| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 // We change the stack size for the ARM64 simulator because at one point this | 28 // We change the stack size for the ARM64 simulator because at one point this |
| 29 // test enters an infinite recursion which goes through the runtime and we | 29 // test enters an infinite recursion which goes through the runtime and we |
| 30 // overflow the system stack before the simulator stack. | 30 // overflow the system stack before the simulator stack. |
| 31 | 31 |
| 32 // Flags: --harmony-proxies --sim-stack-size=500 --allow-natives-syntax | 32 // Flags: --harmony-proxies --sim-stack-size=500 --allow-natives-syntax |
| 33 | 33 |
| 34 | 34 |
| 35 // Helper. | 35 // Helper. |
| 36 | 36 |
| 37 function TestWithProxies(test, x, y, z) { | 37 function TestWithProxies(test, x, y, z) { |
| 38 test(Proxy.create, x, y, z) | 38 test(function(handler) { return new Proxy({}, handler) }, x, y, z) |
| 39 test(function(h) {return Proxy.createFunction(h, function() {})}, x, y, z) | 39 test(function(handler) { |
| 40 return Proxy.createFunction(handler, function() {}) |
| 41 }, x, y, z) |
| 40 } | 42 } |
| 41 | 43 |
| 42 | 44 |
| 43 | 45 |
| 44 // Getting property descriptors (Object.getOwnPropertyDescriptor). | 46 // Getting property descriptors (Object.getOwnPropertyDescriptor). |
| 45 | 47 |
| 46 var key | 48 var key |
| 47 | 49 |
| 48 function TestGetOwnProperty(handler) { | 50 function TestGetOwnProperty(handler) { |
| 49 TestWithProxies(TestGetOwnProperty2, handler) | 51 TestWithProxies(TestGetOwnProperty2, handler) |
| (...skipping 24 matching lines...) Expand all Loading... |
| 74 } | 76 } |
| 75 }) | 77 }) |
| 76 | 78 |
| 77 TestGetOwnProperty({ | 79 TestGetOwnProperty({ |
| 78 getOwnPropertyDescriptor: function(k) { | 80 getOwnPropertyDescriptor: function(k) { |
| 79 key = k | 81 key = k |
| 80 return {get value() { return 42 }, get configurable() { return true }} | 82 return {get value() { return 42 }, get configurable() { return true }} |
| 81 } | 83 } |
| 82 }) | 84 }) |
| 83 | 85 |
| 84 TestGetOwnProperty(Proxy.create({ | 86 TestGetOwnProperty(new Proxy({}, { |
| 85 get: function(pr, pk) { | 87 get: function(pr, pk) { |
| 86 return function(k) { key = k; return {value: 42, configurable: true} } | 88 return function(k) { key = k; return {value: 42, configurable: true} } |
| 87 } | 89 } |
| 88 })) | 90 })) |
| 89 | 91 |
| 90 | 92 |
| 91 function TestGetOwnPropertyThrow(handler) { | 93 function TestGetOwnPropertyThrow(handler) { |
| 92 TestWithProxies(TestGetOwnPropertyThrow2, handler) | 94 TestWithProxies(TestGetOwnPropertyThrow2, handler) |
| 93 } | 95 } |
| 94 | 96 |
| (...skipping 1722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1817 }, | 1819 }, |
| 1818 getOwnPropertyDescriptor: function(k) { throw "myexn" } | 1820 getOwnPropertyDescriptor: function(k) { throw "myexn" } |
| 1819 }) | 1821 }) |
| 1820 | 1822 |
| 1821 | 1823 |
| 1822 | 1824 |
| 1823 // Fixing (Object.freeze, Object.seal, Object.preventExtensions, | 1825 // Fixing (Object.freeze, Object.seal, Object.preventExtensions, |
| 1824 // Object.isFrozen, Object.isSealed, Object.isExtensible) | 1826 // Object.isFrozen, Object.isSealed, Object.isExtensible) |
| 1825 | 1827 |
| 1826 function TestFix(names, handler) { | 1828 function TestFix(names, handler) { |
| 1827 // TODO(neis): Reenable/adapt once proxies properly support these operations. | 1829 var target = {p: 77} |
| 1828 // | 1830 var assertFixing = function(o, s, f, e) { |
| 1829 // var proto = {p: 77} | 1831 assertEquals(s, Object.isSealed(o)) |
| 1830 // var assertFixing = function(o, s, f, e) { | 1832 assertEquals(f, Object.isFrozen(o)) |
| 1831 // assertEquals(s, Object.isSealed(o)) | 1833 assertEquals(e, Object.isExtensible(o)) |
| 1832 // assertEquals(f, Object.isFrozen(o)) | 1834 } |
| 1833 // assertEquals(e, Object.isExtensible(o)) | 1835 |
| 1834 // } | 1836 var p1 = new Proxy(target, handler) |
| 1835 // | 1837 assertFixing(p1, false, false, true) |
| 1836 // var p1 = Proxy.create(handler, proto) | 1838 Object.seal(p1) |
| 1837 // assertFixing(p1, false, false, true) | 1839 assertFixing(p1, true, names.length === 0, false) |
| 1838 // Object.seal(p1) | 1840 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p1).sort()) |
| 1839 // assertFixing(p1, true, names.length === 0, false) | 1841 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), |
| 1840 // assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p1).sort()) | 1842 Object.keys(p1).sort()) |
| 1841 // assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), | 1843 assertEquals(target, Object.getPrototypeOf(p1)) |
| 1842 // Object.keys(p1).sort()) | 1844 assertEquals(77, p1.p) |
| 1843 // assertEquals(proto, Object.getPrototypeOf(p1)) | 1845 for (var n in p1) { |
| 1844 // assertEquals(77, p1.p) | 1846 var desc = Object.getOwnPropertyDescriptor(p1, n) |
| 1845 // for (var n in p1) { | 1847 if (desc !== undefined) assertFalse(desc.configurable) |
| 1846 // var desc = Object.getOwnPropertyDescriptor(p1, n) | 1848 } |
| 1847 // if (desc !== undefined) assertFalse(desc.configurable) | 1849 |
| 1848 // } | 1850 var p2 = new Proxy(target, handler) |
| 1849 // | 1851 assertFixing(p2, false, false, true) |
| 1850 // var p2 = Proxy.create(handler, proto) | 1852 Object.freeze(p2) |
| 1851 // assertFixing(p2, false, false, true) | 1853 assertFixing(p2, true, true, false) |
| 1852 // Object.freeze(p2) | 1854 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p2).sort()) |
| 1853 // assertFixing(p2, true, true, false) | 1855 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), |
| 1854 // assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p2).sort()) | 1856 Object.keys(p2).sort()) |
| 1855 // assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), | 1857 assertEquals(target, Object.getPrototypeOf(p2)) |
| 1856 // Object.keys(p2).sort()) | 1858 assertEquals(77, p2.p) |
| 1857 // assertEquals(proto, Object.getPrototypeOf(p2)) | 1859 for (var n in p2) { |
| 1858 // assertEquals(77, p2.p) | 1860 var desc = Object.getOwnPropertyDescriptor(p2, n) |
| 1859 // for (var n in p2) { | 1861 if (desc !== undefined) assertFalse(desc.writable) |
| 1860 // var desc = Object.getOwnPropertyDescriptor(p2, n) | 1862 if (desc !== undefined) assertFalse(desc.configurable) |
| 1861 // if (desc !== undefined) assertFalse(desc.writable) | 1863 } |
| 1862 // if (desc !== undefined) assertFalse(desc.configurable) | 1864 |
| 1863 // } | 1865 var p3 = new Proxy(target, handler) |
| 1864 // | 1866 assertFixing(p3, false, false, true) |
| 1865 // var p3 = Proxy.create(handler, proto) | 1867 Object.preventExtensions(p3) |
| 1866 // assertFixing(p3, false, false, true) | 1868 assertFixing(p3, names.length === 0, names.length === 0, false) |
| 1867 // Object.preventExtensions(p3) | 1869 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p3).sort()) |
| 1868 // assertFixing(p3, names.length === 0, names.length === 0, false) | 1870 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), |
| 1869 // assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p3).sort()) | 1871 Object.keys(p3).sort()) |
| 1870 // assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), | 1872 assertEquals(target, Object.getPrototypeOf(p3)) |
| 1871 // Object.keys(p3).sort()) | 1873 assertEquals(77, p3.p) |
| 1872 // assertEquals(proto, Object.getPrototypeOf(p3)) | 1874 |
| 1873 // assertEquals(77, p3.p) | 1875 var p = new Proxy(target, handler) |
| 1874 // | 1876 var o = Object.create(p) |
| 1875 // var p = Proxy.create(handler, proto) | 1877 assertFixing(p, false, false, true) |
| 1876 // var o = Object.create(p) | 1878 assertFixing(o, false, false, true) |
| 1877 // assertFixing(p, false, false, true) | 1879 Object.freeze(o) |
| 1878 // assertFixing(o, false, false, true) | 1880 assertFixing(p, false, false, true) |
| 1879 // Object.freeze(o) | 1881 assertFixing(o, true, true, false) |
| 1880 // assertFixing(p, false, false, true) | |
| 1881 // assertFixing(o, true, true, false) | |
| 1882 } | 1882 } |
| 1883 | 1883 |
| 1884 TestFix([], { | 1884 TestFix([], { |
| 1885 fix: function() { return {} } | 1885 fix: function() { return {} } |
| 1886 }) | 1886 }) |
| 1887 | 1887 |
| 1888 TestFix(["a", "b", "c", "3", "zz"], { | 1888 TestFix(["a", "b", "c", "3", "zz"], { |
| 1889 fix: function() { | 1889 fix: function() { |
| 1890 return { | 1890 return { |
| 1891 a: {value: "a", writable: true, configurable: false, enumerable: true}, | 1891 a: {value: "a", writable: true, configurable: false, enumerable: true}, |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1907 TestFix(["b"], { | 1907 TestFix(["b"], { |
| 1908 get fix() { | 1908 get fix() { |
| 1909 return function() { | 1909 return function() { |
| 1910 return {b: {configurable: true, writable: true, enumerable: true}} | 1910 return {b: {configurable: true, writable: true, enumerable: true}} |
| 1911 } | 1911 } |
| 1912 } | 1912 } |
| 1913 }) | 1913 }) |
| 1914 | 1914 |
| 1915 | 1915 |
| 1916 function TestFixFunction(fix) { | 1916 function TestFixFunction(fix) { |
| 1917 // TODO(neis): Reenable/adapt once proxies properly support these operations. | 1917 var f1 = Proxy.createFunction({ |
| 1918 // | 1918 fix: function() { return {} } |
| 1919 // var f1 = Proxy.createFunction({ | 1919 }, function() {}) |
| 1920 // fix: function() { return {} } | 1920 fix(f1) |
| 1921 // }, function() {}) | 1921 assertEquals(0, f1.length) |
| 1922 // fix(f1) | 1922 |
| 1923 // assertEquals(0, f1.length) | 1923 var f2 = Proxy.createFunction({ |
| 1924 // | 1924 fix: function() { return {length: {value: 3}} } |
| 1925 // var f2 = Proxy.createFunction({ | 1925 }, function() {}) |
| 1926 // fix: function() { return {length: {value: 3}} } | 1926 fix(f2) |
| 1927 // }, function() {}) | 1927 assertEquals(3, f2.length) |
| 1928 // fix(f2) | 1928 |
| 1929 // assertEquals(3, f2.length) | 1929 var f3 = Proxy.createFunction({ |
| 1930 // | 1930 fix: function() { return {length: {value: "huh"}} } |
| 1931 // var f3 = Proxy.createFunction({ | 1931 }, function() {}) |
| 1932 // fix: function() { return {length: {value: "huh"}} } | 1932 fix(f3) |
| 1933 // }, function() {}) | 1933 assertEquals(0, f1.length) |
| 1934 // fix(f3) | |
| 1935 // assertEquals(0, f1.length) | |
| 1936 } | 1934 } |
| 1937 | 1935 |
| 1938 TestFixFunction(Object.seal) | 1936 TestFixFunction(Object.seal) |
| 1939 TestFixFunction(Object.freeze) | 1937 TestFixFunction(Object.freeze) |
| 1940 TestFixFunction(Object.preventExtensions) | 1938 TestFixFunction(Object.preventExtensions) |
| 1941 | 1939 |
| 1942 | 1940 |
| 1943 function TestFixThrow(handler) { | 1941 function TestFixThrow(handler) { |
| 1944 TestWithProxies(TestFixThrow2, handler) | 1942 TestWithProxies(TestFixThrow2, handler) |
| 1945 } | 1943 } |
| 1946 | 1944 |
| 1947 function TestFixThrow2(create, handler) { | 1945 function TestFixThrow2(create, handler) { |
| 1948 // TODO(neis): Reenable/adapt once proxies properly support these operations. | 1946 var p = create(handler, {}) |
| 1949 // | 1947 assertThrows(function(){ Object.seal(p) }, "myexn") |
| 1950 // var p = create(handler, {}) | 1948 assertThrows(function(){ Object.freeze(p) }, "myexn") |
| 1951 // assertThrows(function(){ Object.seal(p) }, "myexn") | 1949 assertThrows(function(){ Object.preventExtensions(p) }, "myexn") |
| 1952 // assertThrows(function(){ Object.freeze(p) }, "myexn") | |
| 1953 // assertThrows(function(){ Object.preventExtensions(p) }, "myexn") | |
| 1954 } | 1950 } |
| 1955 | 1951 |
| 1956 TestFixThrow({ | 1952 TestFixThrow({ |
| 1957 fix: function() { throw "myexn" } | 1953 fix: function() { throw "myexn" } |
| 1958 }) | 1954 }) |
| 1959 | 1955 |
| 1960 TestFixThrow({ | 1956 TestFixThrow({ |
| 1961 fix: function() { return this.fix2() }, | 1957 fix: function() { return this.fix2() }, |
| 1962 fix2: function() { throw "myexn" } | 1958 fix2: function() { throw "myexn" } |
| 1963 }) | 1959 }) |
| 1964 | 1960 |
| 1965 TestFixThrow({ | 1961 TestFixThrow({ |
| 1966 get fix() { throw "myexn" } | 1962 get fix() { throw "myexn" } |
| 1967 }) | 1963 }) |
| 1968 | 1964 |
| 1969 TestFixThrow({ | 1965 TestFixThrow({ |
| 1970 get fix() { | 1966 get fix() { |
| 1971 return function() { throw "myexn" } | 1967 return function() { throw "myexn" } |
| 1972 } | 1968 } |
| 1973 }) | 1969 }) |
| 1974 | 1970 |
| 1975 | 1971 |
| 1976 // Freeze a proxy in the middle of operations on it. | 1972 // Freeze a proxy in the middle of operations on it. |
| 1977 // TODO(rossberg): actual behaviour not specified consistently at the moment, | 1973 // TODO(rossberg): actual behaviour not specified consistently at the moment, |
| 1978 // just make sure that we do not crash. | 1974 // just make sure that we do not crash. |
| 1979 function TestReentrantFix(f) { | 1975 function TestReentrantFix(f) { |
| 1980 // TODO(neis): Reenable/adapt once proxies properly support these operations. | 1976 TestWithProxies(f, Object.freeze) |
| 1981 // | 1977 TestWithProxies(f, Object.seal) |
| 1982 // TestWithProxies(f, Object.freeze) | 1978 TestWithProxies(f, Object.preventExtensions) |
| 1983 // TestWithProxies(f, Object.seal) | |
| 1984 // TestWithProxies(f, Object.preventExtensions) | |
| 1985 } | 1979 } |
| 1986 | 1980 |
| 1987 TestReentrantFix(function(create, freeze) { | 1981 TestReentrantFix(function(create, freeze) { |
| 1988 var handler = { | 1982 var handler = { |
| 1989 get get() { freeze(p); return undefined }, | 1983 get get() { freeze(p); return undefined }, |
| 1990 fix: function() { return {} } | 1984 fix: function() { return {} } |
| 1991 } | 1985 } |
| 1992 var p = create(handler) | 1986 var p = create(handler) |
| 1993 // Freeze while getting get trap. | 1987 // Freeze while getting get trap. |
| 1994 try { p.x } catch (e) { assertInstanceof(e, Error) } | 1988 try { p.x } catch (e) { assertInstanceof(e, Error) } |
| (...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2329 function f() { | 2323 function f() { |
| 2330 return o.x; | 2324 return o.x; |
| 2331 } | 2325 } |
| 2332 assertEquals(10, f()); | 2326 assertEquals(10, f()); |
| 2333 assertEquals(10, f()); | 2327 assertEquals(10, f()); |
| 2334 %OptimizeFunctionOnNextCall(f); | 2328 %OptimizeFunctionOnNextCall(f); |
| 2335 assertEquals(10, f()); | 2329 assertEquals(10, f()); |
| 2336 } | 2330 } |
| 2337 | 2331 |
| 2338 TestOptWithProxyPrototype(); | 2332 TestOptWithProxyPrototype(); |
| OLD | NEW |