| // Flags: --expose-internals --no-warnings --allow-natives-syntax |
| 'use strict'; |
| |
| 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); |
| |
| { |
| // Only javascript methods can be optimized through %OptimizeFunctionOnNextCall |
| // This is why we surround the C++ method we want to optimize with a JS function. |
| function getLibuvNow() { |
| return binding.getLibuvNow(); |
| } |
| |
| eval('%PrepareFunctionForOptimization(getLibuvNow)'); |
| getLibuvNow(); |
| eval('%OptimizeFunctionOnNextCall(getLibuvNow)'); |
| assert(getLibuvNow() < 0x3ffffff); |
| |
| if (common.isDebug) { |
| const { getV8FastApiCallCount } = internalBinding('debug'); |
| assert.strictEqual(getV8FastApiCallCount('timers.getLibuvNow'), 1); |
| } |
| } |