Actually CCing Michael and Andreas.
--
Vyacheslav Egorov

On Fri, Jun 8, 2012 at 10:49 PM, Vyacheslav Egorov <vego...@chromium.org> wrote:
> +mstarzinger +rossberg
>
> I think we need a repro and V8 version. I could not repro on ToT with
> an example like:
>
>  static Handle<Value> Getter(Local<String> property, const AccessorInfo& 
> info) {
>  return Integer::New(24);
> }
>
>
> static Handle<Value> Foo(const Arguments& args) {
>  HandleScope scope;
>  Handle<Object> obj = Object::New();
>
>  obj->SetAccessor(String::New("foo"), &Getter, 0 /* setter */,
>                   Handle<Value>(),
>                   static_cast<v8::AccessControl>(v8::DEFAULT),
>                   static_cast<v8::PropertyAttribute>(v8::ReadOnly));
>
>  return scope.Close(obj);
> }
>
> var obj = Foo();
>
> var desc = Object.getOwnPropertyDescriptor(obj, "foo");
>
> print(desc.value);
> print(desc.get);
> print(desc.set);
> print(desc.writable);
> print(obj.foo);
> obj.foo = 42;
> print(obj.foo);
>
> % out/ia32.debug/d8 test.js
> 24
> undefined
> undefined
> false
> 24
> 24
>
>> What I want is a property that is writable but if not set should call the 
>> getter.
>
> I don't see how it fits into JavaScript object model.  If you have an
> accessor property without a setter you can't write into it ([[CanPut]]
> will be false).
>
>>  Is there a way to remove a V8 accessor?
>
> delete object.name would delete it. But there seems to be a different
> way, see below.
>
>> Would a call to Delete() make this a slow object?
>
> Yes.
>
> Different way is to use v8::Object::ForceSet to replace accessor with
> a real property. Good news: it will keep an object in fast mode if
> possible (if object has enough space for another fast property). Bad
> news: every time you replace an accessor with a normal data property
> with ForceSet you will get a different map (hidden class) because
> v8::internal::JSObject::ConvertDescriptorToField does not create a
> transition.
>
> // In theory accessor descriptors should be replaceable with data
> descriptors via [[DefineOwnProperty]] (Object.defineProperty) but
> there is some special handling in our code that prevents it.
> https://github.com/v8/v8/blob/master/src/runtime.cc#L4459-4478
>
> --
> Vyacheslav Egorov
>
> On Fri, Jun 8, 2012 at 9:33 PM, Erik Arvidsson <a...@chromium.org> wrote:
>> The V8 WebKit bindings generates something like this:
>>
>> object->SetAccessor(name, getter, 0 /* setter */, data,
>> static_cast<v8::AccessControl>(v8::DEFAULT),
>> static_cast<v8::PropertyAttribute>(v8::ReadOnly)
>>
>> There are two really strange behaviors with this:
>>
>> 1. The descriptor for this reports this as writable:
>>
>> var descr = Object.getOwnPropertyDescriptor(object, name);
>> descr.writable  // true!
>>
>> 2. Setting the property works
>>
>> object.name = 42;
>> object.name  // 42
>>
>> However, if we remove the ReadOnly flag in the call to SetAccessor we
>> get a writable property that cannot be written to:
>>
>> object->SetAccessor(name, getter, 0 /* setter */, data,
>> static_cast<v8::AccessControl>(v8::DEFAULT),
>> static_cast<v8::PropertyAttribute>(v8::None)
>>
>> var descr = Object.getOwnPropertyDescriptor(object, name);
>> descr.writable  // true
>>
>> object.name = 42;
>> object.name  // not 42!
>>
>>
>> This is pretty strange. What I want is a property that is writable but
>> if not set should call the getter.
>>
>> One way I can implement this is to generate a setter too that when set
>> reconfigures the property. Is there a way to remove a V8 accessor?
>> Would a call to Delete() make this a slow object?
>>
>>
>> --
>> erik
>>
>> --
>> v8-users mailing list
>> v8-users@googlegroups.com
>> http://groups.google.com/group/v8-users

-- 
v8-users mailing list
v8-users@googlegroups.com
http://groups.google.com/group/v8-users

Reply via email to