Skip to content

Commit

Permalink
Implement Object.preventExtensions() and Object.isExtensible() (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
HalidOdat authored Aug 28, 2021
1 parent f9a82b4 commit ae73c26
Showing 1 changed file with 53 additions and 0 deletions.
53 changes: 53 additions & 0 deletions boa/src/builtins/object/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit ae73c26

Please sign in to comment.