private void TranslateToMethodWithStackFrame(ILGenerator il, CompilerGlobals compilerGlobals, bool staticInitializer){
//Can get here if method contains a nested function or if method contains an eval
if (this.isStatic)
il.Emit(OpCodes.Ldtoken, ((ClassScope)this.own_scope.GetParent()).GetTypeBuilder());
else
il.Emit(OpCodes.Ldarg_0);
int n = this.fields.Length;
ConstantWrapper.TranslateToILInt(il, n);
il.Emit(OpCodes.Newarr, Typeob.JSLocalField);
for (int i = 0; i < n; i++){
JSLocalField field = this.fields[i];
il.Emit(OpCodes.Dup);
ConstantWrapper.TranslateToILInt(il, i);
il.Emit(OpCodes.Ldstr, field.Name);
il.Emit(OpCodes.Ldtoken, field.FieldType);
ConstantWrapper.TranslateToILInt(il, field.slotNumber);
il.Emit(OpCodes.Newobj, CompilerGlobals.jsLocalFieldConstructor);
il.Emit(OpCodes.Stelem_Ref);
}
this.TranslateToILToLoadEngine(il, true);
if (this.isStatic)
il.Emit(OpCodes.Call, CompilerGlobals.pushStackFrameForStaticMethod);
else
il.Emit(OpCodes.Call, CompilerGlobals.pushStackFrameForMethod);
bool savedInsideProtectedRegion = compilerGlobals.InsideProtectedRegion;
compilerGlobals.InsideProtectedRegion = true;
il.BeginExceptionBlock();
this.body.TranslateToILInitializer(il);
this.body.TranslateToIL(il, Typeob.Void);
il.MarkLabel(this.returnLabel);
this.TranslateToILToSaveLocals(il); //put locals on heap so that nested functions can get to them
Label retLabel = il.DefineLabel();
il.Emit(OpCodes.Leave, retLabel);
il.BeginFinallyBlock();
this.TranslateToILToLoadEngine(il);
il.Emit(OpCodes.Call, CompilerGlobals.popScriptObjectMethod);
il.Emit(OpCodes.Pop);
il.EndExceptionBlock();
il.MarkLabel(retLabel);
if (!staticInitializer){
if (this.body.context.document.debugOn){
this.EmitLastLineInfo(il);
il.Emit(OpCodes.Nop);
}
if (this.own_scope.returnVar != null)
il.Emit(OpCodes.Ldloc, (LocalBuilder)this.own_scope.returnVar.GetMetaData());
il.Emit(OpCodes.Ret);
}
compilerGlobals.InsideProtectedRegion = savedInsideProtectedRegion;
}