Microsoft.JScript.FunctionObject.TranslateToMethodWithStackFrame C# (CSharp) Method

TranslateToMethodWithStackFrame() private method

private TranslateToMethodWithStackFrame ( ILGenerator il, CompilerGlobals compilerGlobals, bool staticInitializer ) : void
il ILGenerator
compilerGlobals CompilerGlobals
staticInitializer bool
return void
      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;
      }