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