comparison cbackend.js @ 143:282b8056b702

Lambda bugfix and some improvments to the llMessage support
author Mike Pavone <pavone@retrodev.com>
date Fri, 09 Aug 2013 03:58:08 -0700
parents 833624457b81
children d8f92ebf1ff6
comparison
equal deleted inserted replaced
142:833624457b81 143:282b8056b702
265 case 'ptr:': 265 case 'ptr:':
266 case 'ptr': 266 case 'ptr':
267 var receiver = this.receiver ? this.receiver : this.args[0]; 267 var receiver = this.receiver ? this.receiver : this.args[0];
268 return receiver.toCTypeName() + ' *'; 268 return receiver.toCTypeName() + ' *';
269 break; 269 break;
270 case 'struct:':
271 case 'struct':
272 var receiver = this.receiver ? this.receiver : this.args[0];
273 return 'struct ' + receiver.toCTypeName();
274 break;
270 default: 275 default:
271 throw new Error('invalid use of funcall expression where a C type name is expected'); 276 throw new Error('invalid use of funcall expression where a C type name is expected');
272 } 277 }
273 }; 278 };
274 funcall.prototype.toCLines = function(vars, needsreturn) { 279 funcall.prototype.toCLines = function(vars, needsreturn) {
327 funcall.prototype.toCLLExpr = function(vars) { 332 funcall.prototype.toCLLExpr = function(vars) {
328 var name = this.name[this.name.length-1] == ':' ? this.name.substr(0, this.name.length-1) : this.name; 333 var name = this.name[this.name.length-1] == ':' ? this.name.substr(0, this.name.length-1) : this.name;
329 var args = this.args.slice(0, this.args.length); 334 var args = this.args.slice(0, this.args.length);
330 if (this.receiver) { 335 if (this.receiver) {
331 if(this.args.length == 0) { 336 if(this.args.length == 0) {
332 return this.receiver.toCLLExpr(vars) + '->' + this.name; 337 if (this.receiver instanceof symbol && this.receiver.name in vars && vars[this.receiver.name].substr(-1) != "*") {
338 return this.receiver.toCLLExpr(vars) + '.' + this.name;
339 } else {
340 return this.receiver.toCLLExpr(vars) + '->' + this.name;
341 }
333 } else if (this.args.length == 1 && name[name.length-1] == '!') { 342 } else if (this.args.length == 1 && name[name.length-1] == '!') {
334 return this.receiver.toCLLExpr(vars) + '->' + this.name.substr(0, name.length-1) + ' = ' + args[0].toCLLExpr(vars); 343 if (this.receiver instanceof symbol && this.receiver.name in vars && vars[this.receiver.name].substr(-1) != "*") {
344 return this.receiver.toCLLExpr(vars) + '.' + this.name.substr(0, name.length-1) + ' = ' + args[0].toCLLExpr(vars);
345 } else {
346 return this.receiver.toCLLExpr(vars) + '->' + this.name.substr(0, name.length-1) + ' = ' + args[0].toCLLExpr(vars);
347 }
335 } else { 348 } else {
336 args.splice(0, 0, this.receiver); 349 args.splice(0, 0, this.receiver);
337 } 350 }
338 } 351 }
339 switch(name) 352 switch(name)
568 } 581 }
569 me.addMessage(msgname, { 582 me.addMessage(msgname, {
570 vars: vars, 583 vars: vars,
571 lines: messages[i].args[2].toCLines(vars, true) 584 lines: messages[i].args[2].toCLines(vars, true)
572 }); 585 });
586 } else if(messages[i].name == 'includeSystemHeader:' && messages[i].args.length == 1) {
587 me.addInclude("<" + messages[i].args[0].val + ">");
573 } else { 588 } else {
574 589
575 throw new Error('Only import and import:from calls allowed in object context. ' + messages[i].name + 'with ' + messages[i].args.length + ' arguments found instead.'); 590 throw new Error('Only import and import:from calls allowed in object context. ' + messages[i].name + 'with ' + messages[i].args.length + ' arguments found instead.');
576 } 591 }
577 } else { 592 } else {
971 var envvar = 'myenv'; 986 var envvar = 'myenv';
972 } 987 }
973 debugprint('//' + this.name, 'has envvar:', envvar, 'num vars closed over:', Object.keys(this.symbols.closedover).length); 988 debugprint('//' + this.name, 'has envvar:', envvar, 'num vars closed over:', Object.keys(this.symbols.closedover).length);
974 return 'make_lambda(' + envvar + ', (closure_func)' + this.name + ')'; 989 return 'make_lambda(' + envvar + ', (closure_func)' + this.name + ')';
975 } else { 990 } else {
976 toplevelcode += 'lambda ' + this.name + '_obj = {{&lambda_meta, NULL}, NULL, lambda_' + mynum + '};\n'; 991 toplevelcode += 'lambda ' + this.name + '_obj = {{&lambda_meta, NULL}, NULL, ' + this.name + '};\n';
977 return '((object *)&' + this.name + '_obj)'; 992 return '((object *)&' + this.name + '_obj)';
978 } 993 }
979 } 994 }
980 }; 995 };
981 lambda.prototype.toCModuleInstance = function() { 996 lambda.prototype.toCModuleInstance = function() {