diff options
| author | jagt <jagt@live.com> | 2022-03-25 22:53:58 +0800 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2022-03-27 11:23:11 +0300 |
| commit | 29c32b3dc50218d15f779201e154d425fffcefeb (patch) | |
| tree | b16349f3069554879e6bb060d29357b3d93cc98f /src/Sema.zig | |
| parent | 23507f20b943e7923978b293cb03bee886f913ed (diff) | |
| download | zig-29c32b3dc50218d15f779201e154d425fffcefeb.tar.gz zig-29c32b3dc50218d15f779201e154d425fffcefeb.zip | |
`Namespace.decls` use context to save memory
change `Module.Namespace.decls` from `AutoArrayHashMapUnmanaged` to
`ArrayHashMapUnmanaged(*Decl, void)` with custom context to eliminate
duplicated decl name strings.
Also see:
https://zig.news/andrewrk/how-to-use-hash-map-contexts-to-save-memory-when-doing-a-string-table-3l33
Diffstat (limited to 'src/Sema.zig')
| -rw-r--r-- | src/Sema.zig | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index b7580511cc..121a5a20ac 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -4516,7 +4516,7 @@ fn lookupInNamespace( while (check_i < checked_namespaces.count()) : (check_i += 1) { const check_ns = checked_namespaces.keys()[check_i]; - if (check_ns.decls.get(ident_name)) |decl| { + if (check_ns.decls.getKeyAdapted(ident_name, Module.DeclAdapter{})) |decl| { // Skip decls which are not marked pub, which are in a different // file than the `a.b`/`@hasDecl` syntax. if (decl.is_pub or src_file == decl.getFileScope()) { @@ -4559,7 +4559,7 @@ fn lookupInNamespace( return sema.failWithOwnedErrorMsg(block, msg); }, } - } else if (namespace.decls.get(ident_name)) |decl| { + } else if (namespace.decls.getKeyAdapted(ident_name, Module.DeclAdapter{})) |decl| { try mod.declareDeclDependency(sema.owner_decl, decl); return decl; } @@ -11502,12 +11502,11 @@ fn typeInfoDecls( const decls_len = if (opt_namespace) |ns| ns.decls.count() else 0; const decls_vals = try decls_anon_decl.arena().alloc(Value, decls_len); for (decls_vals) |*decls_val, i| { - const decl = opt_namespace.?.decls.values()[i]; - const name = opt_namespace.?.decls.keys()[i]; + const decl = opt_namespace.?.decls.keys()[i]; const name_val = v: { var anon_decl = try block.startAnonDecl(src); defer anon_decl.deinit(); - const bytes = try anon_decl.arena().dupeZ(u8, name); + const bytes = try anon_decl.arena().dupeZ(u8, mem.sliceTo(decl.name, 0)); const new_decl = try anon_decl.finish( try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len), try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]), |
