Index: src/api.cc |
diff --git a/src/api.cc b/src/api.cc |
index d5168cd3853e2e6129103471f72231512292c1d0..e2093704ca325b949e1bd9536f6b6c2159d43ddf 100644 |
--- a/src/api.cc |
+++ b/src/api.cc |
@@ -2249,6 +2249,119 @@ bool StackFrame::IsConstructor() const { |
} |
+// --- W e a k M a p --- |
+ |
+WeakKeyMap* WeakKeyMap::New(Isolate* v8_isolate) { |
+ i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
+ ENTER_V8(isolate); |
+ i::HandleScope scope(isolate); |
+ i::Handle<i::JSWeakMap> weakmap = isolate->factory()->NewJSWeakMap(); |
+ i::Runtime::WeakCollectionInitialize(isolate, weakmap); |
+ Local<Object> v8_obj = Utils::ToLocal(i::Handle<i::JSObject>::cast(weakmap)); |
+ return new WeakKeyMap(v8_isolate, v8_obj); |
+} |
+ |
+ |
+WeakKeyMap::WeakKeyMap(Isolate* isolate, Handle<Object> weak_map) |
+ : isolate_(isolate), map_(isolate, weak_map) {} |
+ |
+ |
+WeakKeyMap::~WeakKeyMap() {} |
+ |
+ |
+void WeakKeyMap::Set(Handle<Value> v8_key, Handle<Value> v8_value) { |
+ v8::HandleScope handleScope(isolate_); |
+ Local<Object> map_handle = Local<Object>::New(isolate_, map_); |
+ i::Isolate* isolate = reinterpret_cast<i::Isolate*>(isolate_); |
+ ENTER_V8(isolate); |
+ i::Handle<i::Object> key = Utils::OpenHandle(*v8_key); |
+ i::Handle<i::Object> value = Utils::OpenHandle(*v8_value); |
+ i::Handle<i::JSWeakMap> weak_collection = |
+ i::Handle<i::JSWeakMap>::cast(Utils::OpenHandle(*map_handle)); |
+ if (!key->IsJSReceiver() && !key->IsSymbol()) { |
+ DCHECK(false); |
+ return; |
+ } |
+ i::Handle<i::ObjectHashTable> table( |
+ i::ObjectHashTable::cast(weak_collection->table())); |
+ if (!table->IsKey(*key)) { |
+ DCHECK(false); |
+ return; |
+ } |
+ i::Runtime::WeakCollectionSet(weak_collection, key, value); |
+} |
+ |
+ |
+Local<Value> WeakKeyMap::Get(Handle<Value> v8_key) { |
+ v8::EscapableHandleScope handleScope(isolate_); |
+ Local<Object> map_handle = Local<Object>::New(isolate_, map_); |
+ i::Isolate* isolate = reinterpret_cast<i::Isolate*>(isolate_); |
+ ENTER_V8(isolate); |
+ i::Handle<i::Object> key = Utils::OpenHandle(*v8_key); |
+ i::Handle<i::JSWeakMap> weak_collection = |
+ i::Handle<i::JSWeakMap>::cast(Utils::OpenHandle(*map_handle)); |
+ if (!key->IsJSReceiver() && !key->IsSymbol()) { |
+ DCHECK(false); |
+ return Undefined(isolate_); |
+ } |
+ i::Handle<i::ObjectHashTable> table( |
+ i::ObjectHashTable::cast(weak_collection->table())); |
+ if (!table->IsKey(*key)) { |
+ DCHECK(false); |
+ return Undefined(isolate_); |
+ } |
+ i::Handle<i::Object> lookup(table->Lookup(key), isolate); |
+ if (lookup->IsTheHole()) return Undefined(isolate_); |
+ Local<Value> result = Utils::ToLocal(lookup); |
+ return handleScope.Escape(result); |
+} |
+ |
+ |
+bool WeakKeyMap::Has(Handle<Value> v8_key) { |
+ v8::HandleScope handleScope(isolate_); |
+ Local<Object> map_handle = Local<Object>::New(isolate_, map_); |
+ i::Isolate* isolate = reinterpret_cast<i::Isolate*>(isolate_); |
+ ENTER_V8(isolate); |
+ i::Handle<i::Object> key = Utils::OpenHandle(*v8_key); |
+ i::Handle<i::JSWeakMap> weak_collection = |
+ i::Handle<i::JSWeakMap>::cast(Utils::OpenHandle(*map_handle)); |
+ if (!key->IsJSReceiver() && !key->IsSymbol()) { |
+ DCHECK(false); |
+ return false; |
+ } |
+ i::Handle<i::ObjectHashTable> table( |
+ i::ObjectHashTable::cast(weak_collection->table())); |
+ if (!table->IsKey(*key)) { |
+ DCHECK(false); |
+ return false; |
+ } |
+ i::Handle<i::Object> lookup(table->Lookup(key), isolate); |
+ return !lookup->IsTheHole(); |
+} |
+ |
+ |
+bool WeakKeyMap::Delete(Handle<Value> v8_key) { |
+ v8::HandleScope handleScope(isolate_); |
+ Local<Object> map_handle = Local<Object>::New(isolate_, map_); |
+ i::Isolate* isolate = reinterpret_cast<i::Isolate*>(isolate_); |
+ ENTER_V8(isolate); |
+ i::Handle<i::Object> key = Utils::OpenHandle(*v8_key); |
+ i::Handle<i::JSWeakMap> weak_collection = |
+ i::Handle<i::JSWeakMap>::cast(Utils::OpenHandle(*map_handle)); |
+ if (!key->IsJSReceiver() && !key->IsSymbol()) { |
+ DCHECK(false); |
+ return false; |
+ } |
+ i::Handle<i::ObjectHashTable> table( |
+ i::ObjectHashTable::cast(weak_collection->table())); |
+ if (!table->IsKey(*key)) { |
+ DCHECK(false); |
+ return false; |
+ } |
+ return i::Runtime::WeakCollectionDelete(weak_collection, key); |
+} |
+ |
+ |
// --- J S O N --- |
Local<Value> JSON::Parse(Local<String> json_string) { |