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

TranslateToCOMPlusClass() private method

private TranslateToCOMPlusClass ( ) : void
return void
      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();
      }