aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorjagt <jagt@live.com>2022-03-25 22:53:58 +0800
committerVeikka Tuominen <git@vexu.eu>2022-03-27 11:23:11 +0300
commit29c32b3dc50218d15f779201e154d425fffcefeb (patch)
treeb16349f3069554879e6bb060d29357b3d93cc98f /src/Sema.zig
parent23507f20b943e7923978b293cb03bee886f913ed (diff)
downloadzig-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.zig9
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]),