Chromium Code Reviews| 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 3443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3454 return Just(true); | 3454 return Just(true); |
| 3455 } | 3455 } |
| 3456 | 3456 |
| 3457 | 3457 |
| 3458 bool v8::Object::Set(uint32_t index, v8::Handle<Value> value) { | 3458 bool v8::Object::Set(uint32_t index, v8::Handle<Value> value) { |
| 3459 auto context = ContextFromHeapObject(Utils::OpenHandle(this)); | 3459 auto context = ContextFromHeapObject(Utils::OpenHandle(this)); |
| 3460 return Set(context, index, value).FromMaybe(false); | 3460 return Set(context, index, value).FromMaybe(false); |
| 3461 } | 3461 } |
| 3462 | 3462 |
| 3463 | 3463 |
| 3464 Maybe<bool> v8::Object::CreateDataProperty(v8::Local<v8::Context> context, | |
| 3465 v8::Local<Name> key, | |
| 3466 v8::Local<Value> value) { | |
| 3467 PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Object::CreateDataProperty()", | |
| 3468 bool); | |
| 3469 auto self = Utils::OpenHandle(this); | |
| 3470 auto key_obj = Utils::OpenHandle(*key); | |
| 3471 auto value_obj = Utils::OpenHandle(*value); | |
| 3472 if (!self->IsExtensible()) return Just(false); | |
| 3473 | |
| 3474 uint32_t index = 0; | |
| 3475 if (key_obj->AsArrayIndex(&index)) { | |
| 3476 return CreateDataProperty(context, index, value); | |
| 3477 } | |
| 3478 | |
| 3479 // Special case for Array.length. | |
| 3480 if (self->IsJSArray() && | |
| 3481 key->StrictEquals(Utils::ToLocal( | |
| 3482 isolate->factory()->NewStringFromStaticChars("length")))) { | |
|
Toon Verwaest
2015/05/27 09:50:06
isolate->factory()->length_string()
| |
| 3483 // Length is not configurable, however, CreateDataProperty always attempts | |
| 3484 // to create a configurable property, so we just fail here. | |
| 3485 return Just(false); | |
| 3486 } | |
| 3487 | |
| 3488 i::LookupIterator it(self, key_obj, i::LookupIterator::OWN_SKIP_INTERCEPTOR); | |
| 3489 if (it.IsFound() && it.state() == i::LookupIterator::ACCESS_CHECK) { | |
| 3490 if (!isolate->MayAccess(self)) return Just(false); | |
| 3491 it.Next(); | |
| 3492 } | |
| 3493 | |
| 3494 if (it.state() == i::LookupIterator::DATA || | |
| 3495 it.state() == i::LookupIterator::ACCESSOR) { | |
| 3496 if (it.property_details().attributes() & DONT_DELETE) return Just(false); | |
|
Toon Verwaest
2015/05/27 09:50:06
!it.IsConfigurable()
| |
| 3497 | |
| 3498 if (it.state() == i::LookupIterator::ACCESSOR) { | |
| 3499 has_pending_exception = i::JSObject::SetOwnPropertyIgnoreAttributes( | |
| 3500 self, key_obj, value_obj, NONE, | |
| 3501 i::JSObject::DONT_FORCE_FIELD).is_null(); | |
| 3502 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); | |
| 3503 return Just(true); | |
| 3504 } | |
| 3505 } | |
| 3506 | |
| 3507 has_pending_exception = i::Runtime::DefineObjectProperty( | |
| 3508 self, key_obj, value_obj, NONE).is_null(); | |
| 3509 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); | |
| 3510 return Just(true); | |
| 3511 } | |
| 3512 | |
| 3513 | |
| 3514 Maybe<bool> v8::Object::CreateDataProperty(v8::Local<v8::Context> context, | |
| 3515 uint32_t index, | |
| 3516 v8::Local<Value> value) { | |
| 3517 PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Object::CreateDataProperty()", | |
| 3518 bool); | |
| 3519 auto self = Utils::OpenHandle(this); | |
| 3520 auto value_obj = Utils::OpenHandle(*value); | |
| 3521 if (!self->IsExtensible()) return Just(false); | |
| 3522 | |
| 3523 if (self->IsJSArray()) { | |
| 3524 size_t length = | |
| 3525 i::NumberToSize(isolate, i::Handle<i::JSArray>::cast(self)->length()); | |
| 3526 if (index >= length) { | |
| 3527 i::Handle<i::Object> args[] = { | |
| 3528 self, isolate->factory()->Uint32ToString(index), value_obj}; | |
| 3529 i::Handle<i::Object> result; | |
| 3530 has_pending_exception = | |
| 3531 !CallV8HeapFunction(isolate, "$objectDefineArrayProperty", | |
| 3532 isolate->factory()->undefined_value(), | |
| 3533 arraysize(args), args).ToHandle(&result); | |
| 3534 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); | |
| 3535 return Just(result->BooleanValue()); | |
| 3536 } | |
| 3537 } | |
| 3538 | |
| 3539 if (self->IsAccessCheckNeeded() && !isolate->MayAccess(self)) { | |
|
Toon Verwaest
2015/05/27 09:50:06
According to https://etherpad.mozilla.org/html5-c
| |
| 3540 return Just(false); | |
| 3541 } | |
| 3542 | |
| 3543 Maybe<PropertyAttributes> attributes = | |
| 3544 i::JSReceiver::GetOwnElementAttribute(self, index); | |
| 3545 if (attributes.IsJust() && attributes.FromJust() & DONT_DELETE) { | |
| 3546 return Just(false); | |
| 3547 } | |
| 3548 | |
| 3549 has_pending_exception = i::Runtime::DefineObjectProperty( | |
| 3550 self, isolate->factory()->Uint32ToString(index), | |
| 3551 value_obj, NONE).is_null(); | |
| 3552 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); | |
| 3553 return Just(true); | |
| 3554 } | |
| 3555 | |
| 3556 | |
| 3464 Maybe<bool> v8::Object::ForceSet(v8::Local<v8::Context> context, | 3557 Maybe<bool> v8::Object::ForceSet(v8::Local<v8::Context> context, |
| 3465 v8::Local<Value> key, v8::Local<Value> value, | 3558 v8::Local<Value> key, v8::Local<Value> value, |
| 3466 v8::PropertyAttribute attribs) { | 3559 v8::PropertyAttribute attribs) { |
| 3467 PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Object::Set()", bool); | 3560 PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Object::Set()", bool); |
| 3468 auto self = Utils::OpenHandle(this); | 3561 auto self = Utils::OpenHandle(this); |
| 3469 auto key_obj = Utils::OpenHandle(*key); | 3562 auto key_obj = Utils::OpenHandle(*key); |
| 3470 auto value_obj = Utils::OpenHandle(*value); | 3563 auto value_obj = Utils::OpenHandle(*value); |
| 3471 has_pending_exception = i::Runtime::DefineObjectProperty( | 3564 has_pending_exception = i::Runtime::DefineObjectProperty( |
| 3472 self, | 3565 self, |
| 3473 key_obj, | 3566 key_obj, |
| (...skipping 4635 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 8109 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); | 8202 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); |
| 8110 Address callback_address = | 8203 Address callback_address = |
| 8111 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 8204 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
| 8112 VMState<EXTERNAL> state(isolate); | 8205 VMState<EXTERNAL> state(isolate); |
| 8113 ExternalCallbackScope call_scope(isolate, callback_address); | 8206 ExternalCallbackScope call_scope(isolate, callback_address); |
| 8114 callback(info); | 8207 callback(info); |
| 8115 } | 8208 } |
| 8116 | 8209 |
| 8117 | 8210 |
| 8118 } } // namespace v8::internal | 8211 } } // namespace v8::internal |
| OLD | NEW |