refactor(hashtable): 简化哈希表初始化接口并优化文件打开模式

- 将哈希表初始化从两步设置改为一步完成,直接传递哈希函数和比较函数
- 重构scc_hashtable_init函数签名,接受函数指针参数
- 更新内部字段名从key_cmp为cmp_func以保持一致性
- 添加类型定义scc_hashtable_hash_func_t和scc_hashtable_equal_func_t
- 修改PAL层文件操作接口,使用枚举模式替代固定只读模式
- 更新IR上下文、预处理器宏表等组件使用新的初始化方式
- 移除AST头文件中未使用的语义分析回调类型定义
- 修复预处理器中的空指针访问问题
This commit is contained in:
zzy
2026-03-04 16:47:28 +08:00
parent 2c4b803058
commit 4015acd866
10 changed files with 48 additions and 51 deletions

View File

@@ -3,21 +3,4 @@
#include "ast_def.h"
/**
* @brief 语义分析回调函数类型
*/
typedef void (*scc_sema_callback_t)(void *context,
scc_ast_node_type_t node_type, void *node);
/**
* @brief 语义分析回调集合
*/
typedef struct scc_sema_callbacks {
scc_sema_callback_t on_decl;
scc_sema_callback_t on_stmt;
scc_sema_callback_t on_expr;
scc_sema_callback_t on_type;
void *context;
} scc_sema_callbacks_t;
#endif /* __SCC_AST_H__ */

View File

@@ -120,24 +120,15 @@ void scc_ir_ctx_init(scc_ir_cprog_ctx_t *ctx) {
scc_vec_init(ctx->bblocks);
scc_vec_init(ctx->funcs);
// 设置哈希函数
ctx->uid2nodes.hash_func = hash_key;
ctx->uid2nodes.key_cmp = cmp_key;
ctx->uid2types.hash_func = hash_key;
ctx->uid2types.key_cmp = cmp_key;
ctx->uid2bblocks.hash_func = hash_key;
ctx->uid2bblocks.key_cmp = cmp_key;
ctx->uid2funcs.hash_func = hash_key;
ctx->uid2funcs.key_cmp = cmp_key;
// 初始化哈希表
scc_hashtable_init(&ctx->uid2nodes);
scc_hashtable_init(&ctx->uid2types);
scc_hashtable_init(&ctx->uid2bblocks);
scc_hashtable_init(&ctx->uid2funcs);
scc_hashtable_init(&ctx->uid2nodes, hash_key, cmp_key);
scc_hashtable_init(&ctx->uid2types, hash_key, cmp_key);
scc_hashtable_init(&ctx->uid2bblocks, hash_key, cmp_key);
scc_hashtable_init(&ctx->uid2funcs, hash_key, cmp_key);
ctx->type_uniquing.hash_func = (void *)hash_type;
ctx->type_uniquing.key_cmp = (void *)cmp_type;
scc_hashtable_init(&ctx->type_uniquing);
scc_hashtable_init(&ctx->type_uniquing,
(scc_hashtable_hash_func_t)hash_type,
(scc_hashtable_equal_func_t)cmp_type);
// 预留UID 0 作为无效引用
ctx->node_uid = 1;

View File

@@ -143,9 +143,7 @@ static int hash_cmp(const void *key1, const void *key2) {
void scc_pproc_marco_table_init(scc_pproc_macro_table_t *macros) {
Assert(macros != null);
macros->table.hash_func = hash_func;
macros->table.key_cmp = hash_cmp;
scc_hashtable_init(&macros->table);
scc_hashtable_init(&macros->table, hash_func, hash_cmp);
}
static int macro_free(const void *key, void *value, void *context) {

View File

@@ -3,10 +3,11 @@
#include <scc_pproc.h>
static int pproc_next_one_file(scc_pproc_t *pp, scc_lexer_tok_t *out) {
scc_lexer_tok_ring_t *stream = pp->cur_ring;
scc_lexer_tok_ring_t *stream = null;
scc_lexer_tok_t tok = {0};
int ok = 0;
CONTINUE:
stream = pp->cur_ring;
if (pp->expanded_ring.cap) {
scc_ring_next_consume(pp->expanded_ring, *out, ok);
if (ok == false) {
@@ -71,8 +72,9 @@ CONTINUE:
}
static int pproc_next(scc_pproc_t *pp, scc_lexer_tok_t *tok) {
int ret = pproc_next_one_file(pp, tok);
int ret = 0;
CONTINUE:
ret = pproc_next_one_file(pp, tok);
if (ret != 0) {
return true;
}