diff --git a/lang/compile.py b/lang/compile.py index d0a0053..59474e7 100755 --- a/lang/compile.py +++ b/lang/compile.py @@ -985,12 +985,18 @@ call = '{.name = "%s", .handler = CLASSNAME_call_bytecode, .priv = %s },\n\t' % (func_name, index) return call +def generate_module_class_call(class_name, func_name, index): + call = '{.name = "%s", .bytecode_index = %s },\n\t' % (func_name, index) + return call + def generate_class_structs(class_ir): calls = "" + module_calls = "" bytecodes = "" index = 0 for func in class_ir.functions: calls += generate_class_call(class_ir.name, func, index) + module_calls += generate_module_class_call(class_ir.name, func, index) bytecodes += "bytecode_%s_%s,\n\t" % (class_ir.name, func) index += 1 return """static const unsigned char *CLASSNAME_bytecodes[] = { @@ -1007,15 +1013,20 @@ %s{.name = NULL, /* end */ }, }; +static ModuleClassCall CLASSNAME_module_calls[] = { + %s{.name = NULL, /* end */ }, +}; + static ModuleClass CLASSNAME_module_class = { .fields_count = 0, .bytecodes = CLASSNAME_bytecodes, + .calls = CLASSNAME_module_calls, }; static struct object_class CLASSNAME_class = { .cleanup = CLASSNAME_cleanup, .calls = &CLASSNAME_calls[0], -};""" % (bytecodes, calls) +};""" % (bytecodes, calls, module_calls) def generate_c_class(class_ir): functions = [] diff --git a/lang/module.h b/lang/module.h index 0d36046..a8f1beb 100644 --- a/lang/module.h +++ b/lang/module.h @@ -20,10 +20,19 @@ // the compiler's C code generator. Do not use for regular C code. #ifdef MODULE_INTERNAL_API +// A call the module class can make +struct module_class_call { + const char *name; + int bytecode_index; +}; + +typedef struct module_class_call ModuleClassCall; + // A class in a module struct module_class { int fields_count; const unsigned char **bytecodes; + ModuleClassCall *calls; }; typedef struct module_class ModuleClass;