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

TranslateToILToSaveLocals() private method

private TranslateToILToSaveLocals ( ILGenerator il ) : void
il ILGenerator
return void
      internal void TranslateToILToSaveLocals(ILGenerator il){
        this.TranslateToILToCopyOuterScopeLocals(il, false, null);
        if (!this.must_save_stack_locals)
          return;
        int offset = (this.attributes&MethodAttributes.Static) == MethodAttributes.Static ? 0 : 1;
        int extras = 3;
        if (this.isMethod)
          extras = 0;
        else if (!this.hasArgumentsObject)
          extras = 2;
        int n = this.fields.Length;
        this.TranslateToILToLoadEngine(il);
        il.Emit(OpCodes.Call, CompilerGlobals.scriptObjectStackTopMethod);
        ScriptObject scope = globals.ScopeStack.Peek();
        while (scope is WithObject || scope is BlockScope){
          il.Emit(OpCodes.Call, CompilerGlobals.getParentMethod);
          scope = scope.GetParent();
        }
        il.Emit(OpCodes.Castclass, Typeob.StackFrame);
        il.Emit(OpCodes.Ldfld, CompilerGlobals.localVarsField);
        for (int i = 0; i < n; i++){
          JSLocalField f = this.fields[i];
          if (f.IsLiteral && !(f.value is FunctionObject))
            continue;
          il.Emit(OpCodes.Dup);
          ConstantWrapper.TranslateToILInt(il, f.slotNumber);
          int j = System.Array.IndexOf(this.formal_parameters, f.Name);
          if (j >= 0 || (f.Name.Equals("arguments") && this.hasArgumentsObject)){
            Convert.EmitLdarg(il, (short)(j+extras+offset));
          }else{
            il.Emit(OpCodes.Ldloc, (LocalBuilder)f.metaData);
          }
          Convert.Emit(this.body, il, f.FieldType, Typeob.Object);
          il.Emit(OpCodes.Stelem_Ref);
        }
        il.Emit(OpCodes.Pop);
        
      }