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

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

Issue 1665833002: [interpreter] Switch context during stack unwinding. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebased. Created 4 years, 10 months 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
« no previous file with comments | « src/objects-inl.h ('k') | test/mjsunit/mjsunit.status » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/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 4609 matching lines...) Expand 10 before | Expand all | Expand 10 after
4620 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 4620 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
4621 } 4621 }
4622 } 4622 }
4623 4623
4624 4624
4625 TEST(TryCatch) { 4625 TEST(TryCatch) {
4626 InitializedHandleScope handle_scope; 4626 InitializedHandleScope handle_scope;
4627 BytecodeGeneratorHelper helper; 4627 BytecodeGeneratorHelper helper;
4628 4628
4629 int closure = Register::function_closure().index(); 4629 int closure = Register::function_closure().index();
4630 int context = Register::current_context().index();
4630 4631
4631 // clang-format off 4632 // clang-format off
4632 ExpectedSnippet<const char*> snippets[] = { 4633 ExpectedSnippet<const char*> snippets[] = {
4633 {"try { return 1; } catch(e) { return 2; }", 4634 {"try { return 1; } catch(e) { return 2; }",
4634 5 * kPointerSize, 4635 5 * kPointerSize,
4635 1, 4636 1,
4636 37, 4637 40,
4637 { 4638 {
4638 B(StackCheck), // 4639 B(StackCheck), //
4640 B(Mov), R(context), R(1), //
4639 B(LdaSmi8), U8(1), // 4641 B(LdaSmi8), U8(1), //
4640 B(Return), // 4642 B(Return), //
4641 B(Star), R(3), // 4643 B(Star), R(3), //
4642 B(LdaConstant), U8(0), // 4644 B(LdaConstant), U8(0), //
4643 B(Star), R(2), // 4645 B(Star), R(2), //
4644 B(Ldar), R(closure), // 4646 B(Ldar), R(closure), //
4645 B(Star), R(4), // 4647 B(Star), R(4), //
4646 B(CallRuntime), U16(Runtime::kPushCatchContext), R(2), U8(3), // 4648 B(CallRuntime), U16(Runtime::kPushCatchContext), R(2), U8(3), //
4647 B(Star), R(1), // 4649 B(Star), R(1), //
4648 B(CallRuntime), U16(Runtime::kInterpreterClearPendingMessage), // 4650 B(CallRuntime), U16(Runtime::kInterpreterClearPendingMessage), //
4649 /* */ R(0), U8(0), // 4651 /* */ R(0), U8(0), //
4650 B(Ldar), R(1), // 4652 B(Ldar), R(1), //
4651 B(PushContext), R(0), // 4653 B(PushContext), R(0), //
4652 B(LdaSmi8), U8(2), // 4654 B(LdaSmi8), U8(2), //
4653 B(PopContext), R(0), // 4655 B(PopContext), R(0), //
4654 B(Return), // 4656 B(Return), //
4655 // TODO(mstarzinger): Potential optimization, elide next bytes. 4657 // TODO(mstarzinger): Potential optimization, elide next bytes.
4656 B(LdaUndefined), // 4658 B(LdaUndefined), //
4657 B(Return), // 4659 B(Return), //
4658 }, 4660 },
4659 1, 4661 1,
4660 {"e"}, 4662 {"e"},
4661 1, 4663 1,
4662 {{1, 4, 4}}}, 4664 {{4, 7, 7}}},
4663 {"var a; try { a = 1 } catch(e1) {}; try { a = 2 } catch(e2) { a = 3 }", 4665 {"var a; try { a = 1 } catch(e1) {}; try { a = 2 } catch(e2) { a = 3 }",
4664 6 * kPointerSize, 4666 6 * kPointerSize,
4665 1, 4667 1,
4666 75, 4668 81,
4667 { 4669 {
4668 B(StackCheck), // 4670 B(StackCheck), //
4671 B(Mov), R(context), R(2), //
4669 B(LdaSmi8), U8(1), // 4672 B(LdaSmi8), U8(1), //
4670 B(Star), R(0), // 4673 B(Star), R(0), //
4671 B(Jump), U8(30), // 4674 B(Jump), U8(30), //
4672 B(Star), R(4), // 4675 B(Star), R(4), //
4673 B(LdaConstant), U8(0), // 4676 B(LdaConstant), U8(0), //
4674 B(Star), R(3), // 4677 B(Star), R(3), //
4675 B(Ldar), R(closure), // 4678 B(Ldar), R(closure), //
4676 B(Star), R(5), // 4679 B(Star), R(5), //
4677 B(CallRuntime), U16(Runtime::kPushCatchContext), R(3), U8(3), // 4680 B(CallRuntime), U16(Runtime::kPushCatchContext), R(3), U8(3), //
4678 B(Star), R(2), // 4681 B(Star), R(2), //
4679 B(CallRuntime), U16(Runtime::kInterpreterClearPendingMessage), // 4682 B(CallRuntime), U16(Runtime::kInterpreterClearPendingMessage), //
4680 /* */ R(0), U8(0), // 4683 /* */ R(0), U8(0), //
4681 B(Ldar), R(2), // 4684 B(Ldar), R(2), //
4682 B(PushContext), R(1), // 4685 B(PushContext), R(1), //
4683 B(PopContext), R(1), // 4686 B(PopContext), R(1), //
4687 B(Mov), R(context), R(2), //
4684 B(LdaSmi8), U8(2), // 4688 B(LdaSmi8), U8(2), //
4685 B(Star), R(0), // 4689 B(Star), R(0), //
4686 B(Jump), U8(34), // 4690 B(Jump), U8(34), //
4687 B(Star), R(4), // 4691 B(Star), R(4), //
4688 B(LdaConstant), U8(1), // 4692 B(LdaConstant), U8(1), //
4689 B(Star), R(3), // 4693 B(Star), R(3), //
4690 B(Ldar), R(closure), // 4694 B(Ldar), R(closure), //
4691 B(Star), R(5), // 4695 B(Star), R(5), //
4692 B(CallRuntime), U16(Runtime::kPushCatchContext), R(3), U8(3), // 4696 B(CallRuntime), U16(Runtime::kPushCatchContext), R(3), U8(3), //
4693 B(Star), R(2), // 4697 B(Star), R(2), //
4694 B(CallRuntime), U16(Runtime::kInterpreterClearPendingMessage), // 4698 B(CallRuntime), U16(Runtime::kInterpreterClearPendingMessage), //
4695 /* */ R(0), U8(0), // 4699 /* */ R(0), U8(0), //
4696 B(Ldar), R(2), // 4700 B(Ldar), R(2), //
4697 B(PushContext), R(1), // 4701 B(PushContext), R(1), //
4698 B(LdaSmi8), U8(3), // 4702 B(LdaSmi8), U8(3), //
4699 B(Star), R(0), // 4703 B(Star), R(0), //
4700 B(PopContext), R(1), // 4704 B(PopContext), R(1), //
4701 B(LdaUndefined), // 4705 B(LdaUndefined), //
4702 B(Return), // 4706 B(Return), //
4703 }, 4707 },
4704 2, 4708 2,
4705 {"e1", "e2"}, 4709 {"e1", "e2"},
4706 2, 4710 2,
4707 {{1, 5, 7}, {35, 39, 41}}}, 4711 {{4, 8, 10}, {41, 45, 47}}},
4708 }; 4712 };
4709 // clang-format on 4713 // clang-format on
4710 4714
4711 for (size_t i = 0; i < arraysize(snippets); i++) { 4715 for (size_t i = 0; i < arraysize(snippets); i++) {
4712 Handle<BytecodeArray> bytecode_array = 4716 Handle<BytecodeArray> bytecode_array =
4713 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 4717 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
4714 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 4718 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
4715 } 4719 }
4716 } 4720 }
4717 4721
4718 4722
4719 TEST(TryFinally) { 4723 TEST(TryFinally) {
4720 InitializedHandleScope handle_scope; 4724 InitializedHandleScope handle_scope;
4721 BytecodeGeneratorHelper helper; 4725 BytecodeGeneratorHelper helper;
4722 4726
4723 int closure = Register::function_closure().index(); 4727 int closure = Register::function_closure().index();
4728 int context = Register::current_context().index();
4724 4729
4725 // clang-format off 4730 // clang-format off
4726 ExpectedSnippet<const char*> snippets[] = { 4731 ExpectedSnippet<const char*> snippets[] = {
4727 {"var a = 1; try { a = 2; } finally { a = 3; }", 4732 {"var a = 1; try { a = 2; } finally { a = 3; }",
4728 4 * kPointerSize, 4733 4 * kPointerSize,
4729 1, 4734 1,
4730 48, 4735 51,
4731 { 4736 {
4732 B(StackCheck), // 4737 B(StackCheck), //
4733 B(LdaSmi8), U8(1), // 4738 B(LdaSmi8), U8(1), //
4734 B(Star), R(0), // 4739 B(Star), R(0), //
4740 B(Mov), R(context), R(3), //
4735 B(LdaSmi8), U8(2), // 4741 B(LdaSmi8), U8(2), //
4736 B(Star), R(0), // 4742 B(Star), R(0), //
4737 B(LdaSmi8), U8(-1), // 4743 B(LdaSmi8), U8(-1), //
4738 B(Star), R(1), // 4744 B(Star), R(1), //
4739 B(Jump), U8(7), // 4745 B(Jump), U8(7), //
4740 B(Star), R(2), // 4746 B(Star), R(2), //
4741 B(LdaZero), // 4747 B(LdaZero), //
4742 B(Star), R(1), // 4748 B(Star), R(1), //
4743 B(CallRuntime), U16(Runtime::kInterpreterClearPendingMessage), // 4749 B(CallRuntime), U16(Runtime::kInterpreterClearPendingMessage), //
4744 /* */ R(0), U8(0), // 4750 /* */ R(0), U8(0), //
4745 B(Star), R(3), // 4751 B(Star), R(3), //
4746 B(LdaSmi8), U8(3), // 4752 B(LdaSmi8), U8(3), //
4747 B(Star), R(0), // 4753 B(Star), R(0), //
4748 B(CallRuntime), U16(Runtime::kInterpreterSetPendingMessage), // 4754 B(CallRuntime), U16(Runtime::kInterpreterSetPendingMessage), //
4749 /* */ R(3), U8(1), // 4755 /* */ R(3), U8(1), //
4750 B(LdaZero), // 4756 B(LdaZero), //
4751 B(TestEqualStrict), R(1), // 4757 B(TestEqualStrict), R(1), //
4752 B(JumpIfTrue), U8(4), // 4758 B(JumpIfTrue), U8(4), //
4753 B(Jump), U8(5), // 4759 B(Jump), U8(5), //
4754 B(Ldar), R(2), // 4760 B(Ldar), R(2), //
4755 B(ReThrow), // 4761 B(ReThrow), //
4756 B(LdaUndefined), // 4762 B(LdaUndefined), //
4757 B(Return), // 4763 B(Return), //
4758 }, 4764 },
4759 0, 4765 0,
4760 {}, 4766 {},
4761 1, 4767 1,
4762 {{5, 9, 15}}}, 4768 {{8, 12, 18}}},
4763 {"var a = 1; try { a = 2; } catch(e) { a = 20 } finally { a = 3; }", 4769 {"var a = 1; try { a = 2; } catch(e) { a = 20 } finally { a = 3; }",
4764 9 * kPointerSize, 4770 9 * kPointerSize,
4765 1, 4771 1,
4766 82, 4772 88,
4767 { 4773 {
4768 B(StackCheck), // 4774 B(StackCheck), //
4769 B(LdaSmi8), U8(1), // 4775 B(LdaSmi8), U8(1), //
4770 B(Star), R(0), // 4776 B(Star), R(0), //
4777 B(Mov), R(context), R(4), //
4778 B(Mov), R(context), R(5), //
4771 B(LdaSmi8), U8(2), // 4779 B(LdaSmi8), U8(2), //
4772 B(Star), R(0), // 4780 B(Star), R(0), //
4773 B(Jump), U8(34), // 4781 B(Jump), U8(34), //
4774 B(Star), R(7), // 4782 B(Star), R(7), //
4775 B(LdaConstant), U8(0), // 4783 B(LdaConstant), U8(0), //
4776 B(Star), R(6), // 4784 B(Star), R(6), //
4777 B(Ldar), R(closure), // 4785 B(Ldar), R(closure), //
4778 B(Star), R(8), // 4786 B(Star), R(8), //
4779 B(CallRuntime), U16(Runtime::kPushCatchContext), R(6), U8(3), // 4787 B(CallRuntime), U16(Runtime::kPushCatchContext), R(6), U8(3), //
4780 B(Star), R(5), // 4788 B(Star), R(5), //
(...skipping 22 matching lines...) Expand all
4803 B(JumpIfTrue), U8(4), // 4811 B(JumpIfTrue), U8(4), //
4804 B(Jump), U8(5), // 4812 B(Jump), U8(5), //
4805 B(Ldar), R(3), // 4813 B(Ldar), R(3), //
4806 B(ReThrow), // 4814 B(ReThrow), //
4807 B(LdaUndefined), // 4815 B(LdaUndefined), //
4808 B(Return), // 4816 B(Return), //
4809 }, 4817 },
4810 1, 4818 1,
4811 {"e"}, 4819 {"e"},
4812 2, 4820 2,
4813 {{5, 43, 49}, {5, 9, 11}}}, 4821 {{8, 49, 55}, {11, 15, 17}}},
4814 {"var a; try {" 4822 {"var a; try {"
4815 " try { a = 1 } catch(e) { a = 2 }" 4823 " try { a = 1 } catch(e) { a = 2 }"
4816 "} catch(e) { a = 20 } finally { a = 3; }", 4824 "} catch(e) { a = 20 } finally { a = 3; }",
4817 10 * kPointerSize, 4825 10 * kPointerSize,
4818 1, 4826 1,
4819 112, 4827 121,
4820 { 4828 {
4821 B(StackCheck), // 4829 B(StackCheck), //
4830 B(Mov), R(context), R(4), //
4831 B(Mov), R(context), R(5), //
4832 B(Mov), R(context), R(6), //
4822 B(LdaSmi8), U8(1), // 4833 B(LdaSmi8), U8(1), //
4823 B(Star), R(0), // 4834 B(Star), R(0), //
4824 B(Jump), U8(34), // 4835 B(Jump), U8(34), //
4825 B(Star), R(8), // 4836 B(Star), R(8), //
4826 B(LdaConstant), U8(0), // 4837 B(LdaConstant), U8(0), //
4827 B(Star), R(7), // 4838 B(Star), R(7), //
4828 B(Ldar), R(closure), // 4839 B(Ldar), R(closure), //
4829 B(Star), R(9), // 4840 B(Star), R(9), //
4830 B(CallRuntime), U16(Runtime::kPushCatchContext), R(7), U8(3), // 4841 B(CallRuntime), U16(Runtime::kPushCatchContext), R(7), U8(3), //
4831 B(Star), R(6), // 4842 B(Star), R(6), //
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
4869 B(JumpIfTrue), U8(4), // 4880 B(JumpIfTrue), U8(4), //
4870 B(Jump), U8(5), // 4881 B(Jump), U8(5), //
4871 B(Ldar), R(3), // 4882 B(Ldar), R(3), //
4872 B(ReThrow), // 4883 B(ReThrow), //
4873 B(LdaUndefined), // 4884 B(LdaUndefined), //
4874 B(Return), // 4885 B(Return), //
4875 }, 4886 },
4876 1, 4887 1,
4877 {"e"}, 4888 {"e"},
4878 3, 4889 3,
4879 {{1, 73, 79}, {1, 39, 41}, {1, 5, 7}}}, 4890 {{4, 82, 88}, {7, 48, 50}, {10, 14, 16}}},
4880 }; 4891 };
4881 // clang-format on 4892 // clang-format on
4882 4893
4883 for (size_t i = 0; i < arraysize(snippets); i++) { 4894 for (size_t i = 0; i < arraysize(snippets); i++) {
4884 Handle<BytecodeArray> bytecode_array = 4895 Handle<BytecodeArray> bytecode_array =
4885 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 4896 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
4886 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 4897 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
4887 } 4898 }
4888 } 4899 }
4889 4900
(...skipping 3447 matching lines...) Expand 10 before | Expand all | Expand 10 after
8337 for (size_t i = 0; i < arraysize(snippets); i++) { 8348 for (size_t i = 0; i < arraysize(snippets); i++) {
8338 Handle<BytecodeArray> bytecode_array = 8349 Handle<BytecodeArray> bytecode_array =
8339 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 8350 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
8340 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 8351 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
8341 } 8352 }
8342 } 8353 }
8343 8354
8344 } // namespace interpreter 8355 } // namespace interpreter
8345 } // namespace internal 8356 } // namespace internal
8346 } // namespace v8 8357 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects-inl.h ('k') | test/mjsunit/mjsunit.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698