fix: PlainDate 周/月/时代 getter 补 ensure branding 校验
This commit is contained in:
@@ -4590,10 +4590,7 @@ pub fn plain_date_days_in_month<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeRes
|
|||||||
|
|
||||||
/// `Temporal.PlainDate.prototype.daysInWeek` getter:恒 7。
|
/// `Temporal.PlainDate.prototype.daysInWeek` getter:恒 7。
|
||||||
pub fn plain_date_days_in_week<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
pub fn plain_date_days_in_week<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||||
let _ = match receiver_obj(vm, args) {
|
let _ = native_try!(plain_date_ymd(vm, args));
|
||||||
Ok(p) => p,
|
|
||||||
Err(e) => return NativeResult::Err(e),
|
|
||||||
};
|
|
||||||
NativeResult::Ok(JsValue::float(7.0))
|
NativeResult::Ok(JsValue::float(7.0))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4612,10 +4609,7 @@ pub fn plain_date_days_in_year<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResu
|
|||||||
|
|
||||||
/// `Temporal.PlainDate.prototype.monthsInYear` getter:恒 12(ISO 日历)。
|
/// `Temporal.PlainDate.prototype.monthsInYear` getter:恒 12(ISO 日历)。
|
||||||
pub fn plain_date_months_in_year<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
pub fn plain_date_months_in_year<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||||
let _ = match receiver_obj(vm, args) {
|
let _ = native_try!(plain_date_ymd(vm, args));
|
||||||
Ok(p) => p,
|
|
||||||
Err(e) => return NativeResult::Err(e),
|
|
||||||
};
|
|
||||||
NativeResult::Ok(JsValue::float(12.0))
|
NativeResult::Ok(JsValue::float(12.0))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4657,19 +4651,13 @@ pub fn plain_date_month_code<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult
|
|||||||
|
|
||||||
/// `Temporal.PlainDate.prototype.era` getter:ISO 日历无纪元,恒 undefined。
|
/// `Temporal.PlainDate.prototype.era` getter:ISO 日历无纪元,恒 undefined。
|
||||||
pub fn plain_date_era<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
pub fn plain_date_era<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||||
let _ = match receiver_obj(vm, args) {
|
let _ = native_try!(plain_date_ymd(vm, args));
|
||||||
Ok(p) => p,
|
|
||||||
Err(e) => return NativeResult::Err(e),
|
|
||||||
};
|
|
||||||
NativeResult::Ok(JsValue::undefined())
|
NativeResult::Ok(JsValue::undefined())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `Temporal.PlainDate.prototype.eraYear` getter:ISO 日历无纪元,恒 undefined。
|
/// `Temporal.PlainDate.prototype.eraYear` getter:ISO 日历无纪元,恒 undefined。
|
||||||
pub fn plain_date_era_year<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
pub fn plain_date_era_year<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||||
let _ = match receiver_obj(vm, args) {
|
let _ = native_try!(plain_date_ymd(vm, args));
|
||||||
Ok(p) => p,
|
|
||||||
Err(e) => return NativeResult::Err(e),
|
|
||||||
};
|
|
||||||
NativeResult::Ok(JsValue::undefined())
|
NativeResult::Ok(JsValue::undefined())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -965,3 +965,30 @@ fn plain_date_from_instance_preserves_calendar() {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(str_val(&vm, r), "gregory,gregory,hebrew,hebrew,gregory,gregory,hebrew");
|
assert_eq!(str_val(&vm, r), "gregory,gregory,hebrew,hebrew,gregory,gregory,hebrew");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn plain_date_brand_only_getters_require_plain_date_receiver() {
|
||||||
|
let mut vm = Vm::new();
|
||||||
|
// 4 个品牌-only getter 对普通对象 receiver 必须抛 TypeError。
|
||||||
|
// 经 property descriptor 取真实 getter 函数(原型上的 `.get` 访问不可靠,
|
||||||
|
// 会拿到 undefined),修复前只查 is_object 不查品牌 → 返回常量不抛,断言失败。
|
||||||
|
for getter in ["daysInWeek", "monthsInYear", "era", "eraYear"] {
|
||||||
|
let r = eval(
|
||||||
|
&mut vm,
|
||||||
|
&format!(
|
||||||
|
"var g = Object.getOwnPropertyDescriptor(Temporal.PlainDate.prototype, '{getter}').get; \
|
||||||
|
try {{ g.call({{}}); 'no-throw' }} catch (e) {{ e.constructor.name }}"
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(str_val(&vm, r), "TypeError", "{getter} on plain object must throw");
|
||||||
|
}
|
||||||
|
// 正常 PlainDate receiver 不回归。
|
||||||
|
let r = eval(
|
||||||
|
&mut vm,
|
||||||
|
"var p = new Temporal.PlainDate(2000, 5, 2); \
|
||||||
|
[p.daysInWeek, p.monthsInYear, p.era === undefined, p.eraYear === undefined].join(',')",
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(str_val(&vm, r), "7,12,true,true");
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user