test: verify performance.timerify()
works w/ non-Node Contexts
PR-URL: https://github.com/nodejs/node/pull/23784 Reviewed-By: Refael Ackermann <refack@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
958d5b7f1d
commit
a3cad3e2ff
@ -310,7 +310,7 @@ void TimerFunctionCall(const FunctionCallbackInfo<Value>& args) {
|
|||||||
Isolate* isolate = args.GetIsolate();
|
Isolate* isolate = args.GetIsolate();
|
||||||
HandleScope scope(isolate);
|
HandleScope scope(isolate);
|
||||||
Environment* env = Environment::GetCurrent(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<Context> context = env->context();
|
||||||
Local<Function> fn = args.Data().As<Function>();
|
Local<Function> fn = args.Data().As<Function>();
|
||||||
size_t count = args.Length();
|
size_t count = args.Length();
|
||||||
|
55
test/addons/non-node-context/binding.cc
Normal file
55
test/addons/non-node-context/binding.cc
Normal file
@ -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
test/addons/non-node-context/binding.gyp
Normal file
8
test/addons/non-node-context/binding.gyp
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
'targets': [
|
||||||
|
{
|
||||||
|
'target_name': 'binding',
|
||||||
|
'sources': ['binding.cc']
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
17
test/addons/non-node-context/test-perf-hooks-timerify.js
Normal file
17
test/addons/non-node-context/test-perf-hooks-timerify.js
Normal file
@ -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');
|
Loading…
x
Reference in New Issue
Block a user