Skip to content

Commit

Permalink
test: verify performance.timerify() works w/ non-Node Contexts
Browse files Browse the repository at this point in the history
PR-URL: #23784
Reviewed-By: Refael Ackermann <refack@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information
addaleax authored and MylesBorins committed Nov 26, 2018
1 parent 28ee410 commit f30f11b
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/node_perf.cc
Expand Up @@ -310,7 +310,7 @@ void TimerFunctionCall(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
HandleScope scope(isolate);
Environment* env = Environment::GetCurrent(isolate);
CHECK_NOT_NULL(env); // TODO(addaleax): Verify that this is correct.
CHECK_NOT_NULL(env);
Local<Context> context = env->context();
Local<Function> fn = args.Data().As<Function>();
size_t count = args.Length();
Expand Down
55 changes: 55 additions & 0 deletions test/addons/non-node-context/binding.cc
@@ -0,0 +1,55 @@
#include <node.h>
#include <assert.h>

namespace {

using v8::Context;
using v8::Function;
using v8::FunctionTemplate;
using v8::Isolate;
using v8::Local;
using v8::MaybeLocal;
using v8::NewStringType;
using v8::Object;
using v8::Script;
using v8::String;
using v8::Value;

inline void RunInNewContext(
const v8::FunctionCallbackInfo<v8::Value>& args) {
Isolate* isolate = args.GetIsolate();
Local<Context> context = Context::New(isolate);
Context::Scope context_scope(context);

context->Global()->Set(
context,
String::NewFromUtf8(isolate, "data", NewStringType::kNormal)
.ToLocalChecked(),
args[1]).FromJust();

assert(args[0]->IsString()); // source code
Local<Script> script;
Local<Value> ret;
if (!Script::Compile(context, args[0].As<String>()).ToLocal(&script) ||
!script->Run(context).ToLocal(&ret)) {
return;
}

args.GetReturnValue().Set(ret);
}

inline void Initialize(Local<Object> exports,
Local<Value> module,
Local<Context> context) {
Isolate* isolate = context->GetIsolate();
Local<String> key = String::NewFromUtf8(
isolate, "runInNewContext", NewStringType::kNormal).ToLocalChecked();
Local<Function> value = FunctionTemplate::New(isolate, RunInNewContext)
->GetFunction(context)
.ToLocalChecked();
assert(exports->Set(context, key, value).IsJust());
}

} // anonymous namespace

NODE_MODULE_CONTEXT_AWARE(NODE_GYP_MODULE_NAME, Initialize)
8 changes: 8 additions & 0 deletions test/addons/non-node-context/binding.gyp
@@ -0,0 +1,8 @@
{
'targets': [
{
'target_name': 'binding',
'sources': ['binding.cc']
},
]
}
17 changes: 17 additions & 0 deletions test/addons/non-node-context/test-perf-hooks-timerify.js
@@ -0,0 +1,17 @@
'use strict';

const common = require('../../common');
const assert = require('assert');
const { runInNewContext } = require(`./build/${common.buildType}/binding`);
const { performance } = require('perf_hooks');

// Check that performance.timerify() works when called from another context,
// for a function created in another context.

const check = runInNewContext(`
const { performance, assert } = data;
const timerified = performance.timerify(function() { return []; });
assert.strictEqual(timerified().constructor, Array);
'success';
`, { performance, assert });
assert.strictEqual(check, 'success');

0 comments on commit f30f11b

Please sign in to comment.