Hello there,
I have a situation, where an object's property is initially declared as
DontDelete, but later needs to be *removed*, so that I can create a named
accessor with the same name.
The V8 API used to have a ForceDelete() method that did the trick, but now
I can not find it any more (I recently upgraded to 4.9).
What is the modern equivalent of ForceDelete()?
Thanks in advance...
Sample code: // I tried using the regular Delete() method, but it fails.
The output is "Error in Delete! (type 2)"
#include <iostream>
#include <string.h>
#include "libplatform/libplatform.h"
#include "v8/v8.h"
void GetNamedAccessor(v8::Local<v8::Name> name, const
v8::PropertyCallbackInfo<v8::Value>& info)
{
std::cout << "[" << std::hex << info.This()->GetIdentityHash() << "]
GetNamedAccessor, name=" << *v8::String::Utf8Value(name) << std::endl;
}
void SetNamedAccessor(v8::Local<v8::Name> name, v8::Local<v8::Value> value,
const v8::PropertyCallbackInfo<void>& info)
{
std::cout << "[" << std::hex << info.This()->GetIdentityHash() << "]
SetNamedAccessor, name=" << *v8::String::Utf8Value(name)
<< ", value=" << *v8::String::Utf8Value(value) << std::endl;
}
class ArrayBufferAllocator : public v8::ArrayBuffer::Allocator {
public:
virtual void* Allocate(size_t length) {
std::cout << "!!! Allocate runs !!! length = " << length << std::endl;
void* data = AllocateUninitialized(length);
return data == NULL ? data : memset(data, 0, length);
}
virtual void* AllocateUninitialized(size_t length) { return
malloc(length); }
virtual void Free(void* data, size_t) { free(data); }
};
int main(int argc, char* argv[])
{
// initialize v8
v8::V8::InitializeICU();
v8::V8::InitializeExternalStartupData(argv[0]);
v8::Platform* platform = v8::platform::CreateDefaultPlatform();
v8::V8::InitializePlatform(platform);
v8::V8::Initialize();
ArrayBufferAllocator allocator;
v8::Isolate::CreateParams create_params;
create_params.array_buffer_allocator = &allocator;
v8::Isolate* isolate = v8::Isolate::New(create_params);
v8::Isolate::Scope isolate_scope(isolate);
v8::HandleScope handle_scope(isolate);
v8::Local<v8::Context> context = v8::Context::New(isolate);
v8::Context::Scope context_scope(context);
// prepare object with non-deleteable property
v8::Local<v8::String> fooStr = v8::String::NewFromUtf8(isolate,"foo");
v8::Local<v8::String> barStr = v8::String::NewFromUtf8(isolate,"bar");
v8::Local<v8::Object> obj = v8::Object::New(isolate);
v8::Maybe<bool> ok = obj->DefineOwnProperty(context, fooStr, barStr,
v8::DontDelete);
if (ok.IsNothing())
{
std::cout << "Error in DefineOwnProperty!" << std::endl;
return 1;
}
// do some testing
ok = obj->Delete(context, fooStr);
if (ok.IsNothing())
{
std::cout << "Error in Delete! (type 1)" << std::endl;
return 1;
}
if (ok.FromJust() == false)
{
std::cout << "Error in Delete! (type 2)" << std::endl;
return 1;
}
ok = obj->SetAccessor(context, fooStr, GetNamedAccessor,
SetNamedAccessor, v8::MaybeLocal<v8::Value>(),
v8::AccessControl(v8::ALL_CAN_READ|v8::ALL_CAN_WRITE),
v8::PropertyAttribute(6));
if (ok.IsNothing())
{
std::cout << "Error in SetAccessor! (type 1)" << std::endl;
return 1;
}
if (ok.FromJust() == false)
{
std::cout << "Error in SetAccessor! (type 2)" << std::endl;
return 1;
}
return 0;
}
--
--
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users
---
You received this message because you are subscribed to the Google Groups
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.