| 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) {
|
|
|