| 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 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 using ::v8::internal::SmartArrayPointer; | 45 using ::v8::internal::SmartArrayPointer; |
| 46 using ::v8::internal::SharedFunctionInfo; | 46 using ::v8::internal::SharedFunctionInfo; |
| 47 using ::v8::internal::String; | 47 using ::v8::internal::String; |
| 48 | 48 |
| 49 | 49 |
| 50 static v8::Persistent<v8::Context> env; | 50 static v8::Persistent<v8::Context> env; |
| 51 | 51 |
| 52 | 52 |
| 53 static void InitializeVM() { | 53 static void InitializeVM() { |
| 54 if (env.IsEmpty()) { | 54 if (env.IsEmpty()) { |
| 55 v8::HandleScope scope; | |
| 56 env = v8::Context::New(); | 55 env = v8::Context::New(); |
| 57 } | 56 } |
| 58 v8::HandleScope scope; | |
| 59 env->Enter(); | 57 env->Enter(); |
| 60 } | 58 } |
| 61 | 59 |
| 62 | 60 |
| 63 static void CheckFunctionName(v8::Handle<v8::Script> script, | 61 static void CheckFunctionName(v8::Handle<v8::Script> script, |
| 64 const char* func_pos_src, | 62 const char* func_pos_src, |
| 65 const char* ref_inferred_name) { | 63 const char* ref_inferred_name) { |
| 66 // Get script source. | 64 // Get script source. |
| 67 Handle<Object> obj = v8::Utils::OpenHandle(*script); | 65 Handle<Object> obj = v8::Utils::OpenHandle(*script); |
| 68 Handle<SharedFunctionInfo> shared_function; | 66 Handle<SharedFunctionInfo> shared_function; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 } | 102 } |
| 105 | 103 |
| 106 | 104 |
| 107 static v8::Handle<v8::Script> Compile(const char* src) { | 105 static v8::Handle<v8::Script> Compile(const char* src) { |
| 108 return v8::Script::Compile(v8::String::New(src)); | 106 return v8::Script::Compile(v8::String::New(src)); |
| 109 } | 107 } |
| 110 | 108 |
| 111 | 109 |
| 112 TEST(GlobalProperty) { | 110 TEST(GlobalProperty) { |
| 113 InitializeVM(); | 111 InitializeVM(); |
| 114 v8::HandleScope scope; | 112 v8::HandleScope scope(env->GetIsolate()); |
| 115 | 113 |
| 116 v8::Handle<v8::Script> script = Compile( | 114 v8::Handle<v8::Script> script = Compile( |
| 117 "fun1 = function() { return 1; }\n" | 115 "fun1 = function() { return 1; }\n" |
| 118 "fun2 = function() { return 2; }\n"); | 116 "fun2 = function() { return 2; }\n"); |
| 119 CheckFunctionName(script, "return 1", "fun1"); | 117 CheckFunctionName(script, "return 1", "fun1"); |
| 120 CheckFunctionName(script, "return 2", "fun2"); | 118 CheckFunctionName(script, "return 2", "fun2"); |
| 121 } | 119 } |
| 122 | 120 |
| 123 | 121 |
| 124 TEST(GlobalVar) { | 122 TEST(GlobalVar) { |
| 125 InitializeVM(); | 123 InitializeVM(); |
| 126 v8::HandleScope scope; | 124 v8::HandleScope scope(env->GetIsolate()); |
| 127 | 125 |
| 128 v8::Handle<v8::Script> script = Compile( | 126 v8::Handle<v8::Script> script = Compile( |
| 129 "var fun1 = function() { return 1; }\n" | 127 "var fun1 = function() { return 1; }\n" |
| 130 "var fun2 = function() { return 2; }\n"); | 128 "var fun2 = function() { return 2; }\n"); |
| 131 CheckFunctionName(script, "return 1", "fun1"); | 129 CheckFunctionName(script, "return 1", "fun1"); |
| 132 CheckFunctionName(script, "return 2", "fun2"); | 130 CheckFunctionName(script, "return 2", "fun2"); |
| 133 } | 131 } |
| 134 | 132 |
| 135 | 133 |
| 136 TEST(LocalVar) { | 134 TEST(LocalVar) { |
| 137 InitializeVM(); | 135 InitializeVM(); |
| 138 v8::HandleScope scope; | 136 v8::HandleScope scope(env->GetIsolate()); |
| 139 | 137 |
| 140 v8::Handle<v8::Script> script = Compile( | 138 v8::Handle<v8::Script> script = Compile( |
| 141 "function outer() {\n" | 139 "function outer() {\n" |
| 142 " var fun1 = function() { return 1; }\n" | 140 " var fun1 = function() { return 1; }\n" |
| 143 " var fun2 = function() { return 2; }\n" | 141 " var fun2 = function() { return 2; }\n" |
| 144 "}"); | 142 "}"); |
| 145 CheckFunctionName(script, "return 1", "fun1"); | 143 CheckFunctionName(script, "return 1", "fun1"); |
| 146 CheckFunctionName(script, "return 2", "fun2"); | 144 CheckFunctionName(script, "return 2", "fun2"); |
| 147 } | 145 } |
| 148 | 146 |
| 149 | 147 |
| 150 TEST(InConstructor) { | 148 TEST(InConstructor) { |
| 151 InitializeVM(); | 149 InitializeVM(); |
| 152 v8::HandleScope scope; | 150 v8::HandleScope scope(env->GetIsolate()); |
| 153 | 151 |
| 154 v8::Handle<v8::Script> script = Compile( | 152 v8::Handle<v8::Script> script = Compile( |
| 155 "function MyClass() {\n" | 153 "function MyClass() {\n" |
| 156 " this.method1 = function() { return 1; }\n" | 154 " this.method1 = function() { return 1; }\n" |
| 157 " this.method2 = function() { return 2; }\n" | 155 " this.method2 = function() { return 2; }\n" |
| 158 "}"); | 156 "}"); |
| 159 CheckFunctionName(script, "return 1", "MyClass.method1"); | 157 CheckFunctionName(script, "return 1", "MyClass.method1"); |
| 160 CheckFunctionName(script, "return 2", "MyClass.method2"); | 158 CheckFunctionName(script, "return 2", "MyClass.method2"); |
| 161 } | 159 } |
| 162 | 160 |
| 163 | 161 |
| 164 TEST(Factory) { | 162 TEST(Factory) { |
| 165 InitializeVM(); | 163 InitializeVM(); |
| 166 v8::HandleScope scope; | 164 v8::HandleScope scope(env->GetIsolate()); |
| 167 | 165 |
| 168 v8::Handle<v8::Script> script = Compile( | 166 v8::Handle<v8::Script> script = Compile( |
| 169 "function createMyObj() {\n" | 167 "function createMyObj() {\n" |
| 170 " var obj = {};\n" | 168 " var obj = {};\n" |
| 171 " obj.method1 = function() { return 1; }\n" | 169 " obj.method1 = function() { return 1; }\n" |
| 172 " obj.method2 = function() { return 2; }\n" | 170 " obj.method2 = function() { return 2; }\n" |
| 173 " return obj;\n" | 171 " return obj;\n" |
| 174 "}"); | 172 "}"); |
| 175 CheckFunctionName(script, "return 1", "obj.method1"); | 173 CheckFunctionName(script, "return 1", "obj.method1"); |
| 176 CheckFunctionName(script, "return 2", "obj.method2"); | 174 CheckFunctionName(script, "return 2", "obj.method2"); |
| 177 } | 175 } |
| 178 | 176 |
| 179 | 177 |
| 180 TEST(Static) { | 178 TEST(Static) { |
| 181 InitializeVM(); | 179 InitializeVM(); |
| 182 v8::HandleScope scope; | 180 v8::HandleScope scope(env->GetIsolate()); |
| 183 | 181 |
| 184 v8::Handle<v8::Script> script = Compile( | 182 v8::Handle<v8::Script> script = Compile( |
| 185 "function MyClass() {}\n" | 183 "function MyClass() {}\n" |
| 186 "MyClass.static1 = function() { return 1; }\n" | 184 "MyClass.static1 = function() { return 1; }\n" |
| 187 "MyClass.static2 = function() { return 2; }\n" | 185 "MyClass.static2 = function() { return 2; }\n" |
| 188 "MyClass.MyInnerClass = {}\n" | 186 "MyClass.MyInnerClass = {}\n" |
| 189 "MyClass.MyInnerClass.static3 = function() { return 3; }\n" | 187 "MyClass.MyInnerClass.static3 = function() { return 3; }\n" |
| 190 "MyClass.MyInnerClass.static4 = function() { return 4; }"); | 188 "MyClass.MyInnerClass.static4 = function() { return 4; }"); |
| 191 CheckFunctionName(script, "return 1", "MyClass.static1"); | 189 CheckFunctionName(script, "return 1", "MyClass.static1"); |
| 192 CheckFunctionName(script, "return 2", "MyClass.static2"); | 190 CheckFunctionName(script, "return 2", "MyClass.static2"); |
| 193 CheckFunctionName(script, "return 3", "MyClass.MyInnerClass.static3"); | 191 CheckFunctionName(script, "return 3", "MyClass.MyInnerClass.static3"); |
| 194 CheckFunctionName(script, "return 4", "MyClass.MyInnerClass.static4"); | 192 CheckFunctionName(script, "return 4", "MyClass.MyInnerClass.static4"); |
| 195 } | 193 } |
| 196 | 194 |
| 197 | 195 |
| 198 TEST(Prototype) { | 196 TEST(Prototype) { |
| 199 InitializeVM(); | 197 InitializeVM(); |
| 200 v8::HandleScope scope; | 198 v8::HandleScope scope(env->GetIsolate()); |
| 201 | 199 |
| 202 v8::Handle<v8::Script> script = Compile( | 200 v8::Handle<v8::Script> script = Compile( |
| 203 "function MyClass() {}\n" | 201 "function MyClass() {}\n" |
| 204 "MyClass.prototype.method1 = function() { return 1; }\n" | 202 "MyClass.prototype.method1 = function() { return 1; }\n" |
| 205 "MyClass.prototype.method2 = function() { return 2; }\n" | 203 "MyClass.prototype.method2 = function() { return 2; }\n" |
| 206 "MyClass.MyInnerClass = function() {}\n" | 204 "MyClass.MyInnerClass = function() {}\n" |
| 207 "MyClass.MyInnerClass.prototype.method3 = function() { return 3; }\n" | 205 "MyClass.MyInnerClass.prototype.method3 = function() { return 3; }\n" |
| 208 "MyClass.MyInnerClass.prototype.method4 = function() { return 4; }"); | 206 "MyClass.MyInnerClass.prototype.method4 = function() { return 4; }"); |
| 209 CheckFunctionName(script, "return 1", "MyClass.method1"); | 207 CheckFunctionName(script, "return 1", "MyClass.method1"); |
| 210 CheckFunctionName(script, "return 2", "MyClass.method2"); | 208 CheckFunctionName(script, "return 2", "MyClass.method2"); |
| 211 CheckFunctionName(script, "return 3", "MyClass.MyInnerClass.method3"); | 209 CheckFunctionName(script, "return 3", "MyClass.MyInnerClass.method3"); |
| 212 CheckFunctionName(script, "return 4", "MyClass.MyInnerClass.method4"); | 210 CheckFunctionName(script, "return 4", "MyClass.MyInnerClass.method4"); |
| 213 } | 211 } |
| 214 | 212 |
| 215 | 213 |
| 216 TEST(ObjectLiteral) { | 214 TEST(ObjectLiteral) { |
| 217 InitializeVM(); | 215 InitializeVM(); |
| 218 v8::HandleScope scope; | 216 v8::HandleScope scope(env->GetIsolate()); |
| 219 | 217 |
| 220 v8::Handle<v8::Script> script = Compile( | 218 v8::Handle<v8::Script> script = Compile( |
| 221 "function MyClass() {}\n" | 219 "function MyClass() {}\n" |
| 222 "MyClass.prototype = {\n" | 220 "MyClass.prototype = {\n" |
| 223 " method1: function() { return 1; },\n" | 221 " method1: function() { return 1; },\n" |
| 224 " method2: function() { return 2; } }"); | 222 " method2: function() { return 2; } }"); |
| 225 CheckFunctionName(script, "return 1", "MyClass.method1"); | 223 CheckFunctionName(script, "return 1", "MyClass.method1"); |
| 226 CheckFunctionName(script, "return 2", "MyClass.method2"); | 224 CheckFunctionName(script, "return 2", "MyClass.method2"); |
| 227 } | 225 } |
| 228 | 226 |
| 229 | 227 |
| 230 TEST(AsParameter) { | 228 TEST(AsParameter) { |
| 231 InitializeVM(); | 229 InitializeVM(); |
| 232 v8::HandleScope scope; | 230 v8::HandleScope scope(env->GetIsolate()); |
| 233 | 231 |
| 234 v8::Handle<v8::Script> script = Compile( | 232 v8::Handle<v8::Script> script = Compile( |
| 235 "function f1(a) { return a(); }\n" | 233 "function f1(a) { return a(); }\n" |
| 236 "function f2(a, b) { return a() + b(); }\n" | 234 "function f2(a, b) { return a() + b(); }\n" |
| 237 "var result1 = f1(function() { return 1; })\n" | 235 "var result1 = f1(function() { return 1; })\n" |
| 238 "var result2 = f2(function() { return 2; }, function() { return 3; })"); | 236 "var result2 = f2(function() { return 2; }, function() { return 3; })"); |
| 239 // Can't infer names here. | 237 // Can't infer names here. |
| 240 CheckFunctionName(script, "return 1", ""); | 238 CheckFunctionName(script, "return 1", ""); |
| 241 CheckFunctionName(script, "return 2", ""); | 239 CheckFunctionName(script, "return 2", ""); |
| 242 CheckFunctionName(script, "return 3", ""); | 240 CheckFunctionName(script, "return 3", ""); |
| 243 } | 241 } |
| 244 | 242 |
| 245 | 243 |
| 246 TEST(MultipleFuncsConditional) { | 244 TEST(MultipleFuncsConditional) { |
| 247 InitializeVM(); | 245 InitializeVM(); |
| 248 v8::HandleScope scope; | 246 v8::HandleScope scope(env->GetIsolate()); |
| 249 | 247 |
| 250 v8::Handle<v8::Script> script = Compile( | 248 v8::Handle<v8::Script> script = Compile( |
| 251 "fun1 = 0 ?\n" | 249 "fun1 = 0 ?\n" |
| 252 " function() { return 1; } :\n" | 250 " function() { return 1; } :\n" |
| 253 " function() { return 2; }"); | 251 " function() { return 2; }"); |
| 254 CheckFunctionName(script, "return 1", "fun1"); | 252 CheckFunctionName(script, "return 1", "fun1"); |
| 255 CheckFunctionName(script, "return 2", "fun1"); | 253 CheckFunctionName(script, "return 2", "fun1"); |
| 256 } | 254 } |
| 257 | 255 |
| 258 | 256 |
| 259 TEST(MultipleFuncsInLiteral) { | 257 TEST(MultipleFuncsInLiteral) { |
| 260 InitializeVM(); | 258 InitializeVM(); |
| 261 v8::HandleScope scope; | 259 v8::HandleScope scope(env->GetIsolate()); |
| 262 | 260 |
| 263 v8::Handle<v8::Script> script = Compile( | 261 v8::Handle<v8::Script> script = Compile( |
| 264 "function MyClass() {}\n" | 262 "function MyClass() {}\n" |
| 265 "MyClass.prototype = {\n" | 263 "MyClass.prototype = {\n" |
| 266 " method1: 0 ? function() { return 1; } :\n" | 264 " method1: 0 ? function() { return 1; } :\n" |
| 267 " function() { return 2; } }"); | 265 " function() { return 2; } }"); |
| 268 CheckFunctionName(script, "return 1", "MyClass.method1"); | 266 CheckFunctionName(script, "return 1", "MyClass.method1"); |
| 269 CheckFunctionName(script, "return 2", "MyClass.method1"); | 267 CheckFunctionName(script, "return 2", "MyClass.method1"); |
| 270 } | 268 } |
| 271 | 269 |
| 272 | 270 |
| 273 // See http://code.google.com/p/v8/issues/detail?id=380 | 271 // See http://code.google.com/p/v8/issues/detail?id=380 |
| 274 TEST(Issue380) { | 272 TEST(Issue380) { |
| 275 InitializeVM(); | 273 InitializeVM(); |
| 276 v8::HandleScope scope; | 274 v8::HandleScope scope(env->GetIsolate()); |
| 277 | 275 |
| 278 v8::Handle<v8::Script> script = Compile( | 276 v8::Handle<v8::Script> script = Compile( |
| 279 "function a() {\n" | 277 "function a() {\n" |
| 280 "var result = function(p,a,c,k,e,d)" | 278 "var result = function(p,a,c,k,e,d)" |
| 281 "{return p}(\"if blah blah\",62,1976,\'a|b\'.split(\'|\'),0,{})\n" | 279 "{return p}(\"if blah blah\",62,1976,\'a|b\'.split(\'|\'),0,{})\n" |
| 282 "}"); | 280 "}"); |
| 283 CheckFunctionName(script, "return p", ""); | 281 CheckFunctionName(script, "return p", ""); |
| 284 } | 282 } |
| 285 | 283 |
| 286 | 284 |
| 287 TEST(MultipleAssignments) { | 285 TEST(MultipleAssignments) { |
| 288 InitializeVM(); | 286 InitializeVM(); |
| 289 v8::HandleScope scope; | 287 v8::HandleScope scope(env->GetIsolate()); |
| 290 | 288 |
| 291 v8::Handle<v8::Script> script = Compile( | 289 v8::Handle<v8::Script> script = Compile( |
| 292 "var fun1 = fun2 = function () { return 1; }\n" | 290 "var fun1 = fun2 = function () { return 1; }\n" |
| 293 "var bar1 = bar2 = bar3 = function () { return 2; }\n" | 291 "var bar1 = bar2 = bar3 = function () { return 2; }\n" |
| 294 "foo1 = foo2 = function () { return 3; }\n" | 292 "foo1 = foo2 = function () { return 3; }\n" |
| 295 "baz1 = baz2 = baz3 = function () { return 4; }"); | 293 "baz1 = baz2 = baz3 = function () { return 4; }"); |
| 296 CheckFunctionName(script, "return 1", "fun2"); | 294 CheckFunctionName(script, "return 1", "fun2"); |
| 297 CheckFunctionName(script, "return 2", "bar3"); | 295 CheckFunctionName(script, "return 2", "bar3"); |
| 298 CheckFunctionName(script, "return 3", "foo2"); | 296 CheckFunctionName(script, "return 3", "foo2"); |
| 299 CheckFunctionName(script, "return 4", "baz3"); | 297 CheckFunctionName(script, "return 4", "baz3"); |
| 300 } | 298 } |
| 301 | 299 |
| 302 | 300 |
| 303 TEST(AsConstructorParameter) { | 301 TEST(AsConstructorParameter) { |
| 304 InitializeVM(); | 302 InitializeVM(); |
| 305 v8::HandleScope scope; | 303 v8::HandleScope scope(env->GetIsolate()); |
| 306 | 304 |
| 307 v8::Handle<v8::Script> script = Compile( | 305 v8::Handle<v8::Script> script = Compile( |
| 308 "function Foo() {}\n" | 306 "function Foo() {}\n" |
| 309 "var foo = new Foo(function() { return 1; })\n" | 307 "var foo = new Foo(function() { return 1; })\n" |
| 310 "var bar = new Foo(function() { return 2; }, function() { return 3; })"); | 308 "var bar = new Foo(function() { return 2; }, function() { return 3; })"); |
| 311 CheckFunctionName(script, "return 1", ""); | 309 CheckFunctionName(script, "return 1", ""); |
| 312 CheckFunctionName(script, "return 2", ""); | 310 CheckFunctionName(script, "return 2", ""); |
| 313 CheckFunctionName(script, "return 3", ""); | 311 CheckFunctionName(script, "return 3", ""); |
| 314 } | 312 } |
| 315 | 313 |
| 316 | 314 |
| 317 TEST(FactoryHashmap) { | 315 TEST(FactoryHashmap) { |
| 318 InitializeVM(); | 316 InitializeVM(); |
| 319 v8::HandleScope scope; | 317 v8::HandleScope scope(env->GetIsolate()); |
| 320 | 318 |
| 321 v8::Handle<v8::Script> script = Compile( | 319 v8::Handle<v8::Script> script = Compile( |
| 322 "function createMyObj() {\n" | 320 "function createMyObj() {\n" |
| 323 " var obj = {};\n" | 321 " var obj = {};\n" |
| 324 " obj[\"method1\"] = function() { return 1; }\n" | 322 " obj[\"method1\"] = function() { return 1; }\n" |
| 325 " obj[\"method2\"] = function() { return 2; }\n" | 323 " obj[\"method2\"] = function() { return 2; }\n" |
| 326 " return obj;\n" | 324 " return obj;\n" |
| 327 "}"); | 325 "}"); |
| 328 CheckFunctionName(script, "return 1", "obj.method1"); | 326 CheckFunctionName(script, "return 1", "obj.method1"); |
| 329 CheckFunctionName(script, "return 2", "obj.method2"); | 327 CheckFunctionName(script, "return 2", "obj.method2"); |
| 330 } | 328 } |
| 331 | 329 |
| 332 | 330 |
| 333 TEST(FactoryHashmapVariable) { | 331 TEST(FactoryHashmapVariable) { |
| 334 InitializeVM(); | 332 InitializeVM(); |
| 335 v8::HandleScope scope; | 333 v8::HandleScope scope(env->GetIsolate()); |
| 336 | 334 |
| 337 v8::Handle<v8::Script> script = Compile( | 335 v8::Handle<v8::Script> script = Compile( |
| 338 "function createMyObj() {\n" | 336 "function createMyObj() {\n" |
| 339 " var obj = {};\n" | 337 " var obj = {};\n" |
| 340 " var methodName = \"method1\";\n" | 338 " var methodName = \"method1\";\n" |
| 341 " obj[methodName] = function() { return 1; }\n" | 339 " obj[methodName] = function() { return 1; }\n" |
| 342 " methodName = \"method2\";\n" | 340 " methodName = \"method2\";\n" |
| 343 " obj[methodName] = function() { return 2; }\n" | 341 " obj[methodName] = function() { return 2; }\n" |
| 344 " return obj;\n" | 342 " return obj;\n" |
| 345 "}"); | 343 "}"); |
| 346 // Can't infer function names statically. | 344 // Can't infer function names statically. |
| 347 CheckFunctionName(script, "return 1", "obj.(anonymous function)"); | 345 CheckFunctionName(script, "return 1", "obj.(anonymous function)"); |
| 348 CheckFunctionName(script, "return 2", "obj.(anonymous function)"); | 346 CheckFunctionName(script, "return 2", "obj.(anonymous function)"); |
| 349 } | 347 } |
| 350 | 348 |
| 351 | 349 |
| 352 TEST(FactoryHashmapConditional) { | 350 TEST(FactoryHashmapConditional) { |
| 353 InitializeVM(); | 351 InitializeVM(); |
| 354 v8::HandleScope scope; | 352 v8::HandleScope scope(env->GetIsolate()); |
| 355 | 353 |
| 356 v8::Handle<v8::Script> script = Compile( | 354 v8::Handle<v8::Script> script = Compile( |
| 357 "function createMyObj() {\n" | 355 "function createMyObj() {\n" |
| 358 " var obj = {};\n" | 356 " var obj = {};\n" |
| 359 " obj[0 ? \"method1\" : \"method2\"] = function() { return 1; }\n" | 357 " obj[0 ? \"method1\" : \"method2\"] = function() { return 1; }\n" |
| 360 " return obj;\n" | 358 " return obj;\n" |
| 361 "}"); | 359 "}"); |
| 362 // Can't infer the function name statically. | 360 // Can't infer the function name statically. |
| 363 CheckFunctionName(script, "return 1", "obj.(anonymous function)"); | 361 CheckFunctionName(script, "return 1", "obj.(anonymous function)"); |
| 364 } | 362 } |
| 365 | 363 |
| 366 | 364 |
| 367 TEST(GlobalAssignmentAndCall) { | 365 TEST(GlobalAssignmentAndCall) { |
| 368 InitializeVM(); | 366 InitializeVM(); |
| 369 v8::HandleScope scope; | 367 v8::HandleScope scope(env->GetIsolate()); |
| 370 | 368 |
| 371 v8::Handle<v8::Script> script = Compile( | 369 v8::Handle<v8::Script> script = Compile( |
| 372 "var Foo = function() {\n" | 370 "var Foo = function() {\n" |
| 373 " return 1;\n" | 371 " return 1;\n" |
| 374 "}();\n" | 372 "}();\n" |
| 375 "var Baz = Bar = function() {\n" | 373 "var Baz = Bar = function() {\n" |
| 376 " return 2;\n" | 374 " return 2;\n" |
| 377 "}"); | 375 "}"); |
| 378 // The inferred name is empty, because this is an assignment of a result. | 376 // The inferred name is empty, because this is an assignment of a result. |
| 379 CheckFunctionName(script, "return 1", ""); | 377 CheckFunctionName(script, "return 1", ""); |
| 380 // See MultipleAssignments test. | 378 // See MultipleAssignments test. |
| 381 CheckFunctionName(script, "return 2", "Bar"); | 379 CheckFunctionName(script, "return 2", "Bar"); |
| 382 } | 380 } |
| 383 | 381 |
| 384 | 382 |
| 385 TEST(AssignmentAndCall) { | 383 TEST(AssignmentAndCall) { |
| 386 InitializeVM(); | 384 InitializeVM(); |
| 387 v8::HandleScope scope; | 385 v8::HandleScope scope(env->GetIsolate()); |
| 388 | 386 |
| 389 v8::Handle<v8::Script> script = Compile( | 387 v8::Handle<v8::Script> script = Compile( |
| 390 "(function Enclosing() {\n" | 388 "(function Enclosing() {\n" |
| 391 " var Foo;\n" | 389 " var Foo;\n" |
| 392 " Foo = function() {\n" | 390 " Foo = function() {\n" |
| 393 " return 1;\n" | 391 " return 1;\n" |
| 394 " }();\n" | 392 " }();\n" |
| 395 " var Baz = Bar = function() {\n" | 393 " var Baz = Bar = function() {\n" |
| 396 " return 2;\n" | 394 " return 2;\n" |
| 397 " }\n" | 395 " }\n" |
| 398 "})();"); | 396 "})();"); |
| 399 // The inferred name is empty, because this is an assignment of a result. | 397 // The inferred name is empty, because this is an assignment of a result. |
| 400 CheckFunctionName(script, "return 1", ""); | 398 CheckFunctionName(script, "return 1", ""); |
| 401 // See MultipleAssignments test. | 399 // See MultipleAssignments test. |
| 402 // TODO(2276): Lazy compiling the enclosing outer closure would yield | 400 // TODO(2276): Lazy compiling the enclosing outer closure would yield |
| 403 // in "Enclosing.Bar" being the inferred name here. | 401 // in "Enclosing.Bar" being the inferred name here. |
| 404 CheckFunctionName(script, "return 2", "Bar"); | 402 CheckFunctionName(script, "return 2", "Bar"); |
| 405 } | 403 } |
| 406 | 404 |
| 407 | 405 |
| 408 TEST(MethodAssignmentInAnonymousFunctionCall) { | 406 TEST(MethodAssignmentInAnonymousFunctionCall) { |
| 409 InitializeVM(); | 407 InitializeVM(); |
| 410 v8::HandleScope scope; | 408 v8::HandleScope scope(env->GetIsolate()); |
| 411 | 409 |
| 412 v8::Handle<v8::Script> script = Compile( | 410 v8::Handle<v8::Script> script = Compile( |
| 413 "(function () {\n" | 411 "(function () {\n" |
| 414 " var EventSource = function () { };\n" | 412 " var EventSource = function () { };\n" |
| 415 " EventSource.prototype.addListener = function () {\n" | 413 " EventSource.prototype.addListener = function () {\n" |
| 416 " return 2012;\n" | 414 " return 2012;\n" |
| 417 " };\n" | 415 " };\n" |
| 418 " this.PublicEventSource = EventSource;\n" | 416 " this.PublicEventSource = EventSource;\n" |
| 419 "})();"); | 417 "})();"); |
| 420 CheckFunctionName(script, "return 2012", "EventSource.addListener"); | 418 CheckFunctionName(script, "return 2012", "EventSource.addListener"); |
| 421 } | 419 } |
| 422 | 420 |
| 423 | 421 |
| 424 TEST(ReturnAnonymousFunction) { | 422 TEST(ReturnAnonymousFunction) { |
| 425 InitializeVM(); | 423 InitializeVM(); |
| 426 v8::HandleScope scope; | 424 v8::HandleScope scope(env->GetIsolate()); |
| 427 | 425 |
| 428 v8::Handle<v8::Script> script = Compile( | 426 v8::Handle<v8::Script> script = Compile( |
| 429 "(function() {\n" | 427 "(function() {\n" |
| 430 " function wrapCode() {\n" | 428 " function wrapCode() {\n" |
| 431 " return function () {\n" | 429 " return function () {\n" |
| 432 " return 2012;\n" | 430 " return 2012;\n" |
| 433 " };\n" | 431 " };\n" |
| 434 " };\n" | 432 " };\n" |
| 435 " var foo = 10;\n" | 433 " var foo = 10;\n" |
| 436 " function f() {\n" | 434 " function f() {\n" |
| 437 " return wrapCode();\n" | 435 " return wrapCode();\n" |
| 438 " }\n" | 436 " }\n" |
| 439 " this.ref = f;\n" | 437 " this.ref = f;\n" |
| 440 "})()"); | 438 "})()"); |
| 441 script->Run(); | 439 script->Run(); |
| 442 CheckFunctionName(script, "return 2012", ""); | 440 CheckFunctionName(script, "return 2012", ""); |
| 443 } | 441 } |
| OLD | NEW |