private void TranslateToCOMPlusClass(){
if (this.isCooked) return;
this.isCooked = true;
if (this is EnumDeclaration){
if (!(this.enclosingScope is ClassScope))
this.TranslateToCreateTypeCall();
return;
}
if (this.superClass != null)
this.superClass.TranslateToCOMPlusClass();
for (int i = 0, n = this.interfaces.Length; i < n; i++){
IReflect iface = this.interfaces[i].ToIReflect();
if (iface is ClassScope)
((ClassScope)iface).owner.TranslateToCOMPlusClass();
}
Globals.ScopeStack.Push(this.classob);
TypeBuilder savedClasswriter = compilerGlobals.classwriter;
compilerGlobals.classwriter = (TypeBuilder)this.classob.classwriter;
if (!this.isInterface){
//Emit the class initializer
ConstructorBuilder ccons = compilerGlobals.classwriter.DefineTypeInitializer();
ILGenerator il = ccons.GetILGenerator();
LocalBuilder engineLocal = null;
if (this.classob.staticInitializerUsesEval) {
engineLocal = il.DeclareLocal(Typeob.VsaEngine);
il.Emit(OpCodes.Ldtoken, this.classob.GetTypeBuilder());
ConstantWrapper.TranslateToILInt(il, 0);
il.Emit(OpCodes.Newarr, Typeob.JSLocalField);
if (this.Engine.PEFileKind == PEFileKinds.Dll) {
il.Emit(OpCodes.Ldtoken, this.classob.GetTypeBuilder());
il.Emit(OpCodes.Call, CompilerGlobals.createVsaEngineWithType);
}else
il.Emit(OpCodes.Call, CompilerGlobals.createVsaEngine);
il.Emit(OpCodes.Dup);
il.Emit(OpCodes.Stloc, engineLocal);
il.Emit(OpCodes.Call, CompilerGlobals.pushStackFrameForStaticMethod);
il.BeginExceptionBlock();
}
((Block)(this.body)).TranslateToILStaticInitializers(il);
if (this.classob.staticInitializerUsesEval) {
il.BeginFinallyBlock();
il.Emit(OpCodes.Ldloc, engineLocal);
il.Emit(OpCodes.Call, CompilerGlobals.popScriptObjectMethod);
il.Emit(OpCodes.Pop);
il.EndExceptionBlock();
}
il.Emit(OpCodes.Ret);
// Emit all the namespaces used by the class initializer
this.EmitUsingNamespaces(il);
//Emit the instance field initializer (this also emits the method bodies)
MethodBuilder initializer = compilerGlobals.classwriter.DefineMethod(".init", MethodAttributes.Private, Typeob.Void, new Type[0]);
this.fieldInitializer = initializer;
il = initializer.GetILGenerator();
if (this.classob.instanceInitializerUsesEval) {
il.Emit(OpCodes.Ldarg_0);
ConstantWrapper.TranslateToILInt(il, 0);
il.Emit(OpCodes.Newarr, Typeob.JSLocalField);
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Callvirt, CompilerGlobals.getEngineMethod);
il.Emit(OpCodes.Call, CompilerGlobals.pushStackFrameForMethod);
il.BeginExceptionBlock();
}
((Block)(this.body)).TranslateToILInstanceInitializers(il);
if (this.classob.instanceInitializerUsesEval) {
il.BeginFinallyBlock();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Callvirt, CompilerGlobals.getEngineMethod);
il.Emit(OpCodes.Call, CompilerGlobals.popScriptObjectMethod);
il.Emit(OpCodes.Pop);
il.EndExceptionBlock();
}
il.Emit(OpCodes.Ret);
// Emit all the namespaces used by the instance initializer
this.EmitUsingNamespaces(il);
//Emit the default constructor
if (this.implicitDefaultConstructor != null)
this.implicitDefaultConstructor.TranslateToIL(compilerGlobals);
//Emit the expando code
if (this.generateCodeForExpando){
this.GetExpandoIndexerGetter();
this.GetExpandoIndexerSetter();
this.GetExpandoDeleteMethod();
this.GenerateGetEnumerator();
}
this.EmitILForINeedEngineMethods();
}
if (!(this.enclosingScope is ClassScope))
this.TranslateToCreateTypeCall();
compilerGlobals.classwriter = savedClasswriter;
Globals.ScopeStack.Pop();
}