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 1806 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1817 }, | 1817 }, |
1818 getOwnPropertyDescriptor: function(k) { throw "myexn" } | 1818 getOwnPropertyDescriptor: function(k) { throw "myexn" } |
1819 }) | 1819 }) |
1820 | 1820 |
1821 | 1821 |
1822 | 1822 |
1823 // Fixing (Object.freeze, Object.seal, Object.preventExtensions, | 1823 // Fixing (Object.freeze, Object.seal, Object.preventExtensions, |
1824 // Object.isFrozen, Object.isSealed, Object.isExtensible) | 1824 // Object.isFrozen, Object.isSealed, Object.isExtensible) |
1825 | 1825 |
1826 function TestFix(names, handler) { | 1826 function TestFix(names, handler) { |
1827 var proto = {p: 77} | 1827 // TODO(neis): Reenable/adapt once proxies properly support these operations. |
1828 var assertFixing = function(o, s, f, e) { | 1828 // |
1829 assertEquals(s, Object.isSealed(o)) | 1829 // var proto = {p: 77} |
1830 assertEquals(f, Object.isFrozen(o)) | 1830 // var assertFixing = function(o, s, f, e) { |
1831 assertEquals(e, Object.isExtensible(o)) | 1831 // assertEquals(s, Object.isSealed(o)) |
1832 } | 1832 // assertEquals(f, Object.isFrozen(o)) |
1833 | 1833 // assertEquals(e, Object.isExtensible(o)) |
1834 var p1 = Proxy.create(handler, proto) | 1834 // } |
1835 assertFixing(p1, false, false, true) | 1835 // |
1836 Object.seal(p1) | 1836 // var p1 = Proxy.create(handler, proto) |
1837 assertFixing(p1, true, names.length === 0, false) | 1837 // assertFixing(p1, false, false, true) |
1838 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p1).sort()) | 1838 // Object.seal(p1) |
1839 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), | 1839 // assertFixing(p1, true, names.length === 0, false) |
1840 Object.keys(p1).sort()) | 1840 // assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p1).sort()) |
1841 assertEquals(proto, Object.getPrototypeOf(p1)) | 1841 // assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), |
1842 assertEquals(77, p1.p) | 1842 // Object.keys(p1).sort()) |
1843 for (var n in p1) { | 1843 // assertEquals(proto, Object.getPrototypeOf(p1)) |
1844 var desc = Object.getOwnPropertyDescriptor(p1, n) | 1844 // assertEquals(77, p1.p) |
1845 if (desc !== undefined) assertFalse(desc.configurable) | 1845 // for (var n in p1) { |
1846 } | 1846 // var desc = Object.getOwnPropertyDescriptor(p1, n) |
1847 | 1847 // if (desc !== undefined) assertFalse(desc.configurable) |
1848 var p2 = Proxy.create(handler, proto) | 1848 // } |
1849 assertFixing(p2, false, false, true) | 1849 // |
1850 Object.freeze(p2) | 1850 // var p2 = Proxy.create(handler, proto) |
1851 assertFixing(p2, true, true, false) | 1851 // assertFixing(p2, false, false, true) |
1852 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p2).sort()) | 1852 // Object.freeze(p2) |
1853 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), | 1853 // assertFixing(p2, true, true, false) |
1854 Object.keys(p2).sort()) | 1854 // assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p2).sort()) |
1855 assertEquals(proto, Object.getPrototypeOf(p2)) | 1855 // assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), |
1856 assertEquals(77, p2.p) | 1856 // Object.keys(p2).sort()) |
1857 for (var n in p2) { | 1857 // assertEquals(proto, Object.getPrototypeOf(p2)) |
1858 var desc = Object.getOwnPropertyDescriptor(p2, n) | 1858 // assertEquals(77, p2.p) |
1859 if (desc !== undefined) assertFalse(desc.writable) | 1859 // for (var n in p2) { |
1860 if (desc !== undefined) assertFalse(desc.configurable) | 1860 // var desc = Object.getOwnPropertyDescriptor(p2, n) |
1861 } | 1861 // if (desc !== undefined) assertFalse(desc.writable) |
1862 | 1862 // if (desc !== undefined) assertFalse(desc.configurable) |
1863 var p3 = Proxy.create(handler, proto) | 1863 // } |
1864 assertFixing(p3, false, false, true) | 1864 // |
1865 Object.preventExtensions(p3) | 1865 // var p3 = Proxy.create(handler, proto) |
1866 assertFixing(p3, names.length === 0, names.length === 0, false) | 1866 // assertFixing(p3, false, false, true) |
1867 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p3).sort()) | 1867 // Object.preventExtensions(p3) |
1868 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), | 1868 // assertFixing(p3, names.length === 0, names.length === 0, false) |
1869 Object.keys(p3).sort()) | 1869 // assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p3).sort()) |
1870 assertEquals(proto, Object.getPrototypeOf(p3)) | 1870 // assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), |
1871 assertEquals(77, p3.p) | 1871 // Object.keys(p3).sort()) |
1872 | 1872 // assertEquals(proto, Object.getPrototypeOf(p3)) |
1873 var p = Proxy.create(handler, proto) | 1873 // assertEquals(77, p3.p) |
1874 var o = Object.create(p) | 1874 // |
1875 assertFixing(p, false, false, true) | 1875 // var p = Proxy.create(handler, proto) |
1876 assertFixing(o, false, false, true) | 1876 // var o = Object.create(p) |
1877 Object.freeze(o) | 1877 // assertFixing(p, false, false, true) |
1878 assertFixing(p, false, false, true) | 1878 // assertFixing(o, false, false, true) |
1879 assertFixing(o, true, true, false) | 1879 // Object.freeze(o) |
| 1880 // assertFixing(p, false, false, true) |
| 1881 // assertFixing(o, true, true, false) |
1880 } | 1882 } |
1881 | 1883 |
1882 TestFix([], { | 1884 TestFix([], { |
1883 fix: function() { return {} } | 1885 fix: function() { return {} } |
1884 }) | 1886 }) |
1885 | 1887 |
1886 TestFix(["a", "b", "c", "3", "zz"], { | 1888 TestFix(["a", "b", "c", "3", "zz"], { |
1887 fix: function() { | 1889 fix: function() { |
1888 return { | 1890 return { |
1889 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... |
1905 TestFix(["b"], { | 1907 TestFix(["b"], { |
1906 get fix() { | 1908 get fix() { |
1907 return function() { | 1909 return function() { |
1908 return {b: {configurable: true, writable: true, enumerable: true}} | 1910 return {b: {configurable: true, writable: true, enumerable: true}} |
1909 } | 1911 } |
1910 } | 1912 } |
1911 }) | 1913 }) |
1912 | 1914 |
1913 | 1915 |
1914 function TestFixFunction(fix) { | 1916 function TestFixFunction(fix) { |
1915 var f1 = Proxy.createFunction({ | 1917 // TODO(neis): Reenable/adapt once proxies properly support these operations. |
1916 fix: function() { return {} } | 1918 // |
1917 }, function() {}) | 1919 // var f1 = Proxy.createFunction({ |
1918 fix(f1) | 1920 // fix: function() { return {} } |
1919 assertEquals(0, f1.length) | 1921 // }, function() {}) |
1920 | 1922 // fix(f1) |
1921 var f2 = Proxy.createFunction({ | 1923 // assertEquals(0, f1.length) |
1922 fix: function() { return {length: {value: 3}} } | 1924 // |
1923 }, function() {}) | 1925 // var f2 = Proxy.createFunction({ |
1924 fix(f2) | 1926 // fix: function() { return {length: {value: 3}} } |
1925 assertEquals(3, f2.length) | 1927 // }, function() {}) |
1926 | 1928 // fix(f2) |
1927 var f3 = Proxy.createFunction({ | 1929 // assertEquals(3, f2.length) |
1928 fix: function() { return {length: {value: "huh"}} } | 1930 // |
1929 }, function() {}) | 1931 // var f3 = Proxy.createFunction({ |
1930 fix(f3) | 1932 // fix: function() { return {length: {value: "huh"}} } |
1931 assertEquals(0, f1.length) | 1933 // }, function() {}) |
| 1934 // fix(f3) |
| 1935 // assertEquals(0, f1.length) |
1932 } | 1936 } |
1933 | 1937 |
1934 TestFixFunction(Object.seal) | 1938 TestFixFunction(Object.seal) |
1935 TestFixFunction(Object.freeze) | 1939 TestFixFunction(Object.freeze) |
1936 TestFixFunction(Object.preventExtensions) | 1940 TestFixFunction(Object.preventExtensions) |
1937 | 1941 |
1938 | 1942 |
1939 function TestFixThrow(handler) { | 1943 function TestFixThrow(handler) { |
1940 TestWithProxies(TestFixThrow2, handler) | 1944 TestWithProxies(TestFixThrow2, handler) |
1941 } | 1945 } |
1942 | 1946 |
1943 function TestFixThrow2(create, handler) { | 1947 function TestFixThrow2(create, handler) { |
1944 var p = create(handler, {}) | 1948 // TODO(neis): Reenable/adapt once proxies properly support these operations. |
1945 assertThrows(function(){ Object.seal(p) }, "myexn") | 1949 // |
1946 assertThrows(function(){ Object.freeze(p) }, "myexn") | 1950 // var p = create(handler, {}) |
1947 assertThrows(function(){ Object.preventExtensions(p) }, "myexn") | 1951 // assertThrows(function(){ Object.seal(p) }, "myexn") |
| 1952 // assertThrows(function(){ Object.freeze(p) }, "myexn") |
| 1953 // assertThrows(function(){ Object.preventExtensions(p) }, "myexn") |
1948 } | 1954 } |
1949 | 1955 |
1950 TestFixThrow({ | 1956 TestFixThrow({ |
1951 fix: function() { throw "myexn" } | 1957 fix: function() { throw "myexn" } |
1952 }) | 1958 }) |
1953 | 1959 |
1954 TestFixThrow({ | 1960 TestFixThrow({ |
1955 fix: function() { return this.fix2() }, | 1961 fix: function() { return this.fix2() }, |
1956 fix2: function() { throw "myexn" } | 1962 fix2: function() { throw "myexn" } |
1957 }) | 1963 }) |
1958 | 1964 |
1959 TestFixThrow({ | 1965 TestFixThrow({ |
1960 get fix() { throw "myexn" } | 1966 get fix() { throw "myexn" } |
1961 }) | 1967 }) |
1962 | 1968 |
1963 TestFixThrow({ | 1969 TestFixThrow({ |
1964 get fix() { | 1970 get fix() { |
1965 return function() { throw "myexn" } | 1971 return function() { throw "myexn" } |
1966 } | 1972 } |
1967 }) | 1973 }) |
1968 | 1974 |
1969 | 1975 |
1970 // Freeze a proxy in the middle of operations on it. | 1976 // Freeze a proxy in the middle of operations on it. |
1971 // TODO(rossberg): actual behaviour not specified consistently at the moment, | 1977 // TODO(rossberg): actual behaviour not specified consistently at the moment, |
1972 // just make sure that we do not crash. | 1978 // just make sure that we do not crash. |
1973 function TestReentrantFix(f) { | 1979 function TestReentrantFix(f) { |
1974 TestWithProxies(f, Object.freeze) | 1980 // TODO(neis): Reenable/adapt once proxies properly support these operations. |
1975 TestWithProxies(f, Object.seal) | 1981 // |
1976 TestWithProxies(f, Object.preventExtensions) | 1982 // TestWithProxies(f, Object.freeze) |
| 1983 // TestWithProxies(f, Object.seal) |
| 1984 // TestWithProxies(f, Object.preventExtensions) |
1977 } | 1985 } |
1978 | 1986 |
1979 TestReentrantFix(function(create, freeze) { | 1987 TestReentrantFix(function(create, freeze) { |
1980 var handler = { | 1988 var handler = { |
1981 get get() { freeze(p); return undefined }, | 1989 get get() { freeze(p); return undefined }, |
1982 fix: function() { return {} } | 1990 fix: function() { return {} } |
1983 } | 1991 } |
1984 var p = create(handler) | 1992 var p = create(handler) |
1985 // Freeze while getting get trap. | 1993 // Freeze while getting get trap. |
1986 try { p.x } catch (e) { assertInstanceof(e, Error) } | 1994 try { p.x } catch (e) { assertInstanceof(e, Error) } |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2321 function f() { | 2329 function f() { |
2322 return o.x; | 2330 return o.x; |
2323 } | 2331 } |
2324 assertEquals(10, f()); | 2332 assertEquals(10, f()); |
2325 assertEquals(10, f()); | 2333 assertEquals(10, f()); |
2326 %OptimizeFunctionOnNextCall(f); | 2334 %OptimizeFunctionOnNextCall(f); |
2327 assertEquals(10, f()); | 2335 assertEquals(10, f()); |
2328 } | 2336 } |
2329 | 2337 |
2330 TestOptWithProxyPrototype(); | 2338 TestOptWithProxyPrototype(); |
OLD | NEW |