enhance global_defs

- support arrays, objects & AST_Node
- support `"a.b":1` on both cli & API
- emit warning if variable is modified
- override top-level variables

fixes #1416
closes #1198
closes #1469
This commit is contained in:
alexlamsl
2017-02-18 19:27:31 +08:00
parent 974247c8c0
commit e275148998
8 changed files with 324 additions and 34 deletions

View File

@@ -206,14 +206,7 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
node.scope.uses_arguments = true;
}
if (!sym) {
if (globals.has(name)) {
sym = globals.get(name);
} else {
sym = new SymbolDef(self, globals.size(), node);
sym.undeclared = true;
sym.global = true;
globals.set(name, sym);
}
sym = self.def_global(node);
}
node.thedef = sym;
node.reference(options);
@@ -227,6 +220,19 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
}
});
AST_Toplevel.DEFMETHOD("def_global", function(node){
var globals = this.globals, name = node.name;
if (globals.has(name)) {
return globals.get(name);
} else {
var g = new SymbolDef(this, globals.size(), node);
g.undeclared = true;
g.global = true;
globals.set(name, g);
return g;
}
});
AST_Scope.DEFMETHOD("init_scope_vars", function(){
this.variables = new Dictionary(); // map name to AST_SymbolVar (variables defined in this scope; includes functions)
this.functions = new Dictionary(); // map name to AST_SymbolDefun (functions defined in this scope)