Browse Source

src: replace SetNamedPropertyHandler()

The changes introdcued here replace the deprecated
v8 method SetNamedPropertyHandler() to SetHandler()
in node.cc.
Prior to refactoring, the method defined callbacks
when accessing object properties defined by Strings
and not Symbols.
test/parallel/test-v8-interceptStrings-not-Symbols.js
demonstrates that this behaviour remained unchanged
after refactoring.

PR-URL: https://github.com/nodejs/node/pull/9062
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Franziska Hinkelmann <franziska.hinkelmann@gmail.com>
v6
AnnaMag 8 years ago
committed by Franziska Hinkelmann
parent
commit
ab194123b7
  1. 17
      src/node.cc
  2. 34
      test/parallel/test-v8-interceptStrings-not-Symbols.js

17
src/node.cc

@ -114,6 +114,7 @@ using v8::Locker;
using v8::MaybeLocal; using v8::MaybeLocal;
using v8::Message; using v8::Message;
using v8::Name; using v8::Name;
using v8::NamedPropertyHandlerConfiguration;
using v8::Null; using v8::Null;
using v8::Number; using v8::Number;
using v8::Object; using v8::Object;
@ -121,6 +122,7 @@ using v8::ObjectTemplate;
using v8::Promise; using v8::Promise;
using v8::PromiseRejectMessage; using v8::PromiseRejectMessage;
using v8::PropertyCallbackInfo; using v8::PropertyCallbackInfo;
using v8::PropertyHandlerFlags;
using v8::ScriptOrigin; using v8::ScriptOrigin;
using v8::SealHandleScope; using v8::SealHandleScope;
using v8::String; using v8::String;
@ -2673,7 +2675,7 @@ static void ProcessTitleSetter(Local<Name> property,
} }
static void EnvGetter(Local<String> property, static void EnvGetter(Local<Name> property,
const PropertyCallbackInfo<Value>& info) { const PropertyCallbackInfo<Value>& info) {
Isolate* isolate = info.GetIsolate(); Isolate* isolate = info.GetIsolate();
#ifdef __POSIX__ #ifdef __POSIX__
@ -2701,7 +2703,7 @@ static void EnvGetter(Local<String> property,
} }
static void EnvSetter(Local<String> property, static void EnvSetter(Local<Name> property,
Local<Value> value, Local<Value> value,
const PropertyCallbackInfo<Value>& info) { const PropertyCallbackInfo<Value>& info) {
#ifdef __POSIX__ #ifdef __POSIX__
@ -2722,7 +2724,7 @@ static void EnvSetter(Local<String> property,
} }
static void EnvQuery(Local<String> property, static void EnvQuery(Local<Name> property,
const PropertyCallbackInfo<Integer>& info) { const PropertyCallbackInfo<Integer>& info) {
int32_t rc = -1; // Not found unless proven otherwise. int32_t rc = -1; // Not found unless proven otherwise.
#ifdef __POSIX__ #ifdef __POSIX__
@ -2748,7 +2750,7 @@ static void EnvQuery(Local<String> property,
} }
static void EnvDeleter(Local<String> property, static void EnvDeleter(Local<Name> property,
const PropertyCallbackInfo<Boolean>& info) { const PropertyCallbackInfo<Boolean>& info) {
#ifdef __POSIX__ #ifdef __POSIX__
node::Utf8Value key(info.GetIsolate(), property); node::Utf8Value key(info.GetIsolate(), property);
@ -3147,12 +3149,15 @@ void SetupProcessObject(Environment* env,
// create process.env // create process.env
Local<ObjectTemplate> process_env_template = Local<ObjectTemplate> process_env_template =
ObjectTemplate::New(env->isolate()); ObjectTemplate::New(env->isolate());
process_env_template->SetNamedPropertyHandler(EnvGetter, process_env_template->SetHandler(NamedPropertyHandlerConfiguration(
EnvGetter,
EnvSetter, EnvSetter,
EnvQuery, EnvQuery,
EnvDeleter, EnvDeleter,
EnvEnumerator, EnvEnumerator,
env->as_external()); env->as_external(),
PropertyHandlerFlags::kOnlyInterceptStrings));
Local<Object> process_env = Local<Object> process_env =
process_env_template->NewInstance(env->context()).ToLocalChecked(); process_env_template->NewInstance(env->context()).ToLocalChecked();
process->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "env"), process_env); process->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "env"), process_env);

34
test/parallel/test-v8-interceptStrings-not-Symbols.js

@ -0,0 +1,34 @@
'use strict';
require('../common');
const assert = require('assert');
// Test that the v8 named property handler intercepts callbacks
// when properties are defined as Strings and NOT for Symbols.
//
// With the kOnlyInterceptStrings flag, manipulating properties via
// Strings is intercepted by the callbacks, while Symbols adopt
// the default global behaviour.
// Removing the kOnlyInterceptStrings flag, adds intercepting to Symbols,
// which causes Type Error at process.env[symbol]=42 due to process.env being
// strongly typed for Strings
// (node::Utf8Value key(info.GetIsolate(), property);).
const symbol = Symbol('sym');
// check if its undefined
assert.strictEqual(process.env[symbol], undefined);
// set a value using a Symbol
process.env[symbol] = 42;
// set a value using a String (call to EnvSetter, node.cc)
process.env['s'] = 42;
//check the values after substitutions
assert.strictEqual(42, process.env[symbol]);
assert.strictEqual('42', process.env['s']);
delete process.env[symbol];
assert.strictEqual(undefined, process.env[symbol]);
Loading…
Cancel
Save