Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/execution.h" | 7 #include "src/execution.h" |
| 8 #include "src/handles.h" | 8 #include "src/handles.h" |
| 9 #include "src/interpreter/bytecode-array-builder.h" | 9 #include "src/interpreter/bytecode-array-builder.h" |
| 10 #include "src/interpreter/interpreter.h" | 10 #include "src/interpreter/interpreter.h" |
| (...skipping 2246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2257 }; | 2257 }; |
| 2258 | 2258 |
| 2259 InterpreterTester tester(handles.main_isolate(), create_args[i].first); | 2259 InterpreterTester tester(handles.main_isolate(), create_args[i].first); |
| 2260 auto callable = | 2260 auto callable = |
| 2261 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); | 2261 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); |
| 2262 Handle<Object> return_val = | 2262 Handle<Object> return_val = |
| 2263 callable(args[0], args[1], args[2]).ToHandleChecked(); | 2263 callable(args[0], args[1], args[2]).ToHandleChecked(); |
| 2264 CHECK(return_val->SameValue(*args[create_args[i].second])); | 2264 CHECK(return_val->SameValue(*args[create_args[i].second])); |
| 2265 } | 2265 } |
| 2266 } | 2266 } |
| 2267 | |
| 2268 | |
| 2269 TEST(InterpreterDelete) { | |
| 2270 HandleAndZoneScope handles; | |
| 2271 i::Isolate* isolate = handles.main_isolate(); | |
| 2272 i::Factory* factory = isolate->factory(); | |
| 2273 | |
| 2274 // Tests for delete for local variables that work both in strict | |
| 2275 // and sloppy modes | |
| 2276 std::pair<const char*, Handle<Object>> test_delete[] = { | |
| 2277 std::make_pair( | |
| 2278 "var a = { x:10, y:'abc', z:30.2}; delete a.x; return a.x;\n", | |
| 2279 factory->undefined_value()), | |
| 2280 std::make_pair( | |
| 2281 "var b = { x:10, y:'abc', z:30.2}; delete b.x; return b.y;\n", | |
| 2282 factory->NewStringFromStaticChars("abc")), | |
| 2283 std::make_pair("var c = { x:10, y:'abc', z:30.2}; var d = c; delete d.x; " | |
| 2284 "return c.x;\n", | |
| 2285 factory->undefined_value()), | |
| 2286 std::make_pair("var e = { x:10, y:'abc', z:30.2}; var g = e; delete g.x; " | |
| 2287 "return e.y;\n", | |
| 2288 factory->NewStringFromStaticChars("abc")), | |
| 2289 std::make_pair("var a = { x:10, y:'abc', z:30.2};\n" | |
| 2290 "var b = a;" | |
| 2291 "delete b.x;" | |
| 2292 "return b.x;\n", | |
| 2293 factory->undefined_value()), | |
| 2294 std::make_pair("var a = {1:10};\n" | |
| 2295 "(function f1() {return a;});" | |
| 2296 "return delete a[1];", | |
| 2297 factory->ToBoolean(true))}; | |
| 2298 | |
|
rmcilroy
2015/10/26 14:31:07
nit - could you add a test for:
- return delete t
mythria
2015/10/27 10:50:48
Done.
| |
| 2299 // Test delete in sloppy mode | |
| 2300 for (size_t i = 0; i < arraysize(test_delete); i++) { | |
| 2301 std::string source( | |
| 2302 InterpreterTester::SourceForBody(test_delete[i].first)); | |
| 2303 InterpreterTester tester(handles.main_isolate(), source.c_str()); | |
| 2304 auto callable = tester.GetCallable<>(); | |
| 2305 | |
| 2306 Handle<i::Object> return_value = callable().ToHandleChecked(); | |
| 2307 CHECK(return_value->SameValue(*test_delete[i].second)); | |
| 2308 } | |
| 2309 | |
| 2310 // Test delete in strict mode | |
| 2311 for (size_t i = 0; i < arraysize(test_delete); i++) { | |
| 2312 std::string strict_test = | |
| 2313 "'use strict'; " + std::string(test_delete[i].first); | |
| 2314 std::string source(InterpreterTester::SourceForBody(strict_test.c_str())); | |
| 2315 InterpreterTester tester(handles.main_isolate(), source.c_str()); | |
| 2316 auto callable = tester.GetCallable<>(); | |
| 2317 | |
| 2318 Handle<i::Object> return_value = callable().ToHandleChecked(); | |
| 2319 CHECK(return_value->SameValue(*test_delete[i].second)); | |
| 2320 } | |
| 2321 } | |
| 2322 | |
| 2323 | |
| 2324 TEST(InterpreterDeleteSloppy) { | |
|
rmcilroy
2015/10/26 14:31:07
nit - How about InterpreterDeleteSloppyUnqualified
mythria
2015/10/27 10:50:48
Done.
| |
| 2325 HandleAndZoneScope handles; | |
| 2326 i::Isolate* isolate = handles.main_isolate(); | |
| 2327 i::Factory* factory = isolate->factory(); | |
| 2328 | |
| 2329 // These tests generate a syntax error for strict mode. We don't | |
| 2330 // test for it here. | |
| 2331 std::pair<const char*, Handle<Object>> test_delete[] = { | |
| 2332 std::make_pair("var a = { x:10, y:'abc'};\n" | |
| 2333 "var b = delete a;\n" | |
| 2334 "a.x = a.x + !b;\n" | |
|
rmcilroy
2015/10/26 14:31:07
this is a bit hard to parse, how about:
var a = {
mythria
2015/10/27 10:50:48
Done.
| |
| 2335 "return a.x;\n", | |
| 2336 Handle<Object>(Smi::FromInt(11), isolate)), | |
| 2337 // TODO(mythria) When try-catch is implemented change the tests to check | |
| 2338 // if delete actually deletes | |
| 2339 std::make_pair("a = { x:10, y:'abc'};\n" | |
| 2340 "var b = delete a;\n" | |
| 2341 // "try{return a.x;} catch(e) {return b;}\n" | |
| 2342 "return b;", | |
| 2343 factory->ToBoolean(true)), | |
| 2344 std::make_pair("a = { x:10, y:'abc'};\n" | |
| 2345 "var b = delete c;\n" | |
| 2346 "return b;", | |
| 2347 factory->ToBoolean(true))}; | |
| 2348 | |
| 2349 | |
| 2350 for (size_t i = 0; i < arraysize(test_delete); i++) { | |
| 2351 std::string source( | |
| 2352 InterpreterTester::SourceForBody(test_delete[i].first)); | |
| 2353 InterpreterTester tester(handles.main_isolate(), source.c_str()); | |
| 2354 auto callable = tester.GetCallable<>(); | |
| 2355 | |
| 2356 Handle<i::Object> return_value = callable().ToHandleChecked(); | |
| 2357 CHECK(return_value->SameValue(*test_delete[i].second)); | |
| 2358 } | |
| 2359 } | |
| 2360 | |
| 2361 | |
| 2362 TEST(InterpreterGlobalDelete) { | |
| 2363 HandleAndZoneScope handles; | |
| 2364 i::Isolate* isolate = handles.main_isolate(); | |
| 2365 i::Factory* factory = isolate->factory(); | |
| 2366 | |
| 2367 std::pair<const char*, Handle<Object>> test_global_delete[] = { | |
| 2368 std::make_pair("var a = { x:10, y:'abc', z:30.2};\n" | |
| 2369 "function f() {\n" | |
| 2370 " delete a.x;\n" | |
| 2371 " return a.x;}\n" | |
|
rmcilroy
2015/10/26 14:31:07
nit - '}' on a newline (throughout)
mythria
2015/10/27 10:50:48
Done.
| |
| 2372 "f();\n", | |
| 2373 factory->undefined_value()), | |
| 2374 std::make_pair("var b = {1:10, 2:'abc', 3:30.2};\n" | |
| 2375 "function f() {delete b[2]; return b[1];} f();\n", | |
| 2376 Handle<Object>(Smi::FromInt(10), isolate)), | |
| 2377 std::make_pair("var c = { x:10, y:'abc', z:30.2};\n" | |
| 2378 "function f() {var d = c; delete d.y; return d.x;} f();\n", | |
| 2379 Handle<Object>(Smi::FromInt(10), isolate)), | |
| 2380 std::make_pair("e = { x:10, y:'abc'};\n" | |
|
rmcilroy
2015/10/26 14:31:07
nit - space after 'abc'
mythria
2015/10/27 10:50:48
Done.
| |
| 2381 "function f() {\n" | |
| 2382 " return delete e;\n" | |
| 2383 "}\n" | |
| 2384 "f();\n", | |
| 2385 factory->ToBoolean(true)), | |
| 2386 std::make_pair("var g = { x:10, y:'abc'};\n" | |
| 2387 "function f() {\n" | |
| 2388 " var b = delete g;\n" | |
|
rmcilroy
2015/10/26 14:31:07
nit - just "return delete g;" to match the one abo
mythria
2015/10/27 10:50:48
Done.
| |
| 2389 " return b;}\n" | |
| 2390 "f();\n", | |
| 2391 factory->ToBoolean(false)), | |
| 2392 std::make_pair("function f() {\n" | |
| 2393 " var obj = {h:10, f1() {return delete this;}};\n" | |
| 2394 " return obj.f1();\n" | |
| 2395 "}\n" | |
| 2396 "f();", | |
| 2397 factory->ToBoolean(true)), | |
| 2398 std::make_pair("function f() {\n" | |
| 2399 " var obj = {h:10,\n" | |
| 2400 " f1() {\n" | |
| 2401 " 'use strict';\n" | |
| 2402 " return delete this.h;}};\n" | |
| 2403 " return obj.f1();\n" | |
| 2404 "}\n" | |
| 2405 "f();", | |
| 2406 factory->ToBoolean(true))}; | |
| 2407 | |
| 2408 for (size_t i = 0; i < arraysize(test_global_delete); i++) { | |
| 2409 InterpreterTester tester(handles.main_isolate(), | |
| 2410 test_global_delete[i].first); | |
| 2411 auto callable = tester.GetCallable<>(); | |
| 2412 | |
| 2413 Handle<i::Object> return_value = callable().ToHandleChecked(); | |
| 2414 CHECK(return_value->SameValue(*test_global_delete[i].second)); | |
| 2415 } | |
| 2416 } | |
| OLD | NEW |