diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2018-09-04 23:17:38 -0400 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2018-09-04 23:17:38 -0400 |
| commit | b35c74ea4c9d93d6a8d90812d2066a78b9abb64e (patch) | |
| tree | 2bd1b9b8f353718c385fd6b800c1b7372840f99f /src | |
| parent | 2bf1b6840d33a27614630ddb34f53a859fc87345 (diff) | |
| download | zig-b35c74ea4c9d93d6a8d90812d2066a78b9abb64e.tar.gz zig-b35c74ea4c9d93d6a8d90812d2066a78b9abb64e.zip | |
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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/analyze.cpp | 12 | ||||
| -rw-r--r-- | src/codegen.cpp | 37 | ||||
| -rw-r--r-- | src/ir.cpp | 25 |
3 files changed, 30 insertions, 44 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp index 99cd496fd9..ff7dac1abf 100644 --- a/src/analyze.cpp +++ b/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); diff --git a/src/codegen.cpp b/src/codegen.cpp index 75465fe80b..3e54e1573f 100644 --- a/src/codegen.cpp +++ b/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); diff --git a/src/ir.cpp b/src/ir.cpp index bbce0af225..1b7bf8aa08 100644 --- a/src/ir.cpp +++ b/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); |
