OLD | NEW |
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 1156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1167 i_isolate); | 1167 i_isolate); |
1168 if (result->IsUndefined(i_isolate)) { | 1168 if (result->IsUndefined(i_isolate)) { |
1169 // Do not cache prototype objects. | 1169 // Do not cache prototype objects. |
1170 result = Utils::OpenHandle( | 1170 result = Utils::OpenHandle( |
1171 *ObjectTemplateNew(i_isolate, Local<FunctionTemplate>(), true)); | 1171 *ObjectTemplateNew(i_isolate, Local<FunctionTemplate>(), true)); |
1172 Utils::OpenHandle(this)->set_prototype_template(*result); | 1172 Utils::OpenHandle(this)->set_prototype_template(*result); |
1173 } | 1173 } |
1174 return ToApiHandle<ObjectTemplate>(result); | 1174 return ToApiHandle<ObjectTemplate>(result); |
1175 } | 1175 } |
1176 | 1176 |
| 1177 void FunctionTemplate::SetPrototypeProviderTemplate( |
| 1178 Local<FunctionTemplate> prototype_provider) { |
| 1179 i::Isolate* i_isolate = Utils::OpenHandle(this)->GetIsolate(); |
| 1180 ENTER_V8(i_isolate); |
| 1181 i::Handle<i::Object> result = Utils::OpenHandle(*prototype_provider); |
| 1182 auto info = Utils::OpenHandle(this); |
| 1183 CHECK(info->prototype_template()->IsUndefined(i_isolate)); |
| 1184 CHECK(info->parent_template()->IsUndefined(i_isolate)); |
| 1185 info->set_prototype_provider_template(*result); |
| 1186 } |
1177 | 1187 |
1178 static void EnsureNotInstantiated(i::Handle<i::FunctionTemplateInfo> info, | 1188 static void EnsureNotInstantiated(i::Handle<i::FunctionTemplateInfo> info, |
1179 const char* func) { | 1189 const char* func) { |
1180 Utils::ApiCheck(!info->instantiated(), func, | 1190 Utils::ApiCheck(!info->instantiated(), func, |
1181 "FunctionTemplate already instantiated"); | 1191 "FunctionTemplate already instantiated"); |
1182 } | 1192 } |
1183 | 1193 |
1184 | 1194 |
1185 void FunctionTemplate::Inherit(v8::Local<FunctionTemplate> value) { | 1195 void FunctionTemplate::Inherit(v8::Local<FunctionTemplate> value) { |
1186 auto info = Utils::OpenHandle(this); | 1196 auto info = Utils::OpenHandle(this); |
1187 EnsureNotInstantiated(info, "v8::FunctionTemplate::Inherit"); | 1197 EnsureNotInstantiated(info, "v8::FunctionTemplate::Inherit"); |
1188 i::Isolate* isolate = info->GetIsolate(); | 1198 i::Isolate* i_isolate = info->GetIsolate(); |
1189 ENTER_V8(isolate); | 1199 ENTER_V8(i_isolate); |
| 1200 CHECK(info->prototype_provider_template()->IsUndefined(i_isolate)); |
1190 info->set_parent_template(*Utils::OpenHandle(*value)); | 1201 info->set_parent_template(*Utils::OpenHandle(*value)); |
1191 } | 1202 } |
1192 | 1203 |
1193 static Local<FunctionTemplate> FunctionTemplateNew( | 1204 static Local<FunctionTemplate> FunctionTemplateNew( |
1194 i::Isolate* isolate, FunctionCallback callback, | 1205 i::Isolate* isolate, FunctionCallback callback, |
1195 experimental::FastAccessorBuilder* fast_handler, v8::Local<Value> data, | 1206 experimental::FastAccessorBuilder* fast_handler, v8::Local<Value> data, |
1196 v8::Local<Signature> signature, int length, bool do_not_cache, | 1207 v8::Local<Signature> signature, int length, bool do_not_cache, |
1197 v8::Local<Private> cached_property_name = v8::Local<Private>()) { | 1208 v8::Local<Private> cached_property_name = v8::Local<Private>()) { |
1198 i::Handle<i::Struct> struct_obj = | 1209 i::Handle<i::Struct> struct_obj = |
1199 isolate->factory()->NewStruct(i::FUNCTION_TEMPLATE_INFO_TYPE); | 1210 isolate->factory()->NewStruct(i::FUNCTION_TEMPLATE_INFO_TYPE); |
(...skipping 8654 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9854 Address callback_address = | 9865 Address callback_address = |
9855 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 9866 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
9856 VMState<EXTERNAL> state(isolate); | 9867 VMState<EXTERNAL> state(isolate); |
9857 ExternalCallbackScope call_scope(isolate, callback_address); | 9868 ExternalCallbackScope call_scope(isolate, callback_address); |
9858 callback(info); | 9869 callback(info); |
9859 } | 9870 } |
9860 | 9871 |
9861 | 9872 |
9862 } // namespace internal | 9873 } // namespace internal |
9863 } // namespace v8 | 9874 } // namespace v8 |
OLD | NEW |