Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: test/cctest/interpreter/test-interpreter.cc

Issue 1422033002: [Interpreter] Add support for for..in. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Update comments. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698