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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user