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

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

Issue 478043006: Rewrite StoreIC handling using the LookupIterator. Continued from patch 494153002 (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 4 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/stub-cache.h ('k') | src/x64/stub-cache-x64.cc » ('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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/api.h" 7 #include "src/api.h"
8 #include "src/arguments.h" 8 #include "src/arguments.h"
9 #include "src/ast.h" 9 #include "src/ast.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after
607 607
608 608
609 RUNTIME_FUNCTION(StorePropertyWithInterceptor) { 609 RUNTIME_FUNCTION(StorePropertyWithInterceptor) {
610 HandleScope scope(isolate); 610 HandleScope scope(isolate);
611 DCHECK(args.length() == 3); 611 DCHECK(args.length() == 3);
612 StoreIC ic(IC::NO_EXTRA_FRAME, isolate); 612 StoreIC ic(IC::NO_EXTRA_FRAME, isolate);
613 Handle<JSObject> receiver = args.at<JSObject>(0); 613 Handle<JSObject> receiver = args.at<JSObject>(0);
614 Handle<Name> name = args.at<Name>(1); 614 Handle<Name> name = args.at<Name>(1);
615 Handle<Object> value = args.at<Object>(2); 615 Handle<Object> value = args.at<Object>(2);
616 #ifdef DEBUG 616 #ifdef DEBUG
617 if (receiver->IsJSGlobalProxy()) { 617 PrototypeIterator iter(isolate, receiver,
618 PrototypeIterator iter(isolate, receiver); 618 PrototypeIterator::START_AT_RECEIVER);
619 DCHECK(iter.IsAtEnd() || 619 bool found = false;
620 Handle<JSGlobalObject>::cast(PrototypeIterator::GetCurrent(iter)) 620 while (!iter.IsAtEnd(PrototypeIterator::END_AT_NON_HIDDEN)) {
621 ->HasNamedInterceptor()); 621 Handle<Object> current = PrototypeIterator::GetCurrent(iter);
622 } else { 622 if (current->IsJSObject() &&
623 DCHECK(receiver->HasNamedInterceptor()); 623 Handle<JSObject>::cast(current)->HasNamedInterceptor()) {
624 found = true;
625 break;
626 }
624 } 627 }
628 DCHECK(found);
625 #endif 629 #endif
626 Handle<Object> result; 630 Handle<Object> result;
627 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 631 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
628 isolate, result, 632 isolate, result,
629 JSObject::SetProperty(receiver, name, value, ic.strict_mode())); 633 JSObject::SetProperty(receiver, name, value, ic.strict_mode()));
630 return *result; 634 return *result;
631 } 635 }
632 636
633 637
634 RUNTIME_FUNCTION(LoadElementWithInterceptor) { 638 RUNTIME_FUNCTION(LoadElementWithInterceptor) {
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
882 Frontend(receiver(), name); 886 Frontend(receiver(), name);
883 Handle<Map> receiver_map = IC::TypeToMap(*type(), isolate()); 887 Handle<Map> receiver_map = IC::TypeToMap(*type(), isolate());
884 GenerateFastApiCall( 888 GenerateFastApiCall(
885 masm(), call_optimization, receiver_map, 889 masm(), call_optimization, receiver_map,
886 receiver(), scratch1(), false, 0, NULL); 890 receiver(), scratch1(), false, 0, NULL);
887 return GetCode(kind(), Code::FAST, name); 891 return GetCode(kind(), Code::FAST, name);
888 } 892 }
889 893
890 894
891 Handle<Code> NamedLoadHandlerCompiler::CompileLoadInterceptor( 895 Handle<Code> NamedLoadHandlerCompiler::CompileLoadInterceptor(
892 LookupIterator* it, Handle<Name> name) { 896 LookupIterator* it) {
893 // So far the most popular follow ups for interceptor loads are FIELD and 897 // So far the most popular follow ups for interceptor loads are FIELD and
894 // ExecutableAccessorInfo, so inline only them. Other cases may be added 898 // ExecutableAccessorInfo, so inline only them. Other cases may be added
895 // later. 899 // later.
896 bool inline_followup = it->state() == LookupIterator::PROPERTY; 900 bool inline_followup = it->state() == LookupIterator::PROPERTY;
897 if (inline_followup) { 901 if (inline_followup) {
898 switch (it->property_kind()) { 902 switch (it->property_kind()) {
899 case LookupIterator::DATA: 903 case LookupIterator::DATA:
900 inline_followup = it->property_details().type() == FIELD; 904 inline_followup = it->property_details().type() == FIELD;
901 break; 905 break;
902 case LookupIterator::ACCESSOR: { 906 case LookupIterator::ACCESSOR: {
903 Handle<Object> accessors = it->GetAccessors(); 907 Handle<Object> accessors = it->GetAccessors();
904 inline_followup = accessors->IsExecutableAccessorInfo(); 908 inline_followup = accessors->IsExecutableAccessorInfo();
905 if (!inline_followup) break; 909 if (!inline_followup) break;
906 Handle<ExecutableAccessorInfo> info = 910 Handle<ExecutableAccessorInfo> info =
907 Handle<ExecutableAccessorInfo>::cast(accessors); 911 Handle<ExecutableAccessorInfo>::cast(accessors);
908 inline_followup = info->getter() != NULL && 912 inline_followup = info->getter() != NULL &&
909 ExecutableAccessorInfo::IsCompatibleReceiverType( 913 ExecutableAccessorInfo::IsCompatibleReceiverType(
910 isolate(), info, type()); 914 isolate(), info, type());
911 } 915 }
912 } 916 }
913 } 917 }
914 918
915 Register reg = Frontend(receiver(), name); 919 Register reg = Frontend(receiver(), it->name());
916 if (inline_followup) { 920 if (inline_followup) {
917 // TODO(368): Compile in the whole chain: all the interceptors in 921 // TODO(368): Compile in the whole chain: all the interceptors in
918 // prototypes and ultimate answer. 922 // prototypes and ultimate answer.
919 GenerateLoadInterceptorWithFollowup(it, reg); 923 GenerateLoadInterceptorWithFollowup(it, reg);
920 } else { 924 } else {
921 GenerateLoadInterceptor(reg); 925 GenerateLoadInterceptor(reg);
922 } 926 }
923 return GetCode(kind(), Code::FAST, name); 927 return GetCode(kind(), Code::FAST, it->name());
924 } 928 }
925 929
926 930
927 void NamedLoadHandlerCompiler::GenerateLoadPostInterceptor( 931 void NamedLoadHandlerCompiler::GenerateLoadPostInterceptor(
928 LookupIterator* it, Register interceptor_reg) { 932 LookupIterator* it, Register interceptor_reg) {
929 Handle<JSObject> real_named_property_holder(it->GetHolder<JSObject>()); 933 Handle<JSObject> real_named_property_holder(it->GetHolder<JSObject>());
930 934
931 set_type_for_object(holder()); 935 set_type_for_object(holder());
932 set_holder(real_named_property_holder); 936 set_holder(real_named_property_holder);
933 Register reg = Frontend(interceptor_reg, it->name()); 937 Register reg = Frontend(interceptor_reg, it->name());
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1000 1004
1001 GenerateRestoreName(&miss, name); 1005 GenerateRestoreName(&miss, name);
1002 TailCallBuiltin(masm(), MissBuiltin(kind())); 1006 TailCallBuiltin(masm(), MissBuiltin(kind()));
1003 1007
1004 GenerateRestoreName(&slow, name); 1008 GenerateRestoreName(&slow, name);
1005 TailCallBuiltin(masm(), SlowBuiltin(kind())); 1009 TailCallBuiltin(masm(), SlowBuiltin(kind()));
1006 return GetCode(kind(), Code::FAST, name); 1010 return GetCode(kind(), Code::FAST, name);
1007 } 1011 }
1008 1012
1009 1013
1010 Handle<Code> NamedStoreHandlerCompiler::CompileStoreField(LookupResult* lookup, 1014 Handle<Code> NamedStoreHandlerCompiler::CompileStoreField(LookupIterator* it) {
1011 Handle<Name> name) {
1012 Label miss; 1015 Label miss;
1013 GenerateStoreField(lookup, value(), &miss); 1016 GenerateStoreField(it, value(), &miss);
1014 __ bind(&miss); 1017 __ bind(&miss);
1015 TailCallBuiltin(masm(), MissBuiltin(kind())); 1018 TailCallBuiltin(masm(), MissBuiltin(kind()));
1016 return GetCode(kind(), Code::FAST, name); 1019 return GetCode(kind(), Code::FAST, it->name());
1017 } 1020 }
1018 1021
1019 1022
1020 Handle<Code> NamedStoreHandlerCompiler::CompileStoreViaSetter( 1023 Handle<Code> NamedStoreHandlerCompiler::CompileStoreViaSetter(
1021 Handle<JSObject> object, Handle<Name> name, Handle<JSFunction> setter) { 1024 Handle<JSObject> object, Handle<Name> name, Handle<JSFunction> setter) {
1022 Frontend(receiver(), name); 1025 Frontend(receiver(), name);
1023 GenerateStoreViaSetter(masm(), type(), receiver(), setter); 1026 GenerateStoreViaSetter(masm(), type(), receiver(), setter);
1024 1027
1025 return GetCode(kind(), Code::FAST, name); 1028 return GetCode(kind(), Code::FAST, name);
1026 } 1029 }
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
1287 Handle<FunctionTemplateInfo>( 1290 Handle<FunctionTemplateInfo>(
1288 FunctionTemplateInfo::cast(signature->receiver())); 1291 FunctionTemplateInfo::cast(signature->receiver()));
1289 } 1292 }
1290 } 1293 }
1291 1294
1292 is_simple_api_call_ = true; 1295 is_simple_api_call_ = true;
1293 } 1296 }
1294 1297
1295 1298
1296 } } // namespace v8::internal 1299 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/stub-cache.h ('k') | src/x64/stub-cache-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698