test262 icon indicating copy to clipboard operation
test262 copied to clipboard

Missing tests for setting a TypedArray property with divergent receiver

Open gibson042 opened this issue 3 years ago • 1 comments

https://tc39.es/ecma262/multipage/ordinary-and-exotic-objects-behaviours.html#sec-integer-indexed-exotic-objects-set-p-v-receiver requires an OrdinarySet when the property is a valid integer index and the Receiver argument does not match the associated typed array object, but there does not seem to be any test coverage and not all implementations get it right:

$ eshost -sx '
  var b = new Uint8Array(3);
  var spying = true;
  var p = new Proxy(
    {},
    Object.getOwnPropertyNames(Reflect)
      .map(name => [
        name,
        (...args) => {
          var result = Reflect[name](...args);
          var resultStr = typeof result === "object" ? JSON.stringify(result) : result;
          if (spying) {
            print(` ${name}(receiver, ${String(args[1])}, ...) => ${typeof result} ${resultStr}`);
          }
          return result;
        }
      ])
      .reduce(function assignFromEntry(obj, [key, val]){ obj[key] = val; return obj; }, {})
  );
  print(`set b[0] to 256 by assignment... ${b[0] = 256} => ${b[0]}\n`);
  print(`set b[1] to 257 by Reflect.set... ${Reflect.set(b, 1, 257)} => ${b[1]}\n`);
  print(`set b[2] to 258 by Reflect.set with receiver... ${Reflect.set(b, 2, 258, p)} => ${b[2]}\n`);
  spying = false;
  print("receiver own properties...");
  var entries = Object.entries(Object.getOwnPropertyDescriptors(p));
  for (var [key, desc] of entries) print(String(key), JSON.stringify(desc));
  if (!entries.length) print("<none>");
'
#### ChakraCore, GraalJS, Hermes, SpiderMonkey, V8
set b[0] to 256 by assignment... 256 => 0

set b[1] to 257 by Reflect.set... true => 1

 getOwnPropertyDescriptor(receiver, 2, ...) => undefined undefined
 defineProperty(receiver, 2, ...) => boolean true
set b[2] to 258 by Reflect.set with receiver... true => 0

receiver own properties...
2 {"value":258,"writable":true,"enumerable":true,"configurable":true}

#### engine262, JavaScriptCore, Moddable XS
set b[0] to 256 by assignment... 256 => 0

set b[1] to 257 by Reflect.set... true => 1

set b[2] to 258 by Reflect.set with receiver... true => 2

receiver own properties...
<none>

gibson042 avatar Oct 14 '22 21:10 gibson042

Related: #3444

gibson042 avatar Oct 14 '22 21:10 gibson042