From be97db92af7654ff9681eb98d8152a0fcb81ad20 Mon Sep 17 00:00:00 2001 From: Anna Henningsen <sqrt@entless.org> Date: Thu, 17 Mar 2016 02:56:15 +0100 Subject: [PATCH] test: add buffer alignment regression tests Buffers instances can have arbitrary alignment. `node-ffi` depends on this. Add some regression tests to ensure we don't break this in the future. PR-URL: https://github.com/nodejs/node/pull/5752 Reviewed-By: trevnorris - Trevor Norris <trev.norris@gmail.com> Reviewed-By: bnoordhuis - Ben Noordhuis <info@bnoordhuis.nl> --- test/addons/buffer-free-callback/binding.cc | 9 ++++++++- test/addons/buffer-free-callback/test.js | 21 +++++++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/test/addons/buffer-free-callback/binding.cc b/test/addons/buffer-free-callback/binding.cc index e5298a0063e5fa..7bfd5e061d8b0c 100644 --- a/test/addons/buffer-free-callback/binding.cc +++ b/test/addons/buffer-free-callback/binding.cc @@ -13,9 +13,16 @@ static void FreeCallback(char* data, void* hint) { void Alloc(const v8::FunctionCallbackInfo<v8::Value>& args) { v8::Isolate* isolate = args.GetIsolate(); alive++; + + uintptr_t alignment = args[1]->IntegerValue(); + uintptr_t offset = args[2]->IntegerValue(); + + uintptr_t static_offset = reinterpret_cast<uintptr_t>(buf) % alignment; + char* aligned = buf + (alignment - static_offset) + offset; + args.GetReturnValue().Set(node::Buffer::New( isolate, - buf, + aligned, args[0]->IntegerValue(), FreeCallback, nullptr).ToLocalChecked()); diff --git a/test/addons/buffer-free-callback/test.js b/test/addons/buffer-free-callback/test.js index a70931d81e8977..f9d7ec90f8c0e9 100644 --- a/test/addons/buffer-free-callback/test.js +++ b/test/addons/buffer-free-callback/test.js @@ -4,8 +4,8 @@ require('../../common'); var binding = require('./build/Release/binding'); -function check(size) { - var buf = binding.alloc(size); +function check(size, alignment, offset) { + var buf = binding.alloc(size, alignment, offset); var slice = buf.slice(size >>> 1); buf = null; @@ -16,7 +16,20 @@ function check(size) { gc(); } -check(64); +check(64, 1, 0); + +// Buffers can have weird sizes. +check(97, 1, 0); + +// Buffers can be unaligned +check(64, 8, 0); +check(64, 16, 0); +check(64, 8, 1); +check(64, 16, 1); +check(97, 8, 1); +check(97, 16, 1); +check(97, 8, 3); +check(97, 16, 3); // Empty ArrayBuffer does not allocate data, worth checking -check(0); +check(0, 1, 0);