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 |