@ -390,6 +390,71 @@ impl GcObject {
}
}
/// Gets own property of 'Object'
///
#[ inline ]
pub fn get_own_property ( & self , key : & PropertyKey ) -> Option < PropertyDescriptor > {
let _timer = BoaProfiler ::global ( ) . start_event ( "Object::get_own_property" , "object" ) ;
let object = self . borrow ( ) ;
match object . data {
ObjectData ::String ( _ ) = > self . string_exotic_get_own_property ( key ) ,
_ = > self . ordinary_get_own_property ( key ) ,
}
}
/// StringGetOwnProperty abstract operation
///
/// More information:
/// - [ECMAScript reference][spec]
///
/// [spec]: https://tc39.es/ecma262/#sec-stringgetownproperty
#[ inline ]
pub fn string_get_own_property ( & self , key : & PropertyKey ) -> Option < PropertyDescriptor > {
let object = self . borrow ( ) ;
match key {
PropertyKey ::Index ( index ) = > {
let string = object . as_string ( ) . unwrap ( ) ;
let pos = * index as usize ;
if pos > = string . len ( ) {
return None ;
}
let result_str = string . encode_utf16 ( ) . nth ( pos ) . map ( | utf16_val | {
char ::from_u32 ( u32 ::from ( utf16_val ) )
. map_or_else ( | | Value ::from ( format! ( "\\u{:x}" , utf16_val ) ) , Value ::from )
} ) ? ;
let desc = PropertyDescriptor ::from ( DataDescriptor ::new (
result_str ,
Attribute ::READONLY | Attribute ::ENUMERABLE | Attribute ::PERMANENT ,
) ) ;
Some ( desc )
}
_ = > None ,
}
}
/// Gets own property of 'String' exotic object
///
/// More information:
/// - [ECMAScript reference][spec]
///
/// [spec]: https://tc39.es/ecma262/#sec-string-exotic-objects-getownproperty-p
#[ inline ]
pub fn string_exotic_get_own_property ( & self , key : & PropertyKey ) -> Option < PropertyDescriptor > {
let desc = self . ordinary_get_own_property ( key ) ;
if desc . is_some ( ) {
desc
} else {
self . string_get_own_property ( key )
}
}
/// The specification returns a Property Descriptor or Undefined.
///
/// These are 2 separate types and we can't do that here.
@ -399,9 +464,7 @@ impl GcObject {
///
/// [spec]: https://tc39.es/ecma262/#sec-ordinary-object-internal-methods-and-internal-slots-getownproperty-p
#[ inline ]
pub fn get_own_property ( & self , key : & PropertyKey ) -> Option < PropertyDescriptor > {
let _timer = BoaProfiler ::global ( ) . start_event ( "Object::get_own_property" , "object" ) ;
pub fn ordinary_get_own_property ( & self , key : & PropertyKey ) -> Option < PropertyDescriptor > {
let object = self . borrow ( ) ;
let property = match key {
PropertyKey ::Index ( index ) = > object . indexed_properties . get ( & index ) ,