vm: accessor properties get converted to data properties inside the vm
Example:
'use strict';
const vm = require('vm');
const x = {};
Object.defineProperty(x, 'prop', {
get() { return 'foo'; }
});
const o = vm.createContext(x);
const code = 'Object.getOwnPropertyDescriptor(this, "prop")';
const res = vm.runInContext(code, o, 'test');
console.log(res);
gives
$ iojs test.js
Object {
value: 'foo',
writable: true,
enumerable: false,
configurable: false }
In https://github.com/nodejs/node/commit/659dadd410a2a0851dd16ca6f8f5e3103bfaf7da I fixed it to return the correct data descriptor. But it appears the accessor descriptor is just broken.
As far as I can tell this is a shortcoming of the V8 API. The named properties handler and the GlobalPropertyQueryCallback always returns data descriptors. This is probably because that is all that is required by Web IDL for the browser use case, where the named property handler is meant to be used for things like window.idOrName
or window.forms.foo
, which are always data descriptors.
I think Chrome also has this problem. Even for non-named properties, things like window.top
are data descriptors. I'm asking related questions on blink-dev.
Original discovery: https://github.com/tmpvar/jsdom/issues/1208, where this is affecting Facebook's use in jest.
/cc @nodejs/v8