1var niters = 100000;
2
3// proxy -> target -> x
4function cacheOnTarget() {
5    var target = {x:42};
6    var proxy = createProxy(target);
7
8    var getX = function(o) { return o.x; };
9    noInline(getX);
10
11    var sum = 0;
12    for (var i = 0; i < niters; ++i)
13        sum += getX(proxy);
14
15    if (sum != 42 * niters)
16        throw new Error("Incorrect result");
17};
18
19// proxy -> target -> proto -> x
20function cacheOnPrototypeOfTarget() {
21    var proto = {x:42};
22    var target = Object.create(proto);
23    var proxy = createProxy(target);
24
25    var getX = function(o) { return o.x; };
26    noInline(getX);
27
28    var sum = 0;
29    for (var i = 0; i < niters; ++i)
30        sum += getX(proxy);
31
32    if (sum != 42 * niters)
33        throw new Error("Incorrect result");
34};
35
36// base -> proto (proxy) -> target -> x
37function dontCacheOnProxyInPrototypeChain() {
38    var target = {x:42};
39    var protoProxy = createProxy(target);
40    var base = Object.create(protoProxy);
41
42    var getX = function(o) { return o.x; };
43    noInline(getX);
44
45    var sum = 0;
46    for (var i = 0; i < niters; ++i)
47        sum += getX(base);
48
49    if (sum != 42 * niters)
50        throw new Error("Incorrect result");
51};
52
53// proxy -> target 1 -> proto (proxy) -> target 2 -> x
54function dontCacheOnTargetOfProxyInPrototypeChainOfTarget() {
55    var target2 = {x:42};
56    var protoProxy = createProxy(target2);
57    var target1 = Object.create(protoProxy);
58    var proxy = createProxy(target1);
59
60    var getX = function(o) { return o.x; };
61    noInline(getX);
62
63    var sum = 0;
64    for (var i = 0; i < niters; ++i)
65        sum += getX(proxy);
66
67    if (sum != 42 * niters)
68        throw new Error("Incorrect result");
69};
70
71cacheOnTarget();
72cacheOnPrototypeOfTarget();
73dontCacheOnProxyInPrototypeChain();
74dontCacheOnTargetOfProxyInPrototypeChainOfTarget();
75