| 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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 SharedFunctionInfo::cast(shared_func_info_ptr)); | 87 SharedFunctionInfo::cast(shared_func_info_ptr)); |
| 88 | 88 |
| 89 // Verify inferred function name. | 89 // Verify inferred function name. |
| 90 SmartArrayPointer<char> inferred_name = | 90 SmartArrayPointer<char> inferred_name = |
| 91 shared_func_info->inferred_name()->ToCString(); | 91 shared_func_info->inferred_name()->ToCString(); |
| 92 CHECK_EQ(ref_inferred_name, *inferred_name); | 92 CHECK_EQ(ref_inferred_name, *inferred_name); |
| 93 #endif // ENABLE_DEBUGGER_SUPPORT | 93 #endif // ENABLE_DEBUGGER_SUPPORT |
| 94 } | 94 } |
| 95 | 95 |
| 96 | 96 |
| 97 static v8::Handle<v8::Script> Compile(const char* src) { | 97 static v8::Handle<v8::Script> Compile(v8::Isolate* isolate, const char* src) { |
| 98 return v8::Script::Compile(v8::String::New(src)); | 98 return v8::Script::Compile(v8::String::NewFromUtf8(isolate, src)); |
| 99 } | 99 } |
| 100 | 100 |
| 101 | 101 |
| 102 TEST(GlobalProperty) { | 102 TEST(GlobalProperty) { |
| 103 CcTest::InitializeVM(); | 103 CcTest::InitializeVM(); |
| 104 v8::HandleScope scope(CcTest::isolate()); | 104 v8::HandleScope scope(CcTest::isolate()); |
| 105 | 105 |
| 106 v8::Handle<v8::Script> script = Compile( | 106 v8::Handle<v8::Script> script = Compile( |
| 107 CcTest::isolate(), |
| 107 "fun1 = function() { return 1; }\n" | 108 "fun1 = function() { return 1; }\n" |
| 108 "fun2 = function() { return 2; }\n"); | 109 "fun2 = function() { return 2; }\n"); |
| 109 CheckFunctionName(script, "return 1", "fun1"); | 110 CheckFunctionName(script, "return 1", "fun1"); |
| 110 CheckFunctionName(script, "return 2", "fun2"); | 111 CheckFunctionName(script, "return 2", "fun2"); |
| 111 } | 112 } |
| 112 | 113 |
| 113 | 114 |
| 114 TEST(GlobalVar) { | 115 TEST(GlobalVar) { |
| 115 CcTest::InitializeVM(); | 116 CcTest::InitializeVM(); |
| 116 v8::HandleScope scope(CcTest::isolate()); | 117 v8::HandleScope scope(CcTest::isolate()); |
| 117 | 118 |
| 118 v8::Handle<v8::Script> script = Compile( | 119 v8::Handle<v8::Script> script = Compile( |
| 120 CcTest::isolate(), |
| 119 "var fun1 = function() { return 1; }\n" | 121 "var fun1 = function() { return 1; }\n" |
| 120 "var fun2 = function() { return 2; }\n"); | 122 "var fun2 = function() { return 2; }\n"); |
| 121 CheckFunctionName(script, "return 1", "fun1"); | 123 CheckFunctionName(script, "return 1", "fun1"); |
| 122 CheckFunctionName(script, "return 2", "fun2"); | 124 CheckFunctionName(script, "return 2", "fun2"); |
| 123 } | 125 } |
| 124 | 126 |
| 125 | 127 |
| 126 TEST(LocalVar) { | 128 TEST(LocalVar) { |
| 127 CcTest::InitializeVM(); | 129 CcTest::InitializeVM(); |
| 128 v8::HandleScope scope(CcTest::isolate()); | 130 v8::HandleScope scope(CcTest::isolate()); |
| 129 | 131 |
| 130 v8::Handle<v8::Script> script = Compile( | 132 v8::Handle<v8::Script> script = Compile( |
| 133 CcTest::isolate(), |
| 131 "function outer() {\n" | 134 "function outer() {\n" |
| 132 " var fun1 = function() { return 1; }\n" | 135 " var fun1 = function() { return 1; }\n" |
| 133 " var fun2 = function() { return 2; }\n" | 136 " var fun2 = function() { return 2; }\n" |
| 134 "}"); | 137 "}"); |
| 135 CheckFunctionName(script, "return 1", "fun1"); | 138 CheckFunctionName(script, "return 1", "fun1"); |
| 136 CheckFunctionName(script, "return 2", "fun2"); | 139 CheckFunctionName(script, "return 2", "fun2"); |
| 137 } | 140 } |
| 138 | 141 |
| 139 | 142 |
| 140 TEST(InConstructor) { | 143 TEST(InConstructor) { |
| 141 CcTest::InitializeVM(); | 144 CcTest::InitializeVM(); |
| 142 v8::HandleScope scope(CcTest::isolate()); | 145 v8::HandleScope scope(CcTest::isolate()); |
| 143 | 146 |
| 144 v8::Handle<v8::Script> script = Compile( | 147 v8::Handle<v8::Script> script = Compile( |
| 148 CcTest::isolate(), |
| 145 "function MyClass() {\n" | 149 "function MyClass() {\n" |
| 146 " this.method1 = function() { return 1; }\n" | 150 " this.method1 = function() { return 1; }\n" |
| 147 " this.method2 = function() { return 2; }\n" | 151 " this.method2 = function() { return 2; }\n" |
| 148 "}"); | 152 "}"); |
| 149 CheckFunctionName(script, "return 1", "MyClass.method1"); | 153 CheckFunctionName(script, "return 1", "MyClass.method1"); |
| 150 CheckFunctionName(script, "return 2", "MyClass.method2"); | 154 CheckFunctionName(script, "return 2", "MyClass.method2"); |
| 151 } | 155 } |
| 152 | 156 |
| 153 | 157 |
| 154 TEST(Factory) { | 158 TEST(Factory) { |
| 155 CcTest::InitializeVM(); | 159 CcTest::InitializeVM(); |
| 156 v8::HandleScope scope(CcTest::isolate()); | 160 v8::HandleScope scope(CcTest::isolate()); |
| 157 | 161 |
| 158 v8::Handle<v8::Script> script = Compile( | 162 v8::Handle<v8::Script> script = Compile( |
| 163 CcTest::isolate(), |
| 159 "function createMyObj() {\n" | 164 "function createMyObj() {\n" |
| 160 " var obj = {};\n" | 165 " var obj = {};\n" |
| 161 " obj.method1 = function() { return 1; }\n" | 166 " obj.method1 = function() { return 1; }\n" |
| 162 " obj.method2 = function() { return 2; }\n" | 167 " obj.method2 = function() { return 2; }\n" |
| 163 " return obj;\n" | 168 " return obj;\n" |
| 164 "}"); | 169 "}"); |
| 165 CheckFunctionName(script, "return 1", "obj.method1"); | 170 CheckFunctionName(script, "return 1", "obj.method1"); |
| 166 CheckFunctionName(script, "return 2", "obj.method2"); | 171 CheckFunctionName(script, "return 2", "obj.method2"); |
| 167 } | 172 } |
| 168 | 173 |
| 169 | 174 |
| 170 TEST(Static) { | 175 TEST(Static) { |
| 171 CcTest::InitializeVM(); | 176 CcTest::InitializeVM(); |
| 172 v8::HandleScope scope(CcTest::isolate()); | 177 v8::HandleScope scope(CcTest::isolate()); |
| 173 | 178 |
| 174 v8::Handle<v8::Script> script = Compile( | 179 v8::Handle<v8::Script> script = Compile( |
| 180 CcTest::isolate(), |
| 175 "function MyClass() {}\n" | 181 "function MyClass() {}\n" |
| 176 "MyClass.static1 = function() { return 1; }\n" | 182 "MyClass.static1 = function() { return 1; }\n" |
| 177 "MyClass.static2 = function() { return 2; }\n" | 183 "MyClass.static2 = function() { return 2; }\n" |
| 178 "MyClass.MyInnerClass = {}\n" | 184 "MyClass.MyInnerClass = {}\n" |
| 179 "MyClass.MyInnerClass.static3 = function() { return 3; }\n" | 185 "MyClass.MyInnerClass.static3 = function() { return 3; }\n" |
| 180 "MyClass.MyInnerClass.static4 = function() { return 4; }"); | 186 "MyClass.MyInnerClass.static4 = function() { return 4; }"); |
| 181 CheckFunctionName(script, "return 1", "MyClass.static1"); | 187 CheckFunctionName(script, "return 1", "MyClass.static1"); |
| 182 CheckFunctionName(script, "return 2", "MyClass.static2"); | 188 CheckFunctionName(script, "return 2", "MyClass.static2"); |
| 183 CheckFunctionName(script, "return 3", "MyClass.MyInnerClass.static3"); | 189 CheckFunctionName(script, "return 3", "MyClass.MyInnerClass.static3"); |
| 184 CheckFunctionName(script, "return 4", "MyClass.MyInnerClass.static4"); | 190 CheckFunctionName(script, "return 4", "MyClass.MyInnerClass.static4"); |
| 185 } | 191 } |
| 186 | 192 |
| 187 | 193 |
| 188 TEST(Prototype) { | 194 TEST(Prototype) { |
| 189 CcTest::InitializeVM(); | 195 CcTest::InitializeVM(); |
| 190 v8::HandleScope scope(CcTest::isolate()); | 196 v8::HandleScope scope(CcTest::isolate()); |
| 191 | 197 |
| 192 v8::Handle<v8::Script> script = Compile( | 198 v8::Handle<v8::Script> script = Compile( |
| 199 CcTest::isolate(), |
| 193 "function MyClass() {}\n" | 200 "function MyClass() {}\n" |
| 194 "MyClass.prototype.method1 = function() { return 1; }\n" | 201 "MyClass.prototype.method1 = function() { return 1; }\n" |
| 195 "MyClass.prototype.method2 = function() { return 2; }\n" | 202 "MyClass.prototype.method2 = function() { return 2; }\n" |
| 196 "MyClass.MyInnerClass = function() {}\n" | 203 "MyClass.MyInnerClass = function() {}\n" |
| 197 "MyClass.MyInnerClass.prototype.method3 = function() { return 3; }\n" | 204 "MyClass.MyInnerClass.prototype.method3 = function() { return 3; }\n" |
| 198 "MyClass.MyInnerClass.prototype.method4 = function() { return 4; }"); | 205 "MyClass.MyInnerClass.prototype.method4 = function() { return 4; }"); |
| 199 CheckFunctionName(script, "return 1", "MyClass.method1"); | 206 CheckFunctionName(script, "return 1", "MyClass.method1"); |
| 200 CheckFunctionName(script, "return 2", "MyClass.method2"); | 207 CheckFunctionName(script, "return 2", "MyClass.method2"); |
| 201 CheckFunctionName(script, "return 3", "MyClass.MyInnerClass.method3"); | 208 CheckFunctionName(script, "return 3", "MyClass.MyInnerClass.method3"); |
| 202 CheckFunctionName(script, "return 4", "MyClass.MyInnerClass.method4"); | 209 CheckFunctionName(script, "return 4", "MyClass.MyInnerClass.method4"); |
| 203 } | 210 } |
| 204 | 211 |
| 205 | 212 |
| 206 TEST(ObjectLiteral) { | 213 TEST(ObjectLiteral) { |
| 207 CcTest::InitializeVM(); | 214 CcTest::InitializeVM(); |
| 208 v8::HandleScope scope(CcTest::isolate()); | 215 v8::HandleScope scope(CcTest::isolate()); |
| 209 | 216 |
| 210 v8::Handle<v8::Script> script = Compile( | 217 v8::Handle<v8::Script> script = Compile( |
| 218 CcTest::isolate(), |
| 211 "function MyClass() {}\n" | 219 "function MyClass() {}\n" |
| 212 "MyClass.prototype = {\n" | 220 "MyClass.prototype = {\n" |
| 213 " method1: function() { return 1; },\n" | 221 " method1: function() { return 1; },\n" |
| 214 " method2: function() { return 2; } }"); | 222 " method2: function() { return 2; } }"); |
| 215 CheckFunctionName(script, "return 1", "MyClass.method1"); | 223 CheckFunctionName(script, "return 1", "MyClass.method1"); |
| 216 CheckFunctionName(script, "return 2", "MyClass.method2"); | 224 CheckFunctionName(script, "return 2", "MyClass.method2"); |
| 217 } | 225 } |
| 218 | 226 |
| 219 | 227 |
| 220 TEST(AsParameter) { | 228 TEST(AsParameter) { |
| 221 CcTest::InitializeVM(); | 229 CcTest::InitializeVM(); |
| 222 v8::HandleScope scope(CcTest::isolate()); | 230 v8::HandleScope scope(CcTest::isolate()); |
| 223 | 231 |
| 224 v8::Handle<v8::Script> script = Compile( | 232 v8::Handle<v8::Script> script = Compile( |
| 233 CcTest::isolate(), |
| 225 "function f1(a) { return a(); }\n" | 234 "function f1(a) { return a(); }\n" |
| 226 "function f2(a, b) { return a() + b(); }\n" | 235 "function f2(a, b) { return a() + b(); }\n" |
| 227 "var result1 = f1(function() { return 1; })\n" | 236 "var result1 = f1(function() { return 1; })\n" |
| 228 "var result2 = f2(function() { return 2; }, function() { return 3; })"); | 237 "var result2 = f2(function() { return 2; }, function() { return 3; })"); |
| 229 // Can't infer names here. | 238 // Can't infer names here. |
| 230 CheckFunctionName(script, "return 1", ""); | 239 CheckFunctionName(script, "return 1", ""); |
| 231 CheckFunctionName(script, "return 2", ""); | 240 CheckFunctionName(script, "return 2", ""); |
| 232 CheckFunctionName(script, "return 3", ""); | 241 CheckFunctionName(script, "return 3", ""); |
| 233 } | 242 } |
| 234 | 243 |
| 235 | 244 |
| 236 TEST(MultipleFuncsConditional) { | 245 TEST(MultipleFuncsConditional) { |
| 237 CcTest::InitializeVM(); | 246 CcTest::InitializeVM(); |
| 238 v8::HandleScope scope(CcTest::isolate()); | 247 v8::HandleScope scope(CcTest::isolate()); |
| 239 | 248 |
| 240 v8::Handle<v8::Script> script = Compile( | 249 v8::Handle<v8::Script> script = Compile( |
| 250 CcTest::isolate(), |
| 241 "fun1 = 0 ?\n" | 251 "fun1 = 0 ?\n" |
| 242 " function() { return 1; } :\n" | 252 " function() { return 1; } :\n" |
| 243 " function() { return 2; }"); | 253 " function() { return 2; }"); |
| 244 CheckFunctionName(script, "return 1", "fun1"); | 254 CheckFunctionName(script, "return 1", "fun1"); |
| 245 CheckFunctionName(script, "return 2", "fun1"); | 255 CheckFunctionName(script, "return 2", "fun1"); |
| 246 } | 256 } |
| 247 | 257 |
| 248 | 258 |
| 249 TEST(MultipleFuncsInLiteral) { | 259 TEST(MultipleFuncsInLiteral) { |
| 250 CcTest::InitializeVM(); | 260 CcTest::InitializeVM(); |
| 251 v8::HandleScope scope(CcTest::isolate()); | 261 v8::HandleScope scope(CcTest::isolate()); |
| 252 | 262 |
| 253 v8::Handle<v8::Script> script = Compile( | 263 v8::Handle<v8::Script> script = Compile( |
| 264 CcTest::isolate(), |
| 254 "function MyClass() {}\n" | 265 "function MyClass() {}\n" |
| 255 "MyClass.prototype = {\n" | 266 "MyClass.prototype = {\n" |
| 256 " method1: 0 ? function() { return 1; } :\n" | 267 " method1: 0 ? function() { return 1; } :\n" |
| 257 " function() { return 2; } }"); | 268 " function() { return 2; } }"); |
| 258 CheckFunctionName(script, "return 1", "MyClass.method1"); | 269 CheckFunctionName(script, "return 1", "MyClass.method1"); |
| 259 CheckFunctionName(script, "return 2", "MyClass.method1"); | 270 CheckFunctionName(script, "return 2", "MyClass.method1"); |
| 260 } | 271 } |
| 261 | 272 |
| 262 | 273 |
| 263 TEST(AnonymousInAnonymousClosure1) { | 274 TEST(AnonymousInAnonymousClosure1) { |
| 264 CcTest::InitializeVM(); | 275 CcTest::InitializeVM(); |
| 265 v8::HandleScope scope(CcTest::isolate()); | 276 v8::HandleScope scope(CcTest::isolate()); |
| 266 | 277 |
| 267 v8::Handle<v8::Script> script = Compile( | 278 v8::Handle<v8::Script> script = Compile( |
| 279 CcTest::isolate(), |
| 268 "(function() {\n" | 280 "(function() {\n" |
| 269 " (function() {\n" | 281 " (function() {\n" |
| 270 " var a = 1;\n" | 282 " var a = 1;\n" |
| 271 " return;\n" | 283 " return;\n" |
| 272 " })();\n" | 284 " })();\n" |
| 273 " var b = function() {\n" | 285 " var b = function() {\n" |
| 274 " var c = 1;\n" | 286 " var c = 1;\n" |
| 275 " return;\n" | 287 " return;\n" |
| 276 " };\n" | 288 " };\n" |
| 277 "})();"); | 289 "})();"); |
| 278 CheckFunctionName(script, "return", ""); | 290 CheckFunctionName(script, "return", ""); |
| 279 } | 291 } |
| 280 | 292 |
| 281 | 293 |
| 282 TEST(AnonymousInAnonymousClosure2) { | 294 TEST(AnonymousInAnonymousClosure2) { |
| 283 CcTest::InitializeVM(); | 295 CcTest::InitializeVM(); |
| 284 v8::HandleScope scope(CcTest::isolate()); | 296 v8::HandleScope scope(CcTest::isolate()); |
| 285 | 297 |
| 286 v8::Handle<v8::Script> script = Compile( | 298 v8::Handle<v8::Script> script = Compile( |
| 299 CcTest::isolate(), |
| 287 "(function() {\n" | 300 "(function() {\n" |
| 288 " (function() {\n" | 301 " (function() {\n" |
| 289 " var a = 1;\n" | 302 " var a = 1;\n" |
| 290 " return;\n" | 303 " return;\n" |
| 291 " })();\n" | 304 " })();\n" |
| 292 " var c = 1;\n" | 305 " var c = 1;\n" |
| 293 "})();"); | 306 "})();"); |
| 294 CheckFunctionName(script, "return", ""); | 307 CheckFunctionName(script, "return", ""); |
| 295 } | 308 } |
| 296 | 309 |
| 297 | 310 |
| 298 TEST(NamedInAnonymousClosure) { | 311 TEST(NamedInAnonymousClosure) { |
| 299 CcTest::InitializeVM(); | 312 CcTest::InitializeVM(); |
| 300 v8::HandleScope scope(CcTest::isolate()); | 313 v8::HandleScope scope(CcTest::isolate()); |
| 301 | 314 |
| 302 v8::Handle<v8::Script> script = Compile( | 315 v8::Handle<v8::Script> script = Compile( |
| 316 CcTest::isolate(), |
| 303 "var foo = function() {\n" | 317 "var foo = function() {\n" |
| 304 " (function named() {\n" | 318 " (function named() {\n" |
| 305 " var a = 1;\n" | 319 " var a = 1;\n" |
| 306 " })();\n" | 320 " })();\n" |
| 307 " var c = 1;\n" | 321 " var c = 1;\n" |
| 308 " return;\n" | 322 " return;\n" |
| 309 "};"); | 323 "};"); |
| 310 CheckFunctionName(script, "return", "foo"); | 324 CheckFunctionName(script, "return", "foo"); |
| 311 } | 325 } |
| 312 | 326 |
| 313 | 327 |
| 314 // See http://code.google.com/p/v8/issues/detail?id=380 | 328 // See http://code.google.com/p/v8/issues/detail?id=380 |
| 315 TEST(Issue380) { | 329 TEST(Issue380) { |
| 316 CcTest::InitializeVM(); | 330 CcTest::InitializeVM(); |
| 317 v8::HandleScope scope(CcTest::isolate()); | 331 v8::HandleScope scope(CcTest::isolate()); |
| 318 | 332 |
| 319 v8::Handle<v8::Script> script = Compile( | 333 v8::Handle<v8::Script> script = Compile( |
| 334 CcTest::isolate(), |
| 320 "function a() {\n" | 335 "function a() {\n" |
| 321 "var result = function(p,a,c,k,e,d)" | 336 "var result = function(p,a,c,k,e,d)" |
| 322 "{return p}(\"if blah blah\",62,1976,\'a|b\'.split(\'|\'),0,{})\n" | 337 "{return p}(\"if blah blah\",62,1976,\'a|b\'.split(\'|\'),0,{})\n" |
| 323 "}"); | 338 "}"); |
| 324 CheckFunctionName(script, "return p", ""); | 339 CheckFunctionName(script, "return p", ""); |
| 325 } | 340 } |
| 326 | 341 |
| 327 | 342 |
| 328 TEST(MultipleAssignments) { | 343 TEST(MultipleAssignments) { |
| 329 CcTest::InitializeVM(); | 344 CcTest::InitializeVM(); |
| 330 v8::HandleScope scope(CcTest::isolate()); | 345 v8::HandleScope scope(CcTest::isolate()); |
| 331 | 346 |
| 332 v8::Handle<v8::Script> script = Compile( | 347 v8::Handle<v8::Script> script = Compile( |
| 348 CcTest::isolate(), |
| 333 "var fun1 = fun2 = function () { return 1; }\n" | 349 "var fun1 = fun2 = function () { return 1; }\n" |
| 334 "var bar1 = bar2 = bar3 = function () { return 2; }\n" | 350 "var bar1 = bar2 = bar3 = function () { return 2; }\n" |
| 335 "foo1 = foo2 = function () { return 3; }\n" | 351 "foo1 = foo2 = function () { return 3; }\n" |
| 336 "baz1 = baz2 = baz3 = function () { return 4; }"); | 352 "baz1 = baz2 = baz3 = function () { return 4; }"); |
| 337 CheckFunctionName(script, "return 1", "fun2"); | 353 CheckFunctionName(script, "return 1", "fun2"); |
| 338 CheckFunctionName(script, "return 2", "bar3"); | 354 CheckFunctionName(script, "return 2", "bar3"); |
| 339 CheckFunctionName(script, "return 3", "foo2"); | 355 CheckFunctionName(script, "return 3", "foo2"); |
| 340 CheckFunctionName(script, "return 4", "baz3"); | 356 CheckFunctionName(script, "return 4", "baz3"); |
| 341 } | 357 } |
| 342 | 358 |
| 343 | 359 |
| 344 TEST(AsConstructorParameter) { | 360 TEST(AsConstructorParameter) { |
| 345 CcTest::InitializeVM(); | 361 CcTest::InitializeVM(); |
| 346 v8::HandleScope scope(CcTest::isolate()); | 362 v8::HandleScope scope(CcTest::isolate()); |
| 347 | 363 |
| 348 v8::Handle<v8::Script> script = Compile( | 364 v8::Handle<v8::Script> script = Compile( |
| 365 CcTest::isolate(), |
| 349 "function Foo() {}\n" | 366 "function Foo() {}\n" |
| 350 "var foo = new Foo(function() { return 1; })\n" | 367 "var foo = new Foo(function() { return 1; })\n" |
| 351 "var bar = new Foo(function() { return 2; }, function() { return 3; })"); | 368 "var bar = new Foo(function() { return 2; }, function() { return 3; })"); |
| 352 CheckFunctionName(script, "return 1", ""); | 369 CheckFunctionName(script, "return 1", ""); |
| 353 CheckFunctionName(script, "return 2", ""); | 370 CheckFunctionName(script, "return 2", ""); |
| 354 CheckFunctionName(script, "return 3", ""); | 371 CheckFunctionName(script, "return 3", ""); |
| 355 } | 372 } |
| 356 | 373 |
| 357 | 374 |
| 358 TEST(FactoryHashmap) { | 375 TEST(FactoryHashmap) { |
| 359 CcTest::InitializeVM(); | 376 CcTest::InitializeVM(); |
| 360 v8::HandleScope scope(CcTest::isolate()); | 377 v8::HandleScope scope(CcTest::isolate()); |
| 361 | 378 |
| 362 v8::Handle<v8::Script> script = Compile( | 379 v8::Handle<v8::Script> script = Compile( |
| 380 CcTest::isolate(), |
| 363 "function createMyObj() {\n" | 381 "function createMyObj() {\n" |
| 364 " var obj = {};\n" | 382 " var obj = {};\n" |
| 365 " obj[\"method1\"] = function() { return 1; }\n" | 383 " obj[\"method1\"] = function() { return 1; }\n" |
| 366 " obj[\"method2\"] = function() { return 2; }\n" | 384 " obj[\"method2\"] = function() { return 2; }\n" |
| 367 " return obj;\n" | 385 " return obj;\n" |
| 368 "}"); | 386 "}"); |
| 369 CheckFunctionName(script, "return 1", "obj.method1"); | 387 CheckFunctionName(script, "return 1", "obj.method1"); |
| 370 CheckFunctionName(script, "return 2", "obj.method2"); | 388 CheckFunctionName(script, "return 2", "obj.method2"); |
| 371 } | 389 } |
| 372 | 390 |
| 373 | 391 |
| 374 TEST(FactoryHashmapVariable) { | 392 TEST(FactoryHashmapVariable) { |
| 375 CcTest::InitializeVM(); | 393 CcTest::InitializeVM(); |
| 376 v8::HandleScope scope(CcTest::isolate()); | 394 v8::HandleScope scope(CcTest::isolate()); |
| 377 | 395 |
| 378 v8::Handle<v8::Script> script = Compile( | 396 v8::Handle<v8::Script> script = Compile( |
| 397 CcTest::isolate(), |
| 379 "function createMyObj() {\n" | 398 "function createMyObj() {\n" |
| 380 " var obj = {};\n" | 399 " var obj = {};\n" |
| 381 " var methodName = \"method1\";\n" | 400 " var methodName = \"method1\";\n" |
| 382 " obj[methodName] = function() { return 1; }\n" | 401 " obj[methodName] = function() { return 1; }\n" |
| 383 " methodName = \"method2\";\n" | 402 " methodName = \"method2\";\n" |
| 384 " obj[methodName] = function() { return 2; }\n" | 403 " obj[methodName] = function() { return 2; }\n" |
| 385 " return obj;\n" | 404 " return obj;\n" |
| 386 "}"); | 405 "}"); |
| 387 // Can't infer function names statically. | 406 // Can't infer function names statically. |
| 388 CheckFunctionName(script, "return 1", "obj.(anonymous function)"); | 407 CheckFunctionName(script, "return 1", "obj.(anonymous function)"); |
| 389 CheckFunctionName(script, "return 2", "obj.(anonymous function)"); | 408 CheckFunctionName(script, "return 2", "obj.(anonymous function)"); |
| 390 } | 409 } |
| 391 | 410 |
| 392 | 411 |
| 393 TEST(FactoryHashmapConditional) { | 412 TEST(FactoryHashmapConditional) { |
| 394 CcTest::InitializeVM(); | 413 CcTest::InitializeVM(); |
| 395 v8::HandleScope scope(CcTest::isolate()); | 414 v8::HandleScope scope(CcTest::isolate()); |
| 396 | 415 |
| 397 v8::Handle<v8::Script> script = Compile( | 416 v8::Handle<v8::Script> script = Compile( |
| 417 CcTest::isolate(), |
| 398 "function createMyObj() {\n" | 418 "function createMyObj() {\n" |
| 399 " var obj = {};\n" | 419 " var obj = {};\n" |
| 400 " obj[0 ? \"method1\" : \"method2\"] = function() { return 1; }\n" | 420 " obj[0 ? \"method1\" : \"method2\"] = function() { return 1; }\n" |
| 401 " return obj;\n" | 421 " return obj;\n" |
| 402 "}"); | 422 "}"); |
| 403 // Can't infer the function name statically. | 423 // Can't infer the function name statically. |
| 404 CheckFunctionName(script, "return 1", "obj.(anonymous function)"); | 424 CheckFunctionName(script, "return 1", "obj.(anonymous function)"); |
| 405 } | 425 } |
| 406 | 426 |
| 407 | 427 |
| 408 TEST(GlobalAssignmentAndCall) { | 428 TEST(GlobalAssignmentAndCall) { |
| 409 CcTest::InitializeVM(); | 429 CcTest::InitializeVM(); |
| 410 v8::HandleScope scope(CcTest::isolate()); | 430 v8::HandleScope scope(CcTest::isolate()); |
| 411 | 431 |
| 412 v8::Handle<v8::Script> script = Compile( | 432 v8::Handle<v8::Script> script = Compile( |
| 433 CcTest::isolate(), |
| 413 "var Foo = function() {\n" | 434 "var Foo = function() {\n" |
| 414 " return 1;\n" | 435 " return 1;\n" |
| 415 "}();\n" | 436 "}();\n" |
| 416 "var Baz = Bar = function() {\n" | 437 "var Baz = Bar = function() {\n" |
| 417 " return 2;\n" | 438 " return 2;\n" |
| 418 "}"); | 439 "}"); |
| 419 // The inferred name is empty, because this is an assignment of a result. | 440 // The inferred name is empty, because this is an assignment of a result. |
| 420 CheckFunctionName(script, "return 1", ""); | 441 CheckFunctionName(script, "return 1", ""); |
| 421 // See MultipleAssignments test. | 442 // See MultipleAssignments test. |
| 422 CheckFunctionName(script, "return 2", "Bar"); | 443 CheckFunctionName(script, "return 2", "Bar"); |
| 423 } | 444 } |
| 424 | 445 |
| 425 | 446 |
| 426 TEST(AssignmentAndCall) { | 447 TEST(AssignmentAndCall) { |
| 427 CcTest::InitializeVM(); | 448 CcTest::InitializeVM(); |
| 428 v8::HandleScope scope(CcTest::isolate()); | 449 v8::HandleScope scope(CcTest::isolate()); |
| 429 | 450 |
| 430 v8::Handle<v8::Script> script = Compile( | 451 v8::Handle<v8::Script> script = Compile( |
| 452 CcTest::isolate(), |
| 431 "(function Enclosing() {\n" | 453 "(function Enclosing() {\n" |
| 432 " var Foo;\n" | 454 " var Foo;\n" |
| 433 " Foo = function() {\n" | 455 " Foo = function() {\n" |
| 434 " return 1;\n" | 456 " return 1;\n" |
| 435 " }();\n" | 457 " }();\n" |
| 436 " var Baz = Bar = function() {\n" | 458 " var Baz = Bar = function() {\n" |
| 437 " return 2;\n" | 459 " return 2;\n" |
| 438 " }\n" | 460 " }\n" |
| 439 "})();"); | 461 "})();"); |
| 440 // The inferred name is empty, because this is an assignment of a result. | 462 // The inferred name is empty, because this is an assignment of a result. |
| 441 CheckFunctionName(script, "return 1", ""); | 463 CheckFunctionName(script, "return 1", ""); |
| 442 // See MultipleAssignments test. | 464 // See MultipleAssignments test. |
| 443 // TODO(2276): Lazy compiling the enclosing outer closure would yield | 465 // TODO(2276): Lazy compiling the enclosing outer closure would yield |
| 444 // in "Enclosing.Bar" being the inferred name here. | 466 // in "Enclosing.Bar" being the inferred name here. |
| 445 CheckFunctionName(script, "return 2", "Bar"); | 467 CheckFunctionName(script, "return 2", "Bar"); |
| 446 } | 468 } |
| 447 | 469 |
| 448 | 470 |
| 449 TEST(MethodAssignmentInAnonymousFunctionCall) { | 471 TEST(MethodAssignmentInAnonymousFunctionCall) { |
| 450 CcTest::InitializeVM(); | 472 CcTest::InitializeVM(); |
| 451 v8::HandleScope scope(CcTest::isolate()); | 473 v8::HandleScope scope(CcTest::isolate()); |
| 452 | 474 |
| 453 v8::Handle<v8::Script> script = Compile( | 475 v8::Handle<v8::Script> script = Compile( |
| 476 CcTest::isolate(), |
| 454 "(function () {\n" | 477 "(function () {\n" |
| 455 " var EventSource = function () { };\n" | 478 " var EventSource = function () { };\n" |
| 456 " EventSource.prototype.addListener = function () {\n" | 479 " EventSource.prototype.addListener = function () {\n" |
| 457 " return 2012;\n" | 480 " return 2012;\n" |
| 458 " };\n" | 481 " };\n" |
| 459 " this.PublicEventSource = EventSource;\n" | 482 " this.PublicEventSource = EventSource;\n" |
| 460 "})();"); | 483 "})();"); |
| 461 CheckFunctionName(script, "return 2012", "EventSource.addListener"); | 484 CheckFunctionName(script, "return 2012", "EventSource.addListener"); |
| 462 } | 485 } |
| 463 | 486 |
| 464 | 487 |
| 465 TEST(ReturnAnonymousFunction) { | 488 TEST(ReturnAnonymousFunction) { |
| 466 CcTest::InitializeVM(); | 489 CcTest::InitializeVM(); |
| 467 v8::HandleScope scope(CcTest::isolate()); | 490 v8::HandleScope scope(CcTest::isolate()); |
| 468 | 491 |
| 469 v8::Handle<v8::Script> script = Compile( | 492 v8::Handle<v8::Script> script = Compile( |
| 493 CcTest::isolate(), |
| 470 "(function() {\n" | 494 "(function() {\n" |
| 471 " function wrapCode() {\n" | 495 " function wrapCode() {\n" |
| 472 " return function () {\n" | 496 " return function () {\n" |
| 473 " return 2012;\n" | 497 " return 2012;\n" |
| 474 " };\n" | 498 " };\n" |
| 475 " };\n" | 499 " };\n" |
| 476 " var foo = 10;\n" | 500 " var foo = 10;\n" |
| 477 " function f() {\n" | 501 " function f() {\n" |
| 478 " return wrapCode();\n" | 502 " return wrapCode();\n" |
| 479 " }\n" | 503 " }\n" |
| 480 " this.ref = f;\n" | 504 " this.ref = f;\n" |
| 481 "})()"); | 505 "})()"); |
| 482 script->Run(); | 506 script->Run(); |
| 483 CheckFunctionName(script, "return 2012", ""); | 507 CheckFunctionName(script, "return 2012", ""); |
| 484 } | 508 } |
| OLD | NEW |