LibJS: Implement indexed access for StringObject

This commit is contained in:
Linus Groh 2020-05-01 13:20:47 +01:00 committed by Andreas Kling
parent a81bce8c2a
commit 1ba2e6768d
Notes: sideshowbarker 2024-07-19 07:08:18 +09:00
2 changed files with 27 additions and 0 deletions

View file

@ -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();

View 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);
}