Mercurial > repos > tabletprog
comparison jsbackend.js @ 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 | d715fb3c39ab |
children |
comparison
equal
deleted
inserted
replaced
114:f2b435509301 | 115:a83989115028 |
---|---|
134 } | 134 } |
135 var ret = ''; | 135 var ret = ''; |
136 switch(funinfo.type) | 136 switch(funinfo.type) |
137 { | 137 { |
138 case 'self': | 138 case 'self': |
139 if (args.length < funinfo.def.args.length || funinfo.def.args[0].name != 'self') { | 139 if (args.length < funinfo.def.args.length || funinfo.def.args.length == 0 || funinfo.def.args[0].name != 'self') { |
140 var receiver = new symbol('self', this.symbols); | 140 var receiver = new symbol('self', this.symbols); |
141 } else { | 141 } else { |
142 var receiver = args[0]; | 142 var receiver = args[0]; |
143 args.splice(0, 1); | 143 args.splice(0, 1); |
144 if (args.length == 0) { | 144 if (args.length == 0) { |
149 } | 149 } |
150 } | 150 } |
151 ret = receiver.toJS(true) + '.'; | 151 ret = receiver.toJS(true) + '.'; |
152 break; | 152 break; |
153 case 'parent': | 153 case 'parent': |
154 ret = 'this'; | 154 var receiver = new symbol('self', this.symbols); |
155 ret = receiver.toJS(true); | |
155 for (var i = 0; i < funinfo.depth; ++i) { | 156 for (var i = 0; i < funinfo.depth; ++i) { |
156 ret += '.parent'; | 157 ret += '.parent'; |
157 } | 158 } |
158 break; | 159 break; |
159 } | 160 } |
335 } | 336 } |
336 | 337 |
337 assignment.prototype.toJS = function() { | 338 assignment.prototype.toJS = function() { |
338 var existing = this.symbols.find(this.symbol.name); | 339 var existing = this.symbols.find(this.symbol.name); |
339 var prefix = ''; | 340 var prefix = ''; |
340 if (!existing) { | 341 /*if (!existing) { |
341 prefix = 'var '; | 342 prefix = 'var '; |
342 } else { | 343 } else { |
343 switch (existing.type) | 344 switch (existing.type) |
344 { | 345 { |
345 case 'self': | 346 case 'self': |
346 prefix = 'this.'; | 347 var self = new symbol('self', this.symbols); |
348 prefix = self.toJS() + '.'; | |
347 break; | 349 break; |
348 case 'parent': | 350 case 'parent': |
349 prefix = 'this.'; | 351 var self = new symbol('self', this.symbols); |
352 prefix = self.toJS() + '.'; | |
350 for (var i = 0; i < existing.depth; ++i) { | 353 for (var i = 0; i < existing.depth; ++i) { |
351 prefix += 'parent.'; | 354 prefix += 'parent.'; |
352 } | 355 } |
353 break; | 356 break; |
354 } | 357 } |
355 } | 358 }*/ |
356 var val = this.expression.toJS(); | 359 var val = this.expression.toJS(); |
357 if (val === null) { | 360 if (val === null) { |
358 return null; | 361 return null; |
362 } | |
363 if ((existing.type == 'local' || existing.type == 'closedover') && !existing.isdeclared) { | |
364 prefix = 'var '; | |
365 this.symbols.declareVar(this.symbol.name); | |
359 } | 366 } |
360 return prefix + this.symbol.toJS() + ' = ' + val; | 367 return prefix + this.symbol.toJS() + ' = ' + val; |
361 }; | 368 }; |
362 function removeInitialFunction(str) | 369 function removeInitialFunction(str) |
363 { | 370 { |