2
0
Эх сурвалжийг харах

Sort procedures in single threaded mode for tilde

gingerBill 1 жил өмнө
parent
commit
1fb5bf6bdb
1 өөрчлөгдсөн 31 нэмэгдсэн , 2 устгасан
  1. 31 2
      src/tilde.cpp

+ 31 - 2
src/tilde.cpp

@@ -781,6 +781,33 @@ gb_internal void cg_add_procedure_to_queue(cgProcedure *p) {
 	}
 }
 
+gb_internal i32 cg_procedure_cmp(void const *a, void const *b) {
+	cgProcedure *x = *(cgProcedure **)a;
+	cgProcedure *y = *(cgProcedure **)b;
+
+	if (x == y) {
+		return 0;
+	}
+	if (!x->parent && y->parent) {
+		return +1;
+	}
+	if (x->parent && !y->parent) {
+		return -1;
+	}
+	if (!x->entity && y->entity) {
+		return -1;
+	}
+	if (x->entity && !y->entity) {
+		return +1;
+	}
+
+	if (x->entity && y->entity) {
+		return token_pos_cmp(x->entity->token.pos, y->entity->token.pos);
+	}
+
+	return string_compare(x->name, y->name);
+}
+
 gb_internal bool cg_generate_code(Checker *c, LinkerData *linker_data) {
 	TIME_SECTION("Tilde Module Initializtion");
 
@@ -854,14 +881,16 @@ gb_internal bool cg_generate_code(Checker *c, LinkerData *linker_data) {
 	}
 
 	if (!m->do_threading) {
+		gb_sort_array(m->single_threaded_procedure_queue.data, m->single_threaded_procedure_queue.count, cg_procedure_cmp);
+
 		for (isize i = 0; i < m->single_threaded_procedure_queue.count; i++) {
 			cgProcedure *p = m->single_threaded_procedure_queue[i];
 			cg_procedure_generate(p);
 		}
+	} else {
+		thread_pool_wait();
 	}
 
-	thread_pool_wait();
-
 	{ // Create startup
 		cgProcedure *p = cg_startup_runtime_proc;
 		cg_procedure_begin(p);