LibJS: Implement indexed access for StringObject
This commit is contained in:
parent
a81bce8c2a
commit
1ba2e6768d
Notes:
sideshowbarker
2024-07-19 07:08:18 +09:00
Author: https://github.com/linusg Commit: https://github.com/SerenityOS/serenity/commit/1ba2e6768db Pull-request: https://github.com/SerenityOS/serenity/pull/2047 Reviewed-by: https://github.com/awesomekling
2 changed files with 27 additions and 0 deletions
|
@ -272,6 +272,12 @@ Value Object::get_by_index(i32 property_index) const
|
|||
|
||||
const Object* object = this;
|
||||
while (object) {
|
||||
if (is_string_object()) {
|
||||
auto& string = static_cast<const StringObject*>(this)->primitive_string().string();
|
||||
if (property_index < (i32)string.length())
|
||||
return js_string(heap(), string.substring(property_index, 1));
|
||||
return js_undefined();
|
||||
}
|
||||
if (static_cast<size_t>(property_index) < object->m_elements.size()) {
|
||||
auto value = object->m_elements[property_index];
|
||||
if (value.is_empty())
|
||||
|
@ -397,6 +403,8 @@ bool Object::has_own_property(const FlyString& property_name) const
|
|||
bool ok;
|
||||
i32 property_index = property_name.to_int(ok);
|
||||
if (ok && property_index >= 0) {
|
||||
if (is_string_object())
|
||||
return property_index < (i32)static_cast<const StringObject*>(this)->primitive_string().string().length();
|
||||
if (static_cast<size_t>(property_index) >= m_elements.size())
|
||||
return false;
|
||||
return !m_elements[property_index].is_empty();
|
||||
|
|
19
Libraries/LibJS/Tests/indexed-access-string-object.js
Normal file
19
Libraries/LibJS/Tests/indexed-access-string-object.js
Normal file
|
@ -0,0 +1,19 @@
|
|||
load("test-common.js");
|
||||
|
||||
try {
|
||||
var s = "foo";
|
||||
assert(s[0] === "f");
|
||||
assert(s[1] === "o");
|
||||
assert(s[2] === "o");
|
||||
assert(s[3] === undefined);
|
||||
|
||||
var o = new String("bar");
|
||||
assert(o[0] === "b");
|
||||
assert(o[1] === "a");
|
||||
assert(o[2] === "r");
|
||||
assert(o[3] === undefined);
|
||||
|
||||
console.log("PASS");
|
||||
} catch (e) {
|
||||
console.log("FAIL: " + e);
|
||||
}
|
Loading…
Add table
Reference in a new issue