diff cbackend.js @ 182:ab7c142090a0

Make method names available at runtime so they can be included in method not implemented error messages
author Mike Pavone <pavone@retrodev.com>
date Sat, 24 Aug 2013 19:02:59 -0700
parents 76e3d4ae1746
children 53cd9c3bcf96
line wrap: on
line diff
--- a/cbackend.js	Sat Aug 24 16:21:42 2013 -0700
+++ b/cbackend.js	Sat Aug 24 19:02:59 2013 -0700
@@ -1,14 +1,14 @@
 var mainModule;
 var modules = {};
 
-var nextmethodId = 0;
 var methodIds = {};
+var methodNames = [];
 var assignNames;
 function getMethodId(methodName)
 {
 	if (!(methodName in methodIds)) {
-		methodIds[methodName] = nextmethodId++;
-
+		methodIds[methodName] = methodNames.length;
+		methodNames.push(methodName);
 	}
 	return methodIds[methodName];
 }
@@ -1019,11 +1019,16 @@
 	var moduleinit = processUsedToplevel(toplevel);
 	debugprint('//------COMPILING AST-----');
 	var rest = 'object * mainModule() {\n' + moduleinit + '\tmain_module = ' + obj.toCModuleInstance() + ';\n\treturn main_module;\n}\n';
+	var mnames = 'char * methodNames[] = {\n';
+	for (var i = 0; i < methodNames.length; i++) {
+		mnames += '\t"' + methodNames[i].replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\n/g, "\\n") + '",\n';
+	}
+	mnames += '};\n';
 	return '#include "runtime/proghead.inc"\n' +
 		'#define METHOD_ID_MAIN ' + getMethodId('main') + '\n' +
 		'#define METHOD_ID_EMPTY ' + getMethodId('empty') + '\n' +
 		'#define METHOD_ID_CONS ' + getMethodId(getOpMethodName('|')) + '\n' +
-		forwarddec + toplevelcode + rest + '#include "runtime/progfoot.inc"\n';
+		mnames + forwarddec + toplevelcode + rest + '#include "runtime/progfoot.inc"\n';
 }
 
 object.prototype.toCModule = function() {