diff --git a/lib/.gitkeep b/lib/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/lib/node-proxy.node b/lib/node-proxy.node deleted file mode 100644 index 4538a48..0000000 Binary files a/lib/node-proxy.node and /dev/null differ diff --git a/src/node-proxy.cc b/src/node-proxy.cc index 8a85d4d..32af493 100644 --- a/src/node-proxy.cc +++ b/src/node-proxy.cc @@ -332,15 +332,18 @@ Handle NodeProxy::IsProxy(const Arguments& args) { if (args.Length() < 1) { return THREXC("isProxy requires at least one (1) argument."); } - + Local obj = args[0]->ToObject(); - Local temp = obj->GetHiddenValue(NodeProxy::hiddenPrivate); - - if (!temp.IsEmpty() && temp->IsObject()) { - Handle ret = ValidateProxyHandler(temp->ToObject()); - return Boolean::New(ret->IsBoolean() && ret->BooleanValue()); + + if (obj->InternalFieldCount() > 0) { + Local temp = obj->GetInternalField(0); + + if (!temp.IsEmpty() && temp->IsObject()) { + Handle ret = ValidateProxyHandler(temp->ToObject()); + return Boolean::New(ret->IsBoolean() && ret->BooleanValue()); + } } - + return False(); } @@ -389,7 +392,9 @@ Handle NodeProxy::Create(const Arguments& args) { proxyHandler->SetHiddenValue(NodeProxy::frozen, False()); Local temp = ObjectTemplate::New(); - + + temp->SetInternalFieldCount(1); + //named property handlers temp->SetNamedPropertyHandler(GetNamedProperty, SetNamedProperty, @@ -413,7 +418,8 @@ Handle NodeProxy::Create(const Arguments& args) { Local instance = temp->NewInstance(); - instance->SetHiddenValue(NodeProxy::hiddenPrivate, proxyHandler); + instance->SetInternalField(0, proxyHandler); + if (args.Length() > 1) { instance->SetPrototype(args[1]); @@ -475,21 +481,23 @@ Handle NodeProxy::CreateFunction(const Arguments& args) { Local temp = FunctionTemplate::New(New, proxyHandler); - Local proto = temp->PrototypeTemplate(); + //Local proto = temp->PrototypeTemplate(); Local instance = temp->InstanceTemplate(); + instance->SetInternalFieldCount(1); + instance->SetNamedPropertyHandler(GetNamedProperty, SetNamedProperty, //different versions of V8 require different return types //0.1.97 is where the switch occurred in v8, but NODE_*_VERSION wasn't added until 0.1.100 #ifndef NODE_MAJOR_VERSION - QueryNamedProperty, + QueryNamedProperty, #elif PROXY_NODE_VERSION_AT_LEAST(0, 1, 98) - QueryNamedPropertyInteger, + QueryNamedPropertyInteger, #else - QueryNamedProperty, + QueryNamedProperty, #endif DeleteNamedProperty, @@ -502,8 +510,8 @@ Handle NodeProxy::CreateFunction(const Arguments& args) { Local fn = temp->GetFunction(); - fn->SetHiddenValue(NodeProxy::hiddenPrivate, proxyHandler); - + fn->SetInternalField(0, proxyHandler); + //optionally pass the name of your function attached to the ProxyHandler Object if (proxyHandler->Has(NodeProxy::name) && proxyHandler->Get(NodeProxy::name)->IsString()) { fn->SetName(proxyHandler->Get(NodeProxy::name)->ToString()); @@ -530,11 +538,14 @@ Handle NodeProxy::Freeze(const Arguments& args) { } Local obj = args[0]->ToObject(); + + if (obj->InternalFieldCount() < 1) { + return THR_TYPE_ERROR("Locking functions expect first argument to be intialized by Proxy"); + } - Local hide = obj->GetHiddenValue(NodeProxy::hiddenPrivate); + Local hide = obj->GetInternalField(0); if (hide.IsEmpty() || !hide->IsObject()) { - //return False(); return THR_TYPE_ERROR("Locking functions expect first argument to be intialized by Proxy"); } @@ -605,7 +616,7 @@ Handle NodeProxy::Freeze(const Arguments& args) { parts->SetHiddenValue(NodeProxy::trapping, False()); //overwrite the handler, making handler available for GC - obj->SetHiddenValue(NodeProxy::hiddenPrivate, parts); + obj->SetInternalField(0, parts); return True(); } @@ -627,11 +638,14 @@ Handle NodeProxy::IsLocked(const Arguments& args) { } Local arg = args[0]->ToObject(); + + if (arg->InternalFieldCount() < 1) { + return THR_TYPE_ERROR("Locking functions expect first argument to be intialized by Proxy"); + } - Local hide = arg->GetHiddenValue(NodeProxy::hiddenPrivate); + Local hide = arg->GetInternalField(0); if (hide.IsEmpty() || !hide->IsObject()) { - //return False(); return THR_TYPE_ERROR("Locking functions expect first argument to be intialized by Proxy"); } @@ -674,7 +688,12 @@ Handle NodeProxy::GetOwnPropertyDescriptor(const Arguments& args) { Local obj = args[0]->ToObject(); Local name = args[1]->ToString(); - Local temp = obj->GetHiddenValue(NodeProxy::hiddenPrivate); + + if (obj->InternalFieldCount() < 1) { + return THR_TYPE_ERROR("getOwnPropertyDescriptor expects first argument to be intialized by Proxy"); + } + + Local temp = obj->GetInternalField(0); if (temp.IsEmpty() || !temp->IsObject()) { return THR_TYPE_ERROR("getOwnPropertyDescriptor expects first argument to be intialized by Proxy"); @@ -718,13 +737,18 @@ Handle NodeProxy::DefineProperty(const Arguments& args) { } Local obj = args[0]->ToObject(); - Local name = args[1]->ToString(); - Local temp = obj->GetHiddenValue(NodeProxy::hiddenPrivate); + + if (obj->InternalFieldCount() < 1) { + return THR_TYPE_ERROR("defineProperty expects first argument to be intialized by Proxy"); + } + + Local temp = obj->GetInternalField(0); if (temp.IsEmpty() || !temp->IsObject()) { return THR_TYPE_ERROR("defineProperty expects first argument to be intialized by Proxy"); } + Local name = args[1]->ToString(); Local handler = temp->ToObject(); if (handler->GetHiddenValue(NodeProxy::sealed)->BooleanValue()) { @@ -772,58 +796,66 @@ Handle NodeProxy::DefineProperties(const Arguments& args) { } Local obj = args[0]->ToObject(); - Local props = args[1]->ToObject(); - Local temp = obj->GetHiddenValue(NodeProxy::hiddenPrivate); - - if (temp.IsEmpty() || !temp->IsObject()) { - return THR_TYPE_ERROR("defineProperties expects first argument to be intialized by Proxy"); + if (obj->InternalFieldCount() < 1) { + return THR_TYPE_ERROR("defineProperty expects first argument to be intialized by Proxy"); } + + Local temp = obj->GetInternalField(0); - Local handler = temp->ToObject(); - - if (handler->GetHiddenValue(NodeProxy::sealed)->BooleanValue()) { - return False(); - } + if (!temp.IsEmpty() && temp->IsObject()) { + Local props = args[1]->ToObject(); + Local handler = temp->ToObject(); + + if (handler->GetHiddenValue(NodeProxy::sealed)->BooleanValue()) { + return False(); + } - Local name; - bool extensible = handler->GetHiddenValue(NodeProxy::extensible)->BooleanValue(); - Local names = props->GetPropertyNames(); - uint32_t i = 0, l = names->Length(); + Local name; + bool extensible = handler->GetHiddenValue(NodeProxy::extensible)->BooleanValue(); + Local names = props->GetPropertyNames(); + uint32_t i = 0, l = names->Length(); - if (!handler->GetHiddenValue(NodeProxy::trapping)->BooleanValue()) { - for (;i < l; ++i) { - name = names->CloneElementAt(i); + if (!handler->GetHiddenValue(NodeProxy::trapping)->BooleanValue()) { - if (handler->Has(name->ToString()) && handler->Get(name->ToString())->IsObject()) { - Local tempObj = handler->Get(name->ToString())->ToObject(); - - if (tempObj->Get(NodeProxy::configurable)->BooleanValue()) { - if (!handler->Set(name->ToString(), props->Get(name->ToString()))) { - return THREXCW(String::Concat(String::New("Unable to define property: "), name->ToString())); + for (;i < l; ++i) { + + name = names->CloneElementAt(i); + + if (handler->Has(name->ToString()) && handler->Get(name->ToString())->IsObject()) { + Local tempObj = handler->Get(name->ToString())->ToObject(); + + if (tempObj->Get(NodeProxy::configurable)->BooleanValue()) { + + if (!handler->Set(name->ToString(), props->Get(name->ToString()))) { + return THREXCW(String::Concat(String::New("Unable to define property: "), name->ToString())); + } } - } - } else { - return THREXCW(String::Concat(String::New("Unable to define property: "), name->ToString())); + } else { + return THREXCW(String::Concat(String::New("Unable to define property: "), name->ToString())); + } } + + return True(); } - return True(); - } - - Local def = Local::Cast(handler->Get(NodeProxy::defineProperty)); - - for (;i < l; ++i) { - name = names->CloneElementAt(i); - if (extensible || obj->Has(name->ToString())) { - Local argv[2] = {name, props->Get(name->ToString())}; + Local def = Local::Cast(handler->Get(NodeProxy::defineProperty)); + + for (;i < l; ++i) { + name = names->CloneElementAt(i); - def->Call(obj, 2, argv); + if (extensible || obj->Has(name->ToString())) { + Local argv[2] = {name, props->Get(name->ToString())}; + + def->Call(obj, 2, argv); + } } + + return True(); } - return True(); + return False(); } /** @@ -836,14 +868,19 @@ Handle NodeProxy::DefineProperties(const Arguments& args) { */ Handle NodeProxy::New(const Arguments& args) { HandleScope scope; - Local fn; + + if (args.This()->InternalFieldCount() < 1) { + return THR_TYPE_ERROR("defineProperty expects first argument to be intialized by Proxy"); + } + Local info, ret, - data = args.This()->GetHiddenValue(NodeProxy::hiddenPrivate); + data = args.This()->GetInternalField(0); if (data.IsEmpty() || !data->IsObject()) { return THREXC("Invalid reference to Proxy#constructor"); } + Local fn; Local obj = data->ToObject(); if (args.IsConstructCall()) { @@ -874,9 +911,9 @@ Handle NodeProxy::New(const Arguments& args) { } return args.This(); - } else { - return ret; } + + return ret; } /** @@ -887,102 +924,107 @@ Handle NodeProxy::New(const Arguments& args) { */ Handle NodeProxy::GetNamedProperty(Local name, const AccessorInfo &info) { HandleScope scope; - Local fn; + + if (info.This()->InternalFieldCount() < 1) { + return THR_TYPE_ERROR("SetNamedProperty intercepted by non-Proxy object"); + } + Local argv[2] = {info.This(), name}, argv1[1] = {name}, temp, ret, undef, - data = info.This()->GetHiddenValue(NodeProxy::hiddenPrivate); - - if (data.IsEmpty() || !data->IsObject()) { - return undef; - } - - Local obj = data->ToObject(); + data = info.This()->GetInternalField(0); - //if the Proxy isn't trapping, return the value set on the property descriptor - if (!obj->GetHiddenValue(NodeProxy::trapping)->BooleanValue()) { - if (obj->Has(name)) { - temp = obj->Get(name); + if (!data.IsEmpty() && data->IsObject()) { + Local fn; + Local obj = data->ToObject(); + + //if the Proxy isn't trapping, return the value set on the property descriptor + if (!obj->GetHiddenValue(NodeProxy::trapping)->BooleanValue()) { + if (obj->Has(name)) { + temp = obj->Get(name); - if (temp.IsEmpty() || !temp->IsObject()) { - return undef; - } + if (temp.IsEmpty() || !temp->IsObject()) { + return undef; + } - Local tempObj = temp->ToObject(); + Local tempObj = temp->ToObject(); - if (tempObj->Has(NodeProxy::get) && tempObj->Get(NodeProxy::get)->IsFunction()) { - return Local::Cast(tempObj->Get(NodeProxy::get))->Call(info.This(), 2, argv); - } + if (tempObj->Has(NodeProxy::get) && tempObj->Get(NodeProxy::get)->IsFunction()) { + return Local::Cast(tempObj->Get(NodeProxy::get))->Call(info.This(), 2, argv); + } - return tempObj->Get(NodeProxy::value); + return tempObj->Get(NodeProxy::value); + } + + return undef; } - return undef; - } - - if (obj->Has(NodeProxy::get)) { - temp = obj->Get(NodeProxy::get); - - if (!temp.IsEmpty() && temp->IsFunction()) { - fn = Local::Cast(temp); - - ret = fn->Call(info.This(), 2, argv); + if (obj->Has(NodeProxy::get)) { + temp = obj->Get(NodeProxy::get); - if (ret.IsEmpty() || ret->IsUndefined()) { - return undef; + if (!temp.IsEmpty() && temp->IsFunction()) { + fn = Local::Cast(temp); + + ret = fn->Call(info.This(), 2, argv); + + if (ret.IsEmpty() || ret->IsUndefined()) { + return undef; + } + + return ret; } - - return ret; } - } - - if (obj->Has(NodeProxy::getOwnPropertyDescriptor)) { - - temp = obj->Get(NodeProxy::getOwnPropertyDescriptor); - fn = Local::Cast(temp); + if (obj->Has(NodeProxy::getOwnPropertyDescriptor)) { - Local desc = fn->Call(info.This(), 1, argv1); - - if (!desc.IsEmpty() && desc->IsObject()) { - Local prop = desc->ToObject(); + temp = obj->Get(NodeProxy::getOwnPropertyDescriptor); - if (prop->Has(NodeProxy::get) && prop->Get(NodeProxy::get)->IsFunction()) { - temp = prop->Get(NodeProxy::get); - - fn = Local::Cast(temp); + fn = Local::Cast(temp); - return fn->Call(info.This(), 1, argv1); + Local desc = fn->Call(info.This(), 1, argv1); - } else if (prop->Has(NodeProxy::value)) { - return prop->Get(NodeProxy::value); + if (!desc.IsEmpty() && desc->IsObject()) { + Local prop = desc->ToObject(); + + if (prop->Has(NodeProxy::get) && prop->Get(NodeProxy::get)->IsFunction()) { + temp = prop->Get(NodeProxy::get); + + fn = Local::Cast(temp); + + return fn->Call(info.This(), 1, argv1); + + } else if (prop->Has(NodeProxy::value)) { + return prop->Get(NodeProxy::value); + } } } - } - - if (obj->Has(NodeProxy::getPropertyDescriptor)) { - - temp = obj->Get(NodeProxy::getPropertyDescriptor); - - fn = Local::Cast(temp); - Local desc = fn->Call(info.This(), 1, argv1); + if (obj->Has(NodeProxy::getPropertyDescriptor)) { - if (!desc.IsEmpty() && desc->IsObject()) { - Local prop = desc->ToObject(); + temp = obj->Get(NodeProxy::getPropertyDescriptor); - if (prop->Has(NodeProxy::get) && prop->Get(NodeProxy::get)->IsFunction()) { - temp = prop->Get(NodeProxy::get); - - fn = Local::Cast(temp); + fn = Local::Cast(temp); - return fn->Call(info.This(), 1, argv1); + Local desc = fn->Call(info.This(), 1, argv1); - } else if (prop->Has(NodeProxy::value)) { - return prop->Get(NodeProxy::value); + if (!desc.IsEmpty() && desc->IsObject()) { + Local prop = desc->ToObject(); + + if (prop->Has(NodeProxy::get) && prop->Get(NodeProxy::get)->IsFunction()) { + temp = prop->Get(NodeProxy::get); + + fn = Local::Cast(temp); + + return fn->Call(info.This(), 1, argv1); + + } else if (prop->Has(NodeProxy::value)) { + return prop->Get(NodeProxy::value); + } } } } + + return undef; } @@ -995,130 +1037,130 @@ Handle NodeProxy::GetNamedProperty(Local name, const AccessorInfo */ Handle NodeProxy::SetNamedProperty(Local name, Local value, const AccessorInfo &info) { HandleScope scope; + + if (info.This()->InternalFieldCount() < 1) { + return THR_TYPE_ERROR("SetNamedProperty intercepted by non-Proxy object"); + } + Local fn; Local argv2[2] = {name, value}, undef, temp, - data = info.This()->GetHiddenValue(NodeProxy::hiddenPrivate); - - if (data.IsEmpty() || !data->IsObject()) { - return undef; - //return THREXC("Invalid reference to NodeProxy::GetNamedProperty"); - } + data = info.This()->GetInternalField(0); - Local obj = data->ToObject(); + if (!data.IsEmpty() && data->IsObject()) { + Local obj = data->ToObject(); - //if the Proxy isn't trapping, return the value set on the property descriptor - if (!obj->GetHiddenValue(NodeProxy::trapping)->BooleanValue()) { - if (obj->GetHiddenValue(NodeProxy::extensible)->BooleanValue() || obj->Has(name)) { - temp = obj->Get(name); + //if the Proxy isn't trapping, return the value set on the property descriptor + if (!obj->GetHiddenValue(NodeProxy::trapping)->BooleanValue()) { + if (obj->GetHiddenValue(NodeProxy::extensible)->BooleanValue() || obj->Has(name)) { + temp = obj->Get(name); - if (temp.IsEmpty() || !temp->IsObject()) { - return undef; - } + if (temp.IsEmpty() || !temp->IsObject()) { + return undef; + } - Local tempObj = temp->ToObject(); + Local tempObj = temp->ToObject(); - if (!tempObj->GetHiddenValue(NodeProxy::writable)->BooleanValue()) { - return THREXCW(String::Concat(String::New("In accessible property: "), name)); - } + if (!tempObj->GetHiddenValue(NodeProxy::writable)->BooleanValue()) { + return THREXCW(String::Concat(String::New("In accessible property: "), name)); + } - if (tempObj->Has(NodeProxy::set) && tempObj->Get(NodeProxy::set)->IsFunction()) { - Local::Cast(tempObj->Get(NodeProxy::set))->Call(info.This(), 2, argv2); - return value; - } + if (tempObj->Has(NodeProxy::set) && tempObj->Get(NodeProxy::set)->IsFunction()) { + Local::Cast(tempObj->Get(NodeProxy::set))->Call(info.This(), 2, argv2); + return value; + } - if (tempObj->Set(NodeProxy::value, value)) { - return value; - } + if (tempObj->Set(NodeProxy::value, value)) { + return value; + } + return undef; + } + return undef; - //return Undefined(); } - return undef; - } - - //does the ProxyHandler have a set method? - if (obj->Has(NodeProxy::set)) { - temp = obj->Get(NodeProxy::set); - - if (!temp.IsEmpty() && temp->IsFunction()) { - fn = Local::Cast(temp); - - Local argv3[3] = {info.This(), name, value}; + //does the ProxyHandler have a set method? + if (obj->Has(NodeProxy::set)) { + temp = obj->Get(NodeProxy::set); - fn->Call(info.This(), 3, argv3); + if (!temp.IsEmpty() && temp->IsFunction()) { + fn = Local::Cast(temp); - return value; + Local argv3[3] = {info.This(), name, value}; + + fn->Call(info.This(), 3, argv3); + + return value; + } } - } - - if (obj->Has(NodeProxy::getOwnPropertyDescriptor)) { - - temp = obj->Get(NodeProxy::getOwnPropertyDescriptor); - - fn = Local::Cast(temp); + + if (obj->Has(NodeProxy::getOwnPropertyDescriptor)) { + + temp = obj->Get(NodeProxy::getOwnPropertyDescriptor); + + fn = Local::Cast(temp); - Local argv[1] = {name}; - - Local desc = fn->Call(info.This(), 1, argv); - - if (!desc.IsEmpty() && desc->IsObject()) { - Local prop = desc->ToObject(); + Local argv[1] = {name}; - //if the PropertyDescriptor has a set method - if (prop->Has(NodeProxy::set) && prop->Get(NodeProxy::set)->IsFunction()) { - temp = prop->Get(NodeProxy::set); - - fn = Local::Cast(temp); - - fn->Call(info.This(), 2, argv2); - - return value; + Local desc = fn->Call(info.This(), 1, argv); + + if (!desc.IsEmpty() && desc->IsObject()) { + Local prop = desc->ToObject(); - //otherwise change value if writable - } else if (prop->Has(NodeProxy::writable) && prop->Get(NodeProxy::writable)->BooleanValue()) { - if (prop->Set(NodeProxy::value, value)) { + //if the PropertyDescriptor has a set method + if (prop->Has(NodeProxy::set) && prop->Get(NodeProxy::set)->IsFunction()) { + temp = prop->Get(NodeProxy::set); + + fn = Local::Cast(temp); + + fn->Call(info.This(), 2, argv2); + return value; + + //otherwise change value if writable + } else if (prop->Has(NodeProxy::writable) && prop->Get(NodeProxy::writable)->BooleanValue()) { + if (prop->Set(NodeProxy::value, value)) { + return value; + } } } } - } - - if (obj->Has(NodeProxy::getPropertyDescriptor)) { - - temp = obj->Get(NodeProxy::getPropertyDescriptor); - - fn = Local::Cast(temp); + + if (obj->Has(NodeProxy::getPropertyDescriptor)) { + + temp = obj->Get(NodeProxy::getPropertyDescriptor); + + fn = Local::Cast(temp); - Local argv[1] = {name}; - - Local desc = fn->Call(info.This(), 1, argv); - - if (!desc.IsEmpty() && desc->IsObject()) { - Local prop = desc->ToObject(); + Local argv[1] = {name}; - //if the PropertyDescriptor has a set method - if (prop->Has(NodeProxy::set) && prop->Get(NodeProxy::set)->IsFunction()) { - temp = prop->Get(NodeProxy::set); - - fn = Local::Cast(temp); - - fn->Call(info.This(), 2, argv2); - - return value; + Local desc = fn->Call(info.This(), 1, argv); + + if (!desc.IsEmpty() && desc->IsObject()) { + Local prop = desc->ToObject(); - //otherwise change value if writable - } else if (prop->Has(NodeProxy::writable) && prop->Get(NodeProxy::writable)->BooleanValue()) { - if (prop->Set(NodeProxy::value, value)) { + //if the PropertyDescriptor has a set method + if (prop->Has(NodeProxy::set) && prop->Get(NodeProxy::set)->IsFunction()) { + temp = prop->Get(NodeProxy::set); + + fn = Local::Cast(temp); + + fn->Call(info.This(), 2, argv2); + return value; + + //otherwise change value if writable + } else if (prop->Has(NodeProxy::writable) && prop->Get(NodeProxy::writable)->BooleanValue()) { + if (prop->Set(NodeProxy::value, value)) { + return value; + } } } } } return undef; - //return Undefined(); } /** @@ -1129,74 +1171,75 @@ Handle NodeProxy::SetNamedProperty(Local name, Local value */ Handle NodeProxy::QueryNamedProperty(Local name, const AccessorInfo &info) { HandleScope scope; - Local argv[1] = {name}, temp, data = info.This()->GetHiddenValue(NodeProxy::hiddenPrivate); - Local fn; - if (data.IsEmpty() || !data->IsObject()) { - return False(); - } - - Local obj = data->ToObject(); + if (info.This()->InternalFieldCount() < 1) { + Local argv[1] = {name}, temp, data = info.This()->GetInternalField(0); + Local fn; + + if (!data.IsEmpty() && data->IsObject()) { + Local obj = data->ToObject(); - //if the Proxy isn't trapping, return the value set on the property descriptor - if (!obj->GetHiddenValue(NodeProxy::trapping)->BooleanValue()) { - return Boolean::New(obj->Has(name)); - } + //if the Proxy isn't trapping, return the value set on the property descriptor + if (!obj->GetHiddenValue(NodeProxy::trapping)->BooleanValue()) { + return Boolean::New(obj->Has(name)); + } - if (obj->Has(NodeProxy::getOwnPropertyDescriptor)) { - temp = obj->Get(NodeProxy::getOwnPropertyDescriptor); - - if (!temp.IsEmpty() && temp->IsFunction()) { - fn = Local::Cast(temp); - - temp = fn->Call(info.This(), 1, argv); - - if (temp->IsBoolean()) { - return temp->ToBoolean(); + if (obj->Has(NodeProxy::getOwnPropertyDescriptor)) { + temp = obj->Get(NodeProxy::getOwnPropertyDescriptor); + + if (!temp.IsEmpty() && temp->IsFunction()) { + fn = Local::Cast(temp); + + temp = fn->Call(info.This(), 1, argv); + + if (temp->IsBoolean()) { + return temp->ToBoolean(); + } + } } - } - } - if (obj->Has(NodeProxy::getPropertyDescriptor)) { - temp = obj->Get(NodeProxy::getPropertyDescriptor); - - if (!temp.IsEmpty() && temp->IsFunction()) { - fn = Local::Cast(temp); - - temp = fn->Call(info.This(), 1, argv); - - if (temp->IsBoolean()) { - return temp->ToBoolean(); + if (obj->Has(NodeProxy::getPropertyDescriptor)) { + temp = obj->Get(NodeProxy::getPropertyDescriptor); + + if (!temp.IsEmpty() && temp->IsFunction()) { + fn = Local::Cast(temp); + + temp = fn->Call(info.This(), 1, argv); + + if (temp->IsBoolean()) { + return temp->ToBoolean(); + } + } } - } - } - - //check the ProxyHandler for the has method - if (obj->Has(NodeProxy::hasOwn)) { - temp = obj->Get(NodeProxy::hasOwn); - - if (!temp.IsEmpty() && temp->IsFunction()) { - fn = Local::Cast(temp); - - temp = fn->Call(info.This(), 1, argv); - if (temp->IsBoolean()) { - return temp->ToBoolean(); + //check the ProxyHandler for the has method + if (obj->Has(NodeProxy::hasOwn)) { + temp = obj->Get(NodeProxy::hasOwn); + + if (!temp.IsEmpty() && temp->IsFunction()) { + fn = Local::Cast(temp); + + temp = fn->Call(info.This(), 1, argv); + + if (temp->IsBoolean()) { + return temp->ToBoolean(); + } + } } - } - } - - //check the ProxyHandler for the has method - if (obj->Has(NodeProxy::has)) { - temp = obj->Get(NodeProxy::has); - - if (!temp.IsEmpty() && temp->IsFunction()) { - fn = Local::Cast(temp); - - temp = fn->Call(info.This(), 1, argv); - if (temp->IsBoolean()) { - return temp->ToBoolean(); + //check the ProxyHandler for the has method + if (obj->Has(NodeProxy::has)) { + temp = obj->Get(NodeProxy::has); + + if (!temp.IsEmpty() && temp->IsFunction()) { + fn = Local::Cast(temp); + + temp = fn->Call(info.This(), 1, argv); + + if (temp->IsBoolean()) { + return temp->ToBoolean(); + } + } } } } @@ -1212,85 +1255,91 @@ Handle NodeProxy::QueryNamedProperty(Local name, const Accessor */ Handle NodeProxy::QueryNamedPropertyInteger(Local name, const AccessorInfo &info) { HandleScope scope; - Local temp, data = info.This()->GetHiddenValue(NodeProxy::hiddenPrivate); - Local fn; Local DoesntHavePropertyResponse, HasPropertyResponse = Integer::New(None); + + if (info.This()->InternalFieldCount() > 0) { + Local temp, data = info.This()->GetInternalField(0); + Local fn; - if (data.IsEmpty() || !data->IsObject()) { - return DoesntHavePropertyResponse; - } + if (!data.IsEmpty() && data->IsObject()) { + Local obj = data->ToObject(); - Local obj = data->ToObject(); + //if the Proxy isn't trapping, return the value set on the property descriptor + if (!obj->GetHiddenValue(NodeProxy::trapping)->BooleanValue()) { + + if(obj->Has(name)) { + + Local pd = obj->Get(name); + + if (pd->IsObject()) { + return GetPropertyAttributeFromPropertyDescriptor(pd->ToObject()); + } - //if the Proxy isn't trapping, return the value set on the property descriptor - if (!obj->GetHiddenValue(NodeProxy::trapping)->BooleanValue()) { - if(obj->Has(name)) { - Local pd = obj->Get(name); - if (pd->IsObject()) { - return GetPropertyAttributeFromPropertyDescriptor(pd->ToObject()); + return HasPropertyResponse; + } + + return DoesntHavePropertyResponse; } - return HasPropertyResponse; - } - - return DoesntHavePropertyResponse; - } - Local argv[1] = {name}; + Local argv[1] = {name}; - if (obj->Has(NodeProxy::getOwnPropertyDescriptor)) { - temp = obj->Get(NodeProxy::getOwnPropertyDescriptor); + if (obj->Has(NodeProxy::getOwnPropertyDescriptor)) { + temp = obj->Get(NodeProxy::getOwnPropertyDescriptor); - if (!temp.IsEmpty() && temp->IsFunction()) { - fn = Local::Cast(temp); + if (!temp.IsEmpty() && temp->IsFunction()) { + fn = Local::Cast(temp); - temp = fn->Call(info.This(), 1, argv); + temp = fn->Call(info.This(), 1, argv); - if (!temp.IsEmpty() && temp->IsObject()) { - return GetPropertyAttributeFromPropertyDescriptor(temp->ToObject()); + if (!temp.IsEmpty() && temp->IsObject()) { + return GetPropertyAttributeFromPropertyDescriptor(temp->ToObject()); + } + } } - } - } - - if (obj->Has(NodeProxy::getPropertyDescriptor)) { - temp = obj->Get(NodeProxy::getPropertyDescriptor); + + if (obj->Has(NodeProxy::getPropertyDescriptor)) { + temp = obj->Get(NodeProxy::getPropertyDescriptor); - if (!temp.IsEmpty() && temp->IsFunction()) { - fn = Local::Cast(temp); + if (!temp.IsEmpty() && temp->IsFunction()) { + fn = Local::Cast(temp); - temp = fn->Call(info.This(), 1, argv); + temp = fn->Call(info.This(), 1, argv); - if (!temp.IsEmpty() && temp->IsObject()) { - return GetPropertyAttributeFromPropertyDescriptor(temp->ToObject()); - } else if (temp->IsUndefined()) { - return DoesntHavePropertyResponse; + if (!temp.IsEmpty() && temp->IsObject()) { + return GetPropertyAttributeFromPropertyDescriptor(temp->ToObject()); + + } else if (temp->IsUndefined()) { + return DoesntHavePropertyResponse; + } + } } - } - } - if (obj->Has(NodeProxy::hasOwn)) { - temp = obj->Get(NodeProxy::hasOwn); + if (obj->Has(NodeProxy::hasOwn)) { + temp = obj->Get(NodeProxy::hasOwn); - if (!temp.IsEmpty() && temp->IsFunction()) { - fn = Local::Cast(temp); + if (!temp.IsEmpty() && temp->IsFunction()) { + fn = Local::Cast(temp); - temp = fn->Call(info.This(), 1, argv); + temp = fn->Call(info.This(), 1, argv); - if (temp->IsBoolean()) { - return HasPropertyResponse; + if (temp->IsBoolean()) { + return HasPropertyResponse; + } + } } - } - } - - if (obj->Has(NodeProxy::has)) { - temp = obj->Get(NodeProxy::has); + + if (obj->Has(NodeProxy::has)) { + temp = obj->Get(NodeProxy::has); - if (!temp.IsEmpty() && temp->IsFunction()) { - fn = Local::Cast(temp); + if (!temp.IsEmpty() && temp->IsFunction()) { + fn = Local::Cast(temp); - temp = fn->Call(info.This(), 1, argv); + temp = fn->Call(info.This(), 1, argv); - if (temp->IsBoolean()) { - return HasPropertyResponse; + if (temp->IsBoolean()) { + return HasPropertyResponse; + } + } } } } @@ -1304,6 +1353,8 @@ Handle NodeProxy::QueryNamedPropertyInteger(Local name, const A * */ Handle NodeProxy::GetPropertyAttributeFromPropertyDescriptor(Local pd) { + HandleScope scope; + if (pd->Has(NodeProxy::configurable) && !pd->Get(NodeProxy::configurable)->BooleanValue()){ return Integer::New(DontDelete); @@ -1325,46 +1376,46 @@ Handle NodeProxy::GetPropertyAttributeFromPropertyDescriptor(Local NodeProxy::DeleteNamedProperty(Local name, const AccessorInfo &info) { HandleScope scope; - Local temp, data = info.This()->GetHiddenValue(NodeProxy::hiddenPrivate); - if (data.IsEmpty() || !data->IsObject()) { - return False(); - } - - Local obj = data->ToObject(); + if (info.This()->InternalFieldCount() > 0) { + Local temp, data = info.This()->GetInternalField(0); - //if the Proxy isn't trapping, return the value set on the property descriptor - if (!obj->GetHiddenValue(NodeProxy::trapping)->BooleanValue()) { - if (obj->GetHiddenValue(NodeProxy::frozen)->BooleanValue()) { - return False(); - } - - if (obj->Has(name)) { - temp = obj->Get(name); - if (temp->IsObject()) { - Local tempObj = temp->ToObject(); + if (!data.IsEmpty() && data->IsObject()) { + Local obj = data->ToObject(); + + //if the Proxy isn't trapping, return the value set on the property descriptor + if (!obj->GetHiddenValue(NodeProxy::trapping)->BooleanValue()) { + + if (!obj->GetHiddenValue(NodeProxy::frozen)->BooleanValue()) { + if (obj->Has(name)) { + temp = obj->Get(name); + if (temp->IsObject()) { + Local tempObj = temp->ToObject(); + + if (tempObj->Has(NodeProxy::configurable) && tempObj->Get(NodeProxy::configurable)->BooleanValue()) { + return Boolean::New(obj->Delete(name)); + } + } + } + } - if (tempObj->Has(NodeProxy::configurable) && tempObj->Get(NodeProxy::configurable)->BooleanValue()) { - return Boolean::New(obj->Delete(name)); + return False(); + } + + if (obj->Has(NodeProxy::delete_)) { + temp = obj->Get(NodeProxy::delete_); + + if (!temp.IsEmpty() && temp->IsFunction()) { + Local fn = Local::Cast(temp); + Local argv[1] = {name}; + + return fn->Call(info.This(), 1, argv)->ToBoolean(); } } } - - return False(); } + - if (obj->Has(NodeProxy::delete_)) { - temp = obj->Get(NodeProxy::delete_); - - if (temp.IsEmpty() || !temp->IsFunction()) { - return False(); - } - - Local fn = Local::Cast(temp); - Local argv[1] = {name}; - - return fn->Call(info.This(), 1, argv)->ToBoolean(); - } return False(); } @@ -1375,32 +1426,33 @@ Handle NodeProxy::DeleteNamedProperty(Local name, const Accesso * * */ -Handle NodeProxy::EnumerateNamedProperties(const AccessorInfo &info) { +Handle NodeProxy::EnumerateNamedProperties(const AccessorInfo &info) { HandleScope scope; - Local data = info.This()->GetHiddenValue(NodeProxy::hiddenPrivate); - - if (data.IsEmpty() || !data->IsObject()) { - return Array::New(); - } - Local obj = data->ToObject(); - - //if the Proxy isn't trapping, return the value set on the property descriptor - if (!obj->GetHiddenValue(NodeProxy::trapping)->BooleanValue()) { - return obj->GetPropertyNames(); - } + if (info.This()->InternalFieldCount() > 0) { + Local data = info.This()->GetInternalField(0); - if (obj->Has(NodeProxy::enumerate)) { - Local temp = obj->Get(NodeProxy::enumerate); + if (!data.IsEmpty() && data->IsObject()) { + Local obj = data->ToObject(); - if (!temp.IsEmpty() && temp->IsFunction()) { - Local fn = Local::Cast(temp); - - Local argv[0]; - temp = fn->Call(info.This(), 0, argv); + //if the Proxy isn't trapping, return the value set on the property descriptor + if (!obj->GetHiddenValue(NodeProxy::trapping)->BooleanValue()) { + return obj->GetPropertyNames(); + } - if (temp->IsArray()) { - return Local::Cast(temp->ToObject()); + if (obj->Has(NodeProxy::enumerate)) { + Local temp = obj->Get(NodeProxy::enumerate); + + if (!temp.IsEmpty() && temp->IsFunction()) { + Local fn = Local::Cast(temp); + + Local argv[0]; + temp = fn->Call(info.This(), 0, argv); + + if (temp->IsArray()) { + return Local::Cast(temp->ToObject()); + } + } } } } @@ -1456,7 +1508,7 @@ Handle NodeProxy::QueryIndexedPropertyInteger(uint32_t index, const Acc * * */ -Handle NodeProxy::DeleteIndexedProperty(uint32_t index, const AccessorInfo &info) { +Handle NodeProxy::DeleteIndexedProperty(uint32_t index, const AccessorInfo &info) { HandleScope scope; return DeleteNamedProperty(Local::Cast(Integer::NewFromUnsigned(index)), info);