Commit 5c386f9911

Andrew Kelley <superjoe30@gmail.com>
2017-09-05 07:22:26
parseh: remove unneeded hash tables
1 parent f6c271f
Changed files (2)
src/parseh.cpp
@@ -40,9 +40,6 @@ struct Context {
     bool warnings_on;
     VisibMod visib_mod;
     AstNode *root;
-    HashMap<Buf *, AstNode *, buf_hash, buf_eql_buf> global_type_table;
-    HashMap<Buf *, AstNode *, buf_hash, buf_eql_buf> struct_type_table;
-    HashMap<Buf *, AstNode *, buf_hash, buf_eql_buf> enum_type_table;
     HashMap<const void *, AstNode *, ptr_hash, ptr_eq> decl_table;
     HashMap<Buf *, AstNode *, buf_hash, buf_eql_buf> macro_table;
     SourceManager *source_manager;
@@ -56,9 +53,9 @@ struct Context {
 
 static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl);
 static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl);
-static AstNode * trans_qual_type_with_table(Context *c, QualType qt, const SourceLocation &source_loc,
-        HashMap<Buf *, AstNode *, buf_hash, buf_eql_buf> *type_table);
-static AstNode * trans_qual_type(Context *c, QualType qt, const SourceLocation &source_loc);
+static AstNode *resolve_typedef_decl(Context *c, const TypedefNameDecl *typedef_decl);
+static AstNode *trans_qual_type_with_table(Context *c, QualType qt, const SourceLocation &source_loc);
+static AstNode *trans_qual_type(Context *c, QualType qt, const SourceLocation &source_loc);
 
 
 __attribute__ ((format (printf, 3, 4)))
@@ -372,9 +369,7 @@ static AstNode * trans_expr(Context *c, AstNode *block, Expr *expr) {
     return trans_stmt(c, block, expr);
 }
 
-static AstNode *trans_type_with_table(Context *c, const Type *ty, const SourceLocation &source_loc,
-    HashMap<Buf *, AstNode *, buf_hash, buf_eql_buf> *type_table)
-{
+static AstNode *trans_type_with_table(Context *c, const Type *ty, const SourceLocation &source_loc) {
     switch (ty->getTypeClass()) {
         case Type::Builtin:
             {
@@ -504,46 +499,16 @@ static AstNode *trans_type_with_table(Context *c, const Type *ty, const SourceLo
             {
                 const TypedefType *typedef_ty = static_cast<const TypedefType*>(ty);
                 const TypedefNameDecl *typedef_decl = typedef_ty->getDecl();
-                Buf *type_name = buf_create_from_str(decl_name(typedef_decl));
-                if (buf_eql_str(type_name, "uint8_t")) {
-                    return trans_create_node_symbol_str(c, "u8");
-                } else if (buf_eql_str(type_name, "int8_t")) {
-                    return trans_create_node_symbol_str(c, "i8");
-                } else if (buf_eql_str(type_name, "uint16_t")) {
-                    return trans_create_node_symbol_str(c, "u16");
-                } else if (buf_eql_str(type_name, "int16_t")) {
-                    return trans_create_node_symbol_str(c, "i16");
-                } else if (buf_eql_str(type_name, "uint32_t")) {
-                    return trans_create_node_symbol_str(c, "u32");
-                } else if (buf_eql_str(type_name, "int32_t")) {
-                    return trans_create_node_symbol_str(c, "i32");
-                } else if (buf_eql_str(type_name, "uint64_t")) {
-                    return trans_create_node_symbol_str(c, "u64");
-                } else if (buf_eql_str(type_name, "int64_t")) {
-                    return trans_create_node_symbol_str(c, "i64");
-                } else if (buf_eql_str(type_name, "intptr_t")) {
-                    return trans_create_node_symbol_str(c, "isize");
-                } else if (buf_eql_str(type_name, "uintptr_t")) {
-                    return trans_create_node_symbol_str(c, "usize");
-                } else {
-                    auto entry = type_table->maybe_get(type_name);
-                    if (entry == nullptr || entry->value == nullptr) {
-                        return nullptr;
-                    } else {
-                        return entry->value;
-                    }
-                }
+                return resolve_typedef_decl(c, typedef_decl);
             }
         case Type::Elaborated:
             {
                 const ElaboratedType *elaborated_ty = static_cast<const ElaboratedType*>(ty);
                 switch (elaborated_ty->getKeyword()) {
                     case ETK_Struct:
-                        return trans_qual_type_with_table(c, elaborated_ty->getNamedType(),
-                                source_loc, &c->struct_type_table);
+                        return trans_qual_type_with_table(c, elaborated_ty->getNamedType(), source_loc);
                     case ETK_Enum:
-                        return trans_qual_type_with_table(c, elaborated_ty->getNamedType(),
-                                source_loc, &c->enum_type_table);
+                        return trans_qual_type_with_table(c, elaborated_ty->getNamedType(), source_loc);
                     case ETK_Interface:
                     case ETK_Union:
                     case ETK_Class:
@@ -738,14 +703,12 @@ static AstNode *trans_type_with_table(Context *c, const Type *ty, const SourceLo
     zig_unreachable();
 }
 
-static AstNode * trans_qual_type_with_table(Context *c, QualType qt, const SourceLocation &source_loc,
-        HashMap<Buf *, AstNode *, buf_hash, buf_eql_buf> *type_table)
-{
-    return trans_type_with_table(c, qt.getTypePtr(), source_loc, type_table);
+static AstNode * trans_qual_type_with_table(Context *c, QualType qt, const SourceLocation &source_loc) {
+    return trans_type_with_table(c, qt.getTypePtr(), source_loc);
 }
 
 static AstNode * trans_qual_type(Context *c, QualType qt, const SourceLocation &source_loc) {
-    return trans_qual_type_with_table(c, qt, source_loc, &c->global_type_table);
+    return trans_qual_type_with_table(c, qt, source_loc);
 }
 
 static AstNode * trans_compound_stmt(Context *c, AstNode *parent, CompoundStmt *stmt) {
@@ -1690,23 +1653,45 @@ static void visit_fn_decl(Context *c, const FunctionDecl *fn_decl) {
     c->root->data.root.top_level_decls.append(proto_node);
 }
 
-static void visit_typedef_decl(Context *c, const TypedefNameDecl *typedef_decl) {
+static AstNode *resolve_typdef_as_builtin(Context *c, const TypedefNameDecl *typedef_decl, const char *primitive_name) {
+    AstNode *node = trans_create_node_symbol_str(c, primitive_name);
+    c->decl_table.put(typedef_decl, node);
+    return node;
+}
+
+static AstNode *resolve_typedef_decl(Context *c, const TypedefNameDecl *typedef_decl) {
+    auto existing_entry = c->decl_table.maybe_get((void*)typedef_decl);
+    if (existing_entry) {
+        return existing_entry->value;
+    }
+
     QualType child_qt = typedef_decl->getUnderlyingType();
     Buf *type_name = buf_create_from_str(decl_name(typedef_decl));
 
-    if (buf_eql_str(type_name, "uint8_t") ||
-        buf_eql_str(type_name, "int8_t") ||
-        buf_eql_str(type_name, "uint16_t") ||
-        buf_eql_str(type_name, "int16_t") ||
-        buf_eql_str(type_name, "uint32_t") ||
-        buf_eql_str(type_name, "int32_t") ||
-        buf_eql_str(type_name, "uint64_t") ||
-        buf_eql_str(type_name, "int64_t") ||
-        buf_eql_str(type_name, "intptr_t") ||
-        buf_eql_str(type_name, "uintptr_t"))
-    {
-        // special case we can just use the builtin types
-        return;
+    if (buf_eql_str(type_name, "uint8_t")) {
+        return resolve_typdef_as_builtin(c, typedef_decl, "u8");
+    } else if (buf_eql_str(type_name, "int8_t")) {
+        return resolve_typdef_as_builtin(c, typedef_decl, "i8");
+    } else if (buf_eql_str(type_name, "uint16_t")) {
+        return resolve_typdef_as_builtin(c, typedef_decl, "u16");
+    } else if (buf_eql_str(type_name, "int16_t")) {
+        return resolve_typdef_as_builtin(c, typedef_decl, "i16");
+    } else if (buf_eql_str(type_name, "uint32_t")) {
+        return resolve_typdef_as_builtin(c, typedef_decl, "u32");
+    } else if (buf_eql_str(type_name, "int32_t")) {
+        return resolve_typdef_as_builtin(c, typedef_decl, "i32");
+    } else if (buf_eql_str(type_name, "uint64_t")) {
+        return resolve_typdef_as_builtin(c, typedef_decl, "u64");
+    } else if (buf_eql_str(type_name, "int64_t")) {
+        return resolve_typdef_as_builtin(c, typedef_decl, "i64");
+    } else if (buf_eql_str(type_name, "intptr_t")) {
+        return resolve_typdef_as_builtin(c, typedef_decl, "isize");
+    } else if (buf_eql_str(type_name, "uintptr_t")) {
+        return resolve_typdef_as_builtin(c, typedef_decl, "usize");
+    } else if (buf_eql_str(type_name, "ssize_t")) {
+        return resolve_typdef_as_builtin(c, typedef_decl, "isize");
+    } else if (buf_eql_str(type_name, "size_t")) {
+        return resolve_typdef_as_builtin(c, typedef_decl, "usize");
     }
 
     // if the underlying type is anonymous, we can special case it to just
@@ -1716,10 +1701,14 @@ static void visit_typedef_decl(Context *c, const TypedefNameDecl *typedef_decl)
     AstNode *type_node = trans_qual_type(c, child_qt, typedef_decl->getLocation());
     if (type_node == nullptr) {
         emit_warning(c, typedef_decl->getLocation(), "typedef %s - unresolved child type", buf_ptr(type_name));
-        return;
+        c->decl_table.put(typedef_decl, nullptr);
+        return nullptr;
     }
     add_global_var(c, type_name, type_node);
-    c->global_type_table.put(type_name, type_node);
+
+    AstNode *symbol_node = trans_create_node_symbol(c, type_name);
+    c->decl_table.put(typedef_decl, symbol_node);
+    return symbol_node;
 }
 
 struct AstNode *demote_enum_to_opaque(Context *c, const EnumDecl *enum_decl,
@@ -1731,7 +1720,6 @@ struct AstNode *demote_enum_to_opaque(Context *c, const EnumDecl *enum_decl,
         return opaque_node;
     }
     AstNode *symbol_node = trans_create_node_symbol(c, full_type_name);
-    c->enum_type_table.put(bare_name, symbol_node);
     add_global_weak_alias(c, bare_name, full_type_name);
     add_global_var(c, full_type_name, opaque_node);
     c->decl_table.put(enum_decl, symbol_node);
@@ -1808,7 +1796,6 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) {
             return enum_node;
         } else {
             AstNode *symbol_node = trans_create_node_symbol(c, full_type_name);
-            c->enum_type_table.put(bare_name, symbol_node);
             add_global_weak_alias(c, bare_name, full_type_name);
             add_global_var(c, full_type_name, enum_node);
             c->decl_table.put(enum_decl, symbol_node);
@@ -1839,7 +1826,6 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) {
         return enum_node;
     } else {
         AstNode *symbol_node = trans_create_node_symbol(c, full_type_name);
-        c->enum_type_table.put(bare_name, symbol_node);
         add_global_weak_alias(c, bare_name, full_type_name);
         add_global_var(c, full_type_name, enum_node);
         return symbol_node;
@@ -1855,7 +1841,6 @@ static AstNode *demote_struct_to_opaque(Context *c, const RecordDecl *record_dec
         return opaque_node;
     }
     AstNode *symbol_node = trans_create_node_symbol(c, full_type_name);
-    c->struct_type_table.put(bare_name, symbol_node);
     add_global_weak_alias(c, bare_name, full_type_name);
     add_global_var(c, full_type_name, opaque_node);
     c->decl_table.put(record_decl, symbol_node);
@@ -1872,6 +1857,7 @@ static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl) {
 
     if (!record_decl->isStruct()) {
         emit_warning(c, record_decl->getLocation(), "skipping record %s, not a struct", raw_name);
+        c->decl_table.put(record_decl, nullptr);
         return nullptr;
     }
 
@@ -1911,9 +1897,6 @@ static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl) {
     if (is_anonymous) {
         c->decl_table.put(record_decl, struct_node);
     } else {
-        c->struct_type_table.put(bare_name, struct_node);
-        add_global_weak_alias(c, bare_name, full_type_name);
-        add_global_var(c, full_type_name, struct_node);
         c->decl_table.put(record_decl, trans_create_node_symbol(c, full_type_name));
     }
 
@@ -1942,6 +1925,8 @@ static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl) {
     if (is_anonymous) {
         return struct_node;
     } else {
+        add_global_weak_alias(c, bare_name, full_type_name);
+        add_global_var(c, full_type_name, struct_node);
         return trans_create_node_symbol(c, full_type_name);
     }
 }
@@ -2032,7 +2017,7 @@ static bool decl_visitor(void *context, const Decl *decl) {
             visit_fn_decl(c, static_cast<const FunctionDecl*>(decl));
             break;
         case Decl::Typedef:
-            visit_typedef_decl(c, static_cast<const TypedefNameDecl *>(decl));
+            resolve_typedef_decl(c, static_cast<const TypedefNameDecl *>(decl));
             break;
         case Decl::Enum:
             resolve_enum_decl(c, static_cast<const EnumDecl *>(decl));
@@ -2260,9 +2245,6 @@ int parse_h_file(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, const ch
     c->import = import;
     c->errors = errors;
     c->visib_mod = VisibModPub;
-    c->global_type_table.init(8);
-    c->enum_type_table.init(8);
-    c->struct_type_table.init(8);
     c->decl_table.init(8);
     c->macro_table.init(8);
     c->codegen = codegen;
test/parseh.zig
@@ -190,7 +190,7 @@ pub fn addCases(cases: &tests.ParseHContext) {
     ,
         \\pub const Foo = c_void;
     ,
-        \\pub extern fn fun(a: ?&c_void);
+        \\pub extern fn fun(a: ?&Foo) -> Foo;
     );
 
     cases.add("generate inline func for #define global extern fn",