Microsoft.JScript.Class.EmitInitialCalls C# (CSharp) Method

EmitInitialCalls() private method

private EmitInitialCalls ( ILGenerator il, MethodBase supcons, ParameterInfo pars, ASTList argAST, int callerParameterCount ) : void
il System.Reflection.Emit.ILGenerator
supcons System.Reflection.MethodBase
pars System.Reflection.ParameterInfo
argAST ASTList
callerParameterCount int
return void
      internal void EmitInitialCalls(ILGenerator il, MethodBase supcons, ParameterInfo[] pars, ASTList argAST, int callerParameterCount){
        bool callFieldInitializer = true;
        if (supcons != null){
          il.Emit(OpCodes.Ldarg_0);
          int n = pars.Length;
          int m = argAST == null ? 0 : argAST.count;
          Object[] tempArray = new Object[n];
          for (int i = 0; i < n; i++){
            AST actual = i < m ? argAST[i] : new ConstantWrapper(null, null);
            if (pars[i].ParameterType.IsByRef)
              tempArray[i] = actual.TranslateToILReference(il, pars[i].ParameterType.GetElementType());
            else{
              actual.TranslateToIL(il, pars[i].ParameterType);
              tempArray[i] = null;
            }
          }
          if (supcons is JSConstructor){
            JSConstructor cons = (JSConstructor)supcons;
            callFieldInitializer = cons.GetClassScope() != this.classob;
            supcons = cons.GetConstructorInfo(this.compilerGlobals);
            //if cons belongs to a nested instance class, load the outer class instance on the stack
            if (cons.GetClassScope().outerClassField != null)
              Convert.EmitLdarg(il, (short)callerParameterCount);
          }
          il.Emit(OpCodes.Call, (ConstructorInfo)supcons);
          for (int i = 0; i < m; i++){
            AST arg = argAST[i];
            if (arg is AddressOf && tempArray[i] != null){
              Type argType = Convert.ToType(arg.InferType(null));
              arg.TranslateToILPreSet(il);
              il.Emit(OpCodes.Ldloc, (LocalBuilder)tempArray[i]);
              Convert.Emit(this, il, pars[i].ParameterType, argType);
              arg.TranslateToILSet(il);
            }
          }
        }
        if (this.classob.outerClassField != null){
          il.Emit(OpCodes.Ldarg_0);
          Convert.EmitLdarg(il, (short)callerParameterCount);
          il.Emit(OpCodes.Stfld, this.classob.outerClassField);
        }
        if (callFieldInitializer){
          il.Emit(OpCodes.Ldarg_0);
          il.Emit(OpCodes.Call, this.fieldInitializer);
          ((Block)(this.body)).TranslateToILInitOnlyInitializers(il);
        }
      }