]> git.kaiwu.me - quickjs.git/commitdiff
added missing extensibility test for generic arrays in JS_CreateProperty() (#593)
authorFabrice Bellard <fabrice@bellard.org>
Sat, 7 Nov 2026 11:07:51 +0000 (12:07 +0100)
committerFabrice Bellard <fabrice@bellard.org>
Sat, 7 Nov 2026 11:07:51 +0000 (12:07 +0100)
quickjs.c
tests/test_builtin.js

index b3288733051f8275d6aefde0ae56dc0a82ab9534..ccd86d4097f5021a64478d2b353b39eeb15c97a0 100644 (file)
--- a/quickjs.c
+++ b/quickjs.c
@@ -10389,6 +10389,8 @@ static int JS_CreateProperty(JSContext *ctx, JSObject *p,
                 JSShapeProperty *pslen;
             generic_array:
                 /* update the length field */
+                if (!p->extensible)
+                    goto not_extensible;
                 plen = &p->prop[0];
                 JS_ToUint32(ctx, &len, plen->u.value);
                 if ((idx + 1) > len) {
index 808801acc848746caf10d7671a9b9b4eda7bbf2f..d0e1691480b9b957f06231d25410083805496a73 100644 (file)
@@ -242,6 +242,31 @@ function test_array()
     a[10] = 2;
     assert(a.length, 11);
     assert(a.toString(), ",,,,,,,,,,2");
+
+    test_array_extension();
+}
+
+function test_array_extension()
+{
+    "use strict";
+    var a, c, s, o;
+    /* array prevent extension */
+    var b = [1, , 3];                    // a hole: not a fast array
+    Object.preventExtensions(b);
+    assert_throws(TypeError, () => b[3] = 9);
+    assert(b.length, 3);
+    
+    var c = [1, , 3]; Object.preventExtensions(c);
+    assert_throws(TypeError, () => c.push(9));
+    assert(c.length, 3);
+    
+    var s = [1, , 3]; Object.seal(s);
+    assert_throws(TypeError, () => s[5] = 1);
+    assert(s.length, 3);
+    
+    var o = [1, , 3]; Object.preventExtensions(o);
+    assert(Reflect.defineProperty(o, 7, { value: 1 }), false);
+    assert(o.length, 3);
 }
 
 function test_string()