Browse Source

Fix delayed assert collection

gingerBill 7 years ago
parent
commit
86cf9383ea
5 changed files with 16 additions and 29 deletions
  1. 1 1
      build.bat
  2. 0 1
      core/thread/thread_windows.odin
  3. 0 2
      examples/demo/demo.odin
  4. 4 1
      src/array.cpp
  5. 11 24
      src/checker.cpp

+ 1 - 1
build.bat

@@ -42,7 +42,7 @@ del *.ilk > NUL 2> NUL
 
 cl %compiler_settings% "src\main.cpp" ^
 	/link %linker_settings% -OUT:%exe_name% ^
-	&& odin run examples/demo/demo.odin
+	&& odin check examples/demo/demo.odin
 
 del *.obj > NUL 2> NUL
 

+ 0 - 1
core/thread/thread.odin → core/thread/thread_windows.odin

@@ -1,6 +1,5 @@
 package thread
 
-#assert(ODIN_OS == "windows");
 import "core:sys/win32"
 
 Thread_Proc :: #type proc(^Thread) -> int;

+ 0 - 2
examples/demo/demo.odin

@@ -1,7 +1,5 @@
 package main
 
-#assert(_BUFFER_SIZE > 0);
-
 import "core:fmt"
 import "core:strconv"
 import "core:mem"

+ 4 - 1
src/array.cpp

@@ -54,7 +54,10 @@ gb_inline void array_init(Array<T> *array, gbAllocator const &a, isize count) {
 template <typename T>
 gb_inline void array_init(Array<T> *array, gbAllocator const &a, isize count, isize capacity) {
 	array->allocator = a;
-	array->data = gb_alloc_array(a, T, capacity);
+	array->data = nullptr;
+	if (capacity > 0) {
+		array->data = gb_alloc_array(a, T, capacity);
+	}
 	array->count = count;
 	array->capacity = capacity;
 }

+ 11 - 24
src/checker.cpp

@@ -215,7 +215,7 @@ bool decl_info_has_init(DeclInfo *d) {
 Scope *create_scope(Scope *parent, gbAllocator allocator) {
 	Scope *s = gb_alloc_item(allocator, Scope);
 	s->parent = parent;
-	map_init(&s->elements,     heap_allocator());
+	map_init(&s->elements, heap_allocator());
 	ptr_set_init(&s->implicit, heap_allocator());
 	ptr_set_init(&s->imported, heap_allocator());
 	ptr_set_init(&s->exported, heap_allocator());
@@ -2119,6 +2119,16 @@ void check_collect_entities(Checker *c, Array<AstNode *> nodes) {
 	for_array(decl_index, nodes) {
 		AstNode *decl = nodes[decl_index];
 		if (!is_ast_node_decl(decl) && !is_ast_node_when_stmt(decl)) {
+
+			if (c->context.scope->is_file && decl->kind == AstNode_ExprStmt) {
+				AstNode *expr = decl->ExprStmt.expr;
+				if (expr->kind == AstNode_CallExpr &&
+				    expr->CallExpr.proc->kind == AstNode_BasicDirective &&
+				    expr->CallExpr.proc->BasicDirective.name == "assert") {
+					array_add(&c->context.scope->delayed_asserts, expr);
+					continue;
+				}
+			}
 			continue;
 		}
 
@@ -2158,18 +2168,6 @@ void check_collect_entities(Checker *c, Array<AstNode *> nodes) {
 			check_add_foreign_block_decl(c, decl);
 		case_end;
 
-
-		case_ast_node(ce, CallExpr, decl);
-			if (c->context.scope->is_file &&
-			    ce->proc->kind == AstNode_BasicDirective &&
-			    ce->proc->BasicDirective.name == "assert") {
-				array_add(&c->context.scope->delayed_asserts, decl);
-			} else {
-				goto error_case;
-			}
-		case_end;
-
-		error_case:
 		default:
 			if (c->context.scope->is_file) {
 				error(decl, "Only declarations are allowed at file scope");
@@ -2709,17 +2707,6 @@ void check_import_entities(Checker *c) {
 		GB_ASSERT(node->scope->is_package);
 		AstPackage *p = node->scope->package;
 
-
-
-		for_array(i, p->files.entries) {
-			AstFile *f = p->files.entries[i].value;
-
-			CheckerContext prev_context = c->context;
-			defer (c->context = prev_context);
-			add_curr_ast_file(c, f);
-			check_collect_entities(c, f->decls);
-		}
-
 		for_array(i, p->files.entries) {
 			AstFile *f = p->files.entries[i].value;
 			CheckerContext prev_context = c->context;