| 56 | namespace |
| 57 | { |
| 58 | ValueExprNode* invertBoolValue(CompilerScratch* csb, ValueExprNode* value) |
| 59 | { |
| 60 | // Having a condition (<field> != <boolean value>), |
| 61 | // invert it by making (<field> == (<boolean value> == FALSE)), |
| 62 | // so that an index lookup could be possible |
| 63 | |
| 64 | static const UCHAR falseValue = '\0'; |
| 65 | LiteralNode* const falseLiteral = |
| 66 | FB_NEW_POOL(csb->csb_pool) LiteralNode(csb->csb_pool); |
| 67 | falseLiteral->litDesc.makeBoolean(const_cast<UCHAR*>(&falseValue)); |
| 68 | |
| 69 | ComparativeBoolNode* const cmpNode = |
| 70 | FB_NEW_POOL(csb->csb_pool) ComparativeBoolNode(csb->csb_pool, blr_eql); |
| 71 | cmpNode->arg1 = value; |
| 72 | cmpNode->arg2 = falseLiteral; |
| 73 | |
| 74 | // Recreate the boolean expression as a value |
| 75 | BoolAsValueNode* const newValue = |
| 76 | FB_NEW_POOL(csb->csb_pool) BoolAsValueNode(csb->csb_pool); |
| 77 | newValue->boolean = cmpNode; |
| 78 | |
| 79 | newValue->impureOffset = csb->allocImpure<impure_value>(); |
| 80 | |
| 81 | return newValue; |
| 82 | } |
| 83 | |
| 84 | bool matchSubset(const BoolExprNode* boolean, const BoolExprNode* sub) |
| 85 | { |
no test coverage detected