| 'use strict'; |
| // Flags: --expose-gc --no-concurrent-array-buffer-sweeping |
| |
| const common = require('../../common'); |
| const binding = require(`./build/${common.buildType}/test_buffer`); |
| const assert = require('assert'); |
| const util = require('util'); |
| const tick = util.promisify(require('../../common/tick')); |
| |
| (async function() { |
| assert.strictEqual(binding.newBuffer().toString(), binding.theText); |
| assert.strictEqual(binding.newExternalBuffer().toString(), binding.theText); |
| console.log('gc1'); |
| global.gc(); |
| assert.strictEqual(binding.getDeleterCallCount(), 0); |
| await tick(10); |
| assert.strictEqual(binding.getDeleterCallCount(), 1); |
| assert.strictEqual(binding.copyBuffer().toString(), binding.theText); |
| |
| let buffer = binding.staticBuffer(); |
| assert.strictEqual(binding.bufferHasInstance(buffer), true); |
| assert.strictEqual(binding.bufferInfo(buffer), true); |
| buffer = null; |
| global.gc(); |
| assert.strictEqual(binding.getDeleterCallCount(), 1); |
| await tick(10); |
| console.log('gc2'); |
| assert.strictEqual(binding.getDeleterCallCount(), 2); |
| |
| // Caveat emptor: it's indeterminate when the SharedArrayBuffer's backing |
| // store is reclaimed; at least some of the time it happens even before |
| // calling gc(). |
| let sab = binding.newExternalSharedArrayBuffer(); |
| assert(util.types.isSharedArrayBuffer(sab)); |
| sab = null; |
| global.gc(); |
| await tick(10); |
| console.log('gc3'); |
| assert.strictEqual(binding.getDeleterCallCount(), 3); |
| |
| // To test this doesn't crash |
| binding.invalidObjectAsBuffer({}); |
| |
| const testBuffer = binding.bufferFromArrayBuffer(); |
| assert(testBuffer instanceof Buffer, 'Expected a Buffer'); |
| })().then(common.mustCall()); |