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

Side by Side Diff: src/compiler/bytecode-graph-builder.cc

Issue 1678103004: [interpreter] Thread through language mode some more. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: 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/compiler/bytecode-graph-builder.h ('k') | no next file » | 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/compiler/bytecode-graph-builder.h" 5 #include "src/compiler/bytecode-graph-builder.h"
6 6
7 #include "src/compiler/bytecode-branch-analysis.h" 7 #include "src/compiler/bytecode-branch-analysis.h"
8 #include "src/compiler/linkage.h" 8 #include "src/compiler/linkage.h"
9 #include "src/compiler/operator-properties.h" 9 #include "src/compiler/operator-properties.h"
10 #include "src/interpreter/bytecodes.h" 10 #include "src/interpreter/bytecodes.h"
(...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after
661 Handle<Name>::cast(bytecode_iterator().GetConstantForIndexOperand(0)); 661 Handle<Name>::cast(bytecode_iterator().GetConstantForIndexOperand(0));
662 VectorSlotPair feedback = 662 VectorSlotPair feedback =
663 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(1)); 663 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(1));
664 664
665 const Operator* op = javascript()->LoadGlobal(name, feedback, typeof_mode); 665 const Operator* op = javascript()->LoadGlobal(name, feedback, typeof_mode);
666 Node* node = NewNode(op, BuildLoadFeedbackVector()); 666 Node* node = NewNode(op, BuildLoadFeedbackVector());
667 environment()->BindAccumulator(node, &states); 667 environment()->BindAccumulator(node, &states);
668 } 668 }
669 669
670 void BytecodeGraphBuilder::VisitLdaGlobalSloppy() { 670 void BytecodeGraphBuilder::VisitLdaGlobalSloppy() {
671 DCHECK(is_sloppy(language_mode()));
672 BuildLoadGlobal(TypeofMode::NOT_INSIDE_TYPEOF); 671 BuildLoadGlobal(TypeofMode::NOT_INSIDE_TYPEOF);
673 } 672 }
674 673
675 void BytecodeGraphBuilder::VisitLdaGlobalStrict() { 674 void BytecodeGraphBuilder::VisitLdaGlobalStrict() {
676 DCHECK(is_strict(language_mode()));
677 BuildLoadGlobal(TypeofMode::NOT_INSIDE_TYPEOF); 675 BuildLoadGlobal(TypeofMode::NOT_INSIDE_TYPEOF);
678 } 676 }
679 677
680 void BytecodeGraphBuilder::VisitLdaGlobalInsideTypeofSloppy() { 678 void BytecodeGraphBuilder::VisitLdaGlobalInsideTypeofSloppy() {
681 DCHECK(is_sloppy(language_mode()));
682 BuildLoadGlobal(TypeofMode::INSIDE_TYPEOF); 679 BuildLoadGlobal(TypeofMode::INSIDE_TYPEOF);
683 } 680 }
684 681
685 void BytecodeGraphBuilder::VisitLdaGlobalInsideTypeofStrict() { 682 void BytecodeGraphBuilder::VisitLdaGlobalInsideTypeofStrict() {
686 DCHECK(is_strict(language_mode()));
687 BuildLoadGlobal(TypeofMode::INSIDE_TYPEOF); 683 BuildLoadGlobal(TypeofMode::INSIDE_TYPEOF);
688 } 684 }
689 685
690 void BytecodeGraphBuilder::VisitLdaGlobalSloppyWide() { 686 void BytecodeGraphBuilder::VisitLdaGlobalSloppyWide() {
691 DCHECK(is_sloppy(language_mode()));
692 BuildLoadGlobal(TypeofMode::NOT_INSIDE_TYPEOF); 687 BuildLoadGlobal(TypeofMode::NOT_INSIDE_TYPEOF);
693 } 688 }
694 689
695 void BytecodeGraphBuilder::VisitLdaGlobalStrictWide() { 690 void BytecodeGraphBuilder::VisitLdaGlobalStrictWide() {
696 DCHECK(is_strict(language_mode()));
697 BuildLoadGlobal(TypeofMode::NOT_INSIDE_TYPEOF); 691 BuildLoadGlobal(TypeofMode::NOT_INSIDE_TYPEOF);
698 } 692 }
699 693
700 void BytecodeGraphBuilder::VisitLdaGlobalInsideTypeofSloppyWide() { 694 void BytecodeGraphBuilder::VisitLdaGlobalInsideTypeofSloppyWide() {
701 DCHECK(is_sloppy(language_mode()));
702 BuildLoadGlobal(TypeofMode::INSIDE_TYPEOF); 695 BuildLoadGlobal(TypeofMode::INSIDE_TYPEOF);
703 } 696 }
704 697
705 void BytecodeGraphBuilder::VisitLdaGlobalInsideTypeofStrictWide() { 698 void BytecodeGraphBuilder::VisitLdaGlobalInsideTypeofStrictWide() {
706 DCHECK(is_strict(language_mode()));
707 BuildLoadGlobal(TypeofMode::INSIDE_TYPEOF); 699 BuildLoadGlobal(TypeofMode::INSIDE_TYPEOF);
708 } 700 }
709 701
710 void BytecodeGraphBuilder::BuildStoreGlobal() { 702 void BytecodeGraphBuilder::BuildStoreGlobal(LanguageMode language_mode) {
711 FrameStateBeforeAndAfter states(this); 703 FrameStateBeforeAndAfter states(this);
712 Handle<Name> name = 704 Handle<Name> name =
713 Handle<Name>::cast(bytecode_iterator().GetConstantForIndexOperand(0)); 705 Handle<Name>::cast(bytecode_iterator().GetConstantForIndexOperand(0));
714 VectorSlotPair feedback = 706 VectorSlotPair feedback =
715 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(1)); 707 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(1));
716 Node* value = environment()->LookupAccumulator(); 708 Node* value = environment()->LookupAccumulator();
717 709
718 const Operator* op = 710 const Operator* op = javascript()->StoreGlobal(language_mode, name, feedback);
719 javascript()->StoreGlobal(language_mode(), name, feedback);
720 Node* node = NewNode(op, value, BuildLoadFeedbackVector()); 711 Node* node = NewNode(op, value, BuildLoadFeedbackVector());
721 environment()->RecordAfterState(node, &states); 712 environment()->RecordAfterState(node, &states);
722 } 713 }
723 714
724 void BytecodeGraphBuilder::VisitStaGlobalSloppy() { 715 void BytecodeGraphBuilder::VisitStaGlobalSloppy() {
725 DCHECK(is_sloppy(language_mode())); 716 BuildStoreGlobal(LanguageMode::SLOPPY);
726 BuildStoreGlobal();
727 } 717 }
728 718
729 void BytecodeGraphBuilder::VisitStaGlobalStrict() { 719 void BytecodeGraphBuilder::VisitStaGlobalStrict() {
730 DCHECK(is_strict(language_mode())); 720 BuildStoreGlobal(LanguageMode::STRICT);
731 BuildStoreGlobal();
732 } 721 }
733 722
734 void BytecodeGraphBuilder::VisitStaGlobalSloppyWide() { 723 void BytecodeGraphBuilder::VisitStaGlobalSloppyWide() {
735 DCHECK(is_sloppy(language_mode())); 724 BuildStoreGlobal(LanguageMode::SLOPPY);
736 BuildStoreGlobal();
737 } 725 }
738 726
739 void BytecodeGraphBuilder::VisitStaGlobalStrictWide() { 727 void BytecodeGraphBuilder::VisitStaGlobalStrictWide() {
740 DCHECK(is_strict(language_mode())); 728 BuildStoreGlobal(LanguageMode::STRICT);
741 BuildStoreGlobal();
742 } 729 }
743 730
744 void BytecodeGraphBuilder::VisitLdaContextSlot() { 731 void BytecodeGraphBuilder::VisitLdaContextSlot() {
745 // TODO(mythria): LoadContextSlots are unrolled by the required depth when 732 // TODO(mythria): LoadContextSlots are unrolled by the required depth when
746 // generating bytecode. Hence the value of depth is always 0. Update this 733 // generating bytecode. Hence the value of depth is always 0. Update this
747 // code, when the implementation changes. 734 // code, when the implementation changes.
748 // TODO(mythria): immutable flag is also set to false. This information is not 735 // TODO(mythria): immutable flag is also set to false. This information is not
749 // available in bytecode array. update this code when the implementation 736 // available in bytecode array. update this code when the implementation
750 // changes. 737 // changes.
751 const Operator* op = javascript()->LoadContext( 738 const Operator* op = javascript()->LoadContext(
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
883 void BytecodeGraphBuilder::VisitKeyedLoadICSloppyWide() { 870 void BytecodeGraphBuilder::VisitKeyedLoadICSloppyWide() {
884 DCHECK(is_sloppy(language_mode())); 871 DCHECK(is_sloppy(language_mode()));
885 BuildKeyedLoad(); 872 BuildKeyedLoad();
886 } 873 }
887 874
888 void BytecodeGraphBuilder::VisitKeyedLoadICStrictWide() { 875 void BytecodeGraphBuilder::VisitKeyedLoadICStrictWide() {
889 DCHECK(is_strict(language_mode())); 876 DCHECK(is_strict(language_mode()));
890 BuildKeyedLoad(); 877 BuildKeyedLoad();
891 } 878 }
892 879
893 void BytecodeGraphBuilder::BuildNamedStore() { 880 void BytecodeGraphBuilder::BuildNamedStore(LanguageMode language_mode) {
894 FrameStateBeforeAndAfter states(this); 881 FrameStateBeforeAndAfter states(this);
895 Node* value = environment()->LookupAccumulator(); 882 Node* value = environment()->LookupAccumulator();
896 Node* object = 883 Node* object =
897 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); 884 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0));
898 Handle<Name> name = 885 Handle<Name> name =
899 Handle<Name>::cast(bytecode_iterator().GetConstantForIndexOperand(1)); 886 Handle<Name>::cast(bytecode_iterator().GetConstantForIndexOperand(1));
900 VectorSlotPair feedback = 887 VectorSlotPair feedback =
901 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(2)); 888 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(2));
902 889
903 const Operator* op = 890 const Operator* op = javascript()->StoreNamed(language_mode, name, feedback);
904 javascript()->StoreNamed(language_mode(), name, feedback);
905 Node* node = NewNode(op, object, value, BuildLoadFeedbackVector()); 891 Node* node = NewNode(op, object, value, BuildLoadFeedbackVector());
906 environment()->RecordAfterState(node, &states); 892 environment()->RecordAfterState(node, &states);
907 } 893 }
908 894
909 void BytecodeGraphBuilder::VisitStoreICSloppy() { 895 void BytecodeGraphBuilder::VisitStoreICSloppy() {
910 DCHECK(is_sloppy(language_mode())); 896 BuildNamedStore(LanguageMode::SLOPPY);
911 BuildNamedStore();
912 } 897 }
913 898
914 void BytecodeGraphBuilder::VisitStoreICStrict() { 899 void BytecodeGraphBuilder::VisitStoreICStrict() {
915 DCHECK(is_strict(language_mode())); 900 BuildNamedStore(LanguageMode::STRICT);
916 BuildNamedStore();
917 } 901 }
918 902
919 void BytecodeGraphBuilder::VisitStoreICSloppyWide() { 903 void BytecodeGraphBuilder::VisitStoreICSloppyWide() {
920 DCHECK(is_sloppy(language_mode())); 904 BuildNamedStore(LanguageMode::SLOPPY);
921 BuildNamedStore();
922 } 905 }
923 906
924 void BytecodeGraphBuilder::VisitStoreICStrictWide() { 907 void BytecodeGraphBuilder::VisitStoreICStrictWide() {
925 DCHECK(is_strict(language_mode())); 908 BuildNamedStore(LanguageMode::STRICT);
926 BuildNamedStore();
927 } 909 }
928 910
929 void BytecodeGraphBuilder::BuildKeyedStore() { 911 void BytecodeGraphBuilder::BuildKeyedStore(LanguageMode language_mode) {
930 FrameStateBeforeAndAfter states(this); 912 FrameStateBeforeAndAfter states(this);
931 Node* value = environment()->LookupAccumulator(); 913 Node* value = environment()->LookupAccumulator();
932 Node* object = 914 Node* object =
933 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); 915 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0));
934 Node* key = 916 Node* key =
935 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(1)); 917 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(1));
936 VectorSlotPair feedback = 918 VectorSlotPair feedback =
937 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(2)); 919 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(2));
938 920
939 const Operator* op = javascript()->StoreProperty(language_mode(), feedback); 921 const Operator* op = javascript()->StoreProperty(language_mode, feedback);
940 Node* node = NewNode(op, object, key, value, BuildLoadFeedbackVector()); 922 Node* node = NewNode(op, object, key, value, BuildLoadFeedbackVector());
941 environment()->RecordAfterState(node, &states); 923 environment()->RecordAfterState(node, &states);
942 } 924 }
943 925
944 void BytecodeGraphBuilder::VisitKeyedStoreICSloppy() { 926 void BytecodeGraphBuilder::VisitKeyedStoreICSloppy() {
945 DCHECK(is_sloppy(language_mode())); 927 BuildKeyedStore(LanguageMode::SLOPPY);
946 BuildKeyedStore();
947 } 928 }
948 929
949 void BytecodeGraphBuilder::VisitKeyedStoreICStrict() { 930 void BytecodeGraphBuilder::VisitKeyedStoreICStrict() {
950 DCHECK(is_strict(language_mode())); 931 BuildKeyedStore(LanguageMode::STRICT);
951 BuildKeyedStore();
952 } 932 }
953 933
954 void BytecodeGraphBuilder::VisitKeyedStoreICSloppyWide() { 934 void BytecodeGraphBuilder::VisitKeyedStoreICSloppyWide() {
955 DCHECK(is_sloppy(language_mode())); 935 BuildKeyedStore(LanguageMode::SLOPPY);
956 BuildKeyedStore();
957 } 936 }
958 937
959 void BytecodeGraphBuilder::VisitKeyedStoreICStrictWide() { 938 void BytecodeGraphBuilder::VisitKeyedStoreICStrictWide() {
960 DCHECK(is_strict(language_mode())); 939 BuildKeyedStore(LanguageMode::STRICT);
961 BuildKeyedStore();
962 } 940 }
963 941
964 void BytecodeGraphBuilder::VisitPushContext() { 942 void BytecodeGraphBuilder::VisitPushContext() {
965 Node* new_context = environment()->LookupAccumulator(); 943 Node* new_context = environment()->LookupAccumulator();
966 environment()->BindRegister(bytecode_iterator().GetRegisterOperand(0), 944 environment()->BindRegister(bytecode_iterator().GetRegisterOperand(0),
967 environment()->Context()); 945 environment()->Context());
968 environment()->SetContext(new_context); 946 environment()->SetContext(new_context);
969 } 947 }
970 948
971 void BytecodeGraphBuilder::VisitPopContext() { 949 void BytecodeGraphBuilder::VisitPopContext() {
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
1321 jsgraph()->FalseConstant(), jsgraph()->TrueConstant()); 1299 jsgraph()->FalseConstant(), jsgraph()->TrueConstant());
1322 environment()->BindAccumulator(node); 1300 environment()->BindAccumulator(node);
1323 } 1301 }
1324 1302
1325 void BytecodeGraphBuilder::VisitTypeOf() { 1303 void BytecodeGraphBuilder::VisitTypeOf() {
1326 Node* node = 1304 Node* node =
1327 NewNode(javascript()->TypeOf(), environment()->LookupAccumulator()); 1305 NewNode(javascript()->TypeOf(), environment()->LookupAccumulator());
1328 environment()->BindAccumulator(node); 1306 environment()->BindAccumulator(node);
1329 } 1307 }
1330 1308
1331 void BytecodeGraphBuilder::BuildDelete() { 1309 void BytecodeGraphBuilder::BuildDelete(LanguageMode language_mode) {
1332 FrameStateBeforeAndAfter states(this); 1310 FrameStateBeforeAndAfter states(this);
1333 Node* key = environment()->LookupAccumulator(); 1311 Node* key = environment()->LookupAccumulator();
1334 Node* object = 1312 Node* object =
1335 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); 1313 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0));
1336 Node* node = 1314 Node* node =
1337 NewNode(javascript()->DeleteProperty(language_mode()), object, key); 1315 NewNode(javascript()->DeleteProperty(language_mode), object, key);
1338 environment()->BindAccumulator(node, &states); 1316 environment()->BindAccumulator(node, &states);
1339 } 1317 }
1340 1318
1341 void BytecodeGraphBuilder::VisitDeletePropertyStrict() { 1319 void BytecodeGraphBuilder::VisitDeletePropertyStrict() {
1342 DCHECK(is_strict(language_mode())); 1320 BuildDelete(LanguageMode::STRICT);
1343 BuildDelete();
1344 } 1321 }
1345 1322
1346 void BytecodeGraphBuilder::VisitDeletePropertySloppy() { 1323 void BytecodeGraphBuilder::VisitDeletePropertySloppy() {
1347 DCHECK(is_sloppy(language_mode())); 1324 BuildDelete(LanguageMode::SLOPPY);
1348 BuildDelete();
1349 } 1325 }
1350 1326
1351 void BytecodeGraphBuilder::VisitDeleteLookupSlot() { 1327 void BytecodeGraphBuilder::VisitDeleteLookupSlot() {
1352 FrameStateBeforeAndAfter states(this); 1328 FrameStateBeforeAndAfter states(this);
1353 Node* name = environment()->LookupAccumulator(); 1329 Node* name = environment()->LookupAccumulator();
1354 const Operator* op = javascript()->CallRuntime(Runtime::kDeleteLookupSlot); 1330 const Operator* op = javascript()->CallRuntime(Runtime::kDeleteLookupSlot);
1355 Node* result = NewNode(op, environment()->Context(), name); 1331 Node* result = NewNode(op, environment()->Context(), name);
1356 environment()->BindAccumulator(result, &states); 1332 environment()->BindAccumulator(result, &states);
1357 } 1333 }
1358 1334
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after
1837 // Phi does not exist yet, introduce one. 1813 // Phi does not exist yet, introduce one.
1838 value = NewPhi(inputs, value, control); 1814 value = NewPhi(inputs, value, control);
1839 value->ReplaceInput(inputs - 1, other); 1815 value->ReplaceInput(inputs - 1, other);
1840 } 1816 }
1841 return value; 1817 return value;
1842 } 1818 }
1843 1819
1844 } // namespace compiler 1820 } // namespace compiler
1845 } // namespace internal 1821 } // namespace internal
1846 } // namespace v8 1822 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/bytecode-graph-builder.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698