Esempio n. 1
0
 public ExprRelationalOpNodeForgeEval(
     ExprRelationalOpNodeForge forge,
     ExprEvaluator left,
     ExprEvaluator right)
 {
     this._forge = forge;
     this._left = left;
     this._right = right;
 }
Esempio n. 2
0
        public static CodegenExpression Codegen(
            ExprRelationalOpNodeForge forge,
            CodegenMethodScope codegenMethodScope,
            ExprForgeCodegenSymbol exprSymbol,
            CodegenClassScope codegenClassScope)
        {
            var lhs = forge.ForgeRenderable.ChildNodes[0].Forge;
            var rhs = forge.ForgeRenderable.ChildNodes[1].Forge;
            
            var lhsType = lhs.EvaluationType;
            if (lhsType == null) {
                return ConstantNull();
            }

            var rhsType = rhs.EvaluationType;
            if (rhsType == null) {
                return ConstantNull();
            }

            var chsType = forge.CoercionType;
            
            var methodNode = codegenMethodScope.MakeChild(
                typeof(bool?),
                typeof(ExprRelationalOpNodeForgeEval),
                codegenClassScope);

            CodegenExpression lhsRef = Ref("left");
            CodegenExpression rhsRef = Ref("right");
            
            var block = methodNode.Block;

            block.DeclareVar(chsType, "left", lhs.EvaluateCodegen(chsType, methodNode, exprSymbol, codegenClassScope));
            if (chsType.CanBeNull()) {
                block.IfRefNullReturnNull("left");
                if (chsType.IsNullable()) {
                    lhsRef = Unbox(lhsRef);
                    lhsType = chsType.GetUnboxedType();
                }
            }

            block.DeclareVar(chsType, "right", rhs.EvaluateCodegen(chsType, methodNode, exprSymbol, codegenClassScope));
            if (chsType.CanBeNull()) {
                block.IfRefNullReturnNull("right");
                if (chsType.IsNullable()) {
                    rhsRef = Unbox(rhsRef);
                    rhsType = chsType.GetUnboxedType();
                }
            }

            block.MethodReturn(forge.Computer.Codegen(lhsRef, lhsType, rhsRef, rhsType));
            return LocalMethod(methodNode);
        }