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

Side by Side Diff: src/api.cc

Issue 12297012: Runtime version of declarative native accessors. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: round 2 Created 7 years, 10 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
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 1019 matching lines...) Expand 10 before | Expand all | Expand 10 after
1030 return Utils::ToLocal(obj); 1030 return Utils::ToLocal(obj);
1031 } 1031 }
1032 1032
1033 1033
1034 Local<AccessorSignature> AccessorSignature::New( 1034 Local<AccessorSignature> AccessorSignature::New(
1035 Handle<FunctionTemplate> receiver) { 1035 Handle<FunctionTemplate> receiver) {
1036 return Utils::AccessorSignatureToLocal(Utils::OpenHandle(*receiver)); 1036 return Utils::AccessorSignatureToLocal(Utils::OpenHandle(*receiver));
1037 } 1037 }
1038 1038
1039 1039
1040 template<typename Operation>
1041 static Local<Operation> NewDescriptor(
1042 Isolate* isolate,
1043 const i::DeclaredAccessorDescriptorData& data,
1044 Data* previous_descriptor
1045 ) {
1046 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate);
1047 i::Handle<i::DeclaredAccessorDescriptor> previous =
1048 i::Handle<i::DeclaredAccessorDescriptor>();
1049 if (previous_descriptor != NULL) {
1050 previous = Utils::OpenHandle(
1051 static_cast<DeclaredAccessorDescriptor*>(previous_descriptor));
1052 }
1053 i::Handle<i::DeclaredAccessorDescriptor> descriptor =
1054 i::DeclaredAccessorDescriptor::Create(internal_isolate, data, previous);
1055 return Local<Operation>(
1056 reinterpret_cast<Operation*>(*Utils::ToLocal(descriptor)));
1057 }
1058
1059
1060 Local<RawOperationDescriptor> ObjectOperationDescriptor::New(
1061 Isolate* isolate,
1062 int internal_field) {
1063 i::DeclaredAccessorDescriptorData data;
1064 data.type = i::kDescriptorObjectDereference;
1065 data.object_dereference_descriptor.internal_field = internal_field;
1066 return NewDescriptor<RawOperationDescriptor>(isolate, data, NULL);
1067 }
1068
1069
1070 Local<RawOperationDescriptor> RawOperationDescriptor::NewRawShift(
1071 Isolate* isolate,
1072 int16_t byte_offset) {
1073 i::DeclaredAccessorDescriptorData data;
1074 data.type = i::kDescriptorPointerShift;
1075 data.pointer_shift_descriptor.byte_offset = byte_offset;
1076 return NewDescriptor<RawOperationDescriptor>(isolate, data, this);
1077 }
1078
1079
1080 Local<DeclaredAccessorDescriptor> RawOperationDescriptor::NewHandleDereference(
1081 Isolate* isolate) {
1082 i::DeclaredAccessorDescriptorData data;
1083 data.type = i::kDescriptorReturnObject;
1084 return NewDescriptor<DeclaredAccessorDescriptor>(isolate, data, this);
1085 }
1086
1087
1088 Local<RawOperationDescriptor> RawOperationDescriptor::NewRawDereference(
1089 Isolate* isolate) {
1090 i::DeclaredAccessorDescriptorData data;
1091 data.type = i::kDescriptorPointerDereference;
1092 return NewDescriptor<RawOperationDescriptor>(isolate, data, this);
1093 }
1094
1095
1096 Local<DeclaredAccessorDescriptor> RawOperationDescriptor::NewPointerCompare(
1097 Isolate* isolate,
1098 void* compare_value) {
1099 i::DeclaredAccessorDescriptorData data;
1100 data.type = i::kDescriptorPointerCompare;
1101 data.pointer_compare_descriptor.compare_value = compare_value;
1102 return NewDescriptor<DeclaredAccessorDescriptor>(isolate, data, this);
1103 }
1104
1105
1106 Local<DeclaredAccessorDescriptor> RawOperationDescriptor::NewPrimitiveValue(
1107 Isolate* isolate,
1108 DeclaredAccessorDescriptorDataType data_type,
1109 uint8_t bool_offset) {
1110 i::DeclaredAccessorDescriptorData data;
1111 data.type = i::kDescriptorPrimitiveValue;
1112 data.primitive_value_descriptor.data_type = data_type;
1113 data.primitive_value_descriptor.bool_offset = bool_offset;
1114 return NewDescriptor<DeclaredAccessorDescriptor>(isolate, data, this);
1115 }
1116
1117
1118 template<typename T>
1119 static Local<DeclaredAccessorDescriptor> NewBitmaskCompare(
1120 Isolate* isolate,
1121 T bitmask,
1122 T compare_value,
1123 RawOperationDescriptor* operation) {
1124 i::DeclaredAccessorDescriptorData data;
1125 data.type = i::kDescriptorBitmaskCompare;
1126 data.bitmask_compare_descriptor.bitmask = bitmask;
1127 data.bitmask_compare_descriptor.compare_value = compare_value;
1128 data.bitmask_compare_descriptor.size = sizeof(T);
1129 return NewDescriptor<DeclaredAccessorDescriptor>(isolate, data, operation);
1130 }
1131
1132
1133 Local<DeclaredAccessorDescriptor> RawOperationDescriptor::NewBitmaskCompare8(
1134 Isolate* isolate,
1135 uint8_t bitmask,
1136 uint8_t compare_value) {
1137 return NewBitmaskCompare(isolate, bitmask, compare_value, this);
1138 }
1139
1140
1141 Local<DeclaredAccessorDescriptor> RawOperationDescriptor::NewBitmaskCompare16(
1142 Isolate* isolate,
1143 uint16_t bitmask,
1144 uint16_t compare_value) {
1145 return NewBitmaskCompare(isolate, bitmask, compare_value, this);
1146 }
1147
1148
1149 Local<DeclaredAccessorDescriptor> RawOperationDescriptor::NewBitmaskCompare32(
1150 Isolate* isolate,
1151 uint32_t bitmask,
1152 uint32_t compare_value) {
1153 return NewBitmaskCompare(isolate, bitmask, compare_value, this);
1154 }
1155
1156
1040 Local<TypeSwitch> TypeSwitch::New(Handle<FunctionTemplate> type) { 1157 Local<TypeSwitch> TypeSwitch::New(Handle<FunctionTemplate> type) {
1041 Handle<FunctionTemplate> types[1] = { type }; 1158 Handle<FunctionTemplate> types[1] = { type };
1042 return TypeSwitch::New(1, types); 1159 return TypeSwitch::New(1, types);
1043 } 1160 }
1044 1161
1045 1162
1046 Local<TypeSwitch> TypeSwitch::New(int argc, Handle<FunctionTemplate> types[]) { 1163 Local<TypeSwitch> TypeSwitch::New(int argc, Handle<FunctionTemplate> types[]) {
1047 i::Isolate* isolate = i::Isolate::Current(); 1164 i::Isolate* isolate = i::Isolate::Current();
1048 EnsureInitializedForIsolate(isolate, "v8::TypeSwitch::New()"); 1165 EnsureInitializedForIsolate(isolate, "v8::TypeSwitch::New()");
1049 LOG_API(isolate, "TypeSwitch::New"); 1166 LOG_API(isolate, "TypeSwitch::New");
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1091 isolate->factory()->NewStruct(i::CALL_HANDLER_INFO_TYPE); 1208 isolate->factory()->NewStruct(i::CALL_HANDLER_INFO_TYPE);
1092 i::Handle<i::CallHandlerInfo> obj = 1209 i::Handle<i::CallHandlerInfo> obj =
1093 i::Handle<i::CallHandlerInfo>::cast(struct_obj); 1210 i::Handle<i::CallHandlerInfo>::cast(struct_obj);
1094 SET_FIELD_WRAPPED(obj, set_callback, callback); 1211 SET_FIELD_WRAPPED(obj, set_callback, callback);
1095 if (data.IsEmpty()) data = v8::Undefined(); 1212 if (data.IsEmpty()) data = v8::Undefined();
1096 obj->set_data(*Utils::OpenHandle(*data)); 1213 obj->set_data(*Utils::OpenHandle(*data));
1097 Utils::OpenHandle(this)->set_call_code(*obj); 1214 Utils::OpenHandle(this)->set_call_code(*obj);
1098 } 1215 }
1099 1216
1100 1217
1101 static i::Handle<i::AccessorInfo> MakeAccessorInfo( 1218 static i::Handle<i::AccessorInfo> SetAccessorInfoProperties(
1102 v8::Handle<String> name, 1219 i::Handle<i::AccessorInfo> obj,
1103 AccessorGetter getter, 1220 v8::Handle<String> name,
1104 AccessorSetter setter, 1221 v8::AccessControl settings,
1105 v8::Handle<Value> data, 1222 v8::PropertyAttribute attributes,
1106 v8::AccessControl settings, 1223 v8::Handle<AccessorSignature> signature) {
1107 v8::PropertyAttribute attributes,
1108 v8::Handle<AccessorSignature> signature) {
1109 i::Handle<i::ExecutableAccessorInfo> obj =
1110 FACTORY->NewExecutableAccessorInfo();
1111 SET_FIELD_WRAPPED(obj, set_getter, getter);
1112 SET_FIELD_WRAPPED(obj, set_setter, setter);
1113 if (data.IsEmpty()) data = v8::Undefined();
1114 obj->set_data(*Utils::OpenHandle(*data));
1115 obj->set_name(*Utils::OpenHandle(*name)); 1224 obj->set_name(*Utils::OpenHandle(*name));
1116 if (settings & ALL_CAN_READ) obj->set_all_can_read(true); 1225 if (settings & ALL_CAN_READ) obj->set_all_can_read(true);
1117 if (settings & ALL_CAN_WRITE) obj->set_all_can_write(true); 1226 if (settings & ALL_CAN_WRITE) obj->set_all_can_write(true);
1118 if (settings & PROHIBITS_OVERWRITING) obj->set_prohibits_overwriting(true); 1227 if (settings & PROHIBITS_OVERWRITING) obj->set_prohibits_overwriting(true);
1119 obj->set_property_attributes(static_cast<PropertyAttributes>(attributes)); 1228 obj->set_property_attributes(static_cast<PropertyAttributes>(attributes));
1120 if (!signature.IsEmpty()) { 1229 if (!signature.IsEmpty()) {
1121 obj->set_expected_receiver_type(*Utils::OpenHandle(*signature)); 1230 obj->set_expected_receiver_type(*Utils::OpenHandle(*signature));
1122 } 1231 }
1123 return obj; 1232 return obj;
1124 } 1233 }
1125 1234
1126 1235
1127 void FunctionTemplate::AddInstancePropertyAccessor( 1236 static i::Handle<i::AccessorInfo> MakeAccessorInfo(
1128 v8::Handle<String> name, 1237 v8::Handle<String> name,
1129 AccessorGetter getter, 1238 AccessorGetter getter,
1130 AccessorSetter setter, 1239 AccessorSetter setter,
1131 v8::Handle<Value> data, 1240 v8::Handle<Value> data,
1132 v8::AccessControl settings, 1241 v8::AccessControl settings,
1133 v8::PropertyAttribute attributes, 1242 v8::PropertyAttribute attributes,
1134 v8::Handle<AccessorSignature> signature) { 1243 v8::Handle<AccessorSignature> signature) {
1135 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 1244 i::Isolate* isolate = Utils::OpenHandle(*name)->GetIsolate();
1136 if (IsDeadCheck(isolate, 1245 i::Handle<i::ExecutableAccessorInfo> obj =
1137 "v8::FunctionTemplate::AddInstancePropertyAccessor()")) { 1246 isolate->factory()->NewExecutableAccessorInfo();
1138 return; 1247 SET_FIELD_WRAPPED(obj, set_getter, getter);
1139 } 1248 SET_FIELD_WRAPPED(obj, set_setter, setter);
1140 ENTER_V8(isolate); 1249 if (data.IsEmpty()) data = v8::Undefined();
1141 i::HandleScope scope(isolate); 1250 obj->set_data(*Utils::OpenHandle(*data));
1142 1251 return SetAccessorInfoProperties(obj, name, settings, attributes, signature);
1143 i::Handle<i::AccessorInfo> obj = MakeAccessorInfo(name, getter, setter, data,
1144 settings, attributes,
1145 signature);
1146 i::Handle<i::Object> list(Utils::OpenHandle(this)->property_accessors());
1147 if (list->IsUndefined()) {
1148 list = NeanderArray().value();
1149 Utils::OpenHandle(this)->set_property_accessors(*list);
1150 }
1151 NeanderArray array(list);
1152 array.add(obj);
1153 } 1252 }
1154 1253
1155 1254
1255 static i::Handle<i::AccessorInfo> MakeAccessorInfo(
1256 v8::Handle<String> name,
1257 v8::Handle<v8::DeclaredAccessorDescriptor> descriptor,
1258 v8::AccessControl settings,
1259 v8::PropertyAttribute attributes,
1260 v8::Handle<AccessorSignature> signature) {
1261 i::Isolate* isolate = Utils::OpenHandle(*name)->GetIsolate();
1262 if (descriptor.IsEmpty()) return i::Handle<i::DeclaredAccessorInfo>();
1263 i::Handle<i::DeclaredAccessorInfo> obj =
1264 isolate->factory()->NewDeclaredAccessorInfo();
1265 obj->set_descriptor(*Utils::OpenHandle(*descriptor));
1266 return SetAccessorInfoProperties(obj, name, settings, attributes, signature);
1267 }
1268
1269
1156 Local<ObjectTemplate> FunctionTemplate::InstanceTemplate() { 1270 Local<ObjectTemplate> FunctionTemplate::InstanceTemplate() {
1157 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 1271 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
1158 if (IsDeadCheck(isolate, "v8::FunctionTemplate::InstanceTemplate()") 1272 if (IsDeadCheck(isolate, "v8::FunctionTemplate::InstanceTemplate()")
1159 || EmptyCheck("v8::FunctionTemplate::InstanceTemplate()", this)) 1273 || EmptyCheck("v8::FunctionTemplate::InstanceTemplate()", this))
1160 return Local<ObjectTemplate>(); 1274 return Local<ObjectTemplate>();
1161 ENTER_V8(isolate); 1275 ENTER_V8(isolate);
1162 if (Utils::OpenHandle(this)->instance_template()->IsUndefined()) { 1276 if (Utils::OpenHandle(this)->instance_template()->IsUndefined()) {
1163 Local<ObjectTemplate> templ = 1277 Local<ObjectTemplate> templ =
1164 ObjectTemplate::New(v8::Handle<FunctionTemplate>(this)); 1278 ObjectTemplate::New(v8::Handle<FunctionTemplate>(this));
1165 Utils::OpenHandle(this)->set_instance_template(*Utils::OpenHandle(*templ)); 1279 Utils::OpenHandle(this)->set_instance_template(*Utils::OpenHandle(*templ));
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
1323 static void EnsureConstructor(ObjectTemplate* object_template) { 1437 static void EnsureConstructor(ObjectTemplate* object_template) {
1324 if (Utils::OpenHandle(object_template)->constructor()->IsUndefined()) { 1438 if (Utils::OpenHandle(object_template)->constructor()->IsUndefined()) {
1325 Local<FunctionTemplate> templ = FunctionTemplate::New(); 1439 Local<FunctionTemplate> templ = FunctionTemplate::New();
1326 i::Handle<i::FunctionTemplateInfo> constructor = Utils::OpenHandle(*templ); 1440 i::Handle<i::FunctionTemplateInfo> constructor = Utils::OpenHandle(*templ);
1327 constructor->set_instance_template(*Utils::OpenHandle(object_template)); 1441 constructor->set_instance_template(*Utils::OpenHandle(object_template));
1328 Utils::OpenHandle(object_template)->set_constructor(*constructor); 1442 Utils::OpenHandle(object_template)->set_constructor(*constructor);
1329 } 1443 }
1330 } 1444 }
1331 1445
1332 1446
1447 static inline void AddPropertyToFunctionTemplate(
1448 i::Handle<i::FunctionTemplateInfo> cons,
1449 i::Handle<i::AccessorInfo> obj) {
1450 i::Handle<i::Object> list(cons->property_accessors());
1451 if (list->IsUndefined()) {
1452 list = NeanderArray().value();
1453 cons->set_property_accessors(*list);
1454 }
1455 NeanderArray array(list);
1456 array.add(obj);
1457 }
1458
1459
1333 void ObjectTemplate::SetAccessor(v8::Handle<String> name, 1460 void ObjectTemplate::SetAccessor(v8::Handle<String> name,
1334 AccessorGetter getter, 1461 AccessorGetter getter,
1335 AccessorSetter setter, 1462 AccessorSetter setter,
1336 v8::Handle<Value> data, 1463 v8::Handle<Value> data,
1337 AccessControl settings, 1464 AccessControl settings,
1338 PropertyAttribute attribute, 1465 PropertyAttribute attributes,
1339 v8::Handle<AccessorSignature> signature) { 1466 v8::Handle<AccessorSignature> signature) {
1340 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 1467 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
1341 if (IsDeadCheck(isolate, "v8::ObjectTemplate::SetAccessor()")) return; 1468 if (IsDeadCheck(isolate, "v8::ObjectTemplate::SetAccessor()")) return;
1342 ENTER_V8(isolate); 1469 ENTER_V8(isolate);
1343 i::HandleScope scope(isolate); 1470 i::HandleScope scope(isolate);
1344 EnsureConstructor(this); 1471 EnsureConstructor(this);
1345 i::FunctionTemplateInfo* constructor = 1472 i::FunctionTemplateInfo* constructor =
1346 i::FunctionTemplateInfo::cast(Utils::OpenHandle(this)->constructor()); 1473 i::FunctionTemplateInfo::cast(Utils::OpenHandle(this)->constructor());
1347 i::Handle<i::FunctionTemplateInfo> cons(constructor); 1474 i::Handle<i::FunctionTemplateInfo> cons(constructor);
1348 Utils::ToLocal(cons)->AddInstancePropertyAccessor(name, 1475 i::Handle<i::AccessorInfo> obj = MakeAccessorInfo(name, getter, setter, data,
1349 getter, 1476 settings, attributes,
1350 setter, 1477 signature);
1351 data, 1478 AddPropertyToFunctionTemplate(cons, obj);
1352 settings,
1353 attribute,
1354 signature);
1355 } 1479 }
1356 1480
1357 1481
1482 bool ObjectTemplate::SetAccessor(Handle<String> name,
1483 Handle<DeclaredAccessorDescriptor> descriptor,
1484 AccessControl settings,
1485 PropertyAttribute attributes,
1486 Handle<AccessorSignature> signature) {
1487 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
1488 if (IsDeadCheck(isolate, "v8::ObjectTemplate::SetAccessor()")) return false;
1489 ENTER_V8(isolate);
1490 i::HandleScope scope(isolate);
1491 EnsureConstructor(this);
1492 i::FunctionTemplateInfo* constructor =
1493 i::FunctionTemplateInfo::cast(Utils::OpenHandle(this)->constructor());
1494 i::Handle<i::FunctionTemplateInfo> cons(constructor);
1495 i::Handle<i::AccessorInfo> obj = MakeAccessorInfo(
1496 name, descriptor, settings, attributes, signature);
1497 if (obj.is_null()) return false;
1498 AddPropertyToFunctionTemplate(cons, obj);
1499 return true;
1500 }
1501
1502
1358 void ObjectTemplate::SetNamedPropertyHandler(NamedPropertyGetter getter, 1503 void ObjectTemplate::SetNamedPropertyHandler(NamedPropertyGetter getter,
1359 NamedPropertySetter setter, 1504 NamedPropertySetter setter,
1360 NamedPropertyQuery query, 1505 NamedPropertyQuery query,
1361 NamedPropertyDeleter remover, 1506 NamedPropertyDeleter remover,
1362 NamedPropertyEnumerator enumerator, 1507 NamedPropertyEnumerator enumerator,
1363 Handle<Value> data) { 1508 Handle<Value> data) {
1364 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 1509 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
1365 if (IsDeadCheck(isolate, "v8::ObjectTemplate::SetNamedPropertyHandler()")) { 1510 if (IsDeadCheck(isolate, "v8::ObjectTemplate::SetNamedPropertyHandler()")) {
1366 return; 1511 return;
1367 } 1512 }
(...skipping 1774 matching lines...) Expand 10 before | Expand all | Expand 10 after
3142 3287
3143 3288
3144 bool v8::Object::Has(uint32_t index) { 3289 bool v8::Object::Has(uint32_t index) {
3145 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3290 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
3146 ON_BAILOUT(isolate, "v8::Object::HasProperty()", return false); 3291 ON_BAILOUT(isolate, "v8::Object::HasProperty()", return false);
3147 i::Handle<i::JSObject> self = Utils::OpenHandle(this); 3292 i::Handle<i::JSObject> self = Utils::OpenHandle(this);
3148 return self->HasElement(index); 3293 return self->HasElement(index);
3149 } 3294 }
3150 3295
3151 3296
3297 static inline bool SetAccessor(Object* obj, i::Handle<i::AccessorInfo> info) {
3298 if (info.is_null()) return false;
3299 bool fast = Utils::OpenHandle(obj)->HasFastProperties();
3300 i::Handle<i::Object> result = i::SetAccessor(Utils::OpenHandle(obj), info);
3301 if (result.is_null() || result->IsUndefined()) return false;
3302 if (fast) i::JSObject::TransformToFastProperties(Utils::OpenHandle(obj), 0);
3303 return true;
3304 }
3305
3306
3152 bool Object::SetAccessor(Handle<String> name, 3307 bool Object::SetAccessor(Handle<String> name,
3153 AccessorGetter getter, 3308 AccessorGetter getter,
3154 AccessorSetter setter, 3309 AccessorSetter setter,
3155 v8::Handle<Value> data, 3310 v8::Handle<Value> data,
3156 AccessControl settings, 3311 AccessControl settings,
3157 PropertyAttribute attributes) { 3312 PropertyAttribute attributes) {
3158 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3313 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
3159 ON_BAILOUT(isolate, "v8::Object::SetAccessor()", return false); 3314 ON_BAILOUT(isolate, "v8::Object::SetAccessor()", return false);
3160 ENTER_V8(isolate); 3315 ENTER_V8(isolate);
3161 i::HandleScope scope(isolate); 3316 i::HandleScope scope(isolate);
3162 v8::Handle<AccessorSignature> signature; 3317 v8::Handle<AccessorSignature> signature;
3163 i::Handle<i::AccessorInfo> info = MakeAccessorInfo(name, getter, setter, data, 3318 i::Handle<i::AccessorInfo> info = MakeAccessorInfo(name, getter, setter, data,
3164 settings, attributes, 3319 settings, attributes,
3165 signature); 3320 signature);
3166 bool fast = Utils::OpenHandle(this)->HasFastProperties(); 3321 return v8::SetAccessor(this, info);
3167 i::Handle<i::Object> result = i::SetAccessor(Utils::OpenHandle(this), info);
3168 if (result.is_null() || result->IsUndefined()) return false;
3169 if (fast) i::JSObject::TransformToFastProperties(Utils::OpenHandle(this), 0);
3170 return true;
3171 } 3322 }
3172 3323
3173 3324
3325 bool Object::SetAccessor(Handle<String> name,
3326 Handle<DeclaredAccessorDescriptor> descriptor,
3327 AccessControl settings,
3328 PropertyAttribute attributes) {
3329 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
3330 ON_BAILOUT(isolate, "v8::Object::SetAccessor()", return false);
3331 ENTER_V8(isolate);
3332 i::HandleScope scope(isolate);
3333 v8::Handle<AccessorSignature> signature;
3334 i::Handle<i::AccessorInfo> info = MakeAccessorInfo(
3335 name, descriptor, settings, attributes, signature);
3336 return v8::SetAccessor(this, info);
3337 }
3338
3339
3174 bool v8::Object::HasOwnProperty(Handle<String> key) { 3340 bool v8::Object::HasOwnProperty(Handle<String> key) {
3175 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3341 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
3176 ON_BAILOUT(isolate, "v8::Object::HasOwnProperty()", 3342 ON_BAILOUT(isolate, "v8::Object::HasOwnProperty()",
3177 return false); 3343 return false);
3178 return Utils::OpenHandle(this)->HasLocalProperty( 3344 return Utils::OpenHandle(this)->HasLocalProperty(
3179 *Utils::OpenHandle(*key)); 3345 *Utils::OpenHandle(*key));
3180 } 3346 }
3181 3347
3182 3348
3183 bool v8::Object::HasRealNamedProperty(Handle<String> key) { 3349 bool v8::Object::HasRealNamedProperty(Handle<String> key) {
(...skipping 3520 matching lines...) Expand 10 before | Expand all | Expand 10 after
6704 6870
6705 v->VisitPointers(blocks_.first(), first_block_limit_); 6871 v->VisitPointers(blocks_.first(), first_block_limit_);
6706 6872
6707 for (int i = 1; i < blocks_.length(); i++) { 6873 for (int i = 1; i < blocks_.length(); i++) {
6708 v->VisitPointers(blocks_[i], &blocks_[i][kHandleBlockSize]); 6874 v->VisitPointers(blocks_[i], &blocks_[i][kHandleBlockSize]);
6709 } 6875 }
6710 } 6876 }
6711 6877
6712 6878
6713 } } // namespace v8::internal 6879 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698