// Flags: --expose-internals --no-warnings --allow-natives-syntax 'use strict'; const common = require('../common'); const assert = require('assert'); const { internalBinding } = require('internal/test/binding'); if (!common.isDebug) { assert.throws(() => internalBinding('debug'), { message: 'No such binding: debug' }); return; } const { getV8FastApiCallCount, isEven, isOdd, } = internalBinding('debug'); assert.throws(() => getV8FastApiCallCount(), { message: 'getV8FastApiCallCount must be called with a string', }); function testIsEven() { for (let i = 0; i < 10; i++) { assert.strictEqual(isEven(i), i % 2 === 0); } } function testIsOdd() { for (let i = 0; i < 20; i++) { assert.strictEqual(isOdd(i), i % 2 !== 0); } } // Should return 0 by default for any string. assert.strictEqual(getV8FastApiCallCount(''), 0); assert.strictEqual(getV8FastApiCallCount('foo'), 0); assert.strictEqual(getV8FastApiCallCount('debug.isEven'), 0); assert.strictEqual(getV8FastApiCallCount('debug.isOdd'), 0); eval('%PrepareFunctionForOptimization(testIsEven)'); testIsEven(); eval('%PrepareFunctionForOptimization(testIsOdd)'); testIsOdd(); // Functions should not be optimized yet. assert.strictEqual(getV8FastApiCallCount('debug.isEven'), 0); assert.strictEqual(getV8FastApiCallCount('debug.isOdd'), 0); eval('%OptimizeFunctionOnNextCall(testIsEven)'); testIsEven(); eval('%OptimizeFunctionOnNextCall(testIsOdd)'); testIsOdd(); // Functions should have been optimized and fast path taken. assert.strictEqual(getV8FastApiCallCount('debug.isEven'), 10); assert.strictEqual(getV8FastApiCallCount('debug.isOdd'), 20);