Пример #1
0
        internal override void Emit(EmitContext ec)
        {
            ILGenerator  ig = ec.ig;
            LocalBuilder local_builder;

            if (op != JSToken.None)
            {
                Type t = typeof(Equality);
                local_builder = ig.DeclareLocal(t);
                if (op == JSToken.Equal)
                {
                    ig.Emit(OpCodes.Ldc_I4_S, (byte)53);
                }
                else if (op == JSToken.NotEqual)
                {
                    ig.Emit(OpCodes.Ldc_I4_S, (byte)54);
                }
                ig.Emit(OpCodes.Newobj, t.GetConstructor(new Type [] { typeof(int) }));
                ig.Emit(OpCodes.Stloc, local_builder);
                ig.Emit(OpCodes.Ldloc, local_builder);
            }

            if (left != null)
            {
                left.Emit(ec);
                CodeGenerator.EmitBox(ig, left);
            }
            if (right != null)
            {
                right.Emit(ec);
                CodeGenerator.EmitBox(ig, right);
            }

            if (op == JSToken.Equal || op == JSToken.NotEqual)
            {
                ig.Emit(OpCodes.Call, typeof(Equality).GetMethod("EvaluateEquality"));

                if (no_effect)
                {
                    Label t_lbl = ig.DefineLabel();
                    Label f_lbl = ig.DefineLabel();

                    if (op == JSToken.Equal)
                    {
                        ig.Emit(OpCodes.Brtrue_S, t_lbl);
                    }
                    else if (op == JSToken.NotEqual)
                    {
                        ig.Emit(OpCodes.Brfalse_S, t_lbl);
                    }

                    ig.Emit(OpCodes.Ldc_I4_0);
                    ig.Emit(OpCodes.Br_S, f_lbl);
                    ig.MarkLabel(t_lbl);
                    ig.Emit(OpCodes.Ldc_I4_1);
                    ig.MarkLabel(f_lbl);
                    ig.Emit(OpCodes.Pop);
                }
            }
        }
Пример #2
0
        internal override void Emit(EmitContext ec)
        {
            int         i       = 0;
            ILGenerator ig      = ec.ig;
            ArrayList   exps    = elems.elems;
            FieldInfo   missing = null;

            if (skip_count != 0)
            {
                missing = typeof(Missing).GetField("Value");
            }
            ig.Emit(OpCodes.Ldc_I4, elems.Size);
            ig.Emit(OpCodes.Newarr, typeof(object));
            foreach (AST ast in exps)
            {
                ig.Emit(OpCodes.Dup);
                ig.Emit(OpCodes.Ldc_I4, i);
                if (ast != null)
                {
                    ast.Emit(ec);
                    CodeGenerator.EmitBox(ig, ast);
                }
                else
                {
                    ig.Emit(OpCodes.Ldsfld, missing);
                }
                ig.Emit(OpCodes.Stelem_Ref);
                i++;
            }
            ig.Emit(OpCodes.Call, typeof(Globals).GetMethod("ConstructArrayLiteral"));
        }
Пример #3
0
 internal override void Emit(EmitContext ec)
 {
     if (left != null)
     {
         left.Emit(ec);
         CodeGenerator.EmitBox(ec.ig, left);
     }
     if (right != null)
     {
         right.Emit(ec);
         CodeGenerator.EmitBox(ec.ig, right);
     }
     ec.ig.Emit(OpCodes.Call, typeof(StrictEquality).GetMethod("JScriptStrictEquals"));
 }
Пример #4
0
        internal override void Emit(EmitContext ec)
        {
            ILGenerator ig        = ec.ig;
            Label       false_lbl = ig.DefineLabel();
            Label       merge_lbl = ig.DefineLabel();

            CodeGenerator.fall_true(ec, cond, false_lbl);
            CodeGenerator.EmitBox(ig, cond);
            if (true_stm != null)
            {
                true_stm.Emit(ec);
            }
            ig.Emit(OpCodes.Br, merge_lbl);
            ig.MarkLabel(false_lbl);
            if (false_stm != null)
            {
                false_stm.Emit(ec);
            }
            ig.MarkLabel(merge_lbl);
        }
Пример #5
0
        internal override void Emit(EmitContext ec)
        {
            ILGenerator ig = ec.ig;

            if (parent == null || (parent.GetType() != typeof(FunctionDeclaration) &&
                                   parent.GetType() != typeof(FunctionExpression)))
            {
                if (val != null)
                {
                    val.Emit(ec);
                    CodeGenerator.EmitBox(ig, val);
                    ig.Emit(OpCodes.Stsfld, field_info);
                }
            }
            else
            {
                if (val != null)
                {
                    val.Emit(ec);
                    CodeGenerator.EmitBox(ig, val);
                    ig.Emit(OpCodes.Stloc, local_builder);
                }
            }
        }
Пример #6
0
 internal override void Emit(EmitContext ec)
 {
     ec.ig.Emit(OpCodes.Ldstr, property_name);
     exp.Emit(ec);
     CodeGenerator.EmitBox(ec.ig, exp);
 }
Пример #7
0
        internal override void Emit(EmitContext ec)
        {
            ILGenerator ig = ec.ig;

            if (op == JSToken.None && right == null)
            {
                left.Emit(ec);
                return;
            }
            else if (op == JSToken.Instanceof)
            {
                if (left != null)
                {
                    left.Emit(ec);
                    CodeGenerator.EmitBox(ig, left);
                }
                if (right != null)
                {
                    right.Emit(ec);
                    CodeGenerator.EmitBox(ig, right);
                }
                ig.Emit(OpCodes.Call, typeof(Instanceof).GetMethod("JScriptInstanceof"));
                ig.Emit(OpCodes.Box, typeof(Boolean));
                return;
            }
            else if (op == JSToken.In)
            {
                if (left != null)
                {
                    left.Emit(ec);
                }
                if (right != null)
                {
                    right.Emit(ec);
                }
                ig.Emit(OpCodes.Call, typeof(In).GetMethod("JScriptIn"));
                return;
            }
            Type            t   = typeof(Relational);
            LocalBuilder    loc = ig.DeclareLocal(t);
            ConstructorInfo ctr_info;

            switch (op)
            {
            case JSToken.GreaterThan:
                ig.Emit(OpCodes.Ldc_I4_S, (byte)57);
                break;

            case JSToken.LessThan:
                ig.Emit(OpCodes.Ldc_I4_S, (byte)58);
                break;

            case JSToken.LessThanEqual:
                ig.Emit(OpCodes.Ldc_I4_S, (byte)59);
                break;

            case JSToken.GreaterThanEqual:
                ig.Emit(OpCodes.Ldc_I4_S, (byte)60);
                break;
            }

            ctr_info = typeof(Relational).GetConstructor(new Type [] { typeof(Int32) });
            ig.Emit(OpCodes.Newobj, ctr_info);
            ig.Emit(OpCodes.Stloc, loc);
            ig.Emit(OpCodes.Ldloc, loc);

            if (left != null)
            {
                left.Emit(ec);
                CodeGenerator.EmitBox(ig, left);
            }
            if (right != null)
            {
                right.Emit(ec);
                CodeGenerator.EmitBox(ig, right);
            }

            ig.Emit(OpCodes.Call, t.GetMethod("EvaluateRelational"));

            if (no_effect)
            {
                ig.Emit(OpCodes.Pop);
            }
        }