Commit 69c7c5de09

Andrew Kelley <andrew@ziglang.org>
2019-06-28 01:15:33
fixups
* better detection for already seen packages * "root" instead of "@root"
1 parent fe2d890
Changed files (3)
src/all_types.hpp
@@ -1110,6 +1110,8 @@ struct ZigPackage {
 
     // reminder: hash tables must be initialized before use
     HashMap<Buf *, ZigPackage *, buf_hash, buf_eql_buf> package_table;
+
+    bool added_to_cache;
 };
 
 // Stuff that only applies to a struct which is the implicit root struct of a file
src/codegen.cpp
@@ -180,7 +180,7 @@ CodeGen *codegen_create(Buf *main_pkg_path, Buf *root_src_path, const ZigTarget
         g->root_package = new_package(".", "", "");
     }
 
-    g->root_package->package_table.put(buf_create_from_str("@root"), g->root_package);
+    g->root_package->package_table.put(buf_create_from_str("root"), g->root_package);
 
     g->zig_std_special_dir = buf_alloc();
     os_path_join(g->zig_std_dir, buf_sprintf("special"), g->zig_std_special_dir);
@@ -8055,6 +8055,8 @@ static Error define_builtin_compile_vars(CodeGen *g) {
     g->root_package->package_table.put(buf_create_from_str("builtin"), g->compile_var_package);
     g->std_package->package_table.put(buf_create_from_str("builtin"), g->compile_var_package);
     g->std_package->package_table.put(buf_create_from_str("std"), g->std_package);
+    g->std_package->package_table.put(buf_create_from_str("root"),
+            g->is_test_build ? g->test_runner_package : g->root_package);
     g->compile_var_import = add_source_file(g, g->compile_var_package, builtin_zig_path, contents,
             SourceKindPkgMain);
 
@@ -8522,8 +8524,10 @@ static ZigType *add_special_code(CodeGen *g, ZigPackage *package, const char *ba
     return add_source_file(g, package, resolved_path, import_code, SourceKindPkgMain);
 }
 
-static ZigPackage *create_bootstrap_pkg(CodeGen *g) {
-    return codegen_create_package(g, buf_ptr(g->zig_std_special_dir), "bootstrap.zig", "std.special");
+static ZigPackage *create_bootstrap_pkg(CodeGen *g, ZigPackage *pkg_with_main) {
+    ZigPackage *package = codegen_create_package(g, buf_ptr(g->zig_std_special_dir), "bootstrap.zig", "std.special");
+    package->package_table.put(buf_create_from_str("root"), pkg_with_main);
+    return package;
 }
 
 static ZigPackage *create_test_runner_pkg(CodeGen *g) {
@@ -8647,12 +8651,12 @@ static void gen_root_source(CodeGen *g) {
         !g->have_c_main && !g->have_winmain && !g->have_winmain_crt_startup &&
         ((g->have_pub_main && g->out_type == OutTypeObj) || g->out_type == OutTypeExe))
     {
-        g->bootstrap_import = add_special_code(g, create_bootstrap_pkg(g), "bootstrap.zig");
+        g->bootstrap_import = add_special_code(g, create_bootstrap_pkg(g, g->root_package), "bootstrap.zig");
     }
     if (g->zig_target->os == OsWindows && !g->have_dllmain_crt_startup &&
             g->out_type == OutTypeLib && g->is_dynamic)
     {
-        g->bootstrap_import = add_special_code(g, create_bootstrap_pkg(g), "bootstrap_lib.zig");
+        g->bootstrap_import = add_special_code(g, create_bootstrap_pkg(g, g->root_package), "bootstrap_lib.zig");
     }
 
     if (!g->error_during_imports) {
@@ -8660,7 +8664,7 @@ static void gen_root_source(CodeGen *g) {
     }
     if (g->is_test_build) {
         create_test_compile_var_and_add_test_runner(g);
-        g->bootstrap_import = add_special_code(g, create_bootstrap_pkg(g), "bootstrap.zig");
+        g->bootstrap_import = add_special_code(g, create_bootstrap_pkg(g, g->test_runner_package), "bootstrap.zig");
 
         if (!g->error_during_imports) {
             semantic_analyze(g);
@@ -9375,6 +9379,7 @@ void codegen_add_time_event(CodeGen *g, const char *name) {
 static void add_cache_pkg(CodeGen *g, CacheHash *ch, ZigPackage *pkg) {
     if (buf_len(&pkg->root_src_path) == 0)
         return;
+    pkg->added_to_cache = true;
 
     Buf *rel_full_path = buf_alloc();
     os_path_join(&pkg->root_src_dir, &pkg->root_src_path, rel_full_path);
@@ -9386,11 +9391,7 @@ static void add_cache_pkg(CodeGen *g, CacheHash *ch, ZigPackage *pkg) {
         if (!entry)
             break;
 
-        // TODO: I think we need a more sophisticated detection of
-        // packages we have already seen
-        if (entry->value != pkg) {
-            auto root = pkg->package_table.maybe_get(buf_create_from_str("@root"));
-            if (root != nullptr && entry->value == root->value) continue;
+        if (!pkg->added_to_cache) {
             cache_buf(ch, entry->key);
             add_cache_pkg(g, ch, entry->value);
         }
@@ -9648,11 +9649,8 @@ ZigPackage *codegen_create_package(CodeGen *g, const char *root_src_dir, const c
         assert(g->compile_var_package != nullptr);
         pkg->package_table.put(buf_create_from_str("std"), g->std_package);
 
-        if (g->is_test_build) {
-            pkg->package_table.put(buf_create_from_str("@root"), g->test_runner_package);
-        } else {
-            pkg->package_table.put(buf_create_from_str("@root"), g->root_package);
-        }
+        ZigPackage *main_pkg = g->is_test_build ? g->test_runner_package : g->root_package;
+        pkg->package_table.put(buf_create_from_str("root"), main_pkg);
 
         pkg->package_table.put(buf_create_from_str("builtin"), g->compile_var_package);
     }
std/special/bootstrap.zig
@@ -1,7 +1,6 @@
-// This file is in a package which has the root source file exposed as "@root".
-// It is included in the compilation unit when exporting an executable.
+// This file is included in the compilation unit when exporting an executable.
 
-const root = @import("@root");
+const root = @import("root");
 const std = @import("std");
 const builtin = @import("builtin");
 const assert = std.debug.assert;