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 748 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
759 | 759 |
760 | 760 |
761 // --- T e m p l a t e --- | 761 // --- T e m p l a t e --- |
762 | 762 |
763 | 763 |
764 static void InitializeTemplate(i::Handle<i::TemplateInfo> that, int type) { | 764 static void InitializeTemplate(i::Handle<i::TemplateInfo> that, int type) { |
765 that->set_tag(i::Smi::FromInt(type)); | 765 that->set_tag(i::Smi::FromInt(type)); |
766 } | 766 } |
767 | 767 |
768 | 768 |
769 static void TemplateSet(i::Isolate* isolate, | |
770 v8::Template* templ, | |
771 int length, | |
772 v8::Handle<v8::Data>* data) { | |
773 i::Handle<i::Object> list(Utils::OpenHandle(templ)->property_list(), isolate); | |
774 if (list->IsUndefined()) { | |
775 list = NeanderArray(isolate).value(); | |
776 Utils::OpenHandle(templ)->set_property_list(*list); | |
777 } | |
778 NeanderArray array(list); | |
779 array.add(isolate, isolate->factory()->NewNumberFromInt(length)); | |
780 for (int i = 0; i < length; i++) { | |
781 i::Handle<i::Object> value = data[i].IsEmpty() ? | |
782 i::Handle<i::Object>(isolate->factory()->undefined_value()) : | |
783 Utils::OpenHandle(*data[i]); | |
784 array.add(isolate, value); | |
785 } | |
786 } | |
787 | |
788 | |
789 void Template::Set(v8::Handle<Name> name, | 769 void Template::Set(v8::Handle<Name> name, |
790 v8::Handle<Data> value, | 770 v8::Handle<Data> value, |
791 v8::PropertyAttribute attribute) { | 771 v8::PropertyAttribute attribute) { |
792 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | 772 auto templ = Utils::OpenHandle(this); |
| 773 i::Isolate* isolate = templ->GetIsolate(); |
793 ENTER_V8(isolate); | 774 ENTER_V8(isolate); |
794 i::HandleScope scope(isolate); | 775 i::HandleScope scope(isolate); |
795 const int kSize = 3; | 776 // TODO(dcarney): split api to allow values of v8::Value or v8::TemplateInfo. |
796 v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); | 777 i::ApiNatives::AddDataProperty(isolate, templ, Utils::OpenHandle(*name), |
797 v8::Handle<v8::Data> data[kSize] = { | 778 Utils::OpenHandle(*value), |
798 name, | 779 static_cast<PropertyAttributes>(attribute)); |
799 value, | |
800 v8::Integer::New(v8_isolate, attribute)}; | |
801 TemplateSet(isolate, this, kSize, data); | |
802 } | 780 } |
803 | 781 |
804 | 782 |
805 void Template::SetAccessorProperty( | 783 void Template::SetAccessorProperty( |
806 v8::Local<v8::Name> name, | 784 v8::Local<v8::Name> name, |
807 v8::Local<FunctionTemplate> getter, | 785 v8::Local<FunctionTemplate> getter, |
808 v8::Local<FunctionTemplate> setter, | 786 v8::Local<FunctionTemplate> setter, |
809 v8::PropertyAttribute attribute, | 787 v8::PropertyAttribute attribute, |
810 v8::AccessControl access_control) { | 788 v8::AccessControl access_control) { |
811 // TODO(verwaest): Remove |access_control|. | 789 // TODO(verwaest): Remove |access_control|. |
812 DCHECK_EQ(v8::DEFAULT, access_control); | 790 DCHECK_EQ(v8::DEFAULT, access_control); |
813 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | 791 auto templ = Utils::OpenHandle(this); |
| 792 auto isolate = templ->GetIsolate(); |
814 ENTER_V8(isolate); | 793 ENTER_V8(isolate); |
815 DCHECK(!name.IsEmpty()); | 794 DCHECK(!name.IsEmpty()); |
816 DCHECK(!getter.IsEmpty() || !setter.IsEmpty()); | 795 DCHECK(!getter.IsEmpty() || !setter.IsEmpty()); |
817 i::HandleScope scope(isolate); | 796 i::HandleScope scope(isolate); |
818 const int kSize = 5; | 797 i::ApiNatives::AddAccessorProperty( |
819 v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); | 798 isolate, templ, Utils::OpenHandle(*name), |
820 v8::Handle<v8::Data> data[kSize] = { | 799 Utils::OpenHandle(*getter, true), Utils::OpenHandle(*setter, true), |
821 name, | 800 static_cast<PropertyAttributes>(attribute)); |
822 getter, | |
823 setter, | |
824 v8::Integer::New(v8_isolate, attribute)}; | |
825 TemplateSet(isolate, this, kSize, data); | |
826 } | 801 } |
827 | 802 |
828 | 803 |
829 // --- F u n c t i o n T e m p l a t e --- | 804 // --- F u n c t i o n T e m p l a t e --- |
830 static void InitializeFunctionTemplate( | 805 static void InitializeFunctionTemplate( |
831 i::Handle<i::FunctionTemplateInfo> info) { | 806 i::Handle<i::FunctionTemplateInfo> info) { |
832 info->set_tag(i::Smi::FromInt(Consts::FUNCTION_TEMPLATE)); | 807 info->set_tag(i::Smi::FromInt(Consts::FUNCTION_TEMPLATE)); |
833 info->set_flag(0); | 808 info->set_flag(0); |
834 } | 809 } |
835 | 810 |
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1137 } | 1112 } |
1138 Local<FunctionTemplate> templ = | 1113 Local<FunctionTemplate> templ = |
1139 FunctionTemplate::New(reinterpret_cast<Isolate*>(isolate)); | 1114 FunctionTemplate::New(reinterpret_cast<Isolate*>(isolate)); |
1140 i::Handle<i::FunctionTemplateInfo> constructor = Utils::OpenHandle(*templ); | 1115 i::Handle<i::FunctionTemplateInfo> constructor = Utils::OpenHandle(*templ); |
1141 constructor->set_instance_template(*Utils::OpenHandle(object_template)); | 1116 constructor->set_instance_template(*Utils::OpenHandle(object_template)); |
1142 Utils::OpenHandle(object_template)->set_constructor(*constructor); | 1117 Utils::OpenHandle(object_template)->set_constructor(*constructor); |
1143 return constructor; | 1118 return constructor; |
1144 } | 1119 } |
1145 | 1120 |
1146 | 1121 |
1147 static inline void AddPropertyToTemplate( | |
1148 i::Handle<i::TemplateInfo> info, | |
1149 i::Handle<i::AccessorInfo> obj) { | |
1150 i::Isolate* isolate = info->GetIsolate(); | |
1151 i::Handle<i::Object> list(info->property_accessors(), isolate); | |
1152 if (list->IsUndefined()) { | |
1153 list = NeanderArray(isolate).value(); | |
1154 info->set_property_accessors(*list); | |
1155 } | |
1156 NeanderArray array(list); | |
1157 array.add(isolate, obj); | |
1158 } | |
1159 | |
1160 | |
1161 static inline i::Handle<i::TemplateInfo> GetTemplateInfo( | 1122 static inline i::Handle<i::TemplateInfo> GetTemplateInfo( |
1162 i::Isolate* isolate, | 1123 i::Isolate* isolate, |
1163 Template* template_obj) { | 1124 Template* template_obj) { |
1164 return Utils::OpenHandle(template_obj); | 1125 return Utils::OpenHandle(template_obj); |
1165 } | 1126 } |
1166 | 1127 |
1167 | 1128 |
1168 // TODO(dcarney): remove this with ObjectTemplate::SetAccessor | 1129 // TODO(dcarney): remove this with ObjectTemplate::SetAccessor |
1169 static inline i::Handle<i::TemplateInfo> GetTemplateInfo( | 1130 static inline i::Handle<i::TemplateInfo> GetTemplateInfo( |
1170 i::Isolate* isolate, | 1131 i::Isolate* isolate, |
1171 ObjectTemplate* object_template) { | 1132 ObjectTemplate* object_template) { |
1172 EnsureConstructor(isolate, object_template); | 1133 EnsureConstructor(isolate, object_template); |
1173 return Utils::OpenHandle(object_template); | 1134 return Utils::OpenHandle(object_template); |
1174 } | 1135 } |
1175 | 1136 |
1176 | 1137 |
1177 template<typename Getter, typename Setter, typename Data, typename Template> | 1138 template<typename Getter, typename Setter, typename Data, typename Template> |
1178 static bool TemplateSetAccessor( | 1139 static bool TemplateSetAccessor( |
1179 Template* template_obj, | 1140 Template* template_obj, |
1180 v8::Local<Name> name, | 1141 v8::Local<Name> name, |
1181 Getter getter, | 1142 Getter getter, |
1182 Setter setter, | 1143 Setter setter, |
1183 Data data, | 1144 Data data, |
1184 AccessControl settings, | 1145 AccessControl settings, |
1185 PropertyAttribute attribute, | 1146 PropertyAttribute attribute, |
1186 v8::Local<AccessorSignature> signature) { | 1147 v8::Local<AccessorSignature> signature) { |
1187 i::Isolate* isolate = Utils::OpenHandle(template_obj)->GetIsolate(); | 1148 auto isolate = Utils::OpenHandle(template_obj)->GetIsolate(); |
1188 ENTER_V8(isolate); | 1149 ENTER_V8(isolate); |
1189 i::HandleScope scope(isolate); | 1150 i::HandleScope scope(isolate); |
1190 i::Handle<i::AccessorInfo> obj = MakeAccessorInfo( | 1151 auto obj = MakeAccessorInfo(name, getter, setter, data, settings, attribute, |
1191 name, getter, setter, data, settings, attribute, signature); | 1152 signature); |
1192 if (obj.is_null()) return false; | 1153 if (obj.is_null()) return false; |
1193 i::Handle<i::TemplateInfo> info = GetTemplateInfo(isolate, template_obj); | 1154 auto info = GetTemplateInfo(isolate, template_obj); |
1194 AddPropertyToTemplate(info, obj); | 1155 i::ApiNatives::AddNativeDataProperty(isolate, info, obj); |
1195 return true; | 1156 return true; |
1196 } | 1157 } |
1197 | 1158 |
1198 | 1159 |
1199 void Template::SetNativeDataProperty(v8::Local<String> name, | 1160 void Template::SetNativeDataProperty(v8::Local<String> name, |
1200 AccessorGetterCallback getter, | 1161 AccessorGetterCallback getter, |
1201 AccessorSetterCallback setter, | 1162 AccessorSetterCallback setter, |
1202 v8::Handle<Value> data, | 1163 v8::Handle<Value> data, |
1203 PropertyAttribute attribute, | 1164 PropertyAttribute attribute, |
1204 v8::Local<AccessorSignature> signature, | 1165 v8::Local<AccessorSignature> signature, |
(...skipping 6432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7637 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); | 7598 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); |
7638 Address callback_address = | 7599 Address callback_address = |
7639 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 7600 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
7640 VMState<EXTERNAL> state(isolate); | 7601 VMState<EXTERNAL> state(isolate); |
7641 ExternalCallbackScope call_scope(isolate, callback_address); | 7602 ExternalCallbackScope call_scope(isolate, callback_address); |
7642 callback(info); | 7603 callback(info); |
7643 } | 7604 } |
7644 | 7605 |
7645 | 7606 |
7646 } } // namespace v8::internal | 7607 } } // namespace v8::internal |
OLD | NEW |