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

Side by Side Diff: src/api.cc

Issue 2405213002: V8 support for cached accessors. (Closed)
Patch Set: Centralized lookup in LookupIterator::TryLookupCacheProperty. Also rebase. Created 4 years, 2 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
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/api.h" 5 #include "src/api.h"
6 6
7 #include <string.h> // For memcpy, strlen. 7 #include <string.h> // For memcpy, strlen.
8 #ifdef V8_USE_ADDRESS_SANITIZER 8 #ifdef V8_USE_ADDRESS_SANITIZER
9 #include <sanitizer/asan_interface.h> 9 #include <sanitizer/asan_interface.h>
10 #endif // V8_USE_ADDRESS_SANITIZER 10 #endif // V8_USE_ADDRESS_SANITIZER
(...skipping 1067 matching lines...) Expand 10 before | Expand all | Expand 10 after
1078 templ->set_serial_number(i::Smi::kZero); 1078 templ->set_serial_number(i::Smi::kZero);
1079 if (templ->IsFunctionTemplateInfo()) { 1079 if (templ->IsFunctionTemplateInfo()) {
1080 i::Handle<i::FunctionTemplateInfo>::cast(templ)->set_do_not_cache(true); 1080 i::Handle<i::FunctionTemplateInfo>::cast(templ)->set_do_not_cache(true);
1081 } 1081 }
1082 } 1082 }
1083 i::ApiNatives::AddDataProperty(isolate, templ, Utils::OpenHandle(*name), 1083 i::ApiNatives::AddDataProperty(isolate, templ, Utils::OpenHandle(*name),
1084 value_obj, 1084 value_obj,
1085 static_cast<i::PropertyAttributes>(attribute)); 1085 static_cast<i::PropertyAttributes>(attribute));
1086 } 1086 }
1087 1087
1088 void Template::SetPrivate(v8::Local<Private> name, v8::Local<Data> value,
1089 v8::PropertyAttribute attribute) {
1090 Set(Utils::ToLocal(Utils::OpenHandle(reinterpret_cast<Name*>(*name))), value,
1091 attribute);
1092 }
1088 1093
1089 void Template::SetAccessorProperty( 1094 void Template::SetAccessorProperty(
1090 v8::Local<v8::Name> name, 1095 v8::Local<v8::Name> name,
1091 v8::Local<FunctionTemplate> getter, 1096 v8::Local<FunctionTemplate> getter,
1092 v8::Local<FunctionTemplate> setter, 1097 v8::Local<FunctionTemplate> setter,
1093 v8::PropertyAttribute attribute, 1098 v8::PropertyAttribute attribute,
1094 v8::AccessControl access_control) { 1099 v8::AccessControl access_control) {
1095 // TODO(verwaest): Remove |access_control|. 1100 // TODO(verwaest): Remove |access_control|.
1096 DCHECK_EQ(v8::DEFAULT, access_control); 1101 DCHECK_EQ(v8::DEFAULT, access_control);
1097 auto templ = Utils::OpenHandle(this); 1102 auto templ = Utils::OpenHandle(this);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1141 1146
1142 1147
1143 void FunctionTemplate::Inherit(v8::Local<FunctionTemplate> value) { 1148 void FunctionTemplate::Inherit(v8::Local<FunctionTemplate> value) {
1144 auto info = Utils::OpenHandle(this); 1149 auto info = Utils::OpenHandle(this);
1145 EnsureNotInstantiated(info, "v8::FunctionTemplate::Inherit"); 1150 EnsureNotInstantiated(info, "v8::FunctionTemplate::Inherit");
1146 i::Isolate* isolate = info->GetIsolate(); 1151 i::Isolate* isolate = info->GetIsolate();
1147 ENTER_V8(isolate); 1152 ENTER_V8(isolate);
1148 info->set_parent_template(*Utils::OpenHandle(*value)); 1153 info->set_parent_template(*Utils::OpenHandle(*value));
1149 } 1154 }
1150 1155
1151
1152 static Local<FunctionTemplate> FunctionTemplateNew( 1156 static Local<FunctionTemplate> FunctionTemplateNew(
1153 i::Isolate* isolate, FunctionCallback callback, 1157 i::Isolate* isolate, FunctionCallback callback,
1154 experimental::FastAccessorBuilder* fast_handler, v8::Local<Value> data, 1158 experimental::FastAccessorBuilder* fast_handler, v8::Local<Value> data,
1155 v8::Local<Signature> signature, int length, bool do_not_cache) { 1159 v8::Local<Signature> signature, int length, bool do_not_cache,
1160 v8::Local<Private> cache_property = v8::Local<Private>()) {
1156 i::Handle<i::Struct> struct_obj = 1161 i::Handle<i::Struct> struct_obj =
1157 isolate->factory()->NewStruct(i::FUNCTION_TEMPLATE_INFO_TYPE); 1162 isolate->factory()->NewStruct(i::FUNCTION_TEMPLATE_INFO_TYPE);
1158 i::Handle<i::FunctionTemplateInfo> obj = 1163 i::Handle<i::FunctionTemplateInfo> obj =
1159 i::Handle<i::FunctionTemplateInfo>::cast(struct_obj); 1164 i::Handle<i::FunctionTemplateInfo>::cast(struct_obj);
1160 InitializeFunctionTemplate(obj); 1165 InitializeFunctionTemplate(obj);
1161 obj->set_do_not_cache(do_not_cache); 1166 obj->set_do_not_cache(do_not_cache);
1162 int next_serial_number = 0; 1167 int next_serial_number = 0;
1163 if (!do_not_cache) { 1168 if (!do_not_cache) {
1164 next_serial_number = isolate->heap()->GetNextTemplateSerialNumber(); 1169 next_serial_number = isolate->heap()->GetNextTemplateSerialNumber();
1165 } 1170 }
1166 obj->set_serial_number(i::Smi::FromInt(next_serial_number)); 1171 obj->set_serial_number(i::Smi::FromInt(next_serial_number));
1167 if (callback != 0) { 1172 if (callback != 0) {
1168 if (data.IsEmpty()) { 1173 if (data.IsEmpty()) {
1169 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); 1174 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
1170 } 1175 }
1171 Utils::ToLocal(obj)->SetCallHandler(callback, data, fast_handler); 1176 Utils::ToLocal(obj)->SetCallHandler(callback, data, fast_handler);
1172 } 1177 }
1173 obj->set_length(length); 1178 obj->set_length(length);
1174 obj->set_undetectable(false); 1179 obj->set_undetectable(false);
1175 obj->set_needs_access_check(false); 1180 obj->set_needs_access_check(false);
1176 obj->set_accept_any_receiver(true); 1181 obj->set_accept_any_receiver(true);
1177 if (!signature.IsEmpty()) 1182 if (!signature.IsEmpty())
1178 obj->set_signature(*Utils::OpenHandle(*signature)); 1183 obj->set_signature(*Utils::OpenHandle(*signature));
1184 obj->set_cache_property(cache_property.IsEmpty()
1185 ? isolate->heap()->the_hole_value()
1186 : *Utils::OpenHandle(*cache_property));
1179 return Utils::ToLocal(obj); 1187 return Utils::ToLocal(obj);
1180 } 1188 }
1181 1189
1182 Local<FunctionTemplate> FunctionTemplate::New( 1190 Local<FunctionTemplate> FunctionTemplate::New(
1183 Isolate* isolate, FunctionCallback callback, v8::Local<Value> data, 1191 Isolate* isolate, FunctionCallback callback, v8::Local<Value> data,
1184 v8::Local<Signature> signature, int length, ConstructorBehavior behavior) { 1192 v8::Local<Signature> signature, int length, ConstructorBehavior behavior) {
1185 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 1193 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
1186 // Changes to the environment cannot be captured in the snapshot. Expect no 1194 // Changes to the environment cannot be captured in the snapshot. Expect no
1187 // function templates when the isolate is created for serialization. 1195 // function templates when the isolate is created for serialization.
1188 LOG_API(i_isolate, FunctionTemplate, New); 1196 LOG_API(i_isolate, FunctionTemplate, New);
(...skipping 24 matching lines...) Expand all
1213 experimental::FastAccessorBuilder* fast_handler, v8::Local<Value> data, 1221 experimental::FastAccessorBuilder* fast_handler, v8::Local<Value> data,
1214 v8::Local<Signature> signature, int length) { 1222 v8::Local<Signature> signature, int length) {
1215 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 1223 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
1216 DCHECK(!i_isolate->serializer_enabled()); 1224 DCHECK(!i_isolate->serializer_enabled());
1217 LOG_API(i_isolate, FunctionTemplate, NewWithFastHandler); 1225 LOG_API(i_isolate, FunctionTemplate, NewWithFastHandler);
1218 ENTER_V8(i_isolate); 1226 ENTER_V8(i_isolate);
1219 return FunctionTemplateNew(i_isolate, callback, fast_handler, data, signature, 1227 return FunctionTemplateNew(i_isolate, callback, fast_handler, data, signature,
1220 length, false); 1228 length, false);
1221 } 1229 }
1222 1230
1231 Local<FunctionTemplate> FunctionTemplate::NewWithCache(
1232 Isolate* isolate, FunctionCallback callback, Local<Private> cache_property,
1233 Local<Value> data, Local<Signature> signature, int length) {
1234 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
1235 DCHECK(!i_isolate->serializer_enabled());
1236 LOG_API(i_isolate, FunctionTemplate, NewWithFastHandler);
1237 ENTER_V8(i_isolate);
1238 return FunctionTemplateNew(i_isolate, callback, nullptr, data, signature,
1239 length, false, cache_property);
1240 }
1223 1241
1224 Local<Signature> Signature::New(Isolate* isolate, 1242 Local<Signature> Signature::New(Isolate* isolate,
1225 Local<FunctionTemplate> receiver) { 1243 Local<FunctionTemplate> receiver) {
1226 return Utils::SignatureToLocal(Utils::OpenHandle(*receiver)); 1244 return Utils::SignatureToLocal(Utils::OpenHandle(*receiver));
1227 } 1245 }
1228 1246
1229 1247
1230 Local<AccessorSignature> AccessorSignature::New( 1248 Local<AccessorSignature> AccessorSignature::New(
1231 Isolate* isolate, Local<FunctionTemplate> receiver) { 1249 Isolate* isolate, Local<FunctionTemplate> receiver) {
1232 return Utils::AccessorSignatureToLocal(Utils::OpenHandle(*receiver)); 1250 return Utils::AccessorSignatureToLocal(Utils::OpenHandle(*receiver));
(...skipping 8213 matching lines...) Expand 10 before | Expand all | Expand 10 after
9446 Address callback_address = 9464 Address callback_address =
9447 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 9465 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
9448 VMState<EXTERNAL> state(isolate); 9466 VMState<EXTERNAL> state(isolate);
9449 ExternalCallbackScope call_scope(isolate, callback_address); 9467 ExternalCallbackScope call_scope(isolate, callback_address);
9450 callback(info); 9468 callback(info);
9451 } 9469 }
9452 9470
9453 9471
9454 } // namespace internal 9472 } // namespace internal
9455 } // namespace v8 9473 } // namespace v8
OLDNEW
« no previous file with comments | « include/v8.h ('k') | src/crankshaft/hydrogen.cc » ('j') | src/ic/ic.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698