summaryrefslogtreecommitdiff
path: root/src/node_util.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/node_util.cc')
-rw-r--r--src/node_util.cc38
1 files changed, 29 insertions, 9 deletions
diff --git a/src/node_util.cc b/src/node_util.cc
index 9fc94acf09..5089188d50 100644
--- a/src/node_util.cc
+++ b/src/node_util.cc
@@ -9,11 +9,11 @@ namespace util {
using v8::Array;
using v8::Context;
using v8::FunctionCallbackInfo;
+using v8::Integer;
using v8::Local;
using v8::Object;
using v8::Private;
using v8::Proxy;
-using v8::String;
using v8::Value;
@@ -53,18 +53,28 @@ static void GetProxyDetails(const FunctionCallbackInfo<Value>& args) {
args.GetReturnValue().Set(ret);
}
+inline Local<Private> IndexToPrivateSymbol(Environment* env, uint32_t index) {
+#define V(name, _) &Environment::name,
+ static Local<Private> (Environment::*const methods[])() const = {
+ PER_ISOLATE_PRIVATE_SYMBOL_PROPERTIES(V)
+ };
+#undef V
+ CHECK_LT(index, arraysize(methods));
+ return (env->*methods[index])();
+}
+
static void GetHiddenValue(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
if (!args[0]->IsObject())
return env->ThrowTypeError("obj must be an object");
- if (!args[1]->IsString())
- return env->ThrowTypeError("name must be a string");
+ if (!args[1]->IsUint32())
+ return env->ThrowTypeError("index must be an uint32");
Local<Object> obj = args[0].As<Object>();
- Local<String> name = args[1].As<String>();
- auto private_symbol = Private::ForApi(env->isolate(), name);
+ auto index = args[1]->Uint32Value(env->context()).FromJust();
+ auto private_symbol = IndexToPrivateSymbol(env, index);
auto maybe_value = obj->GetPrivate(env->context(), private_symbol);
args.GetReturnValue().Set(maybe_value.ToLocalChecked());
@@ -76,12 +86,12 @@ static void SetHiddenValue(const FunctionCallbackInfo<Value>& args) {
if (!args[0]->IsObject())
return env->ThrowTypeError("obj must be an object");
- if (!args[1]->IsString())
- return env->ThrowTypeError("name must be a string");
+ if (!args[1]->IsUint32())
+ return env->ThrowTypeError("index must be an uint32");
Local<Object> obj = args[0].As<Object>();
- Local<String> name = args[1].As<String>();
- auto private_symbol = Private::ForApi(env->isolate(), name);
+ auto index = args[1]->Uint32Value(env->context()).FromJust();
+ auto private_symbol = IndexToPrivateSymbol(env, index);
auto maybe_value = obj->SetPrivate(env->context(), private_symbol, args[2]);
args.GetReturnValue().Set(maybe_value.FromJust());
@@ -97,6 +107,16 @@ void Initialize(Local<Object> target,
VALUE_METHOD_MAP(V)
#undef V
+#define V(name, _) \
+ target->Set(context, \
+ FIXED_ONE_BYTE_STRING(env->isolate(), #name), \
+ Integer::NewFromUnsigned(env->isolate(), index++));
+ {
+ uint32_t index = 0;
+ PER_ISOLATE_PRIVATE_SYMBOL_PROPERTIES(V)
+ }
+#undef V
+
env->SetMethod(target, "getHiddenValue", GetHiddenValue);
env->SetMethod(target, "setHiddenValue", SetHiddenValue);
env->SetMethod(target, "getProxyDetails", GetProxyDetails);