Mercurial > repos > tabletprog
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() { |