@@ -896,25 +896,31 @@ export def compile_queued_functions {
896896 recursion_guard = true
897897 let debug = toolchain::debug_sym
898898 toolchain::debug_sym = false
899-
900- for var fdef in @function_queue.keys() {
901- let entry = function_queue(fdef)
902-
903- if not entry.node {
904- // Create dyn dispatch
905- let function = compiler::predeclare_function(fdef, const_module)
906- compiler::generate_vtable_function(function, fdef, compiler_state)
907- const_module.result.add_function(function.name, function)
908- continue
909- }
910899
911- // Compile function
912- let function = compiler::create_function(entry.node, fdef, entry.node.value.def_.body, entry.node.inner_scope, null, compiler_state, params = entry.node.value.def_.params)
913-
914- if function and function.defer_functions {
915- for var i in 0..vector::length(function.defer_functions) {
916- let deferf = function.defer_functions(i)
917- const_module.result.add_function(deferf.name, deferf)
900+ // This might add new functions to the queue while compiling, so we loop until it's empty
901+ while function_queue.size > 0 {
902+ for var fdef in @function_queue.keys() {
903+ let entry = function_queue(fdef)
904+ function_queue.remove(fdef)
905+
906+ if not entry.node {
907+ // Create dyn dispatch
908+ // TODO This also happens for stuff like destructors and doesn't need to
909+ // Just checking if the node is null doesn't work
910+ let function = compiler::predeclare_function(fdef, const_module)
911+ compiler::generate_vtable_function(function, fdef, compiler_state)
912+ const_module.result.add_function(function.name, function)
913+ continue
914+ }
915+
916+ // Compile function
917+ let function = compiler::create_function(entry.node, fdef, entry.node.value.def_.body, entry.node.inner_scope, null, compiler_state, params = entry.node.value.def_.params)
918+
919+ if function and function.defer_functions {
920+ for var i in 0..vector::length(function.defer_functions) {
921+ let deferf = function.defer_functions(i)
922+ const_module.result.add_function(deferf.name, deferf)
923+ }
918924 }
919925 }
920926 }
0 commit comments