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

Side by Side Diff: src/api.cc

Issue 1154233003: Introduce v8::Object::CreateDataProperty (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 7 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
« include/v8.h ('K') | « include/v8.h ('k') | src/objects.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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()",
Toon Verwaest 2015/05/26 19:40:55 It seems like this is more of a DefineDataProperty
jochen (gone - plz use gerrit) 2015/05/27 07:28:30 it's the name of the JS method.
3468 bool);
3469 auto self = Utils::OpenHandle(this);
Toon Verwaest 2015/05/26 19:40:55 Note that I'm in the process of merging all named
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.
jochen (gone - plz use gerrit) 2015/05/26 16:49:44 Array.prototype.length is not configurable, so thi
Toon Verwaest 2015/05/26 19:40:55 Shouldn't this be allowed to modify the value of t
jochen (gone - plz use gerrit) 2015/05/27 07:28:29 see v8natives.js
3480 if (self->IsJSArray() &&
3481 key->StrictEquals(Utils::ToLocal(
3482 isolate->factory()->NewStringFromStaticChars("length")))) {
3483 i::Handle<i::Object> args[] = {self, key_obj, value_obj};
3484 i::Handle<i::Object> result;
3485 has_pending_exception =
3486 !CallV8HeapFunction(isolate, "$objectDefineArrayProperty",
3487 isolate->factory()->undefined_value(),
3488 arraysize(args), args).ToHandle(&result);
3489 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
3490 return Just(true);
3491 }
3492
3493 i::LookupIterator it(self, key_obj, i::LookupIterator::OWN_SKIP_INTERCEPTOR);
3494 if (it.IsFound() && it.state() == i::LookupIterator::ACCESS_CHECK) {
3495 if (isolate->MayAccess(self)) return Just(false);
noordhuis 2015/05/26 17:22:27 Should this be `if (!isolate->MayAccess(self)) ...
Toon Verwaest 2015/05/26 19:40:55 Yes. Seems like a missing test.
jochen (gone - plz use gerrit) 2015/05/27 07:28:30 done
3496 it.Next();
3497 }
3498
3499 if (it.state() == i::LookupIterator::DATA ||
3500 it.state() == i::LookupIterator::ACCESSOR) {
3501 if (it.property_details().attributes() & DONT_DELETE) return Just(false);
3502
3503 if (it.state() == i::LookupIterator::ACCESSOR) {
3504 has_pending_exception = i::JSObject::SetOwnPropertyIgnoreAttributes(
3505 self, key_obj, value_obj, NONE,
3506 i::JSObject::DONT_FORCE_FIELD).is_null();
3507 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
3508 return Just(true);
3509 }
3510 }
3511
3512
3513 has_pending_exception = i::Runtime::DefineObjectProperty(
3514 self, key_obj, value_obj, NONE).is_null();
3515 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
3516 return Just(true);
3517 }
3518
3519
3520 Maybe<bool> v8::Object::CreateDataProperty(v8::Local<v8::Context> context,
3521 uint32_t index,
3522 v8::Local<Value> value) {
3523 PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Object::CreateDataProperty()",
3524 bool);
3525 auto self = Utils::OpenHandle(this);
3526 auto value_obj = Utils::OpenHandle(*value);
3527 if (!self->IsExtensible()) return Just(false);
3528
3529 if (self->IsJSArray()) {
3530 size_t length =
3531 i::NumberToSize(isolate, i::Handle<i::JSArray>::cast(self)->length());
3532 if (index >= length) {
3533 i::Handle<i::Object> args[] = {
3534 self, isolate->factory()->Uint32ToString(index), value_obj};
3535 i::Handle<i::Object> result;
3536 has_pending_exception =
3537 !CallV8HeapFunction(isolate, "$objectDefineArrayProperty",
3538 isolate->factory()->undefined_value(),
3539 arraysize(args), args).ToHandle(&result);
3540 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
3541 return Just(true);
3542 }
3543 }
3544
3545 if (self->IsAccessCheckNeeded() && !isolate->MayAccess(self))
3546 return Just(false);
Toon Verwaest 2015/05/26 19:40:55 Add {} if on new line
jochen (gone - plz use gerrit) 2015/05/27 07:28:29 done
3547
3548 Maybe<PropertyAttributes> attributes =
3549 i::JSObject::GetElementAttributeWithReceiver(self, self, index, false);
3550 if (attributes.IsJust() && attributes.FromJust() != ABSENT) {
3551 if (attributes.FromJust() & DONT_DELETE) return Just(false);
3552
3553
3554 has_pending_exception =
3555 i::JSObject::SetOwnPropertyIgnoreAttributes(
3556 self, isolate->factory()->Uint32ToString(index), value_obj, NONE,
Toon Verwaest 2015/05/26 19:40:55 You cannot use SetOwn... For elements at this mome
jochen (gone - plz use gerrit) 2015/05/27 07:28:29 this code path is covered by the test that sets ar
Toon Verwaest 2015/05/27 08:03:57 I can guarantee you that that code path doesn't wo
3557 i::JSObject::DONT_FORCE_FIELD).is_null();
3558 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
3559 return Just(true);
3560 }
3561
3562
3563 has_pending_exception = i::Runtime::DefineObjectProperty(
3564 self, isolate->factory()->Uint32ToString(index),
3565 value_obj, NONE).is_null();
3566 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
3567 return Just(true);
3568 }
3569
3570
3464 Maybe<bool> v8::Object::ForceSet(v8::Local<v8::Context> context, 3571 Maybe<bool> v8::Object::ForceSet(v8::Local<v8::Context> context,
3465 v8::Local<Value> key, v8::Local<Value> value, 3572 v8::Local<Value> key, v8::Local<Value> value,
3466 v8::PropertyAttribute attribs) { 3573 v8::PropertyAttribute attribs) {
3467 PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Object::Set()", bool); 3574 PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Object::Set()", bool);
3468 auto self = Utils::OpenHandle(this); 3575 auto self = Utils::OpenHandle(this);
3469 auto key_obj = Utils::OpenHandle(*key); 3576 auto key_obj = Utils::OpenHandle(*key);
3470 auto value_obj = Utils::OpenHandle(*value); 3577 auto value_obj = Utils::OpenHandle(*value);
3471 has_pending_exception = i::Runtime::DefineObjectProperty( 3578 has_pending_exception = i::Runtime::DefineObjectProperty(
3472 self, 3579 self,
3473 key_obj, 3580 key_obj,
(...skipping 4635 matching lines...) Expand 10 before | Expand all | Expand 10 after
8109 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); 8216 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate());
8110 Address callback_address = 8217 Address callback_address =
8111 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 8218 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
8112 VMState<EXTERNAL> state(isolate); 8219 VMState<EXTERNAL> state(isolate);
8113 ExternalCallbackScope call_scope(isolate, callback_address); 8220 ExternalCallbackScope call_scope(isolate, callback_address);
8114 callback(info); 8221 callback(info);
8115 } 8222 }
8116 8223
8117 8224
8118 } } // namespace v8::internal 8225 } } // namespace v8::internal
OLDNEW
« include/v8.h ('K') | « include/v8.h ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698