| let intrinsics = [ |
| "Array.prototype.indexOf", |
| "Array.prototype.pop", |
| "Array.prototype.push", |
| "Array.prototype.slice", |
| "DataView.prototype.getInt8", |
| "DataView.prototype.getUint8", |
| "DataView.prototype.getInt16", |
| "DataView.prototype.getUint16", |
| "DataView.prototype.getInt32", |
| "DataView.prototype.getUint32", |
| "DataView.prototype.getFloat32", |
| "DataView.prototype.getFloat64", |
| "DataView.prototype.setInt8", |
| "DataView.prototype.setUint8", |
| "DataView.prototype.setInt16", |
| "DataView.prototype.setUint16", |
| "DataView.prototype.setInt32", |
| "DataView.prototype.setUint32", |
| "DataView.prototype.setFloat32", |
| "DataView.prototype.setFloat64", |
| "Map.prototype.get", |
| "Map.prototype.has", |
| "Map.prototype.set", |
| "Math.abs", |
| "Math.acos", |
| "Math.asin", |
| "Math.atan", |
| "Math.acosh", |
| "Math.asinh", |
| "Math.atanh", |
| "Math.cbrt", |
| "Math.ceil", |
| "Math.clz32", |
| "Math.cos", |
| "Math.cosh", |
| "Math.exp", |
| "Math.expm1", |
| "Math.floor", |
| "Math.fround", |
| "Math.log", |
| "Math.log10", |
| "Math.log1p", |
| "Math.log2", |
| "Math.max", |
| "Math.min", |
| "Math.pow", |
| "Math.random", |
| "Math.round", |
| "Math.sin", |
| "Math.sinh", |
| "Math.sqrt", |
| "Math.tan", |
| "Math.tanh", |
| "Math.trunc", |
| "Math.imul", |
| "Number.isInteger", |
| "Number.prototype.toString", |
| "Object.create", |
| "Object.getPrototypeOf", |
| "Object.is", |
| "Object.prototype.hasOwnProperty", |
| "parseInt", |
| "Set.prototype.add", |
| "Set.prototype.has", |
| "String.fromCharCode", |
| "String.prototype.charCodeAt", |
| "String.prototype.charAt", |
| "String.prototype.replace", |
| "String.prototype.slice", |
| "String.prototype.toLowerCase", |
| "String.prototype.valueOf", |
| "Reflect.getPrototypeOf", |
| "RegExp.prototype.exec", |
| "RegExp.prototype.test", |
| "WeakMap.prototype.get", |
| "WeakMap.prototype.has", |
| "WeakMap.prototype.set", |
| "WeakSet.prototype.add", |
| "WeakSet.prototype.has", |
| ]; |
| |
| if (typeof Atomics !== "undefined") { |
| intrinsics = intrinsics.concat([ |
| "Atomics.add", |
| "Atomics.and", |
| "Atomics.compareExchange", |
| "Atomics.exchange", |
| "Atomics.isLockFree", |
| "Atomics.load", |
| "Atomics.or", |
| "Atomics.store", |
| "Atomics.sub", |
| "Atomics.wait", |
| "Atomics.wake", |
| "Atomics.xor", |
| ]); |
| } |
| |
| function testGetter(intrinsic) { |
| let runTest = new Function( |
| "let x = {};" + "\n" + |
| "x.__defineGetter__('a', " + intrinsic + ");" + "\n" + |
| "function test() { x['a']; }" + "\n" + |
| "for (let i = 0; i < 1000; i++) {" + "\n" + |
| " try { test(); } catch(e) { }" + "\n" + |
| "}"); |
| runTest(); |
| } |
| |
| function testSetter(intrinsic) { |
| let runTest = new Function( |
| "let x = {};" + "\n" + |
| "x.__defineSetter__('a', " + intrinsic + ");" + "\n" + |
| "function test() { x['a'] = 42; }" + "\n" + |
| "for (let i = 0; i < 1000; i++) {" + "\n" + |
| " try { test(); } catch(e) { }" + "\n" + |
| "}"); |
| runTest(); |
| } |
| |
| for (var i = 0; i < intrinsics.length; ++i) { |
| testGetter(intrinsics[i]); |
| testSetter(intrinsics[i]); |
| } |