author | dcubed |
Tue, 15 Oct 2013 08:25:43 -0700 | |
changeset 20686 | 1fa9a75192c3 |
parent 19097 | f544a2ea40ef |
child 24206 | 40c6d45af73f |
child 24719 | f726e9d67629 |
permissions | -rw-r--r-- |
16206
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
1 |
/* |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
2 |
* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
4 |
* |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
5 |
* This code is free software; you can redistribute it and/or modify it |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
7 |
* published by the Free Software Foundation. |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
8 |
* |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
9 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
10 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
11 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
12 |
* version 2 for more details (a copy is included in the LICENSE file that |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
13 |
* accompanied this code). |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
14 |
* |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
15 |
* You should have received a copy of the GNU General Public License version |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
16 |
* 2 along with this work; if not, write to the Free Software Foundation, |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
17 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
18 |
* |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
19 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
20 |
* or visit www.oracle.com if you need additional information or have any |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
21 |
* questions. |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
22 |
*/ |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
23 |
|
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
24 |
/** |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
25 |
* JDK-8006529 : Methods should not always get callee parameter, and they |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
26 |
* should not be too eager in creation of scopes. |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
27 |
* |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
28 |
* @test |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
29 |
* @run |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
30 |
*/ |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
31 |
|
16226
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
32 |
/* |
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
33 |
* This test script depends on nashorn Compiler internals. It uses reflection |
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
34 |
* to get access to private field and many public methods of Compiler and |
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
35 |
* FunctionNode classes. Note that this is trusted code and access to such |
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
36 |
* internal package classes and methods is okay. But, if you modify any |
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
37 |
* Compiler or FunctionNode class, you may have to revisit this script. |
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
38 |
* We cannot use direct Java class (via dynalink bean linker) to Compiler |
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
39 |
* and FunctionNode because of package-access check and so reflective calls. |
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
40 |
*/ |
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
41 |
|
19097
f544a2ea40ef
8021262: Make nashorn access checks consistent with underlying dynalink
sundar
parents:
19094
diff
changeset
|
42 |
var forName = java.lang.Class["forName(String)"]; |
f544a2ea40ef
8021262: Make nashorn access checks consistent with underlying dynalink
sundar
parents:
19094
diff
changeset
|
43 |
var Parser = forName("jdk.nashorn.internal.parser.Parser").static |
f544a2ea40ef
8021262: Make nashorn access checks consistent with underlying dynalink
sundar
parents:
19094
diff
changeset
|
44 |
var Compiler = forName("jdk.nashorn.internal.codegen.Compiler").static |
f544a2ea40ef
8021262: Make nashorn access checks consistent with underlying dynalink
sundar
parents:
19094
diff
changeset
|
45 |
var Context = forName("jdk.nashorn.internal.runtime.Context").static |
f544a2ea40ef
8021262: Make nashorn access checks consistent with underlying dynalink
sundar
parents:
19094
diff
changeset
|
46 |
var ScriptEnvironment = forName("jdk.nashorn.internal.runtime.ScriptEnvironment").static |
f544a2ea40ef
8021262: Make nashorn access checks consistent with underlying dynalink
sundar
parents:
19094
diff
changeset
|
47 |
var Source = forName("jdk.nashorn.internal.runtime.Source").static |
f544a2ea40ef
8021262: Make nashorn access checks consistent with underlying dynalink
sundar
parents:
19094
diff
changeset
|
48 |
var FunctionNode = forName("jdk.nashorn.internal.ir.FunctionNode").static |
f544a2ea40ef
8021262: Make nashorn access checks consistent with underlying dynalink
sundar
parents:
19094
diff
changeset
|
49 |
var Block = forName("jdk.nashorn.internal.ir.Block").static |
f544a2ea40ef
8021262: Make nashorn access checks consistent with underlying dynalink
sundar
parents:
19094
diff
changeset
|
50 |
var VarNode = forName("jdk.nashorn.internal.ir.VarNode").static |
f544a2ea40ef
8021262: Make nashorn access checks consistent with underlying dynalink
sundar
parents:
19094
diff
changeset
|
51 |
var ExpressionStatement = forName("jdk.nashorn.internal.ir.ExpressionStatement").static |
f544a2ea40ef
8021262: Make nashorn access checks consistent with underlying dynalink
sundar
parents:
19094
diff
changeset
|
52 |
var UnaryNode = forName("jdk.nashorn.internal.ir.UnaryNode").static |
f544a2ea40ef
8021262: Make nashorn access checks consistent with underlying dynalink
sundar
parents:
19094
diff
changeset
|
53 |
var BinaryNode = forName("jdk.nashorn.internal.ir.BinaryNode").static |
f544a2ea40ef
8021262: Make nashorn access checks consistent with underlying dynalink
sundar
parents:
19094
diff
changeset
|
54 |
var ThrowErrorManager = forName("jdk.nashorn.internal.runtime.Context$ThrowErrorManager").static |
f544a2ea40ef
8021262: Make nashorn access checks consistent with underlying dynalink
sundar
parents:
19094
diff
changeset
|
55 |
var ErrorManager = forName("jdk.nashorn.internal.runtime.ErrorManager").static |
f544a2ea40ef
8021262: Make nashorn access checks consistent with underlying dynalink
sundar
parents:
19094
diff
changeset
|
56 |
var Debug = forName("jdk.nashorn.internal.runtime.Debug").static |
18859 | 57 |
|
16233
95d3e01c04c3
8008199: Lazy compilation and trampoline implementation
lagergren
parents:
16226
diff
changeset
|
58 |
var parseMethod = Parser.class.getMethod("parse"); |
18859 | 59 |
var compileMethod = Compiler.class.getMethod("compile", FunctionNode.class); |
60 |
var getBodyMethod = FunctionNode.class.getMethod("getBody"); |
|
61 |
var getStatementsMethod = Block.class.getMethod("getStatements"); |
|
62 |
var getInitMethod = VarNode.class.getMethod("getInit"); |
|
18867
bc91e3fcc5ba
8013925: Remove symbol fields from nodes that don't need them
attila
parents:
18865
diff
changeset
|
63 |
var getExpressionMethod = ExpressionStatement.class.getMethod("getExpression") |
18859 | 64 |
var rhsMethod = UnaryNode.class.getMethod("rhs") |
65 |
var lhsMethod = BinaryNode.class.getMethod("lhs") |
|
66 |
var binaryRhsMethod = BinaryNode.class.getMethod("rhs") |
|
67 |
var debugIdMethod = Debug.class.getMethod("id", java.lang.Object.class) |
|
16226
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
68 |
|
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
69 |
// These are method names of methods in FunctionNode class |
18859 | 70 |
var allAssertionList = ['isVarArg', 'needsParentScope', 'needsCallee', 'hasScopeBlock', 'needsSelfSymbol', 'isSplit', 'hasEval', 'allVarsInScope', 'isStrict'] |
16226
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
71 |
|
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
72 |
// corresponding Method objects of FunctionNode class |
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
73 |
var functionNodeMethods = {}; |
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
74 |
// initialize FunctionNode methods |
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
75 |
(function() { |
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
76 |
for (var f in allAssertionList) { |
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
77 |
var method = allAssertionList[f]; |
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
78 |
functionNodeMethods[method] = FunctionNode.class.getMethod(method); |
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
79 |
} |
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
80 |
})(); |
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
81 |
|
18859 | 82 |
// returns functionNode.getBody().getStatements().get(0) |
83 |
function getFirstFunction(functionNode) { |
|
84 |
var f = findFunction(getBodyMethod.invoke(functionNode)) |
|
85 |
if (f == null) { |
|
86 |
throw new Error(); |
|
87 |
} |
|
88 |
return f; |
|
16226
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
89 |
} |
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
90 |
|
18859 | 91 |
function findFunction(node) { |
92 |
if(node instanceof Block) { |
|
93 |
var stmts = getStatementsMethod.invoke(node) |
|
94 |
for(var i = 0; i < stmts.size(); ++i) { |
|
95 |
var retval = findFunction(stmts.get(i)) |
|
96 |
if(retval != null) { |
|
97 |
return retval; |
|
98 |
} |
|
99 |
} |
|
100 |
} else if(node instanceof VarNode) { |
|
101 |
return findFunction(getInitMethod.invoke(node)) |
|
102 |
} else if(node instanceof UnaryNode) { |
|
103 |
return findFunction(rhsMethod.invoke(node)) |
|
104 |
} else if(node instanceof BinaryNode) { |
|
105 |
return findFunction(lhsMethod.invoke(node)) || findFunction(binaryRhsMethod.invoke(node)) |
|
18867
bc91e3fcc5ba
8013925: Remove symbol fields from nodes that don't need them
attila
parents:
18865
diff
changeset
|
106 |
} else if(node instanceof ExpressionStatement) { |
18859 | 107 |
return findFunction(getExpressionMethod.invoke(node)) |
108 |
} else if(node instanceof FunctionNode) { |
|
109 |
return node |
|
110 |
} |
|
16226
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
111 |
} |
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
112 |
|
18859 | 113 |
var getContextMethod = Context.class.getMethod("getContext") |
114 |
var getEnvMethod = Context.class.getMethod("getEnv") |
|
115 |
||
19093
49bb7e75b326
8021189: Prevent access to constructors of restricted classes
attila
parents:
18867
diff
changeset
|
116 |
var SourceConstructor = Source.class.getConstructor(java.lang.String.class, java.lang.String.class) |
49bb7e75b326
8021189: Prevent access to constructors of restricted classes
attila
parents:
18867
diff
changeset
|
117 |
var ParserConstructor = Parser.class.getConstructor(ScriptEnvironment.class, Source.class, ErrorManager.class) |
49bb7e75b326
8021189: Prevent access to constructors of restricted classes
attila
parents:
18867
diff
changeset
|
118 |
var CompilerConstructor = Compiler.class.getConstructor(ScriptEnvironment.class) |
49bb7e75b326
8021189: Prevent access to constructors of restricted classes
attila
parents:
18867
diff
changeset
|
119 |
|
16206
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
120 |
// compile(script) -- compiles a script specified as a string with its |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
121 |
// source code, returns a jdk.nashorn.internal.ir.FunctionNode object |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
122 |
// representing it. |
16226
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
123 |
function compile(source) { |
19093
49bb7e75b326
8021189: Prevent access to constructors of restricted classes
attila
parents:
18867
diff
changeset
|
124 |
var source = SourceConstructor.newInstance("<no name>", source); |
18859 | 125 |
|
126 |
var env = getEnvMethod.invoke(getContextMethod.invoke(null)) |
|
16233
95d3e01c04c3
8008199: Lazy compilation and trampoline implementation
lagergren
parents:
16226
diff
changeset
|
127 |
|
19094 | 128 |
var parser = ParserConstructor.newInstance(env, source, ThrowErrorManager.class.newInstance()); |
18859 | 129 |
var func = parseMethod.invoke(parser); |
16233
95d3e01c04c3
8008199: Lazy compilation and trampoline implementation
lagergren
parents:
16226
diff
changeset
|
130 |
|
19093
49bb7e75b326
8021189: Prevent access to constructors of restricted classes
attila
parents:
18867
diff
changeset
|
131 |
var compiler = CompilerConstructor.newInstance(env); |
18859 | 132 |
|
133 |
return compileMethod.invoke(compiler, func); |
|
16226
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
134 |
}; |
16206
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
135 |
|
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
136 |
var allAssertions = (function() { |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
137 |
var allAssertions = {} |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
138 |
for(var assertion in allAssertionList) { |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
139 |
allAssertions[allAssertionList[assertion]] = true |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
140 |
} |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
141 |
return allAssertions; |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
142 |
})(); |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
143 |
|
16226
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
144 |
|
16206
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
145 |
// test(f[, assertions...]) tests whether all the specified assertions on the |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
146 |
// passed function node are true. |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
147 |
function test(f) { |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
148 |
var assertions = {} |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
149 |
for(var i = 1; i < arguments.length; ++i) { |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
150 |
var assertion = arguments[i] |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
151 |
if(!allAssertions[assertion]) { |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
152 |
throw "Unknown assertion " + assertion + " for " + f; |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
153 |
} |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
154 |
assertions[assertion] = true |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
155 |
} |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
156 |
for(var assertion in allAssertions) { |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
157 |
var expectedValue = !!assertions[assertion] |
18859 | 158 |
var actualValue = functionNodeMethods[assertion].invoke(f) |
159 |
if(actualValue !== expectedValue) { |
|
160 |
throw "Expected " + assertion + " === " + expectedValue + ", got " + actualValue + " for " + f + ":" + debugIdMethod.invoke(null, f); |
|
16206
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
161 |
} |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
162 |
} |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
163 |
} |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
164 |
|
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
165 |
// testFirstFn(script[, assertions...] tests whether all the specified |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
166 |
// assertions are true in the first function in the given script; "script" |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
167 |
// is a string with the source text of the script. |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
168 |
function testFirstFn(script) { |
16226
0e4f37e6cc40
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents:
16221
diff
changeset
|
169 |
arguments[0] = getFirstFunction(compile(script)) |
16206
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
170 |
test.apply(null, arguments) |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
171 |
} |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
172 |
|
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
173 |
// ---------------------------------- ACTUAL TESTS START HERE -------------- |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
174 |
|
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
175 |
// The simplest possible functions have no attributes set |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
176 |
testFirstFn("function f() { }") |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
177 |
testFirstFn("function f(x) { x }") |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
178 |
|
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
179 |
// A function referencing a global needs parent scope, and it needs callee |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
180 |
// (because parent scope is passed through callee) |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
181 |
testFirstFn("function f() { x }", 'needsCallee', 'needsParentScope') |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
182 |
|
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
183 |
// A function referencing "arguments" will have to be vararg. It also needs |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
184 |
// the callee, as it needs to fill out "arguments.callee". |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
185 |
testFirstFn("function f() { arguments }", 'needsCallee', 'isVarArg') |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
186 |
|
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
187 |
// A function referencing "arguments" will have to be vararg. If it is |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
188 |
// strict, it will not have to have a callee, though. |
18859 | 189 |
testFirstFn("function f() {'use strict'; arguments }", 'isVarArg', 'isStrict') |
16206
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
190 |
|
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
191 |
// A function defining "arguments" as a parameter will not be vararg. |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
192 |
testFirstFn("function f(arguments) { arguments }") |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
193 |
|
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
194 |
// A function defining "arguments" as a nested function will not be vararg. |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
195 |
testFirstFn("function f() { function arguments() {}; arguments; }") |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
196 |
|
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
197 |
// A function defining "arguments" as a local variable will be vararg. |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
198 |
testFirstFn("function f() { var arguments; arguments; }", 'isVarArg', 'needsCallee') |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
199 |
|
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
200 |
// A self-referencing function defined as a statement doesn't need a self |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
201 |
// symbol, as it'll rather obtain itself from the parent scope. |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
202 |
testFirstFn("function f() { f() }", 'needsCallee', 'needsParentScope') |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
203 |
|
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
204 |
// A self-referencing function defined as an expression needs a self symbol, |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
205 |
// as it can't obtain itself from the parent scope. |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
206 |
testFirstFn("(function f() { f() })", 'needsCallee', 'needsSelfSymbol') |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
207 |
|
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
208 |
// A child function accessing parent's variable triggers the need for scope |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
209 |
// in parent |
18859 | 210 |
testFirstFn("(function f() { var x; function g() { x } })", 'hasScopeBlock') |
16206
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
211 |
|
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
212 |
// A child function accessing parent's parameter triggers the need for scope |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
213 |
// in parent |
18859 | 214 |
testFirstFn("(function f(x) { function g() { x } })", 'hasScopeBlock') |
16206
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
215 |
|
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
216 |
// A child function accessing a global variable triggers the need for parent |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
217 |
// scope in parent |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
218 |
testFirstFn("(function f() { function g() { x } })", 'needsParentScope', 'needsCallee') |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
219 |
|
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
220 |
// A child function redefining a local variable from its parent should not |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
221 |
// affect the parent function in any way |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
222 |
testFirstFn("(function f() { var x; function g() { var x; x } })") |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
223 |
|
18859 | 224 |
// Using "with" on its own doesn't do much. |
225 |
testFirstFn("(function f() { var o; with(o) {} })") |
|
16206
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
226 |
|
18859 | 227 |
// "with" referencing a local variable triggers scoping. |
228 |
testFirstFn("(function f() { var x; var y; with(x) { y } })", 'hasScopeBlock') |
|
229 |
||
230 |
// "with" referencing a non-local variable triggers parent scope. |
|
231 |
testFirstFn("(function f() { var x; with(x) { y } })", 'needsCallee', 'needsParentScope') |
|
16206
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
232 |
|
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
233 |
// Nested function using "with" is pretty much the same as the parent |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
234 |
// function needing with. |
18859 | 235 |
testFirstFn("(function f() { function g() { var o; with(o) {} } })") |
236 |
||
237 |
// Nested function using "with" referencing a local variable. |
|
238 |
testFirstFn("(function f() { var x; function g() { var o; with(o) { x } } })", 'hasScopeBlock') |
|
239 |
||
240 |
// Using "eval" triggers pretty much everything. The function even needs to be |
|
241 |
// vararg, 'cause we don't know if eval will be using "arguments". |
|
242 |
testFirstFn("(function f() { eval() })", 'needsParentScope', 'needsCallee', 'hasScopeBlock', 'hasEval', 'isVarArg', 'allVarsInScope') |
|
243 |
||
16206
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
244 |
// Nested function using "eval" is almost the same as parent function using |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
245 |
// eval, but at least the parent doesn't have to be vararg. |
18859 | 246 |
testFirstFn("(function f() { function g() { eval() } })", 'needsParentScope', 'needsCallee', 'hasScopeBlock', 'allVarsInScope') |
16206
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
247 |
|
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
248 |
// Function with 250 named parameters is ordinary |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
249 |
testFirstFn("function f(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, p28, p29, p30, p31, p32, p33, p34, p35, p36, p37, p38, p39, p40, p41, p42, p43, p44, p45, p46, p47, p48, p49, p50, p51, p52, p53, p54, p55, p56, p57, p58, p59, p60, p61, p62, p63, p64, p65, p66, p67, p68, p69, p70, p71, p72, p73, p74, p75, p76, p77, p78, p79, p80, p81, p82, p83, p84, p85, p86, p87, p88, p89, p90, p91, p92, p93, p94, p95, p96, p97, p98, p99, p100, p101, p102, p103, p104, p105, p106, p107, p108, p109, p110, p111, p112, p113, p114, p115, p116, p117, p118, p119, p120, p121, p122, p123, p124, p125, p126, p127, p128, p129, p130, p131, p132, p133, p134, p135, p136, p137, p138, p139, p140, p141, p142, p143, p144, p145, p146, p147, p148, p149, p150, p151, p152, p153, p154, p155, p156, p157, p158, p159, p160, p161, p162, p163, p164, p165, p166, p167, p168, p169, p170, p171, p172, p173, p174, p175, p176, p177, p178, p179, p180, p181, p182, p183, p184, p185, p186, p187, p188, p189, p190, p191, p192, p193, p194, p195, p196, p197, p198, p199, p200, p201, p202, p203, p204, p205, p206, p207, p208, p209, p210, p211, p212, p213, p214, p215, p216, p217, p218, p219, p220, p221, p222, p223, p224, p225, p226, p227, p228, p229, p230, p231, p232, p233, p234, p235, p236, p237, p238, p239, p240, p241, p242, p243, p244, p245, p246, p247, p248, p249, p250) { p250 = p249 }") |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
250 |
|
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
251 |
// Function with 251 named parameters is variable arguments |
83069fa0935b
8006529: Methods always get callee - it should be conditional
attila
parents:
diff
changeset
|
252 |
testFirstFn("function f(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, p28, p29, p30, p31, p32, p33, p34, p35, p36, p37, p38, p39, p40, p41, p42, p43, p44, p45, p46, p47, p48, p49, p50, p51, p52, p53, p54, p55, p56, p57, p58, p59, p60, p61, p62, p63, p64, p65, p66, p67, p68, p69, p70, p71, p72, p73, p74, p75, p76, p77, p78, p79, p80, p81, p82, p83, p84, p85, p86, p87, p88, p89, p90, p91, p92, p93, p94, p95, p96, p97, p98, p99, p100, p101, p102, p103, p104, p105, p106, p107, p108, p109, p110, p111, p112, p113, p114, p115, p116, p117, p118, p119, p120, p121, p122, p123, p124, p125, p126, p127, p128, p129, p130, p131, p132, p133, p134, p135, p136, p137, p138, p139, p140, p141, p142, p143, p144, p145, p146, p147, p148, p149, p150, p151, p152, p153, p154, p155, p156, p157, p158, p159, p160, p161, p162, p163, p164, p165, p166, p167, p168, p169, p170, p171, p172, p173, p174, p175, p176, p177, p178, p179, p180, p181, p182, p183, p184, p185, p186, p187, p188, p189, p190, p191, p192, p193, p194, p195, p196, p197, p198, p199, p200, p201, p202, p203, p204, p205, p206, p207, p208, p209, p210, p211, p212, p213, p214, p215, p216, p217, p218, p219, p220, p221, p222, p223, p224, p225, p226, p227, p228, p229, p230, p231, p232, p233, p234, p235, p236, p237, p238, p239, p240, p241, p242, p243, p244, p245, p246, p247, p248, p249, p250, p251) { p250 = p251 }", 'isVarArg') |