pavone@8: function indent(str) pavone@8: { pavone@8: return str.split('\n').join('\n\t'); pavone@8: } pavone@8: pavone@8: function osymbols(parent) pavone@8: { pavone@8: this.parent = parent; pavone@8: this.names = {}; pavone@8: this.lastname = null; pavone@8: } pavone@8: osymbols.prototype.find = function(name) { pavone@8: if (name in this.names) { pavone@8: if (this.names[name] instanceof funcall && this.names[name].name == 'foreign:') { pavone@8: return { pavone@8: type: 'foreign', pavone@8: def: this.names[name] pavone@8: }; pavone@8: } pavone@8: return { pavone@8: type: 'self', pavone@8: def: this.names[name], pavone@8: }; pavone@8: } else if(this.parent) { pavone@8: var ret = this.parent.find(name); pavone@8: if (ret) { pavone@8: if(ret.type == 'self') { pavone@8: ret.type = 'parent'; pavone@8: ret.depth = 1; pavone@8: } else if(ret.type == 'parent') { pavone@8: ret.depth++; pavone@8: } pavone@8: } pavone@8: return ret; pavone@8: } pavone@8: return null; pavone@8: }; pavone@8: osymbols.prototype.defineMsg = function(name, def) { pavone@8: this.lastname = name; pavone@8: this.names[name] = def; pavone@8: } pavone@8: osymbols.prototype.parentObject = function() { pavone@8: if (!this.parent) { pavone@8: return 'null'; pavone@8: } pavone@8: return 'this'; pavone@8: } pavone@8: pavone@8: function lsymbols(parent) pavone@8: { pavone@8: this.parent = parent; pavone@8: this.names = {}; pavone@8: this.lastname = null; pavone@8: this.needsSelfVar = false; pavone@8: } pavone@8: lsymbols.prototype.find = function(name) { pavone@8: if (name in this.names) { pavone@8: if (this.names[name] instanceof funcall && this.names[name].name == 'foreign:') { pavone@8: return { pavone@8: type: 'foreign', pavone@8: def: this.names[name] pavone@8: }; pavone@8: } pavone@8: return { pavone@8: type: 'local', pavone@8: def: this.names[name] pavone@8: }; pavone@8: } else if(this.parent) { pavone@8: var ret = this.parent.find(name); pavone@8: if (ret && ret.type == 'local') { pavone@8: ret.type = 'upvar'; pavone@8: } pavone@8: return ret; pavone@8: } pavone@8: return null; pavone@8: }; pavone@8: lsymbols.prototype.defineVar = function(name, def) { pavone@8: this.lastname = name; pavone@8: this.names[name] = def; pavone@8: }; pavone@8: lsymbols.prototype.selfVar = function() { pavone@8: if (this.parent && this.parent instanceof lsymbols) { pavone@8: this.parent.needsSelf(); pavone@8: return 'self'; pavone@8: } else { pavone@8: return 'this'; pavone@8: } pavone@8: }; pavone@8: lsymbols.prototype.needsSelf = function() { pavone@8: if (this.parent && this.parent instanceof lsymbols) { pavone@8: this.parent.needsSelf(); pavone@8: } else { pavone@8: this.needsSelfVar = true; pavone@8: } pavone@8: }; pavone@8: