((SymbolTable) stack.Peek ()).Add (id , decl);
System.Console.WriteLine ("IdentificationTable::Enter::{0}", id);
}
-
- internal AST Retrieve (string id)
- {
- return ((SymbolTable) stack.Peek ()).Retrieve (id);
- }
-
- internal bool Contains (string id)
+
+ //
+ // It'll return the object asociated with the 'id', if found.
+ //
+ internal object Contains (string id)
{
SymbolTable parent, current_scope = (SymbolTable) stack.Peek ();
- bool found = current_scope.Contains (id);
+ object found = current_scope.Contains (id);
- if (found)
- return true;
- else {
+ if (found == null) {
parent = current_scope.parent;
if (parent != null)
internal string str;
- public string Str {
- get { return str; }
- set { str = value; }
- }
-
- internal StringLiteral (string s)
+ internal StringLiteral (AST parent, string s)
{
+ this.parent = parent;
str = s;
}
else
ig = ec.ig;
- ec.ig.Emit (OpCodes.Ldstr, str);
+ ig.Emit (OpCodes.Ldstr, str);
}
}
}
-
internal SymbolTable parent;
internal Hashtable symbols;
-
+
internal SymbolTable (SymbolTable parent)
{
symbols = new Hashtable ();
symbols.Add (id, d);
}
- internal AST Retrieve (string id)
- {
- return ((AST) symbols [id]);
- }
-
- internal bool Contains (string id)
+ internal object Contains (string id)
{
- return symbols.ContainsKey (id);
+ return symbols [id];
}
public override string ToString ()
namespace Microsoft.JScript {
- public class VariableDeclaration : AST {
+ public abstract class Decl : AST {
+ internal FieldInfo field_info;
+ internal LocalBuilder local_builder;
+ }
+
+ public class VariableDeclaration : Decl {
- private string id;
- private Type type;
- private string type_annot;
- private AST val;
+ internal string id;
+ internal Type type;
+ internal string type_annot;
+ internal AST val;
internal VariableDeclaration (AST parent, string id, string t, AST init)
{
// FIXME: resolve the type annotations
this.type = typeof (System.Object);
}
-
this.val = init;
}
-
- public string Id {
- get { return id; }
- set { id = value; }
- }
-
- public AST InitValue {
- get { return val; }
- }
-
- public Type Type {
- get { return type; }
- set { type = value; }
- }
-
-
public override string ToString ()
{
StringBuilder sb = new StringBuilder ();
- sb.Append (Id);
+ sb.Append (id);
sb.Append (":" + type_annot);
sb.Append (" = ");
FieldBuilder field;
TypeBuilder type = ec.type_builder;
- field = type.DefineField (id, Type,
+ field = type.DefineField (id, type,
FieldAttributes.Public |
FieldAttributes.Static);
+
+ field_info = CodeGenerator.assembly_builder.GetType ("JScript 0").GetField (id);
+
if (val != null) {
val.Emit (ec);
ec.gc_ig.Emit (OpCodes.Stsfld, field);
}
} else {
ILGenerator ig = ec.ig;
- LocalBuilder lb = ig.DeclareLocal (Type);
+ local_builder = ig.DeclareLocal (type);
if (val != null) {
val.Emit (ec);
- ig.Emit (OpCodes.Stloc, lb);
+ ig.Emit (OpCodes.Stloc, local_builder);
}
}
}
for (i = 0; i < size; i++) {
tmp_decl = (VariableDeclaration) var_decls [i];
- init_val = tmp_decl.InitValue;
+ init_val = tmp_decl.val;
if (init_val != null)
res = init_val.Resolve (context);
if (res)
- context.Enter (tmp_decl.Id, tmp_decl);
+ context.Enter (tmp_decl.id, tmp_decl);
}
-
return true;
}
}
internal class Identifier : AST {
internal string name;
+ internal Decl binding;
- internal Identifier (string id)
+ internal Identifier (AST parent, string id)
{
+ this.parent = parent;
this.name = id;
}
{
if (name == "print")
return SemanticAnalyser.print;
- else if (context.Contains (name))
- return true;
- else throw new Exception ("variable not found: " + name);
+
+ Decl bind = (Decl) context.Contains (name);
+
+ if (bind == null)
+ throw new Exception ("variable not found: " + name);
+ else
+ binding = bind;
+ return true;
}
internal override void Emit (EmitContext ec)
{
- throw new NotImplementedException ();
+ ILGenerator ig;
+
+ if (parent == null) {
+ ig = ec.gc_ig;
+ ig.Emit (OpCodes.Ldsfld, binding.field_info);
+ } else {
+ ig = ec.ig;
+ ig.Emit (OpCodes.Ldloc, binding.local_builder);
+ }
+ ig.Emit (OpCodes.Pop);
}
- }
+ }
public class Args : AST {
| object_literal
| id:IDENTIFIER
{
- Identifier ident = new Identifier (id.getText ());
+ Identifier ident = new Identifier (parent, id.getText ());
prim_exp = (AST) ident;
}
| l = literal [parent] { prim_exp = l; }
}
| s:STRING_LITERAL
{
- StringLiteral str = new StringLiteral (s.getText ());
+ StringLiteral str = new StringLiteral (parent, s.getText ());
l = str;
}
| l = numeric_literal [parent]