2003-11-30 Cesar Lopez Nataren <cesar@ciencias.unam.mx>
authorCésar Natarén <cesar@mono-cvs.ximian.com>
Sun, 30 Nov 2003 17:20:08 +0000 (17:20 -0000)
committerCésar Natarén <cesar@mono-cvs.ximian.com>
Sun, 30 Nov 2003 17:20:08 +0000 (17:20 -0000)
* CodeGenerator.cs: Set parent if 'JScript 0' to GlobalScope. Set
custom attribute. Build default 'JScript 0' constructor. Emit
default initial/final code of 'Global Code'. Create default
'JScript Main'.

svn path=/trunk/mcs/; revision=20629

mcs/class/Microsoft.JScript/Microsoft.JScript/ChangeLog
mcs/class/Microsoft.JScript/Microsoft.JScript/CodeGenerator.cs

index fdb5bc41d5aba3417d594e8f643db2ae55305da9..f4fdea7520f1eefca86a66be91951036d4677eec 100644 (file)
@@ -1,3 +1,10 @@
+2003-11-30  Cesar Lopez Nataren  <cesar@ciencias.unam.mx>
+
+       * CodeGenerator.cs: Set parent if 'JScript 0' to GlobalScope. Set
+       custom attribute. Build default 'JScript 0' constructor. Emit
+       default initial/final code of 'Global Code'. Create default
+       'JScript Main'.
+
 2003-11-29  Cesar Lopez Nataren  <cesar@ciencias.unam.mx>
 
        * jscript-lexer-grammar.g: define new rule 'arguments' instead of
index 781c03f5468b9ac9bb8c67791244c878b20b86ef..396ec8af05b2390d7fda732c095c1cb459046848 100644 (file)
@@ -11,6 +11,8 @@ using System;
 using System.Reflection;
 using System.Reflection.Emit;
 using System.Threading;
+using Microsoft.JScript.Vsa;
+using System.Runtime.CompilerServices;
 
 namespace Microsoft.JScript {
 
@@ -78,8 +80,18 @@ namespace Microsoft.JScript {
 
                        TypeBuilder type_builder;
                        type_builder = module_builder.DefineType ("JScript 0");
+
+                       type_builder.SetParent (typeof (GlobalScope));
+                       type_builder.SetCustomAttribute (new CustomAttributeBuilder
+                                                        (typeof (CompilerGlobalScopeAttribute).GetConstructor (new Type [] {}), new object [] {}));
+
                        EmitContext ec = new EmitContext (type_builder);
 
+                       //
+                       // Build the default constructor of the type
+                       //
+                       emit_default_script_constructor (ec);
+
                        // here we only emit code for declarations.
                        prog.Emit (ec);
 
@@ -96,18 +108,129 @@ namespace Microsoft.JScript {
                        ec.ig = method.GetILGenerator ();
                        ec.is_global_code_method = true;
 
-                       prog.Emit (ec);                        
+                       emit_default_init_global_code (ec.ig);
+                       prog.Emit (ec);
+                       emit_default_end_global_code (ec.ig);
 
                        ec.type_builder.CreateType ();
+
+                       //
+                       // Build the default 'JScript Main' class
+                       //
+                       ec.type_builder = module_builder.DefineType ("JScript Main");
+                       emit_jscript_main (ec.type_builder);
+                       ec.type_builder.CreateType ();
+               }
+
+               internal static void emit_default_init_global_code (ILGenerator ig)
+               {
+                       ig.Emit (OpCodes.Ldarg_0);
+                       ig.Emit (OpCodes.Ldfld, typeof (ScriptObject).GetField ("engine"));
+                       ig.Emit (OpCodes.Ldarg_0);
+                       ig.Emit (OpCodes.Call,
+                               typeof (VsaEngine).GetMethod ("PushScriptObject",
+                                                             new Type [] { typeof (ScriptObject)}));
+               }
+
+               internal static void emit_default_end_global_code (ILGenerator ig)
+               {
+                       ig.Emit (OpCodes.Ldarg_0);
+                       ig.Emit (OpCodes.Ldfld, typeof (ScriptObject).GetField ("engine"));
+                       ig.Emit (OpCodes.Call, typeof (VsaEngine).GetMethod ("PopScriptObject"));
+                       ig.Emit (OpCodes.Pop);
+                       ig.Emit (OpCodes.Ret);          
+               }
+
+               internal static void emit_default_script_constructor (EmitContext ec)
+               {
+                       ConstructorBuilder cons_builder;
+                       TypeBuilder tb = ec.type_builder;
+                       cons_builder = tb.DefineConstructor (MethodAttributes.Public,
+                                                            CallingConventions.Standard,
+                                                            new Type [] { typeof (GlobalScope) });
+
+                       ILGenerator ig = cons_builder.GetILGenerator ();
+                       ig.Emit (OpCodes.Ldarg_0);
+                       ig.Emit (OpCodes.Ldarg_1);
+                       ig.Emit (OpCodes.Dup);
+                       ig.Emit (OpCodes.Ldfld,
+                                typeof (ScriptObject).GetField ("engine"));
+                       
+                       ig.Emit (OpCodes.Call, 
+                                typeof (GlobalScope).GetConstructor (new Type [] {typeof (GlobalScope), 
+                                                                                  typeof (VsaEngine)}));
+                       ig.Emit (OpCodes.Ret);
+               }
+
+               internal static void emit_jscript_main (TypeBuilder tb)
+               {
+                       emit_jscript_main_constructor (tb);
+                       emit_jscript_main_entry_point (tb);
+               }
+
+               internal static void emit_jscript_main_constructor (TypeBuilder tb)
+               {
+                       ConstructorBuilder cons = tb.DefineConstructor (MethodAttributes.Public, 
+                                                                       CallingConventions.Standard,
+                                                                       new Type [] {});
+                       ILGenerator ig = cons.GetILGenerator ();
+                       ig.Emit (OpCodes.Ldarg_0);
+                       ig.Emit (OpCodes.Call, typeof (Object).GetConstructor (new Type [] {}));
+                       ig.Emit (OpCodes.Ret);
+               }
+
+               internal static void emit_jscript_main_entry_point (TypeBuilder tb)
+               {
+                       MethodBuilder method;
+                       method = tb.DefineMethod ("Main", 
+                                                 MethodAttributes.Public | MethodAttributes.Static,
+                                                 typeof (void), new Type [] {typeof (String [])});
+
+                       method.SetCustomAttribute (new CustomAttributeBuilder 
+                                                  (typeof (STAThreadAttribute).GetConstructor (
+                                                                                       new Type [] {}),
+                                                    new object [] {}));
+
+                       ILGenerator ig = method.GetILGenerator ();
+
+                       ig.DeclareLocal (typeof (GlobalScope));
+
+                       ig.Emit (OpCodes.Ldc_I4_1);
+                       ig.Emit (OpCodes.Ldc_I4_1);
+                       ig.Emit (OpCodes.Newarr, typeof (string));
+                       ig.Emit (OpCodes.Dup);
+                       ig.Emit (OpCodes.Ldc_I4_0);
+
+                       ig.Emit (OpCodes.Ldstr,
+                                "mscorlib, Version=1.0.3300.0, Culture=neutral, Pub" + 
+                                "licKeyToken=b77a5c561934e089");
+
+                       ig.Emit (OpCodes.Stelem_Ref);
+
+                       ig.Emit (OpCodes.Call,
+                                typeof (VsaEngine).GetMethod ("CreateEngineAndGetGlobalScope", 
+                                                              new Type [] {typeof (bool), 
+                                                                           typeof (string [])}));      
+                       ig.Emit (OpCodes.Stloc_0);
+                       ig.Emit (OpCodes.Ldloc_0);
+                       
+                       ig.Emit (OpCodes.Newobj,
+                                assembly_builder.GetType ("JScript 0").GetConstructor (
+                                                                       new Type [] {typeof (GlobalScope)})); 
+                       ig.Emit (OpCodes.Call, 
+                                assembly_builder.GetType ("JScript 0").GetMethod (
+                                                                          "Global Code", new Type [] {}));
+                       ig.Emit (OpCodes.Pop);
+                       ig.Emit (OpCodes.Ret);
+
+                       assembly_builder.SetEntryPoint (method);
                }
 
                public static void Run (string file_name, AST prog)
                {
                        CodeGenerator.Init (file_name);
                        CodeGenerator.Emit (prog);
-
-                       CodeGenerator.Save (trim_extension (file_name) + 
-                                           ".exe");
+                       CodeGenerator.Save (trim_extension (file_name) + ".exe");
                }       
        }
 }