diff --git a/lang/compile.py b/lang/compile.py index 45a4cce..e96e472 100755 --- a/lang/compile.py +++ b/lang/compile.py @@ -484,13 +484,12 @@ return 'IRMetadata(id=%s, name=%s, uses=%s)' % (self.id, self.name, self.uses) class IRClass(): - def __init__(self, name, functions, args_len): + def __init__(self, name, functions): self.name = name self.functions = functions - self.args_len = args_len def __repr__(self): - return 'IRClass(name=%s, functions=%s, args_len=%i)' % (self.name, self.functions, self.args_len) + return 'IRClass(name=%s, functions=%s)' % (self.name, self.functions) ## IR Generator @@ -669,8 +668,7 @@ if metadata is None: print("Unable to find module metadata?") return None - args_len = len(metadata.uses) - return IRClass(metadata.name, [], args_len) + return IRClass(metadata.name, []) def map_class_functions(functions, classes): mapped_classes = [] @@ -684,8 +682,7 @@ print("Unknown class %s" % (name)) return None funcs = functions[name] - args_len = class_.args_len - new_class = IRClass(name, funcs, args_len) + new_class = IRClass(name, funcs) mapped_classes.append(new_class) return mapped_classes @@ -953,21 +950,20 @@ return "\n\nstatic const unsigned char bytecode_%s_%s [] = {%s};" \ % (node.class_, node.name, c_bytecode) -def generate_class_boilerplate(args_len): +def generate_class_boilerplate(): return """static struct object_class CLASSNAME_class; static Object CLASSNAME_create(VmState state, ObjectList use_modules) { Object obj = object_create(state, &CLASSNAME_class, sizeof(ObjectList)); ObjectList *args = (ObjectList *)object_priv(state, obj, &CLASSNAME_class); *args = use_modules; - vm_abort_if(state, object_list_length(state, use_modules) < %i, "create_args: Not enough use_modules"); return obj; } static void CLASSNAME_cleanup(VmState state, Object obj) { ObjectList *args = (ObjectList *)object_priv(state, obj, &CLASSNAME_class); object_list_drop(state, args); -}""" % (args_len) +}""" def generate_class_call(class_name, func_name, index): call = '{.name = "%s", .handler = CLASSNAME_call_bytecode, .priv = %s },\n\t' % (func_name, index) @@ -1002,7 +998,7 @@ def generate_c_class(class_ir): functions = [] - output = generate_class_boilerplate(class_ir.args_len) + output = generate_class_boilerplate() output += "\n\n" output += generate_class_structs(class_ir) output = output.replace('CLASSNAME', class_ir.name) diff --git a/lang/module.c b/lang/module.c index b56119f..c293597 100644 --- a/lang/module.c +++ b/lang/module.c @@ -127,7 +127,10 @@ // Creates a module and stores it in a mapping Object create_module( VmState state, struct module_mapping *mapping, const ModuleInfo *info) { - ObjectList use_modules = object_list_create(state, 16); + int use_count = 0; + for (const char **use = info->uses; *use != NULL; ++use) + ++use_count; + ObjectList use_modules = object_list_create(state, use_count); int use_modules_next = 0; for (const char **use = info->uses; *use != NULL; ++use) { const ModuleInfo *use_info = info_by_name(*use); @@ -138,9 +141,6 @@ object_hold(state, use_module); object_list_set( state, use_modules, use_modules_next++, use_module); - // Check there's enough room left for this - if (object_list_length(state, use_modules) < use_modules_next) - abort_print("Too many module use_modules"); } Object module = info->create(state, use_modules); return module;