Use V8's new SetWeak method
This commit is contained in:
parent
f7c75d36ba
commit
bd64f5ced2
5 changed files with 70 additions and 37 deletions
|
@ -10,6 +10,23 @@
|
|||
|
||||
namespace atom {
|
||||
|
||||
namespace {
|
||||
|
||||
struct ObjectKey {
|
||||
ObjectKey(int id, IDWeakMap* map) : id(id), map(map) {}
|
||||
int id;
|
||||
IDWeakMap* map;
|
||||
};
|
||||
|
||||
void OnObjectGC(const v8::WeakCallbackInfo<ObjectKey>& data) {
|
||||
ObjectKey* key = data.GetParameter();
|
||||
LOG(ERROR) << "OnObjectGC: " << key->id;
|
||||
key->map->Remove(key->id);
|
||||
delete key;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
IDWeakMap::IDWeakMap() : next_id_(0) {
|
||||
}
|
||||
|
||||
|
@ -18,11 +35,9 @@ IDWeakMap::~IDWeakMap() {
|
|||
|
||||
int32_t IDWeakMap::Add(v8::Isolate* isolate, v8::Local<v8::Object> object) {
|
||||
int32_t id = GetNextID();
|
||||
object->SetHiddenValue(mate::StringToSymbol(isolate, "IDWeakMapKey"),
|
||||
mate::Converter<int32_t>::ToV8(isolate, id));
|
||||
|
||||
auto global = make_linked_ptr(new v8::Global<v8::Object>(isolate, object));
|
||||
global->SetWeak(this, &WeakCallback);
|
||||
ObjectKey* key = new ObjectKey(id, this);
|
||||
global->SetWeak(key, OnObjectGC, v8::WeakCallbackType::kParameter);
|
||||
map_[id] = global;
|
||||
return id;
|
||||
}
|
||||
|
@ -71,12 +86,4 @@ int32_t IDWeakMap::GetNextID() {
|
|||
return ++next_id_;
|
||||
}
|
||||
|
||||
// static
|
||||
void IDWeakMap::WeakCallback(
|
||||
const v8::WeakCallbackData<v8::Object, IDWeakMap>& data) {
|
||||
int32_t id = data.GetValue()->GetHiddenValue(
|
||||
mate::StringToV8(data.GetIsolate(), "IDWeakMapKey"))->Int32Value();
|
||||
data.GetParameter()->Remove(id);
|
||||
}
|
||||
|
||||
} // namespace atom
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue