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); } } }
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")); }
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")); }
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); }
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); } } }
internal override void Emit(EmitContext ec) { ec.ig.Emit(OpCodes.Ldstr, property_name); exp.Emit(ec); CodeGenerator.EmitBox(ec.ig, exp); }
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); } }