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 {