comparison cbackend.js @ 60:ef3b34c2c0a4

Fix populatesymbols for parent property references. Fix lambda-style modules in cbackend.
author Mike Pavone <pavone@retrodev.com>
date Sat, 14 Jul 2012 03:05:12 -0700
parents 0fd06e077afe
children a6addd8c6bd4
comparison
equal deleted inserted replaced
59:0fd06e077afe 60:ef3b34c2c0a4
732 addBuiltinModules(toplevel); 732 addBuiltinModules(toplevel);
733 debugprint('//------POPULATING SYMBOLS-----'); 733 debugprint('//------POPULATING SYMBOLS-----');
734 obj.populateSymbols(toplevel); 734 obj.populateSymbols(toplevel);
735 var moduleinit = processUsedToplevel(toplevel); 735 var moduleinit = processUsedToplevel(toplevel);
736 debugprint('//------COMPILING AST-----'); 736 debugprint('//------COMPILING AST-----');
737 var rest = 'object * mainModule() {\n' + moduleinit + '\tmain_module = ' + obj.toC() + ';\n\treturn main_module;\n}\n'; 737 var rest = 'object * mainModule() {\n' + moduleinit + '\tmain_module = ' + obj.toCModuleInstance() + ';\n\treturn main_module;\n}\n';
738 return '#include "runtime/proghead.inc"\n' + 738 return '#include "runtime/proghead.inc"\n' +
739 '#define METHOD_ID_MAIN ' + getMethodId('main') + '\n' + 739 '#define METHOD_ID_MAIN ' + getMethodId('main') + '\n' +
740 '#define METHOD_ID_TRUE ' + getMethodId('true') + '\n' + 740 '#define METHOD_ID_TRUE ' + getMethodId('true') + '\n' +
741 '#define METHOD_ID_FALSE ' + getMethodId('false') + '\n' + 741 '#define METHOD_ID_FALSE ' + getMethodId('false') + '\n' +
742 forwarddec + toplevelcode + rest + '#include "runtime/progfoot.inc"\n'; 742 forwarddec + toplevelcode + rest + '#include "runtime/progfoot.inc"\n';
743 } 743 }
744 744
745 object.prototype.toCModule = function() { 745 object.prototype.toCModule = function() {
746 return makeCProg(this); 746 return makeCProg(this);
747 }
748
749 object.prototype.toCModuleInstance = function() {
750 return this.toC();
747 } 751 }
748 752
749 var lambdanum = 0; 753 var lambdanum = 0;
750 754
751 lambda.prototype.toC = function() { 755 lambda.prototype.toC = function() {
814 toplevelcode += '\t' + selfvar + ' = va_arg(args, ' + this.selftype + ' *);\n'; 818 toplevelcode += '\t' + selfvar + ' = va_arg(args, ' + this.selftype + ' *);\n';
815 } 819 }
816 820
817 } 821 }
818 toplevelcode += args.join('') + '\tva_end(args);\n' + exprs.join(';\n\t') + '\n}\n'; 822 toplevelcode += args.join('') + '\tva_end(args);\n' + exprs.join(';\n\t') + '\n}\n';
823 this.name = 'lambda_' + mynum;
819 824
820 if (this.selftype) { 825 if (this.selftype) {
821 return 'lambda_' + mynum; 826 return this.name;
822 } else { 827 } else {
823 if (this.symbols.parentEnvType() != 'void') { 828 if (this.symbols.parentEnvType() != 'void') {
824 if (this.symbols.parent.passthruenv) { 829 if (this.symbols.parent.passthruenv) {
825 var envvar = 'env'; 830 var envvar = 'env';
826 } else { 831 } else {
827 var envvar = 'myenv'; 832 var envvar = 'myenv';
828 } 833 }
829 debugprint('//lambda_' + mynum, 'has envvar:', envvar, 'num vars closed over:', Object.keys(this.symbols.closedover).length); 834 debugprint('//lambda_' + mynum, 'has envvar:', envvar, 'num vars closed over:', Object.keys(this.symbols.closedover).length);
830 return 'make_lambda(' + envvar + ', (closure_func)lambda_' + mynum + ')'; 835 return 'make_lambda(' + envvar + ', (closure_func)' + this.name + ')';
831 } else { 836 } else {
832 toplevelcode += 'lambda lambda_obj_' + mynum + ' = {{&lambda_meta, NULL}, NULL, lambda_' + mynum + '};\n'; 837 toplevelcode += 'lambda lambda_obj_' + mynum + ' = {{&lambda_meta, NULL}, NULL, lambda_' + mynum + '};\n';
833 return '((object *)&lambda_obj_' + mynum + ')'; 838 return '((object *)&lambda_obj_' + mynum + ')';
834 } 839 }
835 } 840 }
841 };
842 lambda.prototype.toCModuleInstance = function() {
843 this.toC();
844 return this.name + '(NULL, 0)';
836 }; 845 };
837 lambda.prototype.toCObject = function(typename) { 846 lambda.prototype.toCObject = function(typename) {
838 this.selftype = typename; 847 this.selftype = typename;
839 return this.toC(); 848 return this.toC();
840 }; 849 };