コード例 #1
0
        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);
                }
            }
        }
コード例 #2
0
 public override void Emit(CodeGen cg)
 {
     //EmitLocation(cg);
     _value.EmitAsObject(cg);
     cg.EmitCodeContext();
     cg.EmitSymbolId(_name);
     cg.EmitCall(typeof(RuntimeHelpers), "SetNameReorder");
 }
コード例 #3
0
ファイル: BinaryExpression.cs プロジェクト: tylike/IronScheme
        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);
            }
        }