| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/arguments.h" | 7 #include "src/arguments.h" |
| 8 #include "src/bootstrapper.h" | 8 #include "src/bootstrapper.h" |
| 9 #include "src/debug.h" | 9 #include "src/debug.h" |
| 10 #include "src/messages.h" | 10 #include "src/messages.h" |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 if (key->ToArrayIndex(&index)) { | 65 if (key->ToArrayIndex(&index)) { |
| 66 return GetElementOrCharAt(isolate, object, index); | 66 return GetElementOrCharAt(isolate, object, index); |
| 67 } | 67 } |
| 68 | 68 |
| 69 // Convert the key to a name - possibly by calling back into JavaScript. | 69 // Convert the key to a name - possibly by calling back into JavaScript. |
| 70 Handle<Name> name; | 70 Handle<Name> name; |
| 71 ASSIGN_RETURN_ON_EXCEPTION(isolate, name, ToName(isolate, key), Object); | 71 ASSIGN_RETURN_ON_EXCEPTION(isolate, name, ToName(isolate, key), Object); |
| 72 | 72 |
| 73 // Check if the name is trivially convertible to an index and get | 73 // Check if the name is trivially convertible to an index and get |
| 74 // the element if so. | 74 // the element if so. |
| 75 // TODO(verwaest): Make sure GetProperty(LookupIterator*) can handle this, and |
| 76 // remove the special casing here. |
| 75 if (name->AsArrayIndex(&index)) { | 77 if (name->AsArrayIndex(&index)) { |
| 76 return GetElementOrCharAt(isolate, object, index); | 78 return GetElementOrCharAt(isolate, object, index); |
| 77 } else { | 79 } else { |
| 78 return Object::GetProperty(object, name); | 80 return Object::GetProperty(object, name); |
| 79 } | 81 } |
| 80 } | 82 } |
| 81 | 83 |
| 82 | 84 |
| 83 MaybeHandle<Object> Runtime::SetObjectProperty(Isolate* isolate, | 85 MaybeHandle<Object> Runtime::SetObjectProperty(Isolate* isolate, |
| 84 Handle<Object> object, | 86 Handle<Object> object, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 95 // Check if the given key is an array index. | 97 // Check if the given key is an array index. |
| 96 uint32_t index = 0; | 98 uint32_t index = 0; |
| 97 if (key->ToArrayIndex(&index)) { | 99 if (key->ToArrayIndex(&index)) { |
| 98 // TODO(verwaest): Support other objects as well. | 100 // TODO(verwaest): Support other objects as well. |
| 99 if (!object->IsJSReceiver()) return value; | 101 if (!object->IsJSReceiver()) return value; |
| 100 return JSReceiver::SetElement(Handle<JSReceiver>::cast(object), index, | 102 return JSReceiver::SetElement(Handle<JSReceiver>::cast(object), index, |
| 101 value, language_mode); | 103 value, language_mode); |
| 102 } | 104 } |
| 103 | 105 |
| 104 Handle<Name> name; | 106 Handle<Name> name; |
| 105 if (key->IsName()) { | 107 ASSIGN_RETURN_ON_EXCEPTION(isolate, name, ToName(isolate, key), Object); |
| 106 name = Handle<Name>::cast(key); | |
| 107 } else { | |
| 108 // Call-back into JavaScript to convert the key to a string. | |
| 109 Handle<Object> converted; | |
| 110 ASSIGN_RETURN_ON_EXCEPTION(isolate, converted, | |
| 111 Execution::ToString(isolate, key), Object); | |
| 112 name = Handle<String>::cast(converted); | |
| 113 } | |
| 114 | 108 |
| 115 if (name->AsArrayIndex(&index)) { | 109 LookupIterator it = LookupIterator::PropertyOrElement(isolate, object, name); |
| 116 // TODO(verwaest): Support other objects as well. | 110 // TODO(verwaest): Support other objects as well. |
| 117 if (!object->IsJSReceiver()) return value; | 111 if (it.IsElement() && !object->IsJSReceiver()) return value; |
| 118 return JSReceiver::SetElement(Handle<JSReceiver>::cast(object), index, | 112 return Object::SetProperty(&it, value, language_mode, |
| 119 value, language_mode); | 113 Object::MAY_BE_STORE_FROM_KEYED); |
| 120 } | |
| 121 return Object::SetProperty(object, name, value, language_mode); | |
| 122 } | 114 } |
| 123 | 115 |
| 124 | 116 |
| 125 MaybeHandle<Object> Runtime::GetPrototype(Isolate* isolate, | 117 MaybeHandle<Object> Runtime::GetPrototype(Isolate* isolate, |
| 126 Handle<Object> obj) { | 118 Handle<Object> obj) { |
| 127 // We don't expect access checks to be needed on JSProxy objects. | 119 // We don't expect access checks to be needed on JSProxy objects. |
| 128 DCHECK(!obj->IsAccessCheckNeeded() || obj->IsJSObject()); | 120 DCHECK(!obj->IsAccessCheckNeeded() || obj->IsJSObject()); |
| 129 PrototypeIterator iter(isolate, obj, PrototypeIterator::START_AT_RECEIVER); | 121 PrototypeIterator iter(isolate, obj, PrototypeIterator::START_AT_RECEIVER); |
| 130 do { | 122 do { |
| 131 if (PrototypeIterator::GetCurrent(iter)->IsAccessCheckNeeded() && | 123 if (PrototypeIterator::GetCurrent(iter)->IsAccessCheckNeeded() && |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 232 }; | 224 }; |
| 233 | 225 |
| 234 | 226 |
| 235 MUST_USE_RESULT static MaybeHandle<Object> GetOwnProperty(Isolate* isolate, | 227 MUST_USE_RESULT static MaybeHandle<Object> GetOwnProperty(Isolate* isolate, |
| 236 Handle<JSObject> obj, | 228 Handle<JSObject> obj, |
| 237 Handle<Name> name) { | 229 Handle<Name> name) { |
| 238 Heap* heap = isolate->heap(); | 230 Heap* heap = isolate->heap(); |
| 239 Factory* factory = isolate->factory(); | 231 Factory* factory = isolate->factory(); |
| 240 | 232 |
| 241 PropertyAttributes attrs; | 233 PropertyAttributes attrs; |
| 242 uint32_t index; | |
| 243 // Get attributes. | 234 // Get attributes. |
| 244 LookupIterator it = | 235 LookupIterator it = LookupIterator::PropertyOrElement(isolate, obj, name, |
| 245 name->AsArrayIndex(&index) | 236 LookupIterator::HIDDEN); |
| 246 ? LookupIterator(isolate, obj, index, LookupIterator::HIDDEN) | |
| 247 : LookupIterator(obj, name, LookupIterator::HIDDEN); | |
| 248 Maybe<PropertyAttributes> maybe = JSObject::GetPropertyAttributes(&it); | 237 Maybe<PropertyAttributes> maybe = JSObject::GetPropertyAttributes(&it); |
| 249 | 238 |
| 250 if (!maybe.IsJust()) return MaybeHandle<Object>(); | 239 if (!maybe.IsJust()) return MaybeHandle<Object>(); |
| 251 attrs = maybe.FromJust(); | 240 attrs = maybe.FromJust(); |
| 252 if (attrs == ABSENT) return factory->undefined_value(); | 241 if (attrs == ABSENT) return factory->undefined_value(); |
| 253 | 242 |
| 254 DCHECK(!isolate->has_pending_exception()); | 243 DCHECK(!isolate->has_pending_exception()); |
| 255 Handle<FixedArray> elms = factory->NewFixedArray(DESCRIPTOR_SIZE); | 244 Handle<FixedArray> elms = factory->NewFixedArray(DESCRIPTOR_SIZE); |
| 256 elms->set(ENUMERABLE_INDEX, heap->ToBoolean((attrs & DONT_ENUM) == 0)); | 245 elms->set(ENUMERABLE_INDEX, heap->ToBoolean((attrs & DONT_ENUM) == 0)); |
| 257 elms->set(CONFIGURABLE_INDEX, heap->ToBoolean((attrs & DONT_DELETE) == 0)); | 246 elms->set(CONFIGURABLE_INDEX, heap->ToBoolean((attrs & DONT_DELETE) == 0)); |
| (...skipping 1009 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1267 // Step 12 - update an existing data property with a data or generic | 1256 // Step 12 - update an existing data property with a data or generic |
| 1268 // descriptor. | 1257 // descriptor. |
| 1269 RUNTIME_FUNCTION(Runtime_DefineDataPropertyUnchecked) { | 1258 RUNTIME_FUNCTION(Runtime_DefineDataPropertyUnchecked) { |
| 1270 HandleScope scope(isolate); | 1259 HandleScope scope(isolate); |
| 1271 DCHECK(args.length() == 4); | 1260 DCHECK(args.length() == 4); |
| 1272 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); | 1261 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
| 1273 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); | 1262 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); |
| 1274 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); | 1263 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
| 1275 CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3); | 1264 CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3); |
| 1276 | 1265 |
| 1277 uint32_t index = 0; | 1266 LookupIterator it = LookupIterator::PropertyOrElement(isolate, object, name, |
| 1278 LookupIterator::Configuration c = LookupIterator::OWN_SKIP_INTERCEPTOR; | 1267 LookupIterator::OWN); |
| 1279 LookupIterator it = name->AsArrayIndex(&index) | |
| 1280 ? LookupIterator(isolate, object, index, c) | |
| 1281 : LookupIterator(object, name, c); | |
| 1282 if (it.state() == LookupIterator::ACCESS_CHECK && !it.HasAccess()) { | 1268 if (it.state() == LookupIterator::ACCESS_CHECK && !it.HasAccess()) { |
| 1283 return isolate->heap()->undefined_value(); | 1269 return isolate->heap()->undefined_value(); |
| 1284 } | 1270 } |
| 1285 | 1271 |
| 1286 Handle<Object> result; | 1272 Handle<Object> result; |
| 1287 MaybeHandle<Object> maybe_result = | 1273 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 1288 it.IsElement() | 1274 isolate, result, JSObject::DefineOwnPropertyIgnoreAttributes( |
| 1289 ? JSObject::SetOwnElementIgnoreAttributes(object, index, value, attrs, | 1275 &it, value, attrs, JSObject::DONT_FORCE_FIELD)); |
| 1290 JSObject::DONT_FORCE_FIELD) | 1276 |
| 1291 : JSObject::SetOwnPropertyIgnoreAttributes( | |
| 1292 object, name, value, attrs, JSObject::DONT_FORCE_FIELD); | |
| 1293 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, maybe_result); | |
| 1294 return *result; | 1277 return *result; |
| 1295 } | 1278 } |
| 1296 | 1279 |
| 1297 | 1280 |
| 1298 // Return property without being observable by accessors or interceptors. | 1281 // Return property without being observable by accessors or interceptors. |
| 1299 RUNTIME_FUNCTION(Runtime_GetDataProperty) { | 1282 RUNTIME_FUNCTION(Runtime_GetDataProperty) { |
| 1300 HandleScope scope(isolate); | 1283 HandleScope scope(isolate); |
| 1301 DCHECK(args.length() == 2); | 1284 DCHECK(args.length() == 2); |
| 1302 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0); | 1285 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0); |
| 1303 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); | 1286 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1441 CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3); | 1424 CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3); |
| 1442 | 1425 |
| 1443 RETURN_FAILURE_ON_EXCEPTION( | 1426 RETURN_FAILURE_ON_EXCEPTION( |
| 1444 isolate, | 1427 isolate, |
| 1445 JSObject::DefineAccessor(object, name, isolate->factory()->null_value(), | 1428 JSObject::DefineAccessor(object, name, isolate->factory()->null_value(), |
| 1446 setter, attrs)); | 1429 setter, attrs)); |
| 1447 return isolate->heap()->undefined_value(); | 1430 return isolate->heap()->undefined_value(); |
| 1448 } | 1431 } |
| 1449 } // namespace internal | 1432 } // namespace internal |
| 1450 } // namespace v8 | 1433 } // namespace v8 |
| OLD | NEW |