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/compiler.h" | 7 #include "src/compiler.h" |
8 #include "src/interpreter/bytecode-array-iterator.h" | 8 #include "src/interpreter/bytecode-array-iterator.h" |
9 #include "src/interpreter/bytecode-generator.h" | 9 #include "src/interpreter/bytecode-generator.h" |
10 #include "src/interpreter/interpreter.h" | 10 #include "src/interpreter/interpreter.h" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 const char* function_name) { | 48 const char* function_name) { |
49 CompileRun(script); | 49 CompileRun(script); |
50 Local<Function> function = | 50 Local<Function> function = |
51 Local<Function>::Cast(CcTest::global()->Get(v8_str(function_name))); | 51 Local<Function>::Cast(CcTest::global()->Get(v8_str(function_name))); |
52 i::Handle<i::JSFunction> js_function = | 52 i::Handle<i::JSFunction> js_function = |
53 i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*function)); | 53 i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*function)); |
54 return handle(js_function->shared()->bytecode_array(), CcTest::i_isolate()); | 54 return handle(js_function->shared()->bytecode_array(), CcTest::i_isolate()); |
55 } | 55 } |
56 | 56 |
57 Handle<BytecodeArray> MakeBytecodeForFunctionBody(const char* body) { | 57 Handle<BytecodeArray> MakeBytecodeForFunctionBody(const char* body) { |
58 ScopedVector<char> program(1024); | 58 ScopedVector<char> program(3072); |
59 SNPrintF(program, "function %s() { %s }\n%s();", kFunctionName, body, | 59 SNPrintF(program, "function %s() { %s }\n%s();", kFunctionName, body, |
60 kFunctionName); | 60 kFunctionName); |
61 return MakeBytecode(program.start(), kFunctionName); | 61 return MakeBytecode(program.start(), kFunctionName); |
62 } | 62 } |
63 | 63 |
64 Handle<BytecodeArray> MakeBytecodeForFunction(const char* function) { | 64 Handle<BytecodeArray> MakeBytecodeForFunction(const char* function) { |
65 ScopedVector<char> program(1024); | 65 ScopedVector<char> program(3072); |
66 SNPrintF(program, "%s\n%s();", function, kFunctionName); | 66 SNPrintF(program, "%s\n%s();", function, kFunctionName); |
67 return MakeBytecode(program.start(), kFunctionName); | 67 return MakeBytecode(program.start(), kFunctionName); |
68 } | 68 } |
69 | 69 |
70 Handle<BytecodeArray> MakeBytecodeForFunctionNoFilter(const char* function) { | 70 Handle<BytecodeArray> MakeBytecodeForFunctionNoFilter(const char* function) { |
71 const char* old_ignition_filter = i::FLAG_ignition_filter; | 71 const char* old_ignition_filter = i::FLAG_ignition_filter; |
72 i::FLAG_ignition_filter = "*"; | 72 i::FLAG_ignition_filter = "*"; |
73 ScopedVector<char> program(1024); | 73 ScopedVector<char> program(3072); |
74 SNPrintF(program, "%s\n%s();", function, kFunctionName); | 74 SNPrintF(program, "%s\n%s();", function, kFunctionName); |
75 Handle<BytecodeArray> return_val = | 75 Handle<BytecodeArray> return_val = |
76 MakeBytecode(program.start(), kFunctionName); | 76 MakeBytecode(program.start(), kFunctionName); |
77 i::FLAG_ignition_filter = old_ignition_filter; | 77 i::FLAG_ignition_filter = old_ignition_filter; |
78 return return_val; | 78 return return_val; |
79 } | 79 } |
80 }; | 80 }; |
81 | 81 |
82 | 82 |
83 // Helper macros for handcrafting bytecode sequences. | 83 // Helper macros for handcrafting bytecode sequences. |
84 #define B(x) static_cast<uint8_t>(Bytecode::k##x) | 84 #define B(x) static_cast<uint8_t>(Bytecode::k##x) |
85 #define U8(x) static_cast<uint8_t>((x) & 0xff) | 85 #define U8(x) static_cast<uint8_t>((x) & 0xff) |
86 #define R(x) static_cast<uint8_t>(-(x) & 0xff) | 86 #define R(x) static_cast<uint8_t>(-(x) & 0xff) |
87 #define A(x, n) R(helper.kLastParamIndex - (n) + 1 + (x)) | 87 #define A(x, n) R(helper.kLastParamIndex - (n) + 1 + (x)) |
88 #define THIS(n) A(0, n) | 88 #define THIS(n) A(0, n) |
89 #if defined(V8_TARGET_LITTLE_ENDIAN) | 89 #if defined(V8_TARGET_LITTLE_ENDIAN) |
90 #define U16(x) static_cast<uint8_t>((x) & 0xff), \ | 90 #define U16(x) static_cast<uint8_t>((x) & 0xff), \ |
91 static_cast<uint8_t>(((x) >> kBitsPerByte) & 0xff) | 91 static_cast<uint8_t>(((x) >> kBitsPerByte) & 0xff) |
92 #elif defined(V8_TARGET_BIG_ENDIAN) | 92 #elif defined(V8_TARGET_BIG_ENDIAN) |
93 #define U16(x) static_cast<uint8_t>(((x) >> kBitsPerByte) & 0xff), \ | 93 #define U16(x) static_cast<uint8_t>(((x) >> kBitsPerByte) & 0xff), \ |
94 static_cast<uint8_t>((x) & 0xff) | 94 static_cast<uint8_t>((x) & 0xff) |
95 #else | 95 #else |
96 #error Unknown byte ordering | 96 #error Unknown byte ordering |
97 #endif | 97 #endif |
98 | 98 |
| 99 #define COMMA() , |
| 100 #define SPACE() |
| 101 |
| 102 #define REPEAT_2(SEP, ...) \ |
| 103 __VA_ARGS__ SEP() __VA_ARGS__ |
| 104 #define REPEAT_4(SEP, ...) \ |
| 105 REPEAT_2(SEP, __VA_ARGS__) SEP() REPEAT_2(SEP, __VA_ARGS__) |
| 106 #define REPEAT_8(SEP, ...) \ |
| 107 REPEAT_4(SEP, __VA_ARGS__) SEP() REPEAT_4(SEP, __VA_ARGS__) |
| 108 #define REPEAT_16(SEP, ...) \ |
| 109 REPEAT_8(SEP, __VA_ARGS__) SEP() REPEAT_8(SEP, __VA_ARGS__) |
| 110 #define REPEAT_32(SEP, ...) \ |
| 111 REPEAT_16(SEP, __VA_ARGS__) SEP() REPEAT_16(SEP, __VA_ARGS__) |
| 112 #define REPEAT_64(SEP, ...) \ |
| 113 REPEAT_32(SEP, __VA_ARGS__) SEP() REPEAT_32(SEP, __VA_ARGS__) |
| 114 #define REPEAT_128(SEP, ...) \ |
| 115 REPEAT_64(SEP, __VA_ARGS__) SEP() REPEAT_64(SEP, __VA_ARGS__) |
| 116 #define REPEAT_256(SEP, ...) \ |
| 117 REPEAT_128(SEP, __VA_ARGS__) SEP() REPEAT_128(SEP, __VA_ARGS__) |
| 118 |
| 119 #define REPEAT_127(SEP, ...) \ |
| 120 REPEAT_64(SEP, __VA_ARGS__) SEP() REPEAT_32(SEP, __VA_ARGS__) SEP() \ |
| 121 REPEAT_16(SEP, __VA_ARGS__) SEP() REPEAT_8(SEP, __VA_ARGS__) SEP() \ |
| 122 REPEAT_4(SEP, __VA_ARGS__) SEP() REPEAT_2(SEP, __VA_ARGS__) SEP() \ |
| 123 __VA_ARGS__ |
99 | 124 |
100 // Structure for containing expected bytecode snippets. | 125 // Structure for containing expected bytecode snippets. |
101 template<typename T> | 126 template<typename T, int C = 6> |
102 struct ExpectedSnippet { | 127 struct ExpectedSnippet { |
103 const char* code_snippet; | 128 const char* code_snippet; |
104 int frame_size; | 129 int frame_size; |
105 int parameter_count; | 130 int parameter_count; |
106 int bytecode_length; | 131 int bytecode_length; |
107 const uint8_t bytecode[512]; | 132 const uint8_t bytecode[2048]; |
108 int constant_count; | 133 int constant_count; |
109 T constants[6]; | 134 T constants[C]; |
110 }; | 135 }; |
111 | 136 |
112 | 137 |
113 static void CheckConstant(int expected, Object* actual) { | 138 static void CheckConstant(int expected, Object* actual) { |
114 CHECK_EQ(expected, Smi::cast(actual)->value()); | 139 CHECK_EQ(expected, Smi::cast(actual)->value()); |
115 } | 140 } |
116 | 141 |
117 | 142 |
118 static void CheckConstant(double expected, Object* actual) { | 143 static void CheckConstant(double expected, Object* actual) { |
119 CHECK_EQ(expected, HeapNumber::cast(actual)->value()); | 144 CHECK_EQ(expected, HeapNumber::cast(actual)->value()); |
(...skipping 10 matching lines...) Expand all Loading... |
130 static void CheckConstant(Handle<Object> expected, Object* actual) { | 155 static void CheckConstant(Handle<Object> expected, Object* actual) { |
131 CHECK(actual == *expected || expected->StrictEquals(actual)); | 156 CHECK(actual == *expected || expected->StrictEquals(actual)); |
132 } | 157 } |
133 | 158 |
134 | 159 |
135 static void CheckConstant(InstanceType expected, Object* actual) { | 160 static void CheckConstant(InstanceType expected, Object* actual) { |
136 CHECK_EQ(expected, HeapObject::cast(actual)->map()->instance_type()); | 161 CHECK_EQ(expected, HeapObject::cast(actual)->map()->instance_type()); |
137 } | 162 } |
138 | 163 |
139 | 164 |
140 template <typename T> | 165 template <typename T, int C> |
141 static void CheckBytecodeArrayEqual(const ExpectedSnippet<T>& expected, | 166 static void CheckBytecodeArrayEqual(const ExpectedSnippet<T, C>& expected, |
142 Handle<BytecodeArray> actual) { | 167 Handle<BytecodeArray> actual) { |
143 CHECK_EQ(expected.frame_size, actual->frame_size()); | 168 CHECK_EQ(expected.frame_size, actual->frame_size()); |
144 CHECK_EQ(expected.parameter_count, actual->parameter_count()); | 169 CHECK_EQ(expected.parameter_count, actual->parameter_count()); |
145 CHECK_EQ(expected.bytecode_length, actual->length()); | 170 CHECK_EQ(expected.bytecode_length, actual->length()); |
146 if (expected.constant_count == 0) { | 171 if (expected.constant_count == 0) { |
147 CHECK_EQ(CcTest::heap()->empty_fixed_array(), actual->constant_pool()); | 172 CHECK_EQ(CcTest::heap()->empty_fixed_array(), actual->constant_pool()); |
148 } else { | 173 } else { |
149 CHECK_EQ(expected.constant_count, actual->constant_pool()->length()); | 174 CHECK_EQ(expected.constant_count, actual->constant_pool()->length()); |
150 for (int i = 0; i < expected.constant_count; i++) { | 175 for (int i = 0; i < expected.constant_count; i++) { |
151 CheckConstant(expected.constants[i], actual->constant_pool()->get(i)); | 176 CheckConstant(expected.constants[i], actual->constant_pool()->get(i)); |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
418 B(LdaSmi8), U8(4), // | 443 B(LdaSmi8), U8(4), // |
419 B(Star), R(2), // | 444 B(Star), R(2), // |
420 B(Ldar), R(0), // | 445 B(Ldar), R(0), // |
421 B(JumpIfToBooleanTrue), U8(8), // | 446 B(JumpIfToBooleanTrue), U8(8), // |
422 B(LdaSmi8), U8(5), // | 447 B(LdaSmi8), U8(5), // |
423 B(Star), R(2), // | 448 B(Star), R(2), // |
424 B(LdaSmi8), U8(3), // | 449 B(LdaSmi8), U8(3), // |
425 B(Return)}, | 450 B(Return)}, |
426 0}, | 451 0}, |
427 {"var x = 1; var a = 2, b = 3; return x || (" | 452 {"var x = 1; var a = 2, b = 3; return x || (" |
428 #define X "a = 1, b = 2, " | 453 REPEAT_32(SPACE, "a = 1, b = 2, ") |
429 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X | |
430 #undef X | |
431 "3);", | 454 "3);", |
432 3 * kPointerSize, | 455 3 * kPointerSize, |
433 1, | 456 1, |
434 283, | 457 275, |
435 {B(LdaSmi8), U8(1), // | 458 {B(LdaSmi8), U8(1), // |
436 B(Star), R(0), // | 459 B(Star), R(0), // |
437 B(LdaSmi8), U8(2), // | 460 B(LdaSmi8), U8(2), // |
438 B(Star), R(1), // | 461 B(Star), R(1), // |
439 B(LdaSmi8), U8(3), // | 462 B(LdaSmi8), U8(3), // |
440 B(Star), R(2), // | 463 B(Star), R(2), // |
441 B(Ldar), R(0), // | 464 B(Ldar), R(0), // |
442 B(JumpIfToBooleanTrueConstant), U8(0), // | 465 B(JumpIfToBooleanTrueConstant), U8(0), // |
443 #define X B(LdaSmi8), U8(1), B(Star), R(1), B(LdaSmi8), U8(2), B(Star), R(2), | 466 REPEAT_32(COMMA, // |
444 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X | 467 B(LdaSmi8), U8(1), // |
445 #undef X | 468 B(Star), R(1), // |
| 469 B(LdaSmi8), U8(2), // |
| 470 B(Star), R(2)), // |
446 B(LdaSmi8), U8(3), // | 471 B(LdaSmi8), U8(3), // |
447 B(Return)}, | 472 B(Return)}, |
448 1, | 473 1, |
449 {268, 0, 0, 0}}, | 474 {260, 0, 0, 0}}, |
450 {"var x = 0; var a = 2, b = 3; return x && (" | 475 {"var x = 0; var a = 2, b = 3; return x && (" |
451 #define X "a = 1, b = 2, " | 476 REPEAT_32(SPACE, "a = 1, b = 2, ") |
452 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X | |
453 #undef X | |
454 "3);", | 477 "3);", |
455 3 * kPointerSize, | 478 3 * kPointerSize, |
456 1, | 479 1, |
457 282, | 480 274, |
458 {B(LdaZero), // | 481 {B(LdaZero), // |
459 B(Star), R(0), // | 482 B(Star), R(0), // |
460 B(LdaSmi8), U8(2), // | 483 B(LdaSmi8), U8(2), // |
461 B(Star), R(1), // | 484 B(Star), R(1), // |
462 B(LdaSmi8), U8(3), // | 485 B(LdaSmi8), U8(3), // |
463 B(Star), R(2), // | 486 B(Star), R(2), // |
464 B(Ldar), R(0), // | 487 B(Ldar), R(0), // |
465 B(JumpIfToBooleanFalseConstant), U8(0), // | 488 B(JumpIfToBooleanFalseConstant), U8(0), // |
466 #define X B(LdaSmi8), U8(1), B(Star), R(1), B(LdaSmi8), U8(2), B(Star), R(2), | 489 REPEAT_32(COMMA, // |
467 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X | 490 B(LdaSmi8), U8(1), // |
468 #undef X | 491 B(Star), R(1), // |
469 B(LdaSmi8), U8(3), // | 492 B(LdaSmi8), U8(2), // |
470 B(Return)}, | 493 B(Star), R(2)), // |
| 494 B(LdaSmi8), U8(3), // |
| 495 B(Return)}, // |
471 1, | 496 1, |
472 {268, 0, 0, 0}}, | 497 {260, 0, 0, 0}}, |
473 {"return 0 && 3;", | 498 {"return 0 && 3;", |
474 0 * kPointerSize, | 499 0 * kPointerSize, |
475 1, | 500 1, |
476 2, | 501 2, |
477 {B(LdaZero), // | 502 {B(LdaZero), // |
478 B(Return)}, | 503 B(Return)}, |
479 0}, | 504 0}, |
480 {"return 1 || 3;", | 505 {"return 1 || 3;", |
481 0 * kPointerSize, | 506 0 * kPointerSize, |
482 1, | 507 1, |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
615 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 640 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
616 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 641 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
617 } | 642 } |
618 } | 643 } |
619 | 644 |
620 | 645 |
621 TEST(HeapNumberConstants) { | 646 TEST(HeapNumberConstants) { |
622 InitializedHandleScope handle_scope; | 647 InitializedHandleScope handle_scope; |
623 BytecodeGeneratorHelper helper; | 648 BytecodeGeneratorHelper helper; |
624 | 649 |
625 ExpectedSnippet<double> snippets[] = { | 650 int wide_idx = 0; |
| 651 |
| 652 ExpectedSnippet<double, 257> snippets[] = { |
626 {"return 1.2;", | 653 {"return 1.2;", |
627 0, | 654 0, |
628 1, | 655 1, |
629 3, | 656 3, |
630 { | 657 { |
631 B(LdaConstant), U8(0), // | 658 B(LdaConstant), U8(0), // |
632 B(Return) // | 659 B(Return) // |
633 }, | 660 }, |
634 1, | 661 1, |
635 {1.2}}, | 662 {1.2}}, |
(...skipping 13 matching lines...) Expand all Loading... |
649 1 * kPointerSize, | 676 1 * kPointerSize, |
650 1, | 677 1, |
651 7, | 678 7, |
652 { | 679 { |
653 B(LdaConstant), U8(0), // | 680 B(LdaConstant), U8(0), // |
654 B(Star), R(0), // | 681 B(Star), R(0), // |
655 B(LdaConstant), U8(1), // | 682 B(LdaConstant), U8(1), // |
656 B(Return) // | 683 B(Return) // |
657 }, | 684 }, |
658 2, | 685 2, |
659 {3.14, 3.14}}}; | 686 {3.14, 3.14}}, |
| 687 {"var a;" |
| 688 REPEAT_256(SPACE, " a = 1.414;") |
| 689 " a = 3.14;", |
| 690 1 * kPointerSize, |
| 691 1, |
| 692 1031, |
| 693 { |
| 694 REPEAT_256(COMMA, // |
| 695 B(LdaConstant), U8(wide_idx++), // |
| 696 B(Star), R(0)), // |
| 697 B(LdaConstantWide), U16(wide_idx++), // |
| 698 B(Star), R(0), // |
| 699 B(LdaUndefined), // |
| 700 B(Return), // |
| 701 }, |
| 702 257, |
| 703 {REPEAT_256(COMMA, 1.414), |
| 704 3.14}} |
| 705 }; |
660 for (size_t i = 0; i < arraysize(snippets); i++) { | 706 for (size_t i = 0; i < arraysize(snippets); i++) { |
661 Handle<BytecodeArray> bytecode_array = | 707 Handle<BytecodeArray> bytecode_array = |
662 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 708 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
663 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 709 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
664 } | 710 } |
665 } | 711 } |
666 | 712 |
667 | 713 |
668 TEST(StringConstants) { | 714 TEST(StringConstants) { |
669 InitializedHandleScope handle_scope; | 715 InitializedHandleScope handle_scope; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
718 BytecodeGeneratorHelper helper; | 764 BytecodeGeneratorHelper helper; |
719 Zone zone; | 765 Zone zone; |
720 | 766 |
721 FeedbackVectorSpec feedback_spec(&zone); | 767 FeedbackVectorSpec feedback_spec(&zone); |
722 FeedbackVectorSlot slot1 = feedback_spec.AddLoadICSlot(); | 768 FeedbackVectorSlot slot1 = feedback_spec.AddLoadICSlot(); |
723 FeedbackVectorSlot slot2 = feedback_spec.AddLoadICSlot(); | 769 FeedbackVectorSlot slot2 = feedback_spec.AddLoadICSlot(); |
724 | 770 |
725 Handle<i::TypeFeedbackVector> vector = | 771 Handle<i::TypeFeedbackVector> vector = |
726 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); | 772 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); |
727 | 773 |
| 774 // These are a hack used by the LoadICXXXWide tests below. |
| 775 int wide_idx_1 = vector->GetIndex(slot1) - 2; |
| 776 int wide_idx_2 = vector->GetIndex(slot1) - 2; |
| 777 int wide_idx_3 = vector->GetIndex(slot1) - 2; |
| 778 int wide_idx_4 = vector->GetIndex(slot1) - 2; |
| 779 |
728 ExpectedSnippet<const char*> snippets[] = { | 780 ExpectedSnippet<const char*> snippets[] = { |
729 {"function f(a) { return a.name; }\nf({name : \"test\"})", | 781 {"function f(a) { return a.name; }\nf({name : \"test\"})", |
730 0, | 782 0, |
731 2, | 783 2, |
732 5, | 784 5, |
733 { | 785 { |
734 B(LoadICSloppy), A(1, 2), U8(0), U8(vector->GetIndex(slot1)), // | 786 B(LoadICSloppy), A(1, 2), U8(0), U8(vector->GetIndex(slot1)), // |
735 B(Return), // | 787 B(Return), // |
736 }, | 788 }, |
737 1, | 789 1, |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
794 "function f(a, b) { \"use strict\"; return a[b]; }\n" | 846 "function f(a, b) { \"use strict\"; return a[b]; }\n" |
795 "f({arg : \"test\"}, \"arg\")", | 847 "f({arg : \"test\"}, \"arg\")", |
796 0, | 848 0, |
797 3, | 849 3, |
798 6, | 850 6, |
799 { | 851 { |
800 B(Ldar), A(2, 3), // | 852 B(Ldar), A(2, 3), // |
801 B(KeyedLoadICStrict), A(1, 3), U8(vector->GetIndex(slot1)), // | 853 B(KeyedLoadICStrict), A(1, 3), U8(vector->GetIndex(slot1)), // |
802 B(Return), // | 854 B(Return), // |
803 }, | 855 }, |
804 0, | 856 0}, |
805 }}; | 857 { |
| 858 "function f(a) {\n" |
| 859 " var b;\n" |
| 860 REPEAT_127(SPACE, " b = a.name; ") |
| 861 " return a.name; }\n" |
| 862 "f({name : \"test\"})\n", |
| 863 1 * kPointerSize, |
| 864 2, |
| 865 769, |
| 866 { |
| 867 REPEAT_127(COMMA, // |
| 868 B(LoadICSloppy), A(1, 2), U8(0), U8((wide_idx_1 += 2)), // |
| 869 B(Star), R(0)), // |
| 870 B(LoadICSloppyWide), A(1, 2), U16(0), U16(wide_idx_1 += 2), // |
| 871 B(Return), // |
| 872 }, |
| 873 1, |
| 874 {"name"}}, |
| 875 { |
| 876 "function f(a) {\n" |
| 877 " 'use strict'; var b;\n" |
| 878 REPEAT_127(SPACE, " b = a.name; ") |
| 879 " return a.name; }\n" |
| 880 "f({name : \"test\"})\n", |
| 881 1 * kPointerSize, |
| 882 2, |
| 883 769, |
| 884 { |
| 885 REPEAT_127(COMMA, // |
| 886 B(LoadICStrict), A(1, 2), U8(0), U8((wide_idx_2 += 2)), // |
| 887 B(Star), R(0)), // |
| 888 B(LoadICStrictWide), A(1, 2), U16(0), U16(wide_idx_2 += 2), // |
| 889 B(Return), // |
| 890 }, |
| 891 1, |
| 892 {"name"}}, |
| 893 { |
| 894 "function f(a, b) {\n" |
| 895 " var c;\n" |
| 896 REPEAT_127(SPACE, " c = a[b]; ") |
| 897 " return a[b]; }\n" |
| 898 "f({name : \"test\"}, \"name\")\n", |
| 899 1 * kPointerSize, |
| 900 3, |
| 901 896, |
| 902 { |
| 903 REPEAT_127(COMMA, // |
| 904 B(Ldar), A(2, 3), // |
| 905 B(KeyedLoadICSloppy), A(1, 3), U8((wide_idx_3 += 2)), // |
| 906 B(Star), R(0)), // |
| 907 B(Ldar), A(2, 3), // |
| 908 B(KeyedLoadICSloppyWide), A(1, 3), U16(wide_idx_3 += 2), // |
| 909 B(Return), // |
| 910 }}, |
| 911 { |
| 912 "function f(a, b) {\n" |
| 913 " 'use strict'; var c;\n" |
| 914 REPEAT_127(SPACE, " c = a[b]; ") |
| 915 " return a[b]; }\n" |
| 916 "f({name : \"test\"}, \"name\")\n", |
| 917 1 * kPointerSize, |
| 918 3, |
| 919 896, |
| 920 { |
| 921 REPEAT_127(COMMA, // |
| 922 B(Ldar), A(2, 3), // |
| 923 B(KeyedLoadICStrict), A(1, 3), U8((wide_idx_4 += 2)), // |
| 924 B(Star), R(0)), // |
| 925 B(Ldar), A(2, 3), // |
| 926 B(KeyedLoadICStrictWide), A(1, 3), U16(wide_idx_4 += 2), // |
| 927 B(Return), // |
| 928 }}, |
| 929 }; |
806 for (size_t i = 0; i < arraysize(snippets); i++) { | 930 for (size_t i = 0; i < arraysize(snippets); i++) { |
807 Handle<BytecodeArray> bytecode_array = | 931 Handle<BytecodeArray> bytecode_array = |
808 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); | 932 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); |
809 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 933 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
810 } | 934 } |
811 } | 935 } |
812 | 936 |
813 | 937 |
814 TEST(PropertyStores) { | 938 TEST(PropertyStores) { |
815 InitializedHandleScope handle_scope; | 939 InitializedHandleScope handle_scope; |
816 BytecodeGeneratorHelper helper; | 940 BytecodeGeneratorHelper helper; |
817 Zone zone; | 941 Zone zone; |
818 | 942 |
819 FeedbackVectorSpec feedback_spec(&zone); | 943 FeedbackVectorSpec feedback_spec(&zone); |
820 FeedbackVectorSlot slot1 = feedback_spec.AddStoreICSlot(); | 944 FeedbackVectorSlot slot1 = feedback_spec.AddStoreICSlot(); |
821 FeedbackVectorSlot slot2 = feedback_spec.AddStoreICSlot(); | 945 FeedbackVectorSlot slot2 = feedback_spec.AddStoreICSlot(); |
822 | 946 |
823 Handle<i::TypeFeedbackVector> vector = | 947 Handle<i::TypeFeedbackVector> vector = |
824 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); | 948 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); |
825 | 949 |
| 950 // These are a hack used by the StoreICXXXWide tests below. |
| 951 int wide_idx_1 = vector->GetIndex(slot1) - 2; |
| 952 int wide_idx_2 = vector->GetIndex(slot1) - 2; |
| 953 int wide_idx_3 = vector->GetIndex(slot1) - 2; |
| 954 int wide_idx_4 = vector->GetIndex(slot1) - 2; |
| 955 |
826 ExpectedSnippet<const char*> snippets[] = { | 956 ExpectedSnippet<const char*> snippets[] = { |
827 {"function f(a) { a.name = \"val\"; }\nf({name : \"test\"})", | 957 {"function f(a) { a.name = \"val\"; }\nf({name : \"test\"})", |
828 0, | 958 0, |
829 2, | 959 2, |
830 8, | 960 8, |
831 { | 961 { |
832 B(LdaConstant), U8(1), // | 962 B(LdaConstant), U8(1), // |
833 B(StoreICSloppy), A(1, 2), U8(0), U8(vector->GetIndex(slot1)), // | 963 B(StoreICSloppy), A(1, 2), U8(0), U8(vector->GetIndex(slot1)), // |
834 B(LdaUndefined), // | 964 B(LdaUndefined), // |
835 B(Return), // | 965 B(Return), // |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
909 3, | 1039 3, |
910 8, | 1040 8, |
911 { | 1041 { |
912 B(LdaConstant), U8(0), // | 1042 B(LdaConstant), U8(0), // |
913 B(KeyedStoreICStrict), A(1, 3), A(2, 3), // | 1043 B(KeyedStoreICStrict), A(1, 3), A(2, 3), // |
914 U8(vector->GetIndex(slot1)), // | 1044 U8(vector->GetIndex(slot1)), // |
915 B(LdaUndefined), // | 1045 B(LdaUndefined), // |
916 B(Return), // | 1046 B(Return), // |
917 }, | 1047 }, |
918 1, | 1048 1, |
919 {"val"}}}; | 1049 {"val"}}, |
| 1050 {"function f(a) {\n" |
| 1051 REPEAT_127(SPACE, " a.name = 1; ") |
| 1052 " a.name = 2; }\n" |
| 1053 "f({name : \"test\"})\n", |
| 1054 0, |
| 1055 2, |
| 1056 772, |
| 1057 { |
| 1058 REPEAT_127(COMMA, // |
| 1059 B(LdaSmi8), U8(1), // |
| 1060 B(StoreICSloppy), A(1, 2), U8(0), U8((wide_idx_1 += 2))), // |
| 1061 B(LdaSmi8), U8(2), // |
| 1062 B(StoreICSloppyWide), A(1, 2), U16(0), U16(wide_idx_1 += 2), // |
| 1063 B(LdaUndefined), // |
| 1064 B(Return), // |
| 1065 }, |
| 1066 1, |
| 1067 {"name"}}, |
| 1068 {"function f(a) {\n" |
| 1069 "'use strict';\n" |
| 1070 REPEAT_127(SPACE, " a.name = 1; ") |
| 1071 " a.name = 2; }\n" |
| 1072 "f({name : \"test\"})\n", |
| 1073 0, |
| 1074 2, |
| 1075 772, |
| 1076 { |
| 1077 REPEAT_127(COMMA, // |
| 1078 B(LdaSmi8), U8(1), // |
| 1079 B(StoreICStrict), A(1, 2), U8(0), U8((wide_idx_2 += 2))), // |
| 1080 B(LdaSmi8), U8(2), // |
| 1081 B(StoreICStrictWide), A(1, 2), U16(0), U16(wide_idx_2 += 2), // |
| 1082 B(LdaUndefined), // |
| 1083 B(Return), // |
| 1084 }, |
| 1085 1, |
| 1086 {"name"}}, |
| 1087 {"function f(a, b) {\n" |
| 1088 REPEAT_127(SPACE, " a[b] = 1; ") |
| 1089 " a[b] = 2; }\n" |
| 1090 "f({name : \"test\"})\n", |
| 1091 0, |
| 1092 3, |
| 1093 771, |
| 1094 { |
| 1095 REPEAT_127(COMMA, // |
| 1096 B(LdaSmi8), U8(1), // |
| 1097 B(KeyedStoreICSloppy), A(1, 3), A(2, 3), // |
| 1098 U8((wide_idx_3 += 2))), // |
| 1099 B(LdaSmi8), U8(2), // |
| 1100 B(KeyedStoreICSloppyWide), A(1, 3), A(2, 3), // |
| 1101 U16(wide_idx_3 += 2), // |
| 1102 B(LdaUndefined), // |
| 1103 B(Return), // |
| 1104 }}, |
| 1105 {"function f(a, b) {\n" |
| 1106 "'use strict';\n" |
| 1107 REPEAT_127(SPACE, " a[b] = 1; ") |
| 1108 " a[b] = 2; }\n" |
| 1109 "f({name : \"test\"})\n", |
| 1110 0, |
| 1111 3, |
| 1112 771, |
| 1113 { |
| 1114 REPEAT_127(COMMA, // |
| 1115 B(LdaSmi8), U8(1), // |
| 1116 B(KeyedStoreICStrict), A(1, 3), A(2, 3), // |
| 1117 U8((wide_idx_4 += 2))), // |
| 1118 B(LdaSmi8), U8(2), // |
| 1119 B(KeyedStoreICStrictWide), A(1, 3), A(2, 3), // |
| 1120 U16(wide_idx_4 += 2), // |
| 1121 B(LdaUndefined), // |
| 1122 B(Return), // |
| 1123 }}}; |
920 for (size_t i = 0; i < arraysize(snippets); i++) { | 1124 for (size_t i = 0; i < arraysize(snippets); i++) { |
921 Handle<BytecodeArray> bytecode_array = | 1125 Handle<BytecodeArray> bytecode_array = |
922 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); | 1126 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); |
923 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 1127 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
924 } | 1128 } |
925 } | 1129 } |
926 | 1130 |
927 | 1131 |
928 #define FUNC_ARG "new (function Obj() { this.func = function() { return; }})()" | 1132 #define FUNC_ARG "new (function Obj() { this.func = function() { return; }})()" |
929 | 1133 |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1005 InitializedHandleScope handle_scope; | 1209 InitializedHandleScope handle_scope; |
1006 BytecodeGeneratorHelper helper; | 1210 BytecodeGeneratorHelper helper; |
1007 Zone zone; | 1211 Zone zone; |
1008 | 1212 |
1009 FeedbackVectorSpec feedback_spec(&zone); | 1213 FeedbackVectorSpec feedback_spec(&zone); |
1010 FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot(); | 1214 FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot(); |
1011 | 1215 |
1012 Handle<i::TypeFeedbackVector> vector = | 1216 Handle<i::TypeFeedbackVector> vector = |
1013 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); | 1217 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); |
1014 | 1218 |
| 1219 // These are a hack used by the LdaGlobalXXXWide tests below. |
| 1220 int wide_idx_1 = vector->GetIndex(slot) - 2; |
| 1221 int wide_idx_2 = vector->GetIndex(slot) - 2; |
| 1222 |
1015 ExpectedSnippet<const char*> snippets[] = { | 1223 ExpectedSnippet<const char*> snippets[] = { |
1016 {"var a = 1;\nfunction f() { return a; }\nf()", | 1224 {"var a = 1;\nfunction f() { return a; }\nf()", |
1017 0, | 1225 0, |
1018 1, | 1226 1, |
1019 4, | 1227 4, |
1020 { | 1228 { |
1021 B(LdaGlobalSloppy), U8(0), U8(vector->GetIndex(slot)), // | 1229 B(LdaGlobalSloppy), U8(0), U8(vector->GetIndex(slot)), // |
1022 B(Return) // | 1230 B(Return) // |
1023 }, | 1231 }, |
1024 1, | 1232 1, |
(...skipping 21 matching lines...) Expand all Loading... |
1046 {"a = 1;\nfunction f() { return a; }\nf()", | 1254 {"a = 1;\nfunction f() { return a; }\nf()", |
1047 0, | 1255 0, |
1048 1, | 1256 1, |
1049 4, | 1257 4, |
1050 { | 1258 { |
1051 B(LdaGlobalSloppy), U8(0), U8(vector->GetIndex(slot)), // | 1259 B(LdaGlobalSloppy), U8(0), U8(vector->GetIndex(slot)), // |
1052 B(Return) // | 1260 B(Return) // |
1053 }, | 1261 }, |
1054 1, | 1262 1, |
1055 {"a"}}, | 1263 {"a"}}, |
| 1264 {"a = 1; function f(b) {\n" |
| 1265 REPEAT_127(SPACE, "b.name; ") |
| 1266 " return a; }\nf({name: 1});", |
| 1267 0, |
| 1268 2, |
| 1269 514, |
| 1270 { |
| 1271 REPEAT_127(COMMA, // |
| 1272 B(LoadICSloppy), A(1, 2), U8(0), U8(wide_idx_1 += 2)), // |
| 1273 B(LdaGlobalSloppyWide), U16(1), U16(wide_idx_1 += 2), // |
| 1274 B(Return), // |
| 1275 }, |
| 1276 2, |
| 1277 {"name", "a"}}, |
| 1278 {"a = 1; function f(b) {\n" |
| 1279 " 'use strict';\n" |
| 1280 REPEAT_127(SPACE, "b.name; ") |
| 1281 " return a; }\nf({name: 1});", |
| 1282 0, |
| 1283 2, |
| 1284 514, |
| 1285 { |
| 1286 REPEAT_127(COMMA, // |
| 1287 B(LoadICStrict), A(1, 2), U8(0), U8(wide_idx_2 += 2)), // |
| 1288 B(LdaGlobalStrictWide), U16(1), U16(wide_idx_2 += 2), // |
| 1289 B(Return), // |
| 1290 }, |
| 1291 2, |
| 1292 {"name", "a"}}, |
1056 }; | 1293 }; |
1057 | 1294 |
1058 for (size_t i = 0; i < arraysize(snippets); i++) { | 1295 for (size_t i = 0; i < arraysize(snippets); i++) { |
1059 Handle<BytecodeArray> bytecode_array = | 1296 Handle<BytecodeArray> bytecode_array = |
1060 helper.MakeBytecode(snippets[i].code_snippet, "f"); | 1297 helper.MakeBytecode(snippets[i].code_snippet, "f"); |
1061 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 1298 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
1062 } | 1299 } |
1063 } | 1300 } |
1064 | 1301 |
1065 | 1302 |
1066 TEST(StoreGlobal) { | 1303 TEST(StoreGlobal) { |
1067 InitializedHandleScope handle_scope; | 1304 InitializedHandleScope handle_scope; |
1068 BytecodeGeneratorHelper helper; | 1305 BytecodeGeneratorHelper helper; |
1069 Zone zone; | 1306 Zone zone; |
1070 | 1307 |
1071 FeedbackVectorSpec feedback_spec(&zone); | 1308 FeedbackVectorSpec feedback_spec(&zone); |
1072 FeedbackVectorSlot slot = feedback_spec.AddStoreICSlot(); | 1309 FeedbackVectorSlot slot = feedback_spec.AddStoreICSlot(); |
1073 | 1310 |
1074 Handle<i::TypeFeedbackVector> vector = | 1311 Handle<i::TypeFeedbackVector> vector = |
1075 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); | 1312 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); |
1076 | 1313 |
| 1314 // These are a hack used by the StaGlobalXXXWide tests below. |
| 1315 int wide_idx_1 = vector->GetIndex(slot) - 2; |
| 1316 int wide_idx_2 = vector->GetIndex(slot) - 2; |
| 1317 |
1077 ExpectedSnippet<const char*> snippets[] = { | 1318 ExpectedSnippet<const char*> snippets[] = { |
1078 {"var a = 1;\nfunction f() { a = 2; }\nf()", | 1319 {"var a = 1;\nfunction f() { a = 2; }\nf()", |
1079 0, | 1320 0, |
1080 1, | 1321 1, |
1081 7, | 1322 7, |
1082 { | 1323 { |
1083 B(LdaSmi8), U8(2), // | 1324 B(LdaSmi8), U8(2), // |
1084 B(StaGlobalSloppy), U8(0), U8(vector->GetIndex(slot)), // | 1325 B(StaGlobalSloppy), U8(0), U8(vector->GetIndex(slot)), // |
1085 B(LdaUndefined), // | 1326 B(LdaUndefined), // |
1086 B(Return) // | 1327 B(Return) // |
(...skipping 29 matching lines...) Expand all Loading... |
1116 1, | 1357 1, |
1117 7, | 1358 7, |
1118 { | 1359 { |
1119 B(LdaSmi8), U8(2), // | 1360 B(LdaSmi8), U8(2), // |
1120 B(StaGlobalSloppy), U8(0), U8(vector->GetIndex(slot)), // | 1361 B(StaGlobalSloppy), U8(0), U8(vector->GetIndex(slot)), // |
1121 B(LdaUndefined), // | 1362 B(LdaUndefined), // |
1122 B(Return) // | 1363 B(Return) // |
1123 }, | 1364 }, |
1124 1, | 1365 1, |
1125 {"a"}}, | 1366 {"a"}}, |
| 1367 {"a = 1; function f(b) {\n" |
| 1368 REPEAT_127(SPACE, "b.name; ") |
| 1369 " a = 2; }\nf({name: 1});", |
| 1370 0, |
| 1371 2, |
| 1372 517, |
| 1373 { |
| 1374 REPEAT_127(COMMA, // |
| 1375 B(LoadICSloppy), A(1, 2), U8(0), U8(wide_idx_1 += 2)), // |
| 1376 B(LdaSmi8), U8(2), // |
| 1377 B(StaGlobalSloppyWide), U16(1), U16(wide_idx_1 += 2), // |
| 1378 B(LdaUndefined), // |
| 1379 B(Return), // |
| 1380 }, |
| 1381 2, |
| 1382 {"name", "a"}}, |
| 1383 {"a = 1; function f(b) {\n" |
| 1384 " 'use strict';\n" |
| 1385 REPEAT_127(SPACE, "b.name; ") |
| 1386 " a = 2; }\nf({name: 1});", |
| 1387 0, |
| 1388 2, |
| 1389 517, |
| 1390 { |
| 1391 REPEAT_127(COMMA, // |
| 1392 B(LoadICStrict), A(1, 2), U8(0), U8(wide_idx_2 += 2)), // |
| 1393 B(LdaSmi8), U8(2), // |
| 1394 B(StaGlobalStrictWide), U16(1), U16(wide_idx_2 += 2), // |
| 1395 B(LdaUndefined), // |
| 1396 B(Return), // |
| 1397 }, |
| 1398 2, |
| 1399 {"name", "a"}}, |
1126 }; | 1400 }; |
1127 | 1401 |
1128 for (size_t i = 0; i < arraysize(snippets); i++) { | 1402 for (size_t i = 0; i < arraysize(snippets); i++) { |
1129 Handle<BytecodeArray> bytecode_array = | 1403 Handle<BytecodeArray> bytecode_array = |
1130 helper.MakeBytecode(snippets[i].code_snippet, "f"); | 1404 helper.MakeBytecode(snippets[i].code_snippet, "f"); |
1131 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 1405 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
1132 } | 1406 } |
1133 } | 1407 } |
1134 | 1408 |
1135 | 1409 |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1327 B(TestIn), A(1, 3), // | 1601 B(TestIn), A(1, 3), // |
1328 B(JumpIfFalse), U8(5), // | 1602 B(JumpIfFalse), U8(5), // |
1329 B(LdaConstant), U8(0), // | 1603 B(LdaConstant), U8(0), // |
1330 B(Return), // | 1604 B(Return), // |
1331 B(LdaUndefined), // | 1605 B(LdaUndefined), // |
1332 B(Return)}, // | 1606 B(Return)}, // |
1333 1, | 1607 1, |
1334 {helper.factory()->NewNumberFromInt(200), unused, unused, unused, unused, | 1608 {helper.factory()->NewNumberFromInt(200), unused, unused, unused, unused, |
1335 unused}}, | 1609 unused}}, |
1336 {"function f(z) { var a = 0; var b = 0; if (a === 0.01) { " | 1610 {"function f(z) { var a = 0; var b = 0; if (a === 0.01) { " |
1337 #define X "b = a; a = b; " | 1611 REPEAT_32(SPACE, "b = a; a = b; ") |
1338 X X X X X X X X X X X X X X X X X X X X X X X X | |
1339 #undef X | |
1340 " return 200; } else { return -200; } } f(0.001)", | 1612 " return 200; } else { return -200; } } f(0.001)", |
1341 2 * kPointerSize, | 1613 2 * kPointerSize, |
1342 2, | 1614 2, |
1343 214, | 1615 278, |
1344 { | 1616 { |
1345 #define X B(Ldar), R(0), B(Star), R(1), B(Ldar), R(1), B(Star), R(0) | |
1346 B(LdaZero), // | 1617 B(LdaZero), // |
1347 B(Star), R(0), // | 1618 B(Star), R(0), // |
1348 B(LdaZero), // | 1619 B(LdaZero), // |
1349 B(Star), R(1), // | 1620 B(Star), R(1), // |
1350 B(LdaConstant), U8(0), // | 1621 B(LdaConstant), U8(0), // |
1351 B(TestEqualStrict), R(0), // | 1622 B(TestEqualStrict), R(0), // |
1352 B(JumpIfFalseConstant), U8(2), // | 1623 B(JumpIfFalseConstant), U8(2), // |
1353 X, X, X, X, X, X, X, X, X, X, // | 1624 REPEAT_32(COMMA, // |
1354 X, X, X, X, X, X, X, X, X, X, // | 1625 B(Ldar), R(0), // |
1355 X, X, X, X, // | 1626 B(Star), R(1), // |
| 1627 B(Ldar), R(1), // |
| 1628 B(Star), R(0)), // |
1356 B(LdaConstant), U8(1), // | 1629 B(LdaConstant), U8(1), // |
1357 B(Return), // | 1630 B(Return), // |
1358 B(Jump), U8(5), // | 1631 B(Jump), U8(5), // |
1359 B(LdaConstant), U8(3), // | 1632 B(LdaConstant), U8(3), // |
1360 B(Return), // | 1633 B(Return), // |
1361 B(LdaUndefined), // | 1634 B(LdaUndefined), // |
1362 B(Return)}, // | 1635 B(Return)}, // |
1363 #undef X | |
1364 4, | 1636 4, |
1365 {helper.factory()->NewHeapNumber(0.01), | 1637 {helper.factory()->NewHeapNumber(0.01), |
1366 helper.factory()->NewNumberFromInt(200), | 1638 helper.factory()->NewNumberFromInt(200), |
1367 helper.factory()->NewNumberFromInt(199), | 1639 helper.factory()->NewNumberFromInt(263), |
1368 helper.factory()->NewNumberFromInt(-200), unused, unused}}, | 1640 helper.factory()->NewNumberFromInt(-200), unused, unused}}, |
1369 {"function f(a, b) {\n" | 1641 {"function f(a, b) {\n" |
1370 " if (a == b) { return 1; }\n" | 1642 " if (a == b) { return 1; }\n" |
1371 " if (a === b) { return 1; }\n" | 1643 " if (a === b) { return 1; }\n" |
1372 " if (a < b) { return 1; }\n" | 1644 " if (a < b) { return 1; }\n" |
1373 " if (a > b) { return 1; }\n" | 1645 " if (a > b) { return 1; }\n" |
1374 " if (a <= b) { return 1; }\n" | 1646 " if (a <= b) { return 1; }\n" |
1375 " if (a >= b) { return 1; }\n" | 1647 " if (a >= b) { return 1; }\n" |
1376 " if (a in b) { return 1; }\n" | 1648 " if (a in b) { return 1; }\n" |
1377 " if (a instanceof b) { return 1; }\n" | 1649 " if (a instanceof b) { return 1; }\n" |
1378 " return 0;\n" | 1650 " return 0;\n" |
1379 "} f(1, 1);", | 1651 "} f(1, 1);", |
1380 0, | 1652 0, |
1381 3, | 1653 3, |
1382 74, | 1654 74, |
1383 { | 1655 { |
1384 #define IF_CONDITION_RETURN(condition) \ | 1656 #define IF_CONDITION_RETURN(condition) \ |
1385 B(Ldar), A(2, 3), \ | 1657 B(Ldar), A(2, 3), \ |
1386 B(condition), A(1, 3), \ | 1658 B(condition), A(1, 3), \ |
1387 B(JumpIfFalse), U8(5), \ | 1659 B(JumpIfFalse), U8(5), \ |
1388 B(LdaSmi8), U8(1), \ | 1660 B(LdaSmi8), U8(1), \ |
1389 B(Return), | 1661 B(Return), |
1390 IF_CONDITION_RETURN(TestEqual) // | 1662 IF_CONDITION_RETURN(TestEqual) // |
1391 IF_CONDITION_RETURN(TestEqualStrict) // | 1663 IF_CONDITION_RETURN(TestEqualStrict) // |
1392 IF_CONDITION_RETURN(TestLessThan) // | 1664 IF_CONDITION_RETURN(TestLessThan) // |
1393 IF_CONDITION_RETURN(TestGreaterThan) // | 1665 IF_CONDITION_RETURN(TestGreaterThan) // |
1394 IF_CONDITION_RETURN(TestLessThanOrEqual) // | 1666 IF_CONDITION_RETURN(TestLessThanOrEqual) // |
1395 IF_CONDITION_RETURN(TestGreaterThanOrEqual) // | 1667 IF_CONDITION_RETURN(TestGreaterThanOrEqual) // |
(...skipping 2669 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4065 for (size_t i = 0; i < arraysize(snippets); i++) { | 4337 for (size_t i = 0; i < arraysize(snippets); i++) { |
4066 Handle<BytecodeArray> bytecode_array = | 4338 Handle<BytecodeArray> bytecode_array = |
4067 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 4339 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
4068 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 4340 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
4069 } | 4341 } |
4070 } | 4342 } |
4071 | 4343 |
4072 } // namespace interpreter | 4344 } // namespace interpreter |
4073 } // namespace internal | 4345 } // namespace internal |
4074 } // namespace v8 | 4346 } // namespace v8 |
OLD | NEW |