add setaccessorproperty to object

R=svenpanne@chromium.org

LOG=N
BUG=v8:2964

Review URL: https://codereview.chromium.org/209853002

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20178 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
dcarney@chromium.org 2014-03-24 08:41:59 +00:00
parent 15951521cc
commit 3ab0622b96
3 changed files with 29 additions and 21 deletions

View File

@ -2205,6 +2205,12 @@ class V8_EXPORT Object : public Value {
PropertyAttribute attribute = None,
AccessControl settings = DEFAULT);
void SetAccessorProperty(Local<String> name,
Local<Function> getter,
Handle<Function> setter = Handle<Function>(),
PropertyAttribute attribute = None,
AccessControl settings = DEFAULT);
/**
* Functionality for private properties.
* This is an experimental feature, use at your own risk.

View File

@ -3488,6 +3488,27 @@ bool Object::SetDeclaredAccessor(Local<String> name,
}
void Object::SetAccessorProperty(Local<String> name,
Local<Function> getter,
Handle<Function> setter,
PropertyAttribute attribute,
AccessControl settings) {
i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
ON_BAILOUT(isolate, "v8::Object::SetAccessorProperty()", return);
ENTER_V8(isolate);
i::HandleScope scope(isolate);
i::Handle<i::Object> getter_i = v8::Utils::OpenHandle(*getter);
i::Handle<i::Object> setter_i = v8::Utils::OpenHandle(*setter, true);
if (setter_i.is_null()) setter_i = isolate->factory()->null_value();
i::JSObject::DefineAccessor(v8::Utils::OpenHandle(this),
v8::Utils::OpenHandle(*name),
getter_i,
setter_i,
static_cast<PropertyAttributes>(attribute),
settings);
}
bool v8::Object::HasOwnProperty(Handle<String> key) {
i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
ON_BAILOUT(isolate, "v8::Object::HasOwnProperty()",

View File

@ -21962,25 +21962,6 @@ class ApiCallOptimizationChecker {
info.GetReturnValue().Set(v8_str("returned"));
}
// TODO(dcarney): move this to v8.h
static void SetAccessorProperty(Local<Object> object,
Local<String> name,
Local<Function> getter,
Local<Function> setter = Local<Function>()) {
i::Isolate* isolate = CcTest::i_isolate();
v8::AccessControl settings = v8::DEFAULT;
v8::PropertyAttribute attribute = v8::None;
i::Handle<i::Object> getter_i = v8::Utils::OpenHandle(*getter);
i::Handle<i::Object> setter_i = v8::Utils::OpenHandle(*setter, true);
if (setter_i.is_null()) setter_i = isolate->factory()->null_value();
i::JSObject::DefineAccessor(v8::Utils::OpenHandle(*object),
v8::Utils::OpenHandle(*name),
getter_i,
setter_i,
static_cast<PropertyAttributes>(attribute),
settings);
}
public:
enum SignatureType {
kNoSignature,
@ -22049,9 +22030,9 @@ class ApiCallOptimizationChecker {
global_holder = Local<Object>::Cast(global_holder->GetPrototype());
}
global_holder->Set(v8_str("g_f"), function);
SetAccessorProperty(global_holder, v8_str("g_acc"), function, function);
global_holder->SetAccessorProperty(v8_str("g_acc"), function, function);
function_holder->Set(v8_str("f"), function);
SetAccessorProperty(function_holder, v8_str("acc"), function, function);
function_holder->SetAccessorProperty(v8_str("acc"), function, function);
// Initialize expected values.
callee = function;
count = 0;