Browse Source

Implement `Object.preventExtensions()` and `Object.isExtensible()` (#1525)

pull/1536/head
Halid Odat 3 years ago committed by GitHub
parent
commit
ae73c261a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 53
      boa/src/builtins/object/mod.rs

53
boa/src/builtins/object/mod.rs

@ -72,6 +72,8 @@ impl BuiltIn for Object {
.static_method(Self::is_sealed, "isSealed", 1)
.static_method(Self::freeze, "freeze", 1)
.static_method(Self::is_frozen, "isFrozen", 1)
.static_method(Self::prevent_extensions, "preventExtensions", 1)
.static_method(Self::is_extensible, "isExtensible", 1)
.static_method(
Self::get_own_property_descriptor,
"getOwnPropertyDescriptor",
@ -781,6 +783,57 @@ impl Object {
Ok(JsValue::new(true))
}
}
/// `Object.preventExtensions( target )`
///
/// More information:
/// - [ECMAScript reference][spec]
/// - [MDN documentation][mdn]
///
/// [spec]: https://tc39.es/ecma262/#sec-object.preventextensions
/// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/preventExtensions
pub fn prevent_extensions(
_: &JsValue,
args: &[JsValue],
context: &mut Context,
) -> JsResult<JsValue> {
let o = args.get(0).cloned().unwrap_or_default();
if let Some(o) = o.as_object() {
// 2. Let status be ? O.[[PreventExtensions]]().
let status = o.__prevent_extensions__(context)?;
// 3. If status is false, throw a TypeError exception.
if !status {
return context.throw_type_error("cannot prevent extensions");
}
}
// 1. If Type(O) is not Object, return O.
// 4. Return O.
Ok(o)
}
/// `Object.isExtensible( target )`
///
/// More information:
/// - [ECMAScript reference][spec]
/// - [MDN documentation][mdn]
///
/// [spec]: https://tc39.es/ecma262/#sec-object.isextensible
/// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible
pub fn is_extensible(
_: &JsValue,
args: &[JsValue],
context: &mut Context,
) -> JsResult<JsValue> {
let o = args.get(0).cloned().unwrap_or_default();
// 1. If Type(O) is not Object, return false.
if let Some(o) = o.as_object() {
// 2. Return ? IsExtensible(O).
Ok(o.is_extensible(context)?.into())
} else {
Ok(JsValue::new(false))
}
}
}
/// The abstract operation ObjectDefineProperties

Loading…
Cancel
Save