public override void Emit(CodeGen cg) { if (_typeOperand.IsAssignableFrom(_expression.Type)) { // if its always true just emit the bool cg.EmitConstant(true); return; } _expression.EmitAsObject(cg); EmitLocation(cg); cg.Emit(OpCodes.Isinst, _typeOperand); cg.Emit(OpCodes.Ldnull); cg.Emit(OpCodes.Cgt_Un); if (ScriptDomainManager.Options.LightweightDebugging) { if (!cg.IsDynamicMethod) { var s = SpanToLong(Span); cg.EmitConstant(s); cg.EmitCall(Debugging.DebugMethods.ExpressionOut); } } }
public override void Emit(CodeGen cg) { //EmitLocation(cg); _value.EmitAsObject(cg); cg.EmitCodeContext(); cg.EmitSymbolId(_name); cg.EmitCall(typeof(RuntimeHelpers), "SetNameReorder"); }
private bool EmitBranchTrue(CodeGen cg, AstNodeType nodeType, Label label) { switch (nodeType) { case AstNodeType.GreaterThan: _left.EmitAs(cg, GetEmitType()); _right.EmitAs(cg, GetEmitType()); cg.EmitSequencePointNone(); cg.Emit(OpCodes.Bgt, label); cg.EmitSequencePointNone(); return(true); case AstNodeType.GreaterThanOrEqual: _left.EmitAs(cg, GetEmitType()); _right.EmitAs(cg, GetEmitType()); cg.EmitSequencePointNone(); cg.Emit(OpCodes.Bge, label); cg.EmitSequencePointNone(); return(true); case AstNodeType.LessThan: _left.EmitAs(cg, GetEmitType()); _right.EmitAs(cg, GetEmitType()); cg.EmitSequencePointNone(); cg.Emit(OpCodes.Blt, label); cg.EmitSequencePointNone(); return(true); case AstNodeType.LessThanOrEqual: _left.EmitAs(cg, GetEmitType()); _right.EmitAs(cg, GetEmitType()); cg.EmitSequencePointNone(); cg.Emit(OpCodes.Ble, label); cg.EmitSequencePointNone(); return(true); case AstNodeType.Equal: if (_left.IsConstant(null)) { _right.EmitAsObject(cg); cg.EmitSequencePointNone(); cg.Emit(OpCodes.Brfalse, label); cg.EmitSequencePointNone(); } else if (_right.IsConstant(null)) { _left.EmitAsObject(cg); cg.EmitSequencePointNone(); cg.Emit(OpCodes.Brfalse, label); cg.EmitSequencePointNone(); } else { _left.EmitAs(cg, GetEmitType()); _right.EmitAs(cg, GetEmitType()); cg.EmitSequencePointNone(); cg.Emit(OpCodes.Beq, label); cg.EmitSequencePointNone(); } return(true); case AstNodeType.NotEqual: if (_left.IsConstant(null)) { _right.EmitAsObject(cg); cg.EmitSequencePointNone(); cg.Emit(OpCodes.Brtrue, label); cg.EmitSequencePointNone(); } else if (_right.IsConstant(null)) { _left.EmitAsObject(cg); cg.EmitSequencePointNone(); cg.Emit(OpCodes.Brtrue, label); cg.EmitSequencePointNone(); } else { _left.EmitAs(cg, GetEmitType()); _right.EmitAs(cg, GetEmitType()); //cg.Emit(OpCodes.Ceq); cg.EmitSequencePointNone(); cg.Emit(OpCodes.Bne_Un, label); cg.EmitSequencePointNone(); } return(true); case AstNodeType.AndAlso: // if (left AND right) branch label // if (left) then // if (right) branch label // endif Label endif = cg.DefineLabel(); _left.EmitBranchFalse(cg, endif); _right.EmitBranchTrue(cg, label); cg.MarkLabel(endif); return(true); case AstNodeType.OrElse: // if (left OR right) branch label // if (left) then branch label endif // if (right) then branch label endif _left.EmitBranchTrue(cg, label); _right.EmitBranchTrue(cg, label); return(true); default: return(false); } }