Microsoft.JScript.ForIn.TranslateToIL C# (CSharp) Method

TranslateToIL() private method

private TranslateToIL ( ILGenerator il, Type rtype ) : void
il System.Reflection.Emit.ILGenerator
rtype System.Type
return void
      internal override void TranslateToIL(ILGenerator il, Type rtype){
        //This assumes that rtype == Void.class
        Label loop_start = il.DefineLabel();
        Label loop_end = il.DefineLabel();
        Label body = il.DefineLabel();
        compilerGlobals.BreakLabelStack.Push(loop_end);
        compilerGlobals.ContinueLabelStack.Push(loop_start);
        if (this.initializer != null){
          this.initializer.TranslateToIL(il, Typeob.Void);
        }
        this.inExpressionContext.EmitLineInfo(il);
        this.collection.TranslateToIL(il, Typeob.Object);
        this.EmitILToLoadEngine(il);
        il.Emit(OpCodes.Call, CompilerGlobals.toForInObjectMethod);
        il.Emit(OpCodes.Call, CompilerGlobals.jScriptGetEnumeratorMethod);
        LocalBuilder enumerator = il.DeclareLocal(Typeob.IEnumerator);
        il.Emit(OpCodes.Stloc, enumerator);
        il.Emit(OpCodes.Br, loop_start);
        il.MarkLabel(body);
        this.body.TranslateToIL(il, Typeob.Void);
        il.MarkLabel(loop_start);
        this.context.EmitLineInfo(il);
        il.Emit(OpCodes.Ldloc, enumerator);
        il.Emit(OpCodes.Callvirt, CompilerGlobals.moveNextMethod);
        il.Emit(OpCodes.Brfalse, loop_end);
        il.Emit(OpCodes.Ldloc, enumerator);
        il.Emit(OpCodes.Callvirt, CompilerGlobals.getCurrentMethod);
        Type vt = Convert.ToType(this.var.InferType(null));
        LocalBuilder val = il.DeclareLocal(vt);
        Convert.Emit(this, il, Typeob.Object, vt);
        il.Emit(OpCodes.Stloc, val);
        this.var.TranslateToILPreSet(il);
        il.Emit(OpCodes.Ldloc, val);
        this.var.TranslateToILSet(il);
        il.Emit(OpCodes.Br, body);
        il.MarkLabel(loop_end);
        compilerGlobals.BreakLabelStack.Pop();
        compilerGlobals.ContinueLabelStack.Pop();
      }