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

Side by Side Diff: src/x64/stub-cache-x64.cc

Issue 13923003: Always require exact maps. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « src/x64/macro-assembler-x64.cc ('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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 728 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 Handle<Name> name, 739 Handle<Name> name,
740 Register receiver_reg, 740 Register receiver_reg,
741 Register name_reg, 741 Register name_reg,
742 Register value_reg, 742 Register value_reg,
743 Register scratch1, 743 Register scratch1,
744 Register scratch2, 744 Register scratch2,
745 Label* miss_label, 745 Label* miss_label,
746 Label* miss_restore_name) { 746 Label* miss_restore_name) {
747 // Check that the map of the object hasn't changed. 747 // Check that the map of the object hasn't changed.
748 __ CheckMap(receiver_reg, Handle<Map>(object->map()), 748 __ CheckMap(receiver_reg, Handle<Map>(object->map()),
749 miss_label, DO_SMI_CHECK, REQUIRE_EXACT_MAP); 749 miss_label, DO_SMI_CHECK);
750 750
751 // Perform global security token check if needed. 751 // Perform global security token check if needed.
752 if (object->IsJSGlobalProxy()) { 752 if (object->IsJSGlobalProxy()) {
753 __ CheckAccessGlobalProxy(receiver_reg, scratch1, miss_label); 753 __ CheckAccessGlobalProxy(receiver_reg, scratch1, miss_label);
754 } 754 }
755 755
756 // Check that we are allowed to write this. 756 // Check that we are allowed to write this.
757 if (object->GetPrototype()->IsJSObject()) { 757 if (object->GetPrototype()->IsJSObject()) {
758 JSObject* holder; 758 JSObject* holder;
759 // holder == object indicates that no property was found. 759 // holder == object indicates that no property was found.
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 Handle<JSObject> object, 867 Handle<JSObject> object,
868 LookupResult* lookup, 868 LookupResult* lookup,
869 Register receiver_reg, 869 Register receiver_reg,
870 Register name_reg, 870 Register name_reg,
871 Register value_reg, 871 Register value_reg,
872 Register scratch1, 872 Register scratch1,
873 Register scratch2, 873 Register scratch2,
874 Label* miss_label) { 874 Label* miss_label) {
875 // Check that the map of the object hasn't changed. 875 // Check that the map of the object hasn't changed.
876 __ CheckMap(receiver_reg, Handle<Map>(object->map()), 876 __ CheckMap(receiver_reg, Handle<Map>(object->map()),
877 miss_label, DO_SMI_CHECK, ALLOW_ELEMENT_TRANSITION_MAPS); 877 miss_label, DO_SMI_CHECK);
878 878
879 // Perform global security token check if needed. 879 // Perform global security token check if needed.
880 if (object->IsJSGlobalProxy()) { 880 if (object->IsJSGlobalProxy()) {
881 __ CheckAccessGlobalProxy(receiver_reg, scratch1, miss_label); 881 __ CheckAccessGlobalProxy(receiver_reg, scratch1, miss_label);
882 } 882 }
883 883
884 // Stub never generated for non-global objects that require access 884 // Stub never generated for non-global objects that require access
885 // checks. 885 // checks.
886 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); 886 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded());
887 887
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
1008 reg = holder_reg; // From now on the object will be in holder_reg. 1008 reg = holder_reg; // From now on the object will be in holder_reg.
1009 __ movq(reg, FieldOperand(scratch1, Map::kPrototypeOffset)); 1009 __ movq(reg, FieldOperand(scratch1, Map::kPrototypeOffset));
1010 } else { 1010 } else {
1011 bool in_new_space = heap()->InNewSpace(*prototype); 1011 bool in_new_space = heap()->InNewSpace(*prototype);
1012 Handle<Map> current_map(current->map()); 1012 Handle<Map> current_map(current->map());
1013 if (in_new_space) { 1013 if (in_new_space) {
1014 // Save the map in scratch1 for later. 1014 // Save the map in scratch1 for later.
1015 __ movq(scratch1, FieldOperand(reg, HeapObject::kMapOffset)); 1015 __ movq(scratch1, FieldOperand(reg, HeapObject::kMapOffset));
1016 } 1016 }
1017 if (!current.is_identical_to(first) || check == CHECK_ALL_MAPS) { 1017 if (!current.is_identical_to(first) || check == CHECK_ALL_MAPS) {
1018 __ CheckMap(reg, current_map, miss, DONT_DO_SMI_CHECK, 1018 __ CheckMap(reg, current_map, miss, DONT_DO_SMI_CHECK);
1019 ALLOW_ELEMENT_TRANSITION_MAPS);
1020 } 1019 }
1021 1020
1022 // Check access rights to the global object. This has to happen after 1021 // Check access rights to the global object. This has to happen after
1023 // the map check so that we know that the object is actually a global 1022 // the map check so that we know that the object is actually a global
1024 // object. 1023 // object.
1025 if (current->IsJSGlobalProxy()) { 1024 if (current->IsJSGlobalProxy()) {
1026 __ CheckAccessGlobalProxy(reg, scratch2, miss); 1025 __ CheckAccessGlobalProxy(reg, scratch2, miss);
1027 } 1026 }
1028 reg = holder_reg; // From now on the object will be in holder_reg. 1027 reg = holder_reg; // From now on the object will be in holder_reg.
1029 1028
(...skipping 14 matching lines...) Expand all
1044 // Go to the next object in the prototype chain. 1043 // Go to the next object in the prototype chain.
1045 current = prototype; 1044 current = prototype;
1046 } 1045 }
1047 ASSERT(current.is_identical_to(holder)); 1046 ASSERT(current.is_identical_to(holder));
1048 1047
1049 // Log the check depth. 1048 // Log the check depth.
1050 LOG(isolate(), IntEvent("check-maps-depth", depth + 1)); 1049 LOG(isolate(), IntEvent("check-maps-depth", depth + 1));
1051 1050
1052 if (!holder.is_identical_to(first) || check == CHECK_ALL_MAPS) { 1051 if (!holder.is_identical_to(first) || check == CHECK_ALL_MAPS) {
1053 // Check the holder map. 1052 // Check the holder map.
1054 __ CheckMap(reg, Handle<Map>(holder->map()), 1053 __ CheckMap(reg, Handle<Map>(holder->map()), miss, DONT_DO_SMI_CHECK);
1055 miss, DONT_DO_SMI_CHECK, ALLOW_ELEMENT_TRANSITION_MAPS);
1056 } 1054 }
1057 1055
1058 // Perform security check for access to the global object. 1056 // Perform security check for access to the global object.
1059 ASSERT(current->IsJSGlobalProxy() || !current->IsAccessCheckNeeded()); 1057 ASSERT(current->IsJSGlobalProxy() || !current->IsAccessCheckNeeded());
1060 if (current->IsJSGlobalProxy()) { 1058 if (current->IsJSGlobalProxy()) {
1061 __ CheckAccessGlobalProxy(reg, scratch1, miss); 1059 __ CheckAccessGlobalProxy(reg, scratch1, miss);
1062 } 1060 }
1063 1061
1064 // If we've skipped any global objects, it's not enough to verify that 1062 // If we've skipped any global objects, it's not enough to verify that
1065 // their maps haven't changed. We also need to check that the property 1063 // their maps haven't changed. We also need to check that the property
(...skipping 1458 matching lines...) Expand 10 before | Expand all | Expand 10 after
2524 #undef __ 2522 #undef __
2525 #define __ ACCESS_MASM(masm()) 2523 #define __ ACCESS_MASM(masm())
2526 2524
2527 2525
2528 Handle<Code> StoreStubCompiler::CompileStoreInterceptor( 2526 Handle<Code> StoreStubCompiler::CompileStoreInterceptor(
2529 Handle<JSObject> object, 2527 Handle<JSObject> object,
2530 Handle<Name> name) { 2528 Handle<Name> name) {
2531 Label miss; 2529 Label miss;
2532 2530
2533 // Check that the map of the object hasn't changed. 2531 // Check that the map of the object hasn't changed.
2534 __ CheckMap(receiver(), Handle<Map>(object->map()), &miss, 2532 __ CheckMap(receiver(), Handle<Map>(object->map()), &miss, DO_SMI_CHECK);
2535 DO_SMI_CHECK, ALLOW_ELEMENT_TRANSITION_MAPS);
2536 2533
2537 // Perform global security token check if needed. 2534 // Perform global security token check if needed.
2538 if (object->IsJSGlobalProxy()) { 2535 if (object->IsJSGlobalProxy()) {
2539 __ CheckAccessGlobalProxy(receiver(), scratch1(), &miss); 2536 __ CheckAccessGlobalProxy(receiver(), scratch1(), &miss);
2540 } 2537 }
2541 2538
2542 // Stub never generated for non-global objects that require access 2539 // Stub never generated for non-global objects that require access
2543 // checks. 2540 // checks.
2544 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); 2541 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded());
2545 2542
(...skipping 924 matching lines...) Expand 10 before | Expand all | Expand 10 after
3470 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow); 3467 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow);
3471 } 3468 }
3472 } 3469 }
3473 3470
3474 3471
3475 #undef __ 3472 #undef __
3476 3473
3477 } } // namespace v8::internal 3474 } } // namespace v8::internal
3478 3475
3479 #endif // V8_TARGET_ARCH_X64 3476 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/x64/macro-assembler-x64.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698