5 // Cesar Lopez Nataren (cesar@ciencias.unam.mx)
7 // (C) 2003, 2004 Cesar Lopez Nataren
12 using System.Reflection.Emit;
14 namespace Microsoft.JScript {
16 public class Equality : BinaryOp {
18 internal Equality (AST parent, AST left, AST right, JSToken op)
25 public Equality (Context context, AST oper1, AST oper2, JSToken operatorTok)
27 throw new NotImplementedException ();
30 public Equality (int i)
32 current_op = (JSToken) i;
35 public bool EvaluateEquality (object v1, object v2)
41 public static bool JScriptEquals (object v1, object v2)
43 throw new NotImplementedException ();
46 public override string ToString ()
48 StringBuilder sb = new StringBuilder ();
50 sb.Append (left.ToString ());
52 if (current_op != JSToken.None)
53 sb.Append (current_op + " ");
56 sb.Append (right.ToString ());
58 return sb.ToString ();
61 internal override bool Resolve (IdentificationTable context)
65 r &= left.Resolve (context);
67 r &= right.Resolve (context);
71 internal override bool Resolve (IdentificationTable context, bool no_effect)
73 this.no_effect = no_effect;
74 return Resolve (context);
77 internal override void Emit (EmitContext ec)
79 ILGenerator ig = ec.ig;
80 LocalBuilder local_builder;
82 if (current_op != JSToken.None) {
83 Type t = typeof (Equality);
84 local_builder = ig.DeclareLocal (t);
85 if (current_op == JSToken.Equal)
86 ig.Emit (OpCodes.Ldc_I4_S, (byte) 53);
87 else if (current_op == JSToken.NotEqual)
88 ig.Emit (OpCodes.Ldc_I4_S, (byte) 54);
89 ig.Emit (OpCodes.Newobj, t.GetConstructor (new Type [] {typeof (int)}));
90 ig.Emit (OpCodes.Stloc, local_builder);
91 ig.Emit (OpCodes.Ldloc, local_builder);
99 if (current_op == JSToken.Equal || current_op == JSToken.NotEqual) {
100 ig.Emit (OpCodes.Call, typeof (Equality).GetMethod ("EvaluateEquality"));
103 Label t_lbl = ig.DefineLabel ();
104 Label f_lbl = ig.DefineLabel ();
106 if (current_op == JSToken.Equal)
107 ig.Emit (OpCodes.Brtrue_S, t_lbl);
108 else if (current_op == JSToken.NotEqual)
109 ig.Emit (OpCodes.Brfalse_S, t_lbl);
111 ig.Emit (OpCodes.Ldc_I4_0);
112 ig.Emit (OpCodes.Br_S, f_lbl);
113 ig.MarkLabel (t_lbl);
114 ig.Emit (OpCodes.Ldc_I4_1);
115 ig.MarkLabel (f_lbl);
116 ig.Emit (OpCodes.Pop);