Skip to content

Instantly share code, notes, and snippets.

@d3x0r
Created June 8, 2020 18:34
Show Gist options
  • Save d3x0r/f201f197ab017b643dcb941481b1bca4 to your computer and use it in GitHub Desktop.
Save d3x0r/f201f197ab017b643dcb941481b1bca4 to your computer and use it in GitHub Desktop.
Node BackingStore Debug Crash

You can download this gist as a single repository.

build

node-gyp configure --debug
node-gyp build --debug

test

node test.js
{
"targets": [
{
"target_name": "test_backstor",
'win_delay_load_hook': 'false',
"sources": [ "test_backstor.cc"],
'defines': [ "BUILDING_NODE_EXTENSION","BUILD_NODE_ADDON" ],
}
],
}
{
"name": "testbackingstore",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"install": "node-gyp rebuild"
},
"author": "",
"license": "ISC",
"gypfile": true
}
test = require( "./build/Debug/test_backstor.node" );
var buf;
buf = test.getBuffer();
console.log( "Buffer:", buf );
#include <node.h>
#include <node_object_wrap.h>
#include <v8.h>
#include <uv.h>
using namespace v8;
using namespace v8;
#define ReadOnlyProperty (PropertyAttribute)((int)PropertyAttribute::ReadOnly | PropertyAttribute::DontDelete)
#define SET_READONLY_METHOD( object, name, method ) (object)->DefineOwnProperty( isolate->GetCurrentContext(), String::NewFromUtf8(isolate, name, v8::NewStringType::kNormal ).ToLocalChecked(), v8::Function::New(isolate->GetCurrentContext(), method ).ToLocalChecked(), ReadOnlyProperty )
static void releaseBufferBackingStore( void* data, size_t length, void* deleter_data ) {
(void)length;
(void)deleter_data;;
(void)data; // it's actually a static buffer...
//Deallocate( void*, data );
}
static void makeBuffer( const v8::FunctionCallbackInfo<Value>& args ){
Isolate *isolate = args.GetIsolate();
static char buf[] = {"This is a test buffer"};
std::shared_ptr<BackingStore> bs = ArrayBuffer::NewBackingStore( buf, sizeof(buf), releaseBufferBackingStore, NULL );
Local<Object> arrayBuffer = ArrayBuffer::New( isolate, bs);
args.GetReturnValue().Set( arrayBuffer );
}
static void doInit( Local<Context> context, Local<Object> exports )
{
Isolate* isolate = Isolate::GetCurrent();
SET_READONLY_METHOD( exports, "getBuffer", makeBuffer );
}
NODE_MODULE_INIT( /*Local<Object> exports,
Local<Value>Module,
Local<Context> context*/ ) {
doInit(context,exports);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment