public ExprRelationalOpNodeForgeEval( ExprRelationalOpNodeForge forge, ExprEvaluator left, ExprEvaluator right) { this._forge = forge; this._left = left; this._right = right; }
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); }