Skip to content

Commit

Permalink
test: add fast api tests for getLibuvNow()
Browse files Browse the repository at this point in the history
  • Loading branch information
anonrig committed Nov 18, 2024
1 parent f8c9ab4 commit 0c49cfb
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 3 deletions.
4 changes: 4 additions & 0 deletions src/timers.cc
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
#include "timers.h"

#include <node_debug.h>

#include "env-inl.h"
#include "node_external_reference.h"
#include "util-inl.h"
Expand Down Expand Up @@ -35,6 +38,7 @@ void BindingData::SlowGetLibuvNow(const FunctionCallbackInfo<Value>& args) {

double BindingData::FastGetLibuvNow(Local<Object> unused,
Local<Object> receiver) {
TRACK_V8_FAST_API_CALL("timers.getLibuvNow");
return GetLibuvNowImpl(FromJSObject<BindingData>(receiver));
}

Expand Down
23 changes: 20 additions & 3 deletions test/parallel/test-timers-now.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,28 @@
// Flags: --expose-internals --no-warnings --allow-natives-syntax

Check failure on line 1 in test/parallel/test-timers-now.js

View workflow job for this annotation

GitHub Actions / test-macOS

--- stderr --- # # Fatal error in , line 0 # Check failed: v8_flags.fuzzing. # # # #FailureMessage Object: 0x16ba2c238 ----- Native stack trace ----- 1: 0x10454b94c node::NodePlatform::GetStackTracePrinter()::$_3::__invoke() [/Users/runner/work/node/node/out/Release/node] 2: 0x105bed27c V8_Fatal(char const*, ...) [/Users/runner/work/node/node/out/Release/node] 3: 0x104d42efc v8::internal::Runtime_PrepareFunctionForOptimization(int, unsigned long*, v8::internal::Isolate*) [/Users/runner/work/node/node/out/Release/node] 4: 0x1053db848 Builtins_CEntry_Return1_ArgvInRegister_NoBuiltinExit [/Users/runner/work/node/node/out/Release/node] 5: 0x1054be114 Builtins_CallRuntimeHandler [/Users/runner/work/node/node/out/Release/node] 6: 0x105344838 Builtins_InterpreterEntryTrampoline [/Users/runner/work/node/node/out/Release/node] 7: 0x105344838 Builtins_InterpreterEntryTrampoline [/Users/runner/work/node/node/out/Release/node] 8: 0x105344838 Builtins_InterpreterEntryTrampoline [/Users/runner/work/node/node/out/Release/node] 9: 0x105344838 Builtins_InterpreterEntryTrampoline [/Users/runner/work/node/node/out/Release/node] 10: 0x105344838 Builtins_InterpreterEntryTrampoline [/Users/runner/work/node/node/out/Release/node] 11: 0x105344838 Builtins_InterpreterEntryTrampoline [/Users/runner/work/node/node/out/Release/node] 12: 0x105344838 Builtins_InterpreterEntryTrampoline [/Users/runner/work/node/node/out/Release/node] 13: 0x105344838 Builtins_InterpreterEntryTrampoline [/Users/runner/work/node/node/out/Release/node] 14: 0x105344838 Builtins_InterpreterEntryTrampoline [/Users/runner/work/node/node/out/Release/node] 15: 0x105344838 Builtins_InterpreterEntryTrampoline [/Users/runner/work/node/node/out/Release/node] 16: 0x10534250c Builtins_JSEntryTrampoline [/Users/runner/work/node/node/out/Release/node] 17: 0x1053421b0 Builtins_JSEntry [/Users/runner/work/node/node/out/Release/node] 18: 0x10487ab1c v8::internal::(anonymous namespace)::Invoke(v8::internal::Isolate*, v8::internal::(anonymous namespace)::InvokeParams const&) [/Users/runner/work/node/node/out/Release/node] 19: 0x10487a478 v8::internal::Execution::Call(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, int, v8::internal::Handle<v8::internal::Object>*) [/Users/runner/work/node/node/out/Release/node] 20: 0x104714794 v8::Function::Call(v8::Isolate*, v8::Local<v8::Context>, v8::Local<v8::Value>, int, v8::Local<v8::Value>*) [/Users/runner/work/node/node/out/Release/node] 21: 0x1044a8040 node::builtins::BuiltinLoader::CompileAndCall(v8::Local<v8::Context>, char const*, node::Realm*) [/Users/runner/work/node/node/out/Release/node] 22: 0x10455c28c node::Realm::ExecuteBootstrapper(char const*) [/Users/runner/work/node/node/out/Release/node] 23: 0x104486054 node::StartExecution(node::Environment*, char const*) [/Users/runner/work/node/node/out/Release/node] 24: 0x104485fa8 node::StartExecution(node::Environment*, std::__1::function<v8::MaybeLocal<v8::Value> (node::StartExecutionCallbackInfo const&)>) [/Users/runner/work/node/node/out/Release/node] 25: 0x1043da594 node::LoadEnvironment(node::Environment*, std::__1::function<v8::MaybeLocal<v8::Value> (node::StartExecutionCallbackInfo const&)>, std::__1::function<void (node::Environment*, v8::Local<v8::Value>, v8::Local<v8::Value>)>) [/Users/runner/work/node/node/out/Release/node] 26: 0x1045168f0 node::NodeMainInstance::Run() [/Users/runner/work/node/node/out/Release/node] 27: 0x1044893a4 node::Start(int, char**) [/Users/runner/work/node/node/out/Release/node] 28: 0x189b77154 start [/usr/lib/dyld] Command: out/Release/node --expose-internals --no-warnings --allow-natives-syntax --test-reporter=spec --test-reporter-destination=stdout --test-reporter=./tools/github_reporter/index.js --test-reporter-destination=stdout /Users/runner/work/node/node/test/parallel/test-timers-now.js --- CRASHED (Signal: 5) ---

Check failure on line 1 in test/parallel/test-timers-now.js

View workflow job for this annotation

GitHub Actions / test-linux

--- stderr --- # # Fatal error in , line 0 # Check failed: v8_flags.fuzzing. # # # #FailureMessage Object: 0x7ffdb27ac610 ----- Native stack trace ----- 1: 0x55a2ca3b18e2 [out/Release/node] 2: 0x55a2cbb60109 V8_Fatal(char const*, ...) [out/Release/node] 3: 0x55a2cac0c220 v8::internal::Runtime_OptimizeOsr(int, unsigned long*, v8::internal::Isolate*) [out/Release/node] 4: 0x55a26b26f0f1 Command: out/Release/node --expose-internals --no-warnings --allow-natives-syntax --test-reporter=spec --test-reporter-destination=stdout --test-reporter=./tools/github_reporter/index.js --test-reporter-destination=stdout /home/runner/work/node/node/test/parallel/test-timers-now.js --- CRASHED (Signal: 5) ---
'use strict';
// Flags: --expose-internals

require('../common');
const assert = require('assert');
const common = require('../common');
const assert = require('node:assert');
const { internalBinding } = require('internal/test/binding');
const binding = internalBinding('timers');

// Return value of getLibuvNow() should easily fit in a SMI after start-up.
// We need to use the binding as the receiver for fast API calls.
assert(binding.getLibuvNow() < 0x3ffffff);

{
// V8 Fast API
function testFastPaths() {
assert(binding.getLibuvNow() < 0x3ffffff);
}

eval('%PrepareFunctionForOptimization(binding.getLibuvNow)');
testFastPaths();
eval('%OptimizeFunctionOnNextCall(binding.getLibuvNow)');
testFastPaths();

if (common.isDebug) {
const { getV8FastApiCallCount } = internalBinding('debug');
assert.strictEqual(getV8FastApiCallCount('timers.getLibuvNow'), 1);
}
}

0 comments on commit 0c49cfb

Please sign in to comment.