feat(ir): 重构指针操作API并优化数组访问逻辑

- 将scc_ir_builder_get_ptr重命名为scc_ir_builder_get_elem_ptr以更好地反映其功能
- 移除旧的GET_PTR相关枚举和结构体定义
- 更新IR构建器中指针类型的处理逻辑,支持数组元素指针计算
- 在代码生成阶段正确处理元素指针操作的索引计算

fix(ast2ir): 修正数组下标表达式的指针获取操作

- 将数组访问中的get_ptr调用替换为get_elem_ptr
- 确保数组元素访问使用正确的IR指令

perf(runtime): 优化fprintf函数的大字符串处理性能

- 实现动态缓冲区分配策略,小字符串使用栈缓冲区,大字符串使用堆分配
- 避免固定大小缓冲区可能导致的截断问题
- 添加适当的内存清理机制
This commit is contained in:
zzy
2026-04-11 10:12:22 +08:00
parent eeb4c4fc3c
commit 053c6abf51
9 changed files with 106 additions and 63 deletions

View File

@@ -79,8 +79,33 @@ int scc_fprintf(scc_file_t file, const char *format, ...) {
}
int scc_vfprintf(scc_file_t file, const char *format, va_list args) {
char buf[4096] = {0};
int size = vsnprintf_(buf, sizeof(buf), format, args);
va_list args_copy;
va_copy(args_copy, args);
// 先计算所需长度
int required_size = vsnprintf_(nullptr, 0, format, args_copy);
va_end(args_copy);
if (required_size < 0)
return -1;
char *buf = nullptr;
int size = 0;
if (required_size < 4096) {
// 小输出使用栈上缓冲区
char stack_buf[4096];
size = vsnprintf_(stack_buf, sizeof(stack_buf), format, args);
buf = stack_buf;
} else {
// 大输出使用堆分配
buf = scc_pal_malloc(required_size + 1);
if (!buf)
return -1;
size = vsnprintf_(buf, required_size + 1, format, args);
}
// 输出处理...
if (file == scc_stdout) {
scc_pal_write(buf, size);
} else if (file == scc_stderr) {
@@ -88,6 +113,12 @@ int scc_vfprintf(scc_file_t file, const char *format, va_list args) {
} else {
scc_pal_fwrite(file, buf, size);
}
// 如果使用了堆分配,释放内存
if (buf && required_size >= 4096) {
scc_pal_free(buf);
}
return size;
}