# HG changeset patch # User Mike Pavone # Date 1366085589 25200 # Node ID a83989115028d6d77e80544071f59427fb575e9e # Parent f2b4355093017830b834a482a96bb6ec11e4d3fe Fix some variable scope issues in the JS backend. diff -r f2b435509301 -r a83989115028 jsbackend.js --- 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)