Commit b35c74ea4c

Andrew Kelley <superjoe30@gmail.com>
2018-09-05 05:17:38
stage1: use os_path_resolve instead of os_path_real
to canonicalize imports. This means that softlinks can represent different files, but referencing the same absolute path different ways still references the same import.
1 parent 2bf1b68
Changed files (3)
src/analyze.cpp
@@ -4236,9 +4236,9 @@ void preview_use_decl(CodeGen *g, AstNode *node) {
     node->data.use.value = result;
 }
 
-ImportTableEntry *add_source_file(CodeGen *g, PackageTableEntry *package, Buf *abs_full_path, Buf *source_code) {
+ImportTableEntry *add_source_file(CodeGen *g, PackageTableEntry *package, Buf *resolved_path, Buf *source_code) {
     if (g->verbose_tokenize) {
-        fprintf(stderr, "\nOriginal Source (%s):\n", buf_ptr(abs_full_path));
+        fprintf(stderr, "\nOriginal Source (%s):\n", buf_ptr(resolved_path));
         fprintf(stderr, "----------------\n");
         fprintf(stderr, "%s\n", buf_ptr(source_code));
 
@@ -4250,7 +4250,7 @@ ImportTableEntry *add_source_file(CodeGen *g, PackageTableEntry *package, Buf *a
     tokenize(source_code, &tokenization);
 
     if (tokenization.err) {
-        ErrorMsg *err = err_msg_create_with_line(abs_full_path, tokenization.err_line, tokenization.err_column,
+        ErrorMsg *err = err_msg_create_with_line(resolved_path, tokenization.err_line, tokenization.err_column,
                 source_code, tokenization.line_offsets, tokenization.err);
 
         print_err_msg(err, g->err_color);
@@ -4268,7 +4268,7 @@ ImportTableEntry *add_source_file(CodeGen *g, PackageTableEntry *package, Buf *a
     import_entry->package = package;
     import_entry->source_code = source_code;
     import_entry->line_offsets = tokenization.line_offsets;
-    import_entry->path = abs_full_path;
+    import_entry->path = resolved_path;
 
     import_entry->root = ast_parse(source_code, tokenization.tokens, import_entry, g->err_color);
     assert(import_entry->root);
@@ -4278,10 +4278,10 @@ ImportTableEntry *add_source_file(CodeGen *g, PackageTableEntry *package, Buf *a
 
     Buf *src_dirname = buf_alloc();
     Buf *src_basename = buf_alloc();
-    os_path_split(abs_full_path, src_dirname, src_basename);
+    os_path_split(resolved_path, src_dirname, src_basename);
 
     import_entry->di_file = ZigLLVMCreateFile(g->dbuilder, buf_ptr(src_basename), buf_ptr(src_dirname));
-    g->import_table.put(abs_full_path, import_entry);
+    g->import_table.put(resolved_path, import_entry);
     g->import_queue.append(import_entry);
 
     import_entry->decls_scope = create_decls_scope(import_entry->root, nullptr, nullptr, import_entry);
src/codegen.cpp
@@ -6866,19 +6866,16 @@ static void define_builtin_compile_vars(CodeGen *g) {
     ensure_cache_dir(g);
     os_write_file(builtin_zig_path, contents);
 
-    int err;
-    Buf *abs_full_path = buf_alloc();
-    if ((err = os_path_real(builtin_zig_path, abs_full_path))) {
-        fprintf(stderr, "unable to open '%s': %s\n", buf_ptr(builtin_zig_path), err_str(err));
-        exit(1);
-    }
+    Buf *resolved_path = buf_alloc();
+    Buf *resolve_paths[] = {builtin_zig_path};
+    *resolved_path = os_path_resolve(resolve_paths, 1);
 
     assert(g->root_package);
     assert(g->std_package);
     g->compile_var_package = new_package(buf_ptr(&g->cache_dir), builtin_zig_basename);
     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->compile_var_import = add_source_file(g, g->compile_var_package, abs_full_path, contents);
+    g->compile_var_import = add_source_file(g, g->compile_var_package, resolved_path, contents);
     scan_import(g, g->compile_var_import);
 }
 
@@ -7034,17 +7031,17 @@ static ImportTableEntry *add_special_code(CodeGen *g, PackageTableEntry *package
     Buf *code_basename = buf_create_from_str(basename);
     Buf path_to_code_src = BUF_INIT;
     os_path_join(g->zig_std_special_dir, code_basename, &path_to_code_src);
-    Buf *abs_full_path = buf_alloc();
-    int err;
-    if ((err = os_path_real(&path_to_code_src, abs_full_path))) {
-        zig_panic("unable to open '%s': %s\n", buf_ptr(&path_to_code_src), err_str(err));
-    }
+
+    Buf *resolve_paths[] = {&path_to_code_src};
+    Buf *resolved_path = buf_alloc();
+    *resolved_path = os_path_resolve(resolve_paths, 1);
     Buf *import_code = buf_alloc();
-    if ((err = os_fetch_file_path(abs_full_path, import_code, false))) {
+    int err;
+    if ((err = os_fetch_file_path(resolved_path, import_code, false))) {
         zig_panic("unable to open '%s': %s\n", buf_ptr(&path_to_code_src), err_str(err));
     }
 
-    return add_source_file(g, package, abs_full_path, import_code);
+    return add_source_file(g, package, resolved_path, import_code);
 }
 
 static PackageTableEntry *create_bootstrap_pkg(CodeGen *g, PackageTableEntry *pkg_with_main) {
@@ -7122,20 +7119,18 @@ static void gen_root_source(CodeGen *g) {
     Buf *rel_full_path = buf_alloc();
     os_path_join(&g->root_package->root_src_dir, &g->root_package->root_src_path, rel_full_path);
 
-    Buf *abs_full_path = buf_alloc();
-    int err;
-    if ((err = os_path_real(rel_full_path, abs_full_path))) {
-        fprintf(stderr, "unable to open '%s': %s\n", buf_ptr(rel_full_path), err_str(err));
-        exit(1);
-    }
+    Buf *resolved_path = buf_alloc();
+    Buf *resolve_paths[] = {rel_full_path};
+    *resolved_path = os_path_resolve(resolve_paths, 1);
 
     Buf *source_code = buf_alloc();
+    int err;
     if ((err = os_fetch_file_path(rel_full_path, source_code, true))) {
         fprintf(stderr, "unable to open '%s': %s\n", buf_ptr(rel_full_path), err_str(err));
         exit(1);
     }
 
-    g->root_import = add_source_file(g, g->root_package, abs_full_path, source_code);
+    g->root_import = add_source_file(g, g->root_package, resolved_path, source_code);
 
     assert(g->root_out_name);
     assert(g->out_type != OutTypeUnknown);
src/ir.cpp
@@ -16131,29 +16131,20 @@ static TypeTableEntry *ir_analyze_instruction_import(IrAnalyze *ira, IrInstructi
     os_path_join(search_dir, import_target_path, &full_path);
 
     Buf *import_code = buf_alloc();
-    Buf *abs_full_path = buf_alloc();
-    int err;
-    if ((err = os_path_real(&full_path, abs_full_path))) {
-        if (err == ErrorFileNotFound) {
-            ir_add_error_node(ira, source_node,
-                    buf_sprintf("unable to find '%s'", buf_ptr(import_target_path)));
-            return ira->codegen->builtin_types.entry_invalid;
-        } else {
-            ira->codegen->error_during_imports = true;
-            ir_add_error_node(ira, source_node,
-                    buf_sprintf("unable to open '%s': %s", buf_ptr(&full_path), err_str(err)));
-            return ira->codegen->builtin_types.entry_invalid;
-        }
-    }
+    Buf *resolved_path = buf_alloc();
+
+    Buf *resolve_paths[] = { &full_path, };
+    *resolved_path = os_path_resolve(resolve_paths, 1);
 
-    auto import_entry = ira->codegen->import_table.maybe_get(abs_full_path);
+    auto import_entry = ira->codegen->import_table.maybe_get(resolved_path);
     if (import_entry) {
         ConstExprValue *out_val = ir_build_const_from(ira, &import_instruction->base);
         out_val->data.x_import = import_entry->value;
         return ira->codegen->builtin_types.entry_namespace;
     }
 
-    if ((err = os_fetch_file_path(abs_full_path, import_code, true))) {
+    int err;
+    if ((err = os_fetch_file_path(resolved_path, import_code, true))) {
         if (err == ErrorFileNotFound) {
             ir_add_error_node(ira, source_node,
                     buf_sprintf("unable to find '%s'", buf_ptr(import_target_path)));
@@ -16164,7 +16155,7 @@ static TypeTableEntry *ir_analyze_instruction_import(IrAnalyze *ira, IrInstructi
             return ira->codegen->builtin_types.entry_invalid;
         }
     }
-    ImportTableEntry *target_import = add_source_file(ira->codegen, target_package, abs_full_path, import_code);
+    ImportTableEntry *target_import = add_source_file(ira->codegen, target_package, resolved_path, import_code);
 
     scan_import(ira->codegen, target_import);