Mercurial > repos > tabletprog
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 }; |