changeset 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 f188723c15b4
children 97f107b9e8d3
files cbackend.js runtime/proghead.inc
diffstat 2 files changed, 12 insertions(+), 5 deletions(-) [+]
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() {
--- a/runtime/proghead.inc	Sat Aug 24 16:21:42 2013 -0700
+++ b/runtime/proghead.inc	Sat Aug 24 19:02:59 2013 -0700
@@ -6,9 +6,11 @@
 
 object * main_module;
 
+char * methodNames[];
+
 object * no_impl(uint32_t method_id, uint32_t num_args, object * self, va_list args)
 {
-	fprintf(stderr, "method %d is not implemented on object %p\n", method_id, self);
+	fprintf(stderr, "method %s(%d) is not implemented on object %p\n", methodNames[method_id], method_id, self);
 	fprintf(stderr, "main_module %p\n", main_module);
 	exit(1);
 	return NULL;