Skip to content

Commit

Permalink
2003-11-30 Cesar Lopez Nataren <cesar@ciencias.unam.mx>
Browse files Browse the repository at this point in the history
	* 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
  • Loading branch information
César Natarén committed Nov 30, 2003
1 parent 5b99e09 commit fa5c4d3
Show file tree
Hide file tree
Showing 2 changed files with 134 additions and 4 deletions.
7 changes: 7 additions & 0 deletions mcs/class/Microsoft.JScript/Microsoft.JScript/ChangeLog
@@ -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
Expand Down
131 changes: 127 additions & 4 deletions mcs/class/Microsoft.JScript/Microsoft.JScript/CodeGenerator.cs
Expand Up @@ -11,6 +11,8 @@
using System.Reflection;
using System.Reflection.Emit;
using System.Threading;
using Microsoft.JScript.Vsa;
using System.Runtime.CompilerServices;

namespace Microsoft.JScript {

Expand Down Expand Up @@ -78,8 +80,18 @@ internal static void Emit (AST prog)

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

Expand All @@ -96,18 +108,129 @@ internal static void Emit (AST prog)
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");
}
}
}

0 comments on commit fa5c4d3

Please sign in to comment.