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。
|
||||
pub fn plain_date_days_in_week<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||
let _ = match receiver_obj(vm, args) {
|
||||
Ok(p) => p,
|
||||
Err(e) => return NativeResult::Err(e),
|
||||
};
|
||||
let _ = native_try!(plain_date_ymd(vm, args));
|
||||
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 日历)。
|
||||
pub fn plain_date_months_in_year<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||
let _ = match receiver_obj(vm, args) {
|
||||
Ok(p) => p,
|
||||
Err(e) => return NativeResult::Err(e),
|
||||
};
|
||||
let _ = native_try!(plain_date_ymd(vm, args));
|
||||
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。
|
||||
pub fn plain_date_era<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||
let _ = match receiver_obj(vm, args) {
|
||||
Ok(p) => p,
|
||||
Err(e) => return NativeResult::Err(e),
|
||||
};
|
||||
let _ = native_try!(plain_date_ymd(vm, args));
|
||||
NativeResult::Ok(JsValue::undefined())
|
||||
}
|
||||
|
||||
/// `Temporal.PlainDate.prototype.eraYear` getter:ISO 日历无纪元,恒 undefined。
|
||||
pub fn plain_date_era_year<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||
let _ = match receiver_obj(vm, args) {
|
||||
Ok(p) => p,
|
||||
Err(e) => return NativeResult::Err(e),
|
||||
};
|
||||
let _ = native_try!(plain_date_ymd(vm, args));
|
||||
NativeResult::Ok(JsValue::undefined())
|
||||
}
|
||||
|
||||
|
||||
@@ -965,3 +965,30 @@ fn plain_date_from_instance_preserves_calendar() {
|
||||
.unwrap();
|
||||
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