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();
}