浏览代码

LibJS: Implement indexed access for StringObject

Linus Groh 5 年之前
父节点
当前提交
1ba2e6768d
共有 2 个文件被更改,包括 27 次插入0 次删除
  1. 8 0
      Libraries/LibJS/Runtime/Object.cpp
  2. 19 0
      Libraries/LibJS/Tests/indexed-access-string-object.js

+ 8 - 0
Libraries/LibJS/Runtime/Object.cpp

@@ -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 - 0
Libraries/LibJS/Tests/indexed-access-string-object.js

@@ -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);
+}