perf: 字符串 +/+= 二元拼接改 Cons rope 惰性扁平化消除 O(n²)
JsString 拆 Flat/Cons 变体:Cons 经独立 ConsNode 保存左右子节点 + O(1) 字节长 + 惰性扁平化产物缓存(OnceLock 原子发布,产物挂节点生命周期)。 concat_strings 接线:总长 ≤ 128B 的小链急切扁平(与 rope 前同款,拼接即 消费场景零开销),大链 O(1) 链接——大段重复拼接从 O(n²) 拷贝降为 O(n) 链接,文本在消费点(.length/==/string_ref/方法族)首次扁平化后缓存。 GC 兼容:mark 收口 mark_string_live 传播 Cons 子节点与产物闭包(显式栈 防深链爆栈);sweep/full_reset 共用 drop 辅助连带释放产物;节点字节记账 用 O(1) byte_len。rope 节点登记 session 字符串表,与执行期字符串 GC (指令边界触发)天然兼容。JsString 结构 32B 与 rope 前同 bin,小串路径 零结构回退;unsafe impl Send/Sync 论证同 StringPtr(perm 恒 Flat)。
This commit is contained in:
@@ -156,7 +156,7 @@ pub fn date_constructor<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||
let val = vm.reg(args[1]);
|
||||
if val.is_string() {
|
||||
// SAFETY: val 已确认是字符串值。
|
||||
let s = unsafe { (*val.as_string_ptr()).data.clone() };
|
||||
let s = unsafe { (*val.as_string_ptr()).to_owned_string() };
|
||||
let formats = ["%Y-%m-%dT%H:%M:%S%.fZ", "%Y-%m-%dT%H:%M:%S%.f"];
|
||||
let mut ts = f64::NAN;
|
||||
for fmt in &formats {
|
||||
@@ -241,7 +241,7 @@ pub fn date_parse<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||
return NativeResult::Ok(JsValue::float(f64::NAN));
|
||||
}
|
||||
// SAFETY: val 已确认是字符串值。
|
||||
let s = unsafe { (*val.as_string_ptr()).data.clone() };
|
||||
let s = unsafe { (*val.as_string_ptr()).to_owned_string() };
|
||||
let mut ts = f64::NAN;
|
||||
if let Ok(dt) = chrono::DateTime::parse_from_rfc2822(&s) {
|
||||
ts = dt.timestamp_millis() as f64;
|
||||
|
||||
@@ -22,7 +22,7 @@ pub fn json_parse<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||
}
|
||||
let text = {
|
||||
// SAFETY: val 已确认是字符串值。
|
||||
unsafe { (*val.as_string_ptr()).data.clone() }
|
||||
unsafe { (*val.as_string_ptr()).to_owned_string() }
|
||||
};
|
||||
|
||||
let parsed: serde_json::Value = match serde_json::from_str(&text) {
|
||||
@@ -172,7 +172,7 @@ fn process_space(val: JsValue) -> String {
|
||||
let clamped = (n as usize).min(10);
|
||||
" ".repeat(clamped)
|
||||
} else if val.is_string() {
|
||||
let s = unsafe { (*val.as_string_ptr()).data.clone() };
|
||||
let s = unsafe { (*val.as_string_ptr()).to_owned_string() };
|
||||
s.chars().take(10).collect()
|
||||
} else {
|
||||
let s = oxide_runtime_api::to_string(val);
|
||||
@@ -305,7 +305,7 @@ fn jsvalue_to_json<H: VmHost>(
|
||||
out.push_str(&oxide_runtime_api::js_number_to_string(n));
|
||||
}
|
||||
} else if val.is_string() {
|
||||
let s = unsafe { (*val.as_string_ptr()).data.clone() };
|
||||
let s = unsafe { (*val.as_string_ptr()).to_owned_string() };
|
||||
stringify_string(&s, out);
|
||||
} else if val.is_object() {
|
||||
let obj_ptr = val.as_js_object_ptr();
|
||||
|
||||
@@ -13,7 +13,7 @@ fn eval(source: &str) -> Result<(Vm, JsValue), String> {
|
||||
|
||||
fn stringify_val(val: &JsValue) -> String {
|
||||
if val.is_string() {
|
||||
unsafe { (*val.as_string_ptr()).data.clone() }
|
||||
unsafe { (*val.as_string_ptr()).to_owned_string() }
|
||||
} else {
|
||||
format!("{:?}", val)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user