Mercurial > repos > tabletprog
changeset 115:a83989115028
Fix some variable scope issues in the JS backend.
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 15 Apr 2013 21:13:09 -0700 |
parents | f2b435509301 |
children | 9cf3e0b18ecc |
files | jsbackend.js |
diffstat | 1 files changed, 13 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/jsbackend.js Mon Apr 15 09:34:32 2013 -0700 +++ b/jsbackend.js Mon Apr 15 21:13:09 2013 -0700 @@ -136,7 +136,7 @@ switch(funinfo.type) { case 'self': - if (args.length < funinfo.def.args.length || funinfo.def.args[0].name != 'self') { + if (args.length < funinfo.def.args.length || funinfo.def.args.length == 0 || funinfo.def.args[0].name != 'self') { var receiver = new symbol('self', this.symbols); } else { var receiver = args[0]; @@ -151,7 +151,8 @@ ret = receiver.toJS(true) + '.'; break; case 'parent': - ret = 'this'; + var receiver = new symbol('self', this.symbols); + ret = receiver.toJS(true); for (var i = 0; i < funinfo.depth; ++i) { ret += '.parent'; } @@ -337,26 +338,32 @@ assignment.prototype.toJS = function() { var existing = this.symbols.find(this.symbol.name); var prefix = ''; - if (!existing) { + /*if (!existing) { prefix = 'var '; } else { switch (existing.type) { case 'self': - prefix = 'this.'; + var self = new symbol('self', this.symbols); + prefix = self.toJS() + '.'; break; case 'parent': - prefix = 'this.'; + var self = new symbol('self', this.symbols); + prefix = self.toJS() + '.'; for (var i = 0; i < existing.depth; ++i) { prefix += 'parent.'; } break; } - } + }*/ var val = this.expression.toJS(); if (val === null) { return null; } + if ((existing.type == 'local' || existing.type == 'closedover') && !existing.isdeclared) { + prefix = 'var '; + this.symbols.declareVar(this.symbol.name); + } return prefix + this.symbol.toJS() + ' = ' + val; }; function removeInitialFunction(str)