diff options
author | Ben Noordhuis <info@bnoordhuis.nl> | 2013-02-25 22:45:23 +0100 |
---|---|---|
committer | Ben Noordhuis <info@bnoordhuis.nl> | 2013-02-25 23:45:02 +0100 |
commit | b15a10e7a014674ef6f71c51ad84032fb7b802e2 (patch) | |
tree | 3bb04a6cb05c7a37c385eda4521b8a9e7bcd736f /deps/v8/test/mjsunit/harmony | |
parent | 34046084c0665c8bb2dfd84683dcf29d7ffbad2d (diff) | |
download | node-new-b15a10e7a014674ef6f71c51ad84032fb7b802e2.tar.gz |
deps: downgrade v8 to 3.14.5
V8 3.15 and newer have stability and performance issues. Roll back to
a known-good version.
Diffstat (limited to 'deps/v8/test/mjsunit/harmony')
-rw-r--r-- | deps/v8/test/mjsunit/harmony/collections.js | 58 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/harmony/module-linking.js | 2 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/harmony/object-observe.js | 873 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/harmony/proxies-json.js | 178 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/harmony/proxies.js | 5 |
5 files changed, 2 insertions, 1114 deletions
diff --git a/deps/v8/test/mjsunit/harmony/collections.js b/deps/v8/test/mjsunit/harmony/collections.js index 0219f39364..f3db7ea2b7 100644 --- a/deps/v8/test/mjsunit/harmony/collections.js +++ b/deps/v8/test/mjsunit/harmony/collections.js @@ -313,60 +313,4 @@ TestBogusReceivers(bogusReceiversTestSet); // Stress Test // There is a proposed stress-test available at the es-discuss mailing list // which cannot be reasonably automated. Check it out by hand if you like: -// https://mail.mozilla.org/pipermail/es-discuss/2011-May/014096.html - - -// Set and Map size getters -var setSizeDescriptor = Object.getOwnPropertyDescriptor(Set.prototype, 'size'); -assertEquals(undefined, setSizeDescriptor.value); -assertEquals(undefined, setSizeDescriptor.set); -assertTrue(setSizeDescriptor.get instanceof Function); -assertEquals(undefined, setSizeDescriptor.get.prototype); -assertFalse(setSizeDescriptor.enumerable); -assertTrue(setSizeDescriptor.configurable); - -var s = new Set(); -assertFalse(s.hasOwnProperty('size')); -for (var i = 0; i < 10; i++) { - assertEquals(i, s.size); - s.add(i); -} -for (var i = 9; i >= 0; i--) { - s.delete(i); - assertEquals(i, s.size); -} - - -var mapSizeDescriptor = Object.getOwnPropertyDescriptor(Map.prototype, 'size'); -assertEquals(undefined, mapSizeDescriptor.value); -assertEquals(undefined, mapSizeDescriptor.set); -assertTrue(mapSizeDescriptor.get instanceof Function); -assertEquals(undefined, mapSizeDescriptor.get.prototype); -assertFalse(mapSizeDescriptor.enumerable); -assertTrue(mapSizeDescriptor.configurable); - -var m = new Map(); -assertFalse(m.hasOwnProperty('size')); -for (var i = 0; i < 10; i++) { - assertEquals(i, m.size); - m.set(i, i); -} -for (var i = 9; i >= 0; i--) { - m.delete(i); - assertEquals(i, m.size); -} - -// Test clear -var a = new Set(); -s.add(42); -assertTrue(s.has(42)); -s.clear(); -assertFalse(s.has(42)); -assertEquals(0, s.size); - -var m = new Map(); -m.set(42, true); -assertTrue(m.has(42)); -m.clear(); -assertFalse(m.has(42)); -assertEquals(0, m.size); +// https://mail.mozilla.org/pipermail/es-discuss/2011-May/014096.html
\ No newline at end of file diff --git a/deps/v8/test/mjsunit/harmony/module-linking.js b/deps/v8/test/mjsunit/harmony/module-linking.js index 3c0f18c37d..a4b272f468 100644 --- a/deps/v8/test/mjsunit/harmony/module-linking.js +++ b/deps/v8/test/mjsunit/harmony/module-linking.js @@ -112,7 +112,7 @@ module R { assertThrows(function() { eval("c = -1") }, SyntaxError) assertThrows(function() { R.c = -2 }, TypeError) - // Initialize first bunch of variables. + // Initialize first bunch or variables. export var v = 1 export let l = 2 export const c = 3 diff --git a/deps/v8/test/mjsunit/harmony/object-observe.js b/deps/v8/test/mjsunit/harmony/object-observe.js deleted file mode 100644 index 04dfb967b3..0000000000 --- a/deps/v8/test/mjsunit/harmony/object-observe.js +++ /dev/null @@ -1,873 +0,0 @@ -// Copyright 2012 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Flags: --harmony-observation --harmony-proxies --harmony-collections - -var allObservers = []; -function reset() { - allObservers.forEach(function(observer) { observer.reset(); }); -} - -function stringifyNoThrow(arg) { - try { - return JSON.stringify(arg); - } catch (e) { - return '{<circular reference>}'; - } -} - -function createObserver() { - "use strict"; // So that |this| in callback can be undefined. - - var observer = { - records: undefined, - callbackCount: 0, - reset: function() { - this.records = undefined; - this.callbackCount = 0; - }, - assertNotCalled: function() { - assertEquals(undefined, this.records); - assertEquals(0, this.callbackCount); - }, - assertCalled: function() { - assertEquals(1, this.callbackCount); - }, - assertRecordCount: function(count) { - this.assertCalled(); - assertEquals(count, this.records.length); - }, - assertCallbackRecords: function(recs) { - this.assertRecordCount(recs.length); - for (var i = 0; i < recs.length; i++) { - if ('name' in recs[i]) - recs[i].name = String(recs[i].name); - print(i, stringifyNoThrow(this.records[i]), stringifyNoThrow(recs[i])); - assertSame(this.records[i].object, recs[i].object); - assertEquals('string', typeof recs[i].type); - assertPropertiesEqual(this.records[i], recs[i]); - } - } - }; - - observer.callback = function(r) { - assertEquals(undefined, this); - assertEquals('object', typeof r); - assertTrue(r instanceof Array) - observer.records = r; - observer.callbackCount++; - }; - - observer.reset(); - allObservers.push(observer); - return observer; -} - -var observer = createObserver(); -assertEquals("function", typeof observer.callback); -var obj = {}; - -function frozenFunction() {} -Object.freeze(frozenFunction); -var nonFunction = {}; -var changeRecordWithAccessor = { type: 'foo' }; -var recordCreated = false; -Object.defineProperty(changeRecordWithAccessor, 'name', { - get: function() { - recordCreated = true; - return "bar"; - }, - enumerable: true -}) - -// Object.observe -assertThrows(function() { Object.observe("non-object", observer.callback); }, TypeError); -assertThrows(function() { Object.observe(obj, nonFunction); }, TypeError); -assertThrows(function() { Object.observe(obj, frozenFunction); }, TypeError); -assertEquals(obj, Object.observe(obj, observer.callback)); - -// Object.unobserve -assertThrows(function() { Object.unobserve(4, observer.callback); }, TypeError); -assertThrows(function() { Object.unobserve(obj, nonFunction); }, TypeError); -assertEquals(obj, Object.unobserve(obj, observer.callback)); - -// Object.getNotifier -var notifier = Object.getNotifier(obj); -assertSame(notifier, Object.getNotifier(obj)); -assertEquals(null, Object.getNotifier(Object.freeze({}))); -assertFalse(notifier.hasOwnProperty('notify')); -assertEquals([], Object.keys(notifier)); -var notifyDesc = Object.getOwnPropertyDescriptor(notifier.__proto__, 'notify'); -assertTrue(notifyDesc.configurable); -assertTrue(notifyDesc.writable); -assertFalse(notifyDesc.enumerable); -assertThrows(function() { notifier.notify({}); }, TypeError); -assertThrows(function() { notifier.notify({ type: 4 }); }, TypeError); -var notify = notifier.notify; -assertThrows(function() { notify.call(undefined, { type: 'a' }); }, TypeError); -assertThrows(function() { notify.call(null, { type: 'a' }); }, TypeError); -assertThrows(function() { notify.call(5, { type: 'a' }); }, TypeError); -assertThrows(function() { notify.call('hello', { type: 'a' }); }, TypeError); -assertThrows(function() { notify.call(false, { type: 'a' }); }, TypeError); -assertThrows(function() { notify.call({}, { type: 'a' }); }, TypeError); -assertFalse(recordCreated); -notifier.notify(changeRecordWithAccessor); -assertFalse(recordCreated); // not observed yet - -// Object.deliverChangeRecords -assertThrows(function() { Object.deliverChangeRecords(nonFunction); }, TypeError); - -Object.observe(obj, observer.callback); - -// notify uses to [[CreateOwnProperty]] to create changeRecord; -reset(); -var protoExpandoAccessed = false; -Object.defineProperty(Object.prototype, 'protoExpando', - { - configurable: true, - set: function() { protoExpandoAccessed = true; } - } -); -notifier.notify({ type: 'foo', protoExpando: 'val'}); -assertFalse(protoExpandoAccessed); -delete Object.prototype.protoExpando; -Object.deliverChangeRecords(observer.callback); - -// Multiple records are delivered. -reset(); -notifier.notify({ - type: 'updated', - name: 'foo', - expando: 1 -}); - -notifier.notify({ - object: notifier, // object property is ignored - type: 'deleted', - name: 'bar', - expando2: 'str' -}); -Object.deliverChangeRecords(observer.callback); -observer.assertCallbackRecords([ - { object: obj, name: 'foo', type: 'updated', expando: 1 }, - { object: obj, name: 'bar', type: 'deleted', expando2: 'str' } -]); - -// No delivery takes place if no records are pending -reset(); -Object.deliverChangeRecords(observer.callback); -observer.assertNotCalled(); - -// Multiple observation has no effect. -reset(); -Object.observe(obj, observer.callback); -Object.observe(obj, observer.callback); -Object.getNotifier(obj).notify({ - type: 'foo', -}); -Object.deliverChangeRecords(observer.callback); -observer.assertCalled(); - -// Observation can be stopped. -reset(); -Object.unobserve(obj, observer.callback); -Object.getNotifier(obj).notify({ - type: 'foo', -}); -Object.deliverChangeRecords(observer.callback); -observer.assertNotCalled(); - -// Multiple unobservation has no effect -reset(); -Object.unobserve(obj, observer.callback); -Object.unobserve(obj, observer.callback); -Object.getNotifier(obj).notify({ - type: 'foo', -}); -Object.deliverChangeRecords(observer.callback); -observer.assertNotCalled(); - -// Re-observation works and only includes changeRecords after of call. -reset(); -Object.getNotifier(obj).notify({ - type: 'foo', -}); -Object.observe(obj, observer.callback); -Object.getNotifier(obj).notify({ - type: 'foo', -}); -records = undefined; -Object.deliverChangeRecords(observer.callback); -observer.assertRecordCount(1); - -// Observing a continuous stream of changes, while itermittantly unobserving. -reset(); -Object.observe(obj, observer.callback); -Object.getNotifier(obj).notify({ - type: 'foo', - val: 1 -}); - -Object.unobserve(obj, observer.callback); -Object.getNotifier(obj).notify({ - type: 'foo', - val: 2 -}); - -Object.observe(obj, observer.callback); -Object.getNotifier(obj).notify({ - type: 'foo', - val: 3 -}); - -Object.unobserve(obj, observer.callback); -Object.getNotifier(obj).notify({ - type: 'foo', - val: 4 -}); - -Object.observe(obj, observer.callback); -Object.getNotifier(obj).notify({ - type: 'foo', - val: 5 -}); - -Object.unobserve(obj, observer.callback); -Object.deliverChangeRecords(observer.callback); -observer.assertCallbackRecords([ - { object: obj, type: 'foo', val: 1 }, - { object: obj, type: 'foo', val: 3 }, - { object: obj, type: 'foo', val: 5 } -]); - -// Observing multiple objects; records appear in order. -reset(); -var obj2 = {}; -var obj3 = {} -Object.observe(obj, observer.callback); -Object.observe(obj3, observer.callback); -Object.observe(obj2, observer.callback); -Object.getNotifier(obj).notify({ - type: 'foo1', -}); -Object.getNotifier(obj2).notify({ - type: 'foo2', -}); -Object.getNotifier(obj3).notify({ - type: 'foo3', -}); -Object.observe(obj3, observer.callback); -Object.deliverChangeRecords(observer.callback); -observer.assertCallbackRecords([ - { object: obj, type: 'foo1' }, - { object: obj2, type: 'foo2' }, - { object: obj3, type: 'foo3' } -]); - -// Observing named properties. -reset(); -var obj = {a: 1} -Object.observe(obj, observer.callback); -obj.a = 2; -obj["a"] = 3; -delete obj.a; -obj.a = 4; -obj.a = 4; // ignored -obj.a = 5; -Object.defineProperty(obj, "a", {value: 6}); -Object.defineProperty(obj, "a", {writable: false}); -obj.a = 7; // ignored -Object.defineProperty(obj, "a", {value: 8}); -Object.defineProperty(obj, "a", {value: 7, writable: true}); -Object.defineProperty(obj, "a", {get: function() {}}); -Object.defineProperty(obj, "a", {get: frozenFunction}); -Object.defineProperty(obj, "a", {get: frozenFunction}); // ignored -Object.defineProperty(obj, "a", {get: frozenFunction, set: frozenFunction}); -Object.defineProperty(obj, "a", {set: frozenFunction}); // ignored -Object.defineProperty(obj, "a", {get: undefined, set: frozenFunction}); -delete obj.a; -delete obj.a; -Object.defineProperty(obj, "a", {get: function() {}, configurable: true}); -Object.defineProperty(obj, "a", {value: 9, writable: true}); -obj.a = 10; -delete obj.a; -Object.defineProperty(obj, "a", {value: 11, configurable: true}); -Object.deliverChangeRecords(observer.callback); -observer.assertCallbackRecords([ - { object: obj, name: "a", type: "updated", oldValue: 1 }, - { object: obj, name: "a", type: "updated", oldValue: 2 }, - { object: obj, name: "a", type: "deleted", oldValue: 3 }, - { object: obj, name: "a", type: "new" }, - { object: obj, name: "a", type: "updated", oldValue: 4 }, - { object: obj, name: "a", type: "updated", oldValue: 5 }, - { object: obj, name: "a", type: "reconfigured", oldValue: 6 }, - { object: obj, name: "a", type: "updated", oldValue: 6 }, - { object: obj, name: "a", type: "reconfigured", oldValue: 8 }, - { object: obj, name: "a", type: "reconfigured", oldValue: 7 }, - { object: obj, name: "a", type: "reconfigured" }, - { object: obj, name: "a", type: "reconfigured" }, - { object: obj, name: "a", type: "reconfigured" }, - { object: obj, name: "a", type: "deleted" }, - { object: obj, name: "a", type: "new" }, - { object: obj, name: "a", type: "reconfigured" }, - { object: obj, name: "a", type: "updated", oldValue: 9 }, - { object: obj, name: "a", type: "deleted", oldValue: 10 }, - { object: obj, name: "a", type: "new" }, -]); - -// Observing indexed properties. -reset(); -var obj = {'1': 1} -Object.observe(obj, observer.callback); -obj[1] = 2; -obj[1] = 3; -delete obj[1]; -obj[1] = 4; -obj[1] = 4; // ignored -obj[1] = 5; -Object.defineProperty(obj, "1", {value: 6}); -Object.defineProperty(obj, "1", {writable: false}); -obj[1] = 7; // ignored -Object.defineProperty(obj, "1", {value: 8}); -Object.defineProperty(obj, "1", {value: 7, writable: true}); -Object.defineProperty(obj, "1", {get: function() {}}); -Object.defineProperty(obj, "1", {get: frozenFunction}); -Object.defineProperty(obj, "1", {get: frozenFunction}); // ignored -Object.defineProperty(obj, "1", {get: frozenFunction, set: frozenFunction}); -Object.defineProperty(obj, "1", {set: frozenFunction}); // ignored -Object.defineProperty(obj, "1", {get: undefined, set: frozenFunction}); -delete obj[1]; -delete obj[1]; -Object.defineProperty(obj, "1", {get: function() {}, configurable: true}); -Object.defineProperty(obj, "1", {value: 9, writable: true}); -obj[1] = 10; -delete obj[1]; -Object.defineProperty(obj, "1", {value: 11, configurable: true}); -Object.deliverChangeRecords(observer.callback); -observer.assertCallbackRecords([ - { object: obj, name: "1", type: "updated", oldValue: 1 }, - { object: obj, name: "1", type: "updated", oldValue: 2 }, - { object: obj, name: "1", type: "deleted", oldValue: 3 }, - { object: obj, name: "1", type: "new" }, - { object: obj, name: "1", type: "updated", oldValue: 4 }, - { object: obj, name: "1", type: "updated", oldValue: 5 }, - { object: obj, name: "1", type: "reconfigured", oldValue: 6 }, - { object: obj, name: "1", type: "updated", oldValue: 6 }, - { object: obj, name: "1", type: "reconfigured", oldValue: 8 }, - { object: obj, name: "1", type: "reconfigured", oldValue: 7 }, - { object: obj, name: "1", type: "reconfigured" }, - { object: obj, name: "1", type: "reconfigured" }, - { object: obj, name: "1", type: "reconfigured" }, - { object: obj, name: "1", type: "deleted" }, - { object: obj, name: "1", type: "new" }, - { object: obj, name: "1", type: "reconfigured" }, - { object: obj, name: "1", type: "updated", oldValue: 9 }, - { object: obj, name: "1", type: "deleted", oldValue: 10 }, - { object: obj, name: "1", type: "new" }, -]); - - -// Test all kinds of objects generically. -function TestObserveConfigurable(obj, prop) { - reset(); - obj[prop] = 1; - Object.observe(obj, observer.callback); - obj[prop] = 2; - obj[prop] = 3; - delete obj[prop]; - obj[prop] = 4; - obj[prop] = 4; // ignored - obj[prop] = 5; - Object.defineProperty(obj, prop, {value: 6}); - Object.defineProperty(obj, prop, {writable: false}); - obj[prop] = 7; // ignored - Object.defineProperty(obj, prop, {value: 8}); - Object.defineProperty(obj, prop, {value: 7, writable: true}); - Object.defineProperty(obj, prop, {get: function() {}}); - Object.defineProperty(obj, prop, {get: frozenFunction}); - Object.defineProperty(obj, prop, {get: frozenFunction}); // ignored - Object.defineProperty(obj, prop, {get: frozenFunction, set: frozenFunction}); - Object.defineProperty(obj, prop, {set: frozenFunction}); // ignored - Object.defineProperty(obj, prop, {get: undefined, set: frozenFunction}); - obj.__defineSetter__(prop, frozenFunction); // ignored - obj.__defineSetter__(prop, function() {}); - obj.__defineGetter__(prop, function() {}); - delete obj[prop]; - delete obj[prop]; // ignored - obj.__defineGetter__(prop, function() {}); - delete obj[prop]; - Object.defineProperty(obj, prop, {get: function() {}, configurable: true}); - Object.defineProperty(obj, prop, {value: 9, writable: true}); - obj[prop] = 10; - delete obj[prop]; - Object.defineProperty(obj, prop, {value: 11, configurable: true}); - Object.deliverChangeRecords(observer.callback); - observer.assertCallbackRecords([ - { object: obj, name: prop, type: "updated", oldValue: 1 }, - { object: obj, name: prop, type: "updated", oldValue: 2 }, - { object: obj, name: prop, type: "deleted", oldValue: 3 }, - { object: obj, name: prop, type: "new" }, - { object: obj, name: prop, type: "updated", oldValue: 4 }, - { object: obj, name: prop, type: "updated", oldValue: 5 }, - { object: obj, name: prop, type: "reconfigured", oldValue: 6 }, - { object: obj, name: prop, type: "updated", oldValue: 6 }, - { object: obj, name: prop, type: "reconfigured", oldValue: 8 }, - { object: obj, name: prop, type: "reconfigured", oldValue: 7 }, - { object: obj, name: prop, type: "reconfigured" }, - { object: obj, name: prop, type: "reconfigured" }, - { object: obj, name: prop, type: "reconfigured" }, - { object: obj, name: prop, type: "reconfigured" }, - { object: obj, name: prop, type: "reconfigured" }, - { object: obj, name: prop, type: "deleted" }, - { object: obj, name: prop, type: "new" }, - { object: obj, name: prop, type: "deleted" }, - { object: obj, name: prop, type: "new" }, - { object: obj, name: prop, type: "reconfigured" }, - { object: obj, name: prop, type: "updated", oldValue: 9 }, - { object: obj, name: prop, type: "deleted", oldValue: 10 }, - { object: obj, name: prop, type: "new" }, - ]); - Object.unobserve(obj, observer.callback); - delete obj[prop]; -} - -function TestObserveNonConfigurable(obj, prop, desc) { - reset(); - obj[prop] = 1; - Object.observe(obj, observer.callback); - obj[prop] = 4; - obj[prop] = 4; // ignored - obj[prop] = 5; - Object.defineProperty(obj, prop, {value: 6}); - Object.defineProperty(obj, prop, {value: 6}); // ignored - Object.defineProperty(obj, prop, {value: 7}); - Object.defineProperty(obj, prop, - {enumerable: desc.enumerable}); // ignored - Object.defineProperty(obj, prop, {writable: false}); - obj[prop] = 7; // ignored - Object.deliverChangeRecords(observer.callback); - observer.assertCallbackRecords([ - { object: obj, name: prop, type: "updated", oldValue: 1 }, - { object: obj, name: prop, type: "updated", oldValue: 4 }, - { object: obj, name: prop, type: "updated", oldValue: 5 }, - { object: obj, name: prop, type: "updated", oldValue: 6 }, - { object: obj, name: prop, type: "reconfigured", oldValue: 7 }, - ]); - Object.unobserve(obj, observer.callback); -} - -function createProxy(create, x) { - var handler = { - getPropertyDescriptor: function(k) { - for (var o = this.target; o; o = Object.getPrototypeOf(o)) { - var desc = Object.getOwnPropertyDescriptor(o, k); - if (desc) return desc; - } - return undefined; - }, - getOwnPropertyDescriptor: function(k) { - return Object.getOwnPropertyDescriptor(this.target, k); - }, - defineProperty: function(k, desc) { - var x = Object.defineProperty(this.target, k, desc); - Object.deliverChangeRecords(this.callback); - return x; - }, - delete: function(k) { - var x = delete this.target[k]; - Object.deliverChangeRecords(this.callback); - return x; - }, - getPropertyNames: function() { - return Object.getOwnPropertyNames(this.target); - }, - target: {isProxy: true}, - callback: function(changeRecords) { - print("callback", stringifyNoThrow(handler.proxy), stringifyNoThrow(got)); - for (var i in changeRecords) { - var got = changeRecords[i]; - var change = {object: handler.proxy, name: got.name, type: got.type}; - if ("oldValue" in got) change.oldValue = got.oldValue; - Object.getNotifier(handler.proxy).notify(change); - } - }, - }; - Object.observe(handler.target, handler.callback); - return handler.proxy = create(handler, x); -} - -var objects = [ - {}, - [], - this, // global object - function(){}, - (function(){ return arguments })(), - (function(){ "use strict"; return arguments })(), - Object(1), Object(true), Object("bla"), - new Date(), - Object, Function, Date, RegExp, - new Set, new Map, new WeakMap, - new ArrayBuffer(10), new Int32Array(5), - createProxy(Proxy.create, null), - createProxy(Proxy.createFunction, function(){}), -]; -var properties = ["a", "1", 1, "length", "prototype"]; - -// Cases that yield non-standard results. -// TODO(observe): ...or don't work yet. -function blacklisted(obj, prop) { - return (obj instanceof Int32Array && prop == 1) || - (obj instanceof Int32Array && prop === "length") || - (obj instanceof ArrayBuffer && prop == 1) || - // TODO(observe): oldValue when reconfiguring array length - (obj instanceof Array && prop === "length") -} - -for (var i in objects) for (var j in properties) { - var obj = objects[i]; - var prop = properties[j]; - if (blacklisted(obj, prop)) continue; - var desc = Object.getOwnPropertyDescriptor(obj, prop); - print("***", typeof obj, stringifyNoThrow(obj), prop); - if (!desc || desc.configurable) - TestObserveConfigurable(obj, prop); - else if (desc.writable) - TestObserveNonConfigurable(obj, prop, desc); -} - - -// Observing array length (including truncation) -reset(); -var arr = ['a', 'b', 'c', 'd']; -var arr2 = ['alpha', 'beta']; -var arr3 = ['hello']; -arr3[2] = 'goodbye'; -arr3.length = 6; -// TODO(adamk): Enable this test case when it can run in a reasonable -// amount of time. -//var slow_arr = new Array(1000000000); -//slow_arr[500000000] = 'hello'; -Object.defineProperty(arr, '0', {configurable: false}); -Object.defineProperty(arr, '2', {get: function(){}}); -Object.defineProperty(arr2, '0', {get: function(){}, configurable: false}); -Object.observe(arr, observer.callback); -Object.observe(arr2, observer.callback); -Object.observe(arr3, observer.callback); -arr.length = 2; -arr.length = 0; -arr.length = 10; -arr2.length = 0; -arr2.length = 1; // no change expected -arr3.length = 0; -Object.defineProperty(arr3, 'length', {value: 5}); -Object.defineProperty(arr3, 'length', {value: 10, writable: false}); -Object.deliverChangeRecords(observer.callback); -observer.assertCallbackRecords([ - { object: arr, name: '3', type: 'deleted', oldValue: 'd' }, - { object: arr, name: '2', type: 'deleted' }, - { object: arr, name: 'length', type: 'updated', oldValue: 4 }, - { object: arr, name: '1', type: 'deleted', oldValue: 'b' }, - { object: arr, name: 'length', type: 'updated', oldValue: 2 }, - { object: arr, name: 'length', type: 'updated', oldValue: 1 }, - { object: arr2, name: '1', type: 'deleted', oldValue: 'beta' }, - { object: arr2, name: 'length', type: 'updated', oldValue: 2 }, - { object: arr3, name: '2', type: 'deleted', oldValue: 'goodbye' }, - { object: arr3, name: '0', type: 'deleted', oldValue: 'hello' }, - { object: arr3, name: 'length', type: 'updated', oldValue: 6 }, - { object: arr3, name: 'length', type: 'updated', oldValue: 0 }, - { object: arr3, name: 'length', type: 'updated', oldValue: 5 }, - // TODO(adamk): This record should be merged with the above - { object: arr3, name: 'length', type: 'reconfigured' }, -]); - -// Assignments in loops (checking different IC states). -reset(); -var obj = {}; -Object.observe(obj, observer.callback); -for (var i = 0; i < 5; i++) { - obj["a" + i] = i; -} -Object.deliverChangeRecords(observer.callback); -observer.assertCallbackRecords([ - { object: obj, name: "a0", type: "new" }, - { object: obj, name: "a1", type: "new" }, - { object: obj, name: "a2", type: "new" }, - { object: obj, name: "a3", type: "new" }, - { object: obj, name: "a4", type: "new" }, -]); - -reset(); -var obj = {}; -Object.observe(obj, observer.callback); -for (var i = 0; i < 5; i++) { - obj[i] = i; -} -Object.deliverChangeRecords(observer.callback); -observer.assertCallbackRecords([ - { object: obj, name: "0", type: "new" }, - { object: obj, name: "1", type: "new" }, - { object: obj, name: "2", type: "new" }, - { object: obj, name: "3", type: "new" }, - { object: obj, name: "4", type: "new" }, -]); - -// Adding elements past the end of an array should notify on length -reset(); -var arr = [1, 2, 3]; -Object.observe(arr, observer.callback); -arr[3] = 10; -arr[100] = 20; -Object.defineProperty(arr, '200', {value: 7}); -Object.defineProperty(arr, '400', {get: function(){}}); -arr[50] = 30; // no length change expected -Object.deliverChangeRecords(observer.callback); -observer.assertCallbackRecords([ - { object: arr, name: '3', type: 'new' }, - { object: arr, name: 'length', type: 'updated', oldValue: 3 }, - { object: arr, name: '100', type: 'new' }, - { object: arr, name: 'length', type: 'updated', oldValue: 4 }, - { object: arr, name: '200', type: 'new' }, - { object: arr, name: 'length', type: 'updated', oldValue: 101 }, - { object: arr, name: '400', type: 'new' }, - { object: arr, name: 'length', type: 'updated', oldValue: 201 }, - { object: arr, name: '50', type: 'new' }, -]); - -// Tests for array methods, first on arrays and then on plain objects -// -// === ARRAYS === -// -// Push -reset(); -var array = [1, 2]; -Object.observe(array, observer.callback); -array.push(3, 4); -Object.deliverChangeRecords(observer.callback); -observer.assertCallbackRecords([ - { object: array, name: '2', type: 'new' }, - { object: array, name: 'length', type: 'updated', oldValue: 2 }, - { object: array, name: '3', type: 'new' }, - { object: array, name: 'length', type: 'updated', oldValue: 3 }, -]); - -// Pop -reset(); -var array = [1, 2]; -Object.observe(array, observer.callback); -array.pop(); -array.pop(); -Object.deliverChangeRecords(observer.callback); -observer.assertCallbackRecords([ - { object: array, name: '1', type: 'deleted', oldValue: 2 }, - { object: array, name: 'length', type: 'updated', oldValue: 2 }, - { object: array, name: '0', type: 'deleted', oldValue: 1 }, - { object: array, name: 'length', type: 'updated', oldValue: 1 }, -]); - -// Shift -reset(); -var array = [1, 2]; -Object.observe(array, observer.callback); -array.shift(); -array.shift(); -Object.deliverChangeRecords(observer.callback); -observer.assertCallbackRecords([ - { object: array, name: '0', type: 'updated', oldValue: 1 }, - { object: array, name: '1', type: 'deleted', oldValue: 2 }, - { object: array, name: 'length', type: 'updated', oldValue: 2 }, - { object: array, name: '0', type: 'deleted', oldValue: 2 }, - { object: array, name: 'length', type: 'updated', oldValue: 1 }, -]); - -// Unshift -reset(); -var array = [1, 2]; -Object.observe(array, observer.callback); -array.unshift(3, 4); -Object.deliverChangeRecords(observer.callback); -observer.assertCallbackRecords([ - { object: array, name: '3', type: 'new' }, - { object: array, name: 'length', type: 'updated', oldValue: 2 }, - { object: array, name: '2', type: 'new' }, - { object: array, name: '0', type: 'updated', oldValue: 1 }, - { object: array, name: '1', type: 'updated', oldValue: 2 }, -]); - -// Splice -reset(); -var array = [1, 2, 3]; -Object.observe(array, observer.callback); -array.splice(1, 1, 4, 5); -Object.deliverChangeRecords(observer.callback); -observer.assertCallbackRecords([ - { object: array, name: '3', type: 'new' }, - { object: array, name: 'length', type: 'updated', oldValue: 3 }, - { object: array, name: '1', type: 'updated', oldValue: 2 }, - { object: array, name: '2', type: 'updated', oldValue: 3 }, -]); - -// -// === PLAIN OBJECTS === -// -// Push -reset() -var array = {0: 1, 1: 2, length: 2} -Object.observe(array, observer.callback); -Array.prototype.push.call(array, 3, 4); -Object.deliverChangeRecords(observer.callback); -observer.assertCallbackRecords([ - { object: array, name: '2', type: 'new' }, - { object: array, name: '3', type: 'new' }, - { object: array, name: 'length', type: 'updated', oldValue: 2 }, -]); - -// Pop -reset() -var array = {0: 1, 1: 2, length: 2}; -Object.observe(array, observer.callback); -Array.prototype.pop.call(array); -Array.prototype.pop.call(array); -Object.deliverChangeRecords(observer.callback); -observer.assertCallbackRecords([ - { object: array, name: '1', type: 'deleted', oldValue: 2 }, - { object: array, name: 'length', type: 'updated', oldValue: 2 }, - { object: array, name: '0', type: 'deleted', oldValue: 1 }, - { object: array, name: 'length', type: 'updated', oldValue: 1 }, -]); - -// Shift -reset() -var array = {0: 1, 1: 2, length: 2}; -Object.observe(array, observer.callback); -Array.prototype.shift.call(array); -Array.prototype.shift.call(array); -Object.deliverChangeRecords(observer.callback); -observer.assertCallbackRecords([ - { object: array, name: '0', type: 'updated', oldValue: 1 }, - { object: array, name: '1', type: 'deleted', oldValue: 2 }, - { object: array, name: 'length', type: 'updated', oldValue: 2 }, - { object: array, name: '0', type: 'deleted', oldValue: 2 }, - { object: array, name: 'length', type: 'updated', oldValue: 1 }, -]); - -// Unshift -reset() -var array = {0: 1, 1: 2, length: 2}; -Object.observe(array, observer.callback); -Array.prototype.unshift.call(array, 3, 4); -Object.deliverChangeRecords(observer.callback); -observer.assertCallbackRecords([ - { object: array, name: '3', type: 'new' }, - { object: array, name: '2', type: 'new' }, - { object: array, name: '0', type: 'updated', oldValue: 1 }, - { object: array, name: '1', type: 'updated', oldValue: 2 }, - { object: array, name: 'length', type: 'updated', oldValue: 2 }, -]); - -// Splice -reset() -var array = {0: 1, 1: 2, 2: 3, length: 3}; -Object.observe(array, observer.callback); -Array.prototype.splice.call(array, 1, 1, 4, 5); -Object.deliverChangeRecords(observer.callback); -observer.assertCallbackRecords([ - { object: array, name: '3', type: 'new' }, - { object: array, name: '1', type: 'updated', oldValue: 2 }, - { object: array, name: '2', type: 'updated', oldValue: 3 }, - { object: array, name: 'length', type: 'updated', oldValue: 3 }, -]); - -// Exercise StoreIC_ArrayLength -reset(); -var dummy = {}; -Object.observe(dummy, observer.callback); -Object.unobserve(dummy, observer.callback); -var array = [0]; -Object.observe(array, observer.callback); -array.splice(0, 1); -Object.deliverChangeRecords(observer.callback); -observer.assertCallbackRecords([ - { object: array, name: '0', type: 'deleted', oldValue: 0 }, - { object: array, name: 'length', type: 'updated', oldValue: 1}, -]); - - -// __proto__ -reset(); -var obj = {}; -Object.observe(obj, observer.callback); -var p = {foo: 'yes'}; -var q = {bar: 'no'}; -obj.__proto__ = p; -obj.__proto__ = p; // ignored -obj.__proto__ = null; -obj.__proto__ = q; -// TODO(adamk): Add tests for objects with hidden prototypes -// once we support observing the global object. -Object.deliverChangeRecords(observer.callback); -observer.assertCallbackRecords([ - { object: obj, name: '__proto__', type: 'prototype', - oldValue: Object.prototype }, - { object: obj, name: '__proto__', type: 'prototype', oldValue: p }, - { object: obj, name: '__proto__', type: 'prototype', oldValue: null }, -]); - -// Function.prototype -reset(); -var fun = function(){}; -Object.observe(fun, observer.callback); -var myproto = {foo: 'bar'}; -fun.prototype = myproto; -fun.prototype = 7; -fun.prototype = 7; // ignored -Object.defineProperty(fun, 'prototype', {value: 8}); -Object.deliverChangeRecords(observer.callback); -observer.assertRecordCount(3); -// Manually examine the first record in order to test -// lazy creation of oldValue -assertSame(fun, observer.records[0].object); -assertEquals('prototype', observer.records[0].name); -assertEquals('updated', observer.records[0].type); -// The only existing reference to the oldValue object is in this -// record, so to test that lazy creation happened correctly -// we compare its constructor to our function (one of the invariants -// ensured when creating an object via AllocateFunctionPrototype). -assertSame(fun, observer.records[0].oldValue.constructor); -observer.records.splice(0, 1); -observer.assertCallbackRecords([ - { object: fun, name: 'prototype', type: 'updated', oldValue: myproto }, - { object: fun, name: 'prototype', type: 'updated', oldValue: 7 }, -]); - -// Function.prototype should not be observable except on the object itself -reset(); -var fun = function(){}; -var obj = { __proto__: fun }; -Object.observe(obj, observer.callback); -obj.prototype = 7; -Object.deliverChangeRecords(observer.callback); -observer.assertNotCalled(); diff --git a/deps/v8/test/mjsunit/harmony/proxies-json.js b/deps/v8/test/mjsunit/harmony/proxies-json.js deleted file mode 100644 index 539c5a84cb..0000000000 --- a/deps/v8/test/mjsunit/harmony/proxies-json.js +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright 2012 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Flags: --harmony - -function testStringify(expected, object) { - // Test fast case that bails out to slow case. - assertEquals(expected, JSON.stringify(object)); - // Test slow case. - assertEquals(expected, JSON.stringify(object, undefined, 0)); -} - -// Test serializing a proxy, function proxy and objects that contain them. -var handler1 = { - get: function(target, name) { - return name.toUpperCase(); - }, - enumerate: function(target) { - return ['a', 'b', 'c']; - }, - getOwnPropertyDescriptor: function(target, name) { - return { enumerable: true }; - } -} - -var proxy1 = Proxy.create(handler1); -testStringify('{"a":"A","b":"B","c":"C"}', proxy1); - -var proxy_fun = Proxy.createFunction(handler1, function() { return 1; }); -testStringify(undefined, proxy_fun); -testStringify('[1,null]', [1, proxy_fun]); - -var parent1a = { b: proxy1 }; -testStringify('{"b":{"a":"A","b":"B","c":"C"}}', parent1a); - -var parent1b = { a: 123, b: proxy1, c: true }; -testStringify('{"a":123,"b":{"a":"A","b":"B","c":"C"},"c":true}', parent1b); - -var parent1c = [123, proxy1, true]; -testStringify('[123,{"a":"A","b":"B","c":"C"},true]', parent1c); - -// Proxy with side effect. -var handler2 = { - get: function(target, name) { - delete parent2.c; - return name.toUpperCase(); - }, - enumerate: function(target) { - return ['a', 'b', 'c']; - }, - getOwnPropertyDescriptor: function(target, name) { - return { enumerable: true }; - } -} - -var proxy2 = Proxy.create(handler2); -var parent2 = { a: "delete", b: proxy2, c: "remove" }; -var expected2 = '{"a":"delete","b":{"a":"A","b":"B","c":"C"}}'; -assertEquals(expected2, JSON.stringify(parent2)); -parent2.c = "remove"; // Revert side effect. -assertEquals(expected2, JSON.stringify(parent2, undefined, 0)); - -// Proxy with a get function that uses the first argument. -var handler3 = { - get: function(target, name) { - if (name == 'valueOf') return function() { return "proxy" }; - return name + "(" + target + ")"; - }, - enumerate: function(target) { - return ['a', 'b', 'c']; - }, - getOwnPropertyDescriptor: function(target, name) { - return { enumerable: true }; - } -} - -var proxy3 = Proxy.create(handler3); -var parent3 = { x: 123, y: proxy3 } -testStringify('{"x":123,"y":{"a":"a(proxy)","b":"b(proxy)","c":"c(proxy)"}}', - parent3); - -// Empty proxy. -var handler4 = { - get: function(target, name) { - return 0; - }, - enumerate: function(target) { - return []; - }, - getOwnPropertyDescriptor: function(target, name) { - return { enumerable: false }; - } -} - -var proxy4 = Proxy.create(handler4); -testStringify('{}', proxy4); -testStringify('{"a":{}}', { a: proxy4 }); - -// Proxy that provides a toJSON function that uses this. -var handler5 = { - get: function(target, name) { - if (name == 'z') return 97000; - return function(key) { return key.charCodeAt(0) + this.z; }; - }, - enumerate: function(target) { - return ['toJSON', 'z']; - }, - getOwnPropertyDescriptor: function(target, name) { - return { enumerable: true }; - } -} - -var proxy5 = Proxy.create(handler5); -testStringify('{"a":97097}', { a: proxy5 }); - -// Proxy that provides a toJSON function that returns undefined. -var handler6 = { - get: function(target, name) { - return function(key) { return undefined; }; - }, - enumerate: function(target) { - return ['toJSON']; - }, - getOwnPropertyDescriptor: function(target, name) { - return { enumerable: true }; - } -} - -var proxy6 = Proxy.create(handler6); -testStringify('[1,null,true]', [1, proxy6, true]); -testStringify('{"a":1,"c":true}', {a: 1, b: proxy6, c: true}); - -// Object containing a proxy that changes the parent's properties. -var handler7 = { - get: function(target, name) { - delete parent7.a; - delete parent7.c; - parent7.e = "5"; - return name.toUpperCase(); - }, - enumerate: function(target) { - return ['a', 'b', 'c']; - }, - getOwnPropertyDescriptor: function(target, name) { - return { enumerable: true }; - } -} - -var proxy7 = Proxy.create(handler7); -var parent7 = { a: "1", b: proxy7, c: "3", d: "4" }; -assertEquals('{"a":"1","b":{"a":"A","b":"B","c":"C"},"d":"4"}', - JSON.stringify(parent7)); -assertEquals('{"b":{"a":"A","b":"B","c":"C"},"d":"4","e":"5"}', - JSON.stringify(parent7)); diff --git a/deps/v8/test/mjsunit/harmony/proxies.js b/deps/v8/test/mjsunit/harmony/proxies.js index 04fc76949e..7170ffd9c7 100644 --- a/deps/v8/test/mjsunit/harmony/proxies.js +++ b/deps/v8/test/mjsunit/harmony/proxies.js @@ -649,11 +649,6 @@ function TestSetForDerived2(create, trap) { TestSetForDerived( function(k) { - // TODO(yangguo): issue 2398 - throwing an error causes formatting of - // the message string, which can be observable through this handler. - // We ignore keys that occur when formatting the message string. - if (k == "toString" || k == "valueOf") return; - key = k; switch (k) { case "p_writable": return {writable: true, configurable: true} |