|
1 // Any copyright is dedicated to the Public Domain. |
|
2 // http://creativecommons.org/licenses/publicdomain/ |
|
3 // Contributor: Jim Blandy |
|
4 |
|
5 if (typeof findReferences == "function") { |
|
6 |
|
7 function makeGenerator(c) { eval(c); yield function generatorClosure() { return x; }; } |
|
8 var generator = makeGenerator('var x = 42'); |
|
9 var closure = generator.next(); |
|
10 referencesVia(closure, 'parent; generator object', generator); |
|
11 |
|
12 var o = {}; |
|
13 |
|
14 assertEq(function f() { |
|
15 return referencesVia(null, 'arguments', arguments) || |
|
16 referencesVia(null, 'baseline-args-obj', arguments); |
|
17 }(), true); |
|
18 |
|
19 var rvalueCorrect; |
|
20 |
|
21 function finallyHoldsRval() { |
|
22 try { |
|
23 return o; |
|
24 } finally { |
|
25 rvalueCorrect = referencesVia(null, 'rval', o) || |
|
26 referencesVia(null, 'baseline-rval', o); |
|
27 } |
|
28 } |
|
29 rvalueCorrect = false; |
|
30 finallyHoldsRval(); |
|
31 assertEq(rvalueCorrect, true); |
|
32 |
|
33 // Because we don't distinguish between JavaScript stack marking and C++ |
|
34 // stack marking (both use the conservative scanner), we can't really write |
|
35 // the following tests meaningfully: |
|
36 // generator frame -> generator object |
|
37 // stack frame -> local variables |
|
38 // stack frame -> this |
|
39 // stack frame -> callee |
|
40 // for(... in x) loop's reference to x |
|
41 |
|
42 reportCompare(true, true); |
|
43 } else { |
|
44 reportCompare(true, true, "test skipped: findReferences is not a function"); |
|
45 } |