| var createProxy = $vm.createProxy; |
| |
| var niters = 100000; |
| |
| // proxy -> target -> x |
| function cacheOnTarget() { |
| var target = {x:42}; |
| var proxy = createProxy(target); |
| |
| var getX = function(o) { return o.x; }; |
| noInline(getX); |
| |
| var sum = 0; |
| for (var i = 0; i < niters; ++i) |
| sum += getX(proxy); |
| |
| if (sum != 42 * niters) |
| throw new Error("Incorrect result"); |
| }; |
| |
| // proxy -> target -> proto -> x |
| function cacheOnPrototypeOfTarget() { |
| var proto = {x:42}; |
| var target = Object.create(proto); |
| var proxy = createProxy(target); |
| |
| var getX = function(o) { return o.x; }; |
| noInline(getX); |
| |
| var sum = 0; |
| for (var i = 0; i < niters; ++i) |
| sum += getX(proxy); |
| |
| if (sum != 42 * niters) |
| throw new Error("Incorrect result"); |
| }; |
| |
| // base -> proto (proxy) -> target -> x |
| function dontCacheOnProxyInPrototypeChain() { |
| var target = {x:42}; |
| var protoProxy = createProxy(target); |
| var base = Object.create(protoProxy); |
| |
| var getX = function(o) { return o.x; }; |
| noInline(getX); |
| |
| var sum = 0; |
| for (var i = 0; i < niters; ++i) |
| sum += getX(base); |
| |
| if (sum != 42 * niters) |
| throw new Error("Incorrect result"); |
| }; |
| |
| // proxy -> target 1 -> proto (proxy) -> target 2 -> x |
| function dontCacheOnTargetOfProxyInPrototypeChainOfTarget() { |
| var target2 = {x:42}; |
| var protoProxy = createProxy(target2); |
| var target1 = Object.create(protoProxy); |
| var proxy = createProxy(target1); |
| |
| var getX = function(o) { return o.x; }; |
| noInline(getX); |
| |
| var sum = 0; |
| for (var i = 0; i < niters; ++i) |
| sum += getX(proxy); |
| |
| if (sum != 42 * niters) |
| throw new Error("Incorrect result"); |
| }; |
| |
| cacheOnTarget(); |
| cacheOnPrototypeOfTarget(); |
| dontCacheOnProxyInPrototypeChain(); |
| dontCacheOnTargetOfProxyInPrototypeChainOfTarget(); |