mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-26 03:31:12 +08:00
fix: escape/unescape 参数按规范抛错转换
This commit is contained in:
@@ -51,11 +51,23 @@ pub fn global_is_finite<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
|||||||
NativeResult::Ok(JsValue::bool(n.is_finite()))
|
NativeResult::Ok(JsValue::bool(n.is_finite()))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn string_arg<H: VmHost>(vm: &mut H, args: &[u8]) -> String {
|
/// `escape`/`unescape` 的字符串参数:按规范 `? ToString` 完整转换。
|
||||||
|
///
|
||||||
|
/// 对象经 ToPrimitive(string hint) 强制转换,Symbol 抛 TypeError,对象方法
|
||||||
|
/// 抛出的原生异常原样传播;缺省参数按 "undefined" 处理。
|
||||||
|
fn string_arg_full<H: VmHost>(vm: &mut H, args: &[u8]) -> Result<String, JsValue> {
|
||||||
if args.len() > 1 {
|
if args.len() > 1 {
|
||||||
oxide_runtime_api::to_string(vm.reg(args[1]))
|
match oxide_runtime_api::to_string_full(vm.reg(args[1]), vm) {
|
||||||
|
Ok(s) => Ok(s),
|
||||||
|
Err(_) => {
|
||||||
|
if let Some(exc) = vm.take_uncaught_value() {
|
||||||
|
return Err(exc);
|
||||||
|
}
|
||||||
|
Err(crate::error::create_type_error(vm, "Cannot convert value to a string"))
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
"undefined".to_string()
|
Ok("undefined".to_string())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -89,15 +89,25 @@ fn unescape_string(input: &str) -> String {
|
|||||||
|
|
||||||
/// Annex B 的全局 `escape(string)`:除 ASCII 字母数字与 `@*_+-./` 外全部编码。
|
/// Annex B 的全局 `escape(string)`:除 ASCII 字母数字与 `@*_+-./` 外全部编码。
|
||||||
/// <=0xFF 字符用 `%XX`,其它按 UTF-16 code unit 用 `%uXXXX` 转义。
|
/// <=0xFF 字符用 `%XX`,其它按 UTF-16 code unit 用 `%uXXXX` 转义。
|
||||||
|
/// 参数按 `? ToString` 完整转换:Symbol 抛 TypeError,对象方法抛出的原生
|
||||||
|
/// 异常原样传播。
|
||||||
pub fn js_escape<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
pub fn js_escape<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||||
let input = super::string_arg(vm, args);
|
let input = match super::string_arg_full(vm, args) {
|
||||||
|
Ok(s) => s,
|
||||||
|
Err(exc) => return NativeResult::Err(exc),
|
||||||
|
};
|
||||||
NativeResult::Ok(vm.new_string(&escape_string(&input)))
|
NativeResult::Ok(vm.new_string(&escape_string(&input)))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Annex B 的全局 `unescape(string)`:解码 `escape` 生成的 `%XX`/`%uXXXX` 序列,
|
/// Annex B 的全局 `unescape(string)`:解码 `escape` 生成的 `%XX`/`%uXXXX` 序列,
|
||||||
/// 支持 surrogate pair 合并;无法解析的序列原样保留。
|
/// 支持 surrogate pair 合并;无法解析的序列原样保留。
|
||||||
|
/// 参数按 `? ToString` 完整转换:Symbol 抛 TypeError,对象方法抛出的原生
|
||||||
|
/// 异常原样传播。
|
||||||
pub fn js_unescape<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
pub fn js_unescape<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||||
let input = super::string_arg(vm, args);
|
let input = match super::string_arg_full(vm, args) {
|
||||||
|
Ok(s) => s,
|
||||||
|
Err(exc) => return NativeResult::Err(exc),
|
||||||
|
};
|
||||||
NativeResult::Ok(vm.new_string(&unescape_string(&input)))
|
NativeResult::Ok(vm.new_string(&unescape_string(&input)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user