Skip to content

Conversation

@gibson042
Copy link
Member

@gibson042 gibson042 commented Jul 23, 2025

Includes #4545
Ref #4509

%TypedArray%.prototype properties

  • read-only %TypedArray%.prototype properties
    • work as expected if the receiver is backed by an immutable ArrayBuffer
    • %TypedArray%.prototype.filter throws a TypeError if the receiver constructs an instance backed by an immutable ArrayBuffer, after determining contents
    • %TypedArray%.prototype.map throws a TypeError if the receiver constructs an instance backed by an immutable ArrayBuffer, after validating that callback is callable but before invoking it
    • %TypedArray%.prototype.slice throws a TypeError if the receiver constructs an instance backed by an immutable ArrayBuffer, after coercing bounds

@gibson042 gibson042 requested a review from a team as a code owner July 23, 2025 19:21
@gibson042 gibson042 force-pushed the 2025-07-immutable-arraybuffer-typedarray-methods-readonly branch 3 times, most recently from 504e309 to 97ab546 Compare July 23, 2025 21:31
With `sedi` being a portable `sed -i`, e.g. `sed -i '' "$@"` on BSD and
`sed -i "$@"` on Linux:
```sh
git grep -l 'testWith[A-Za-z]*TypedArrayConstructors[(].*, N.*' test/built-ins/ | \
  xargs sedi -E 's#(testWith[A-Za-z]*TypedArrayConstructors[(].*), N([^a-zA-Z].*)#\1\2#'
```
With `sedi` being a portable `sed -i`, e.g. `sed -i '' "$@"` on BSD and
`sed -i "$@"` on Linux:
```sh
git grep -l 'testBigIntTypedArray[.]js' | \
  xargs sedi 's#testBigIntTypedArray[.]js#testTypedArray.js#'
```
…uctors

With `sedi` being a portable `sed -i`, e.g. `sed -i '' "$@"` on BSD and
`sed -i "$@"` on Linux:
```sh
git grep -l 'testWith[A-Za-z]*TypedArrayConstructors[(]' test/built-ins/ | \
  while read f; do
    grep -qF detachArrayBuffer.js "$f" && continue
    grep -qF '.resize(' "$f" && continue
    taCtorAliases="$(sed -nE \
      's#testWith[A-Za-z]*TypedArrayConstructors[(] *(function[^(]*[(] *|[^a-zA-Z0-9_]*)([a-zA-Z0-9_]+).*#\2#p' \
      "$f")"
    sedi -E '
      s#(testWith[A-Za-z]*TypedArrayConstructors[(] *(function[^(]*[(] *|[(] *)[a-zA-Z0-9_]+)#\1, makeCtorArg#; t;
      s#(testWith[A-Za-z]*TypedArrayConstructors[(] *)([a-zA-Z0-9_]+)#\1(\2, makeCtorArg)#; t;
      '"$(printf '%s' "$taCtorAliases" | sed -E 's/(.*)/s#\\b\1[(]([0-9.]+n?|[[][^]]*[]])[)]#\1(makeCtorArg(\\1))#/')" \
      "$f"
  done

git diff --numstat -- test/built-ins/ | \
  awk '{ print $NF }' | \
  xargs grep -c '\bmakeCtorArg\b' | \
  sed -n 's/:1$//p' | \
  xargs sedi -E '
    /makeCtorArg/,$ { s#^[}][)]#}, null, ["passthrough"])#; }
    /makeCtorArg/ { s#, makeCtorArg##; s#[(]([a-zA-Z0-9_]+)[)] =>#\1 =>#; }
  '

git diff --numstat -- test/built-ins/ | \
  awk '{ print $NF }' | \
  xargs grep -l '\bdefineProperty\b' | \
  xargs sedi -E \
    '/testWith[A-Za-z]*TypedArrayConstructors[(]/,$s#^[}][)]#}, null, ["passthrough"])#'
```
…e contents

With `sedi` being a portable `sed -i`, e.g. `sed -i '' "$@"` on BSD and
`sed -i "$@"` on Linux:
```sh
git grep -l 'testWith[A-Za-z]*TypedArrayConstructors[(]' \
    test/built-ins/TypedArray/prototype/{copyWithin,fill,reverse,set,sort} | \
  xargs sedi -E \
    '/testWith[A-Za-z]*TypedArrayConstructors[(]/,$s#^[}][)]#}, null, null, ["immutable"])#'

git grep -l 'testWith[A-Za-z]*TypedArrayConstructors[(]' \
    test/built-ins/TypedArray/prototype | \
  grep -E 'set-value-during-|predicate-call-changes-value|values-are-not-cached' | \
  xargs sedi -E \
    '/testWith[A-Za-z]*TypedArrayConstructors[(]/,$s#^[}][)]#}, null, null, ["immutable"])#'
```
@ptomato ptomato force-pushed the 2025-07-immutable-arraybuffer-typedarray-methods-readonly branch from 97ab546 to b283db3 Compare August 25, 2025 22:30
var iab = (new TA(["3", "4"])).buffer.transferToImmutable();
var result = new TA(iab);
calls.push("construct result");
return result;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wondered why this test passes even without implementing the relevant changes in %TypedArray%.prototype.filter. The root of the problem is here. This Symbol.species getter doesn't return constructor (it returns a typed array). Not returning a constructor results in the expected TypeError (before we have any chance to get to the IsImmutableBuffer() that's supposed to be checked by this test).

In other words, the getter should not return result but a function that returns result.

The same problem is in the slice and map versions of this test.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants