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 1196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1207 .Return(); | 1207 .Return(); |
| 1208 | 1208 |
| 1209 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1209 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 1210 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 1210 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| 1211 auto callable = tester.GetCallable<>(); | 1211 auto callable = tester.GetCallable<>(); |
| 1212 Handle<Object> return_value = callable().ToHandleChecked(); | 1212 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1213 CHECK_EQ(Smi::cast(*return_value)->value(), 7); | 1213 CHECK_EQ(Smi::cast(*return_value)->value(), 7); |
| 1214 } | 1214 } |
| 1215 | 1215 |
| 1216 | 1216 |
| 1217 TEST(InterpreterConditionalJumps2) { | |
| 1218 // TODO(oth): Add tests for all conditional jumps near and far. | |
| 1219 HandleAndZoneScope handles; | |
| 1220 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | |
| 1221 builder.set_locals_count(2); | |
| 1222 builder.set_context_count(0); | |
| 1223 builder.set_parameter_count(0); | |
| 1224 Register reg(0), scratch(1); | |
| 1225 BytecodeLabel label[2]; | |
| 1226 BytecodeLabel done, done1; | |
| 1227 | |
| 1228 builder.LoadLiteral(Smi::FromInt(0)) | |
| 1229 .StoreAccumulatorInRegister(reg) | |
| 1230 .LoadFalse() | |
| 1231 .JumpIfFalse(&label[0]); | |
| 1232 IncrementRegister(builder, reg, 1024, scratch) | |
| 1233 .Bind(&label[0]) | |
| 1234 .LoadTrue() | |
| 1235 .JumpIfFalse(&done); | |
| 1236 IncrementRegister(builder, reg, 1, scratch).LoadTrue().JumpIfTrue(&label[1]); | |
| 1237 IncrementRegister(builder, reg, 2048, scratch).Bind(&label[1]); | |
| 1238 IncrementRegister(builder, reg, 2, scratch).LoadFalse().JumpIfTrue(&done1); | |
| 1239 IncrementRegister(builder, reg, 4, scratch) | |
| 1240 .LoadAccumulatorWithRegister(reg) | |
| 1241 .Bind(&done) | |
| 1242 .Bind(&done1) | |
| 1243 .Return(); | |
| 1244 | |
| 1245 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | |
| 1246 InterpreterTester tester(handles.main_isolate(), bytecode_array); | |
| 1247 auto callable = tester.GetCallable<>(); | |
| 1248 Handle<Object> return_value = callable().ToHandleChecked(); | |
| 1249 CHECK_EQ(Smi::cast(*return_value)->value(), 7); | |
| 1250 } | |
| 1251 | |
| 1252 | |
| 1217 static const Token::Value kComparisonTypes[] = { | 1253 static const Token::Value kComparisonTypes[] = { |
| 1218 Token::Value::EQ, Token::Value::NE, Token::Value::EQ_STRICT, | 1254 Token::Value::EQ, Token::Value::NE, Token::Value::EQ_STRICT, |
| 1219 Token::Value::NE_STRICT, Token::Value::LTE, Token::Value::LTE, | 1255 Token::Value::NE_STRICT, Token::Value::LTE, Token::Value::LTE, |
| 1220 Token::Value::GT, Token::Value::GTE}; | 1256 Token::Value::GT, Token::Value::GTE}; |
| 1221 | 1257 |
| 1222 | 1258 |
| 1223 template <typename T> | 1259 template <typename T> |
| 1224 bool CompareC(Token::Value op, T lhs, T rhs, bool types_differed = false) { | 1260 bool CompareC(Token::Value op, T lhs, T rhs, bool types_differed = false) { |
| 1225 switch (op) { | 1261 switch (op) { |
| 1226 case Token::Value::EQ: | 1262 case Token::Value::EQ: |
| (...skipping 1264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2491 | 2527 |
| 2492 for (size_t i = 0; i < arraysize(test_global_delete); i++) { | 2528 for (size_t i = 0; i < arraysize(test_global_delete); i++) { |
| 2493 InterpreterTester tester(handles.main_isolate(), | 2529 InterpreterTester tester(handles.main_isolate(), |
| 2494 test_global_delete[i].first); | 2530 test_global_delete[i].first); |
| 2495 auto callable = tester.GetCallable<>(); | 2531 auto callable = tester.GetCallable<>(); |
| 2496 | 2532 |
| 2497 Handle<i::Object> return_value = callable().ToHandleChecked(); | 2533 Handle<i::Object> return_value = callable().ToHandleChecked(); |
| 2498 CHECK(return_value->SameValue(*test_global_delete[i].second)); | 2534 CHECK(return_value->SameValue(*test_global_delete[i].second)); |
| 2499 } | 2535 } |
| 2500 } | 2536 } |
| 2537 | |
| 2538 | |
| 2539 TEST(InterpreterForIn) { | |
| 2540 HandleAndZoneScope handles; | |
| 2541 | |
| 2542 // TODO(oth): Add a test here for delete mid-loop when delete is ready. | |
|
rmcilroy
2015/10/28 13:46:22
it's now ready and landed ;)
oth
2015/10/28 22:50:40
Done.
| |
| 2543 std::pair<const char*, int> for_in_samples[] = { | |
| 2544 {"function f() {\n" | |
| 2545 " var r = -1;\n" | |
| 2546 " for (var a in null) { r = a; }\n" | |
| 2547 " return r;\n" | |
| 2548 "}", | |
| 2549 -1}, | |
| 2550 {"function f() {\n" | |
| 2551 " var r = -1;\n" | |
| 2552 " for (var a in undefined) { r = a; }\n" | |
| 2553 " return r;\n" | |
| 2554 "}", | |
| 2555 -1}, | |
| 2556 {"function f() {\n" | |
| 2557 " var r = 0;\n" | |
| 2558 " for (var a in [0,6,7,9]) { r = r + (1 << a); }\n" | |
| 2559 " return r;\n" | |
| 2560 "}", | |
| 2561 0xf}, | |
| 2562 {"function f() {\n" | |
| 2563 " var r = 0;\n" | |
| 2564 " for (var a in [0,6,7,9]) { r = r + (1 << a); }\n" | |
| 2565 " var r = 0;\n" | |
| 2566 " for (var a in [0,6,7,9]) { r = r + (1 << a); }\n" | |
| 2567 " return r;\n" | |
| 2568 "}", | |
| 2569 0xf}, | |
| 2570 {"function f() {\n" | |
| 2571 " var r = 0;\n" | |
| 2572 " for (var a in 'foobar') { r = r + (1 << a); }\n" | |
| 2573 " return r;\n" | |
| 2574 "}", | |
| 2575 0x3f}, | |
| 2576 {"function f() {\n" | |
| 2577 " var r = 0;\n" | |
| 2578 " for (var a in {1:0, 10:1, 100:2, 1000:3}) {\n" | |
| 2579 " r = r + Number(a);\n" | |
| 2580 " }\n" | |
| 2581 " return r;\n" | |
| 2582 "}", | |
| 2583 1111}, | |
| 2584 {"function f() {\n" | |
| 2585 " var r = 0;\n" | |
| 2586 " var input = 'foobar';\n" | |
| 2587 " for (var a in input) {\n" | |
| 2588 " if (input[a] == 'b') break;\n" | |
| 2589 " r = r + (1 << a);\n" | |
| 2590 " }\n" | |
| 2591 " return r;\n" | |
| 2592 "}", | |
| 2593 0x7}, | |
| 2594 {"function f() {\n" | |
| 2595 "var r = 0;\n" | |
| 2596 "var input = 'foobar';\n" | |
| 2597 "for (var a in input) {\n" | |
| 2598 " if (input[a] == 'b') continue;\n" | |
| 2599 " r = r + (1 << a);\n" | |
| 2600 "}\n" | |
| 2601 "return r;\n" | |
| 2602 "}", | |
| 2603 0x37}, | |
| 2604 {"function f() {\n" | |
| 2605 " var r = 0;\n" | |
| 2606 " var data = {1:0, 10:1, 100:2, 1000:3};\n" | |
| 2607 " for (var a in data) {\n" | |
| 2608 " if (a == 10) {\n" | |
| 2609 " data[10000] = 4;\n" | |
| 2610 " }\n" | |
| 2611 " r = r + Number(a);\n" | |
| 2612 " }\n" | |
| 2613 " return r;\n" | |
| 2614 "}", | |
| 2615 1111}, | |
| 2616 {"function f() {\n" | |
| 2617 " var r = [ 3 ];\n" | |
| 2618 " var data = {1:0, 10:1, 100:2, 1000:3};\n" | |
| 2619 " for (r[10] in data) {\n" | |
| 2620 " }\n" | |
| 2621 " return Number(r[10]);\n" | |
| 2622 "}", | |
| 2623 1000}, | |
| 2624 {"function f() {\n" | |
| 2625 " var r = [ 3 ];\n" | |
| 2626 " var data = {1:0, 10:1, 100:2, 1000:3};\n" | |
| 2627 " for (r['100'] in data) {\n" | |
| 2628 " }\n" | |
| 2629 " return Number(r['100']);\n" | |
| 2630 "}", | |
| 2631 1000}, | |
| 2632 {"function f() {\n" | |
| 2633 " var obj = {}\n" | |
| 2634 " var descObj = new Boolean(false);\n" | |
| 2635 " var accessed = 0;\n" | |
| 2636 " descObj.enumerable = true;\n" | |
| 2637 " Object.defineProperties(obj, { prop:descObj });\n" | |
| 2638 " for (var p in obj) {\n" | |
| 2639 " if (p === 'prop') { accessed = 1; }\n" | |
| 2640 " }\n" | |
| 2641 " return accessed;" | |
| 2642 "}", | |
| 2643 1}}; | |
| 2644 | |
| 2645 for (size_t i = 0; i < arraysize(for_in_samples); i++) { | |
| 2646 InterpreterTester tester(handles.main_isolate(), for_in_samples[i].first); | |
| 2647 auto callable = tester.GetCallable<>(); | |
| 2648 Handle<Object> return_val = callable().ToHandleChecked(); | |
| 2649 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), for_in_samples[i].second); | |
| 2650 } | |
| 2651 } | |
| OLD | NEW |