From 29c32b3dc50218d15f779201e154d425fffcefeb Mon Sep 17 00:00:00 2001 From: jagt Date: Fri, 25 Mar 2022 22:53:58 +0800 Subject: `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 --- src/Sema.zig | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'src/Sema.zig') 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]), -- cgit v1.2.3