Updated bitcoind.cc to run on node v0.12.2. This code will not compile for node v0.10, but the old code will.

This commit is contained in:
Chris Kleeschulte 2015-06-10 15:38:21 -04:00
parent a38d4b1ea0
commit 287ae29881
2 changed files with 111 additions and 129 deletions

10
benchmarks/index.js Normal file
View File

@ -0,0 +1,10 @@
'use strict'
// The primary methods needed are:
// getInfo
// getRawTransaction
// sendRawTransaction
// getTransaction
// Wallet functionality isn't needed, and libbitcoind.so could be compiled with the --disable-wallet flag.

View File

@ -451,7 +451,7 @@ struct async_node_data {
bool rpc; bool rpc;
bool testnet; bool testnet;
bool txindex; bool txindex;
Local<Function> callback; Eternal<Function> callback;
}; };
/** /**
@ -464,7 +464,7 @@ struct async_block_data {
int64_t height; int64_t height;
CBlock cblock; CBlock cblock;
CBlockIndex* cblock_index; CBlockIndex* cblock_index;
Local<Function> callback; Eternal<Function> callback;
}; };
/** /**
@ -476,7 +476,7 @@ struct async_tx_data {
std::string txid; std::string txid;
std::string blockhash; std::string blockhash;
CTransaction ctx; CTransaction ctx;
Local<Function> callback; Eternal<Function> callback;
}; };
/** /**
@ -489,7 +489,7 @@ struct async_block_tx_data {
CBlock cblock; CBlock cblock;
CBlockIndex* cblock_index; CBlockIndex* cblock_index;
CTransaction ctx; CTransaction ctx;
Local<Function> callback; Eternal<Function> callback;
}; };
/** /**
@ -509,7 +509,7 @@ struct async_block_time_data {
uint32_t lte; uint32_t lte;
int64_t limit; int64_t limit;
cblocks_list *cblocks; cblocks_list *cblocks;
Local<Function> callback; Eternal<Function> callback;
}; };
/** /**
@ -529,7 +529,7 @@ struct async_addrtx_data {
ctx_list *ctxs; ctx_list *ctxs;
int64_t blockheight; int64_t blockheight;
int64_t blocktime; int64_t blocktime;
Local<Function> callback; Eternal<Function> callback;
}; };
/** /**
@ -538,12 +538,12 @@ struct async_addrtx_data {
struct async_broadcast_tx_data { struct async_broadcast_tx_data {
std::string err_msg; std::string err_msg;
Local<Object> jstx; Eternal<Object> jstx;
CTransaction ctx; CTransaction ctx;
std::string txid; std::string txid;
bool override_fees; bool override_fees;
bool own_only; bool own_only;
Local<Function> callback; Eternal<Function> callback;
}; };
/** /**
@ -556,7 +556,7 @@ struct async_wallet_sendto_data {
std::string address; std::string address;
int64_t nAmount; int64_t nAmount;
CWalletTx wtx; CWalletTx wtx;
Local<Function> callback; Eternal<Function> callback;
}; };
/** /**
@ -570,7 +570,7 @@ struct async_wallet_sendfrom_data {
int64_t nAmount; int64_t nAmount;
int nMinDepth; int nMinDepth;
CWalletTx wtx; CWalletTx wtx;
Local<Function> callback; Eternal<Function> callback;
}; };
/** /**
@ -580,7 +580,7 @@ struct async_wallet_sendfrom_data {
struct async_import_key_data { struct async_import_key_data {
std::string err_msg; std::string err_msg;
bool fRescan; bool fRescan;
Local<Function> callback; Eternal<Function> callback;
}; };
/** /**
@ -590,7 +590,7 @@ struct async_import_key_data {
struct async_import_wallet_data { struct async_import_wallet_data {
std::string err_msg; std::string err_msg;
std::string path; std::string path;
Local<Function> callback; Eternal<Function> callback;
}; };
/** /**
@ -600,7 +600,7 @@ struct async_import_wallet_data {
struct async_dump_wallet_data { struct async_dump_wallet_data {
std::string err_msg; std::string err_msg;
std::string path; std::string path;
Local<Function> callback; Eternal<Function> callback;
}; };
/** /**
@ -609,7 +609,7 @@ struct async_dump_wallet_data {
struct async_rescan_data { struct async_rescan_data {
std::string err_msg; std::string err_msg;
Local<Function> callback; Eternal<Function> callback;
}; };
/** /**
@ -620,7 +620,7 @@ struct async_from_tx_data {
std::string err_msg; std::string err_msg;
std::string txid; std::string txid;
ctx_list *ctxs; ctx_list *ctxs;
Local<Function> callback; Eternal<Function> callback;
}; };
/** /**
@ -708,10 +708,9 @@ NAN_METHOD(StartBitcoind) {
data->testnet = testnet; data->testnet = testnet;
data->txindex = txindex; data->txindex = txindex;
Persistent<Function> persistent(isolate, callback); Eternal<Function> eternal(isolate, callback);
data->callback = Local<Function>::New(isolate, persistent);
data->callback = eternal;
uv_work_t *req = new uv_work_t(); uv_work_t *req = new uv_work_t();
req->data = data; req->data = data;
@ -757,31 +756,29 @@ async_start_node_after(uv_work_t *req) {
HandleScope scope(isolate); HandleScope scope(isolate);
async_node_data *data = static_cast<async_node_data*>(req->data); async_node_data *data = static_cast<async_node_data*>(req->data);
Local<Function> cb = data->callback.Get(isolate);
if (data->err_msg != "") { if (data->err_msg != "") {
Local<Value> err = Exception::Error(NanNew<String>(data->err_msg)); Local<Value> err = Exception::Error(NanNew<String>(data->err_msg));
const unsigned argc = 1; const unsigned argc = 1;
Local<Value> argv[argc] = { err }; Local<Value> argv[argc] = { err };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
} else { } else {
const unsigned argc = 2; const unsigned argc = 2;
Local<Value> argv[argc] = { Local<Value> argv[argc] = {
Local<Value>::New(isolate, NanNull()), v8::Null(isolate),
Local<Value>::New(isolate, NanNew<String>(data->result)) Local<Value>::New(isolate, NanNew<String>(data->result))
}; };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
} }
Persistent<Function> persistent(isolate, data->callback);
persistent.Reset();
delete data; delete data;
delete req; delete req;
} }
@ -972,8 +969,8 @@ NAN_METHOD(StopBitcoind) {
async_node_data *data = new async_node_data(); async_node_data *data = new async_node_data();
data->err_msg = std::string(""); data->err_msg = std::string("");
data->result = std::string(""); data->result = std::string("");
Persistent<Function> persistent(isolate, callback); Eternal<Function> eternal(isolate, callback);
data->callback = Local<Function>::New(isolate, persistent); data->callback = eternal;
uv_work_t *req = new uv_work_t(); uv_work_t *req = new uv_work_t();
req->data = data; req->data = data;
@ -1012,12 +1009,13 @@ async_stop_node_after(uv_work_t *req) {
HandleScope scope(isolate); HandleScope scope(isolate);
async_node_data* data = static_cast<async_node_data*>(req->data); async_node_data* data = static_cast<async_node_data*>(req->data);
Local<Function> cb = data->callback.Get(isolate);
if (data->err_msg != "") { if (data->err_msg != "") {
Local<Value> err = Exception::Error(NanNew<String>(data->err_msg)); Local<Value> err = Exception::Error(NanNew<String>(data->err_msg));
const unsigned argc = 1; const unsigned argc = 1;
Local<Value> argv[argc] = { err }; Local<Value> argv[argc] = { err };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
@ -1028,15 +1026,12 @@ async_stop_node_after(uv_work_t *req) {
Local<Value>::New(isolate, NanNew<String>(data->result)) Local<Value>::New(isolate, NanNew<String>(data->result))
}; };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
} }
Persistent<Function> persistent(isolate, data->callback);
persistent.Reset();
delete data; delete data;
delete req; delete req;
} }
@ -1097,8 +1092,8 @@ NAN_METHOD(GetBlock) {
} }
Local<Function> callback = Local<Function>::Cast(args[1]); Local<Function> callback = Local<Function>::Cast(args[1]);
Persistent<Function> persistent(isolate, callback); Eternal<Function> eternal(isolate, callback);
data->callback = Local<Function>::New(isolate, persistent); data->callback = eternal;
uv_work_t *req = new uv_work_t(); uv_work_t *req = new uv_work_t();
req->data = data; req->data = data;
@ -1146,13 +1141,14 @@ async_get_block_after(uv_work_t *req) {
Isolate *isolate = Isolate::GetCurrent(); Isolate *isolate = Isolate::GetCurrent();
HandleScope scope(isolate); HandleScope scope(isolate);
async_block_data* data = static_cast<async_block_data*>(req->data); async_block_data* data = static_cast<async_block_data*>(req->data);
Local<Function> cb = data->callback.Get(isolate);
if (data->err_msg != "") { if (data->err_msg != "") {
Local<Value> err = Exception::Error(NanNew<String>(data->err_msg)); Local<Value> err = Exception::Error(NanNew<String>(data->err_msg));
const unsigned argc = 1; const unsigned argc = 1;
Local<Value> argv[argc] = { err }; Local<Value> argv[argc] = { err };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
@ -1169,13 +1165,11 @@ async_get_block_after(uv_work_t *req) {
Local<Value>::New(isolate, jsblock) Local<Value>::New(isolate, jsblock)
}; };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
} }
Persistent<Function> persistent(isolate, data->callback);
persistent.Reset();
delete data; delete data;
delete req; delete req;
@ -1213,8 +1207,8 @@ NAN_METHOD(GetTransaction) {
data->err_msg = std::string(""); data->err_msg = std::string("");
data->txid = txid; data->txid = txid;
data->blockhash = blockhash; data->blockhash = blockhash;
Persistent<Function> persistent(isolate, callback); Eternal<Function> eternal(isolate, callback);
data->callback = Local<Function>::New(isolate, persistent); data->callback = eternal;
uv_work_t *req = new uv_work_t(); uv_work_t *req = new uv_work_t();
req->data = data; req->data = data;
@ -1257,13 +1251,14 @@ async_get_tx_after(uv_work_t *req) {
CTransaction ctx = data->ctx; CTransaction ctx = data->ctx;
uint256 blockhash(data->blockhash); uint256 blockhash(data->blockhash);
Local<Function> cb = data->callback.Get(isolate);
if (data->err_msg != "") { if (data->err_msg != "") {
Local<Value> err = Exception::Error(NanNew<String>(data->err_msg)); Local<Value> err = Exception::Error(NanNew<String>(data->err_msg));
const unsigned argc = 1; const unsigned argc = 1;
Local<Value> argv[argc] = { err }; Local<Value> argv[argc] = { err };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
@ -1277,13 +1272,11 @@ async_get_tx_after(uv_work_t *req) {
Local<Value>::New(isolate, jstx) Local<Value>::New(isolate, jstx)
}; };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
} }
Persistent<Function> persistent(isolate, data->callback);
persistent.Reset();
delete data; delete data;
delete req; delete req;
} }
@ -1314,11 +1307,11 @@ NAN_METHOD(BroadcastTx) {
data->override_fees = args[1]->ToBoolean()->IsTrue(); data->override_fees = args[1]->ToBoolean()->IsTrue();
data->own_only = args[2]->ToBoolean()->IsTrue(); data->own_only = args[2]->ToBoolean()->IsTrue();
data->err_msg = std::string(""); data->err_msg = std::string("");
Persistent<Function> persistent(isolate, callback); Eternal<Function> eternal(isolate, callback);
data->callback = Local<Function>::New(isolate, persistent); data->callback = eternal;
Persistent<Object> persistentObject(isolate, jstx); Eternal<Object> eternalObject(isolate, jstx);
data->jstx = Local<Object>::New(isolate, persistentObject); data->jstx = eternalObject;
CTransaction ctx; CTransaction ctx;
jstx_to_ctx(jstx, ctx); jstx_to_ctx(jstx, ctx);
@ -1388,13 +1381,15 @@ async_broadcast_tx_after(uv_work_t *req) {
Isolate* isolate = Isolate::GetCurrent(); Isolate* isolate = Isolate::GetCurrent();
HandleScope scope(isolate); HandleScope scope(isolate);
async_broadcast_tx_data* data = static_cast<async_broadcast_tx_data*>(req->data); async_broadcast_tx_data* data = static_cast<async_broadcast_tx_data*>(req->data);
Local<Function> cb = data->callback.Get(isolate);
Local<Object> obj = data->jstx.Get(isolate);
if (data->err_msg != "") { if (data->err_msg != "") {
Local<Value> err = Exception::Error(NanNew<String>(data->err_msg)); Local<Value> err = Exception::Error(NanNew<String>(data->err_msg));
const unsigned argc = 1; const unsigned argc = 1;
Local<Value> argv[argc] = { err }; Local<Value> argv[argc] = { err };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
@ -1403,16 +1398,14 @@ async_broadcast_tx_after(uv_work_t *req) {
Local<Value> argv[argc] = { Local<Value> argv[argc] = {
Local<Value>::New(isolate, NanNull()), Local<Value>::New(isolate, NanNull()),
Local<Value>::New(isolate, NanNew<String>(data->txid)), Local<Value>::New(isolate, NanNew<String>(data->txid)),
Local<Value>::New(isolate, data->jstx) Local<Value>::New(isolate, obj)
}; };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
} }
Persistent<Function> persistent(isolate, data->callback);
persistent.Reset();
delete data; delete data;
delete req; delete req;
@ -1753,8 +1746,8 @@ NAN_METHOD(GetProgress) {
data->hash = pindex->GetBlockHash().GetHex(); data->hash = pindex->GetBlockHash().GetHex();
data->height = -1; data->height = -1;
Persistent<Function> persistent(isolate, callback); Eternal<Function> eternal(isolate, callback);
data->callback = Local<Function>::New(isolate, persistent); data->callback = eternal;
uv_work_t *req = new uv_work_t(); uv_work_t *req = new uv_work_t();
req->data = data; req->data = data;
@ -1778,13 +1771,14 @@ async_get_progress_after(uv_work_t *req) {
Isolate* isolate = Isolate::GetCurrent(); Isolate* isolate = Isolate::GetCurrent();
HandleScope scope(isolate); HandleScope scope(isolate);
async_block_data* data = static_cast<async_block_data*>(req->data); async_block_data* data = static_cast<async_block_data*>(req->data);
Local<Function> cb = data->callback.Get(isolate);
if (data->err_msg != "") { if (data->err_msg != "") {
Local<Value> err = Exception::Error(NanNew<String>(data->err_msg)); Local<Value> err = Exception::Error(NanNew<String>(data->err_msg));
const unsigned argc = 1; const unsigned argc = 1;
Local<Value> argv[argc] = { err }; Local<Value> argv[argc] = { err };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
@ -1837,13 +1831,11 @@ async_get_progress_after(uv_work_t *req) {
Local<Value>::New(isolate,result) Local<Value>::New(isolate,result)
}; };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
} }
Persistent<Function> persistent(isolate, data->callback);
persistent.Reset();
delete data; delete data;
delete req; delete req;
@ -2020,8 +2012,8 @@ NAN_METHOD(GetAddrTransactions) {
data->ctxs = NULL; data->ctxs = NULL;
data->blockheight = blockheight; data->blockheight = blockheight;
data->blocktime = blocktime; data->blocktime = blocktime;
Persistent<Function> persistent(isolate, callback); Eternal<Function> eternal(isolate, callback);
data->callback = Local<Function>::New(isolate, persistent); data->callback = eternal;
uv_work_t *req = new uv_work_t(); uv_work_t *req = new uv_work_t();
req->data = data; req->data = data;
@ -2136,13 +2128,14 @@ async_get_addrtx_after(uv_work_t *req) {
HandleScope scope(isolate); HandleScope scope(isolate);
async_addrtx_data* data = static_cast<async_addrtx_data*>(req->data); async_addrtx_data* data = static_cast<async_addrtx_data*>(req->data);
Local<Function> cb = data->callback.Get(isolate);
if (data->err_msg != "") { if (data->err_msg != "") {
Local<Value> err = Exception::Error(NanNew<String>(data->err_msg)); Local<Value> err = Exception::Error(NanNew<String>(data->err_msg));
const unsigned argc = 1; const unsigned argc = 1;
Local<Value> argv[argc] = { err }; Local<Value> argv[argc] = { err };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
@ -2167,13 +2160,11 @@ async_get_addrtx_after(uv_work_t *req) {
Local<Value>::New(isolate, result) Local<Value>::New(isolate, result)
}; };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
} }
Persistent<Function> persistent(isolate, data->callback);
persistent.Reset();
delete data; delete data;
delete req; delete req;
@ -2242,8 +2233,8 @@ NAN_METHOD(GetBlockByTx) {
data->txid = txid; data->txid = txid;
Local<Function> callback = Local<Function>::Cast(args[1]); Local<Function> callback = Local<Function>::Cast(args[1]);
Persistent<Function> persistent(isolate, callback); Eternal<Function> eternal(isolate, callback);
data->callback = Local<Function>::New(isolate, persistent); data->callback = eternal;
int status = uv_queue_work(uv_default_loop(), int status = uv_queue_work(uv_default_loop(),
req, async_block_tx, req, async_block_tx,
@ -2292,13 +2283,14 @@ async_block_tx_after(uv_work_t *req) {
Isolate* isolate = Isolate::GetCurrent(); Isolate* isolate = Isolate::GetCurrent();
HandleScope scope(isolate); HandleScope scope(isolate);
async_block_tx_data* data = static_cast<async_block_tx_data*>(req->data); async_block_tx_data* data = static_cast<async_block_tx_data*>(req->data);
Local<Function> cb = data->callback.Get(isolate);
if (data->err_msg != "") { if (data->err_msg != "") {
Local<Value> err = Exception::Error(NanNew<String>(data->err_msg)); Local<Value> err = Exception::Error(NanNew<String>(data->err_msg));
const unsigned argc = 1; const unsigned argc = 1;
Local<Value> argv[argc] = { err }; Local<Value> argv[argc] = { err };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
@ -2320,15 +2312,12 @@ async_block_tx_after(uv_work_t *req) {
Local<Value>::New(isolate, jstx) Local<Value>::New(isolate, jstx)
}; };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
} }
Persistent<Function> persistent(isolate, data->callback);
persistent.Reset();
delete data; delete data;
delete req; delete req;
} }
@ -2371,8 +2360,8 @@ NAN_METHOD(GetBlocksByTime) {
data->cblocks = NULL; data->cblocks = NULL;
Local<Function> callback = Local<Function>::Cast(args[1]); Local<Function> callback = Local<Function>::Cast(args[1]);
Persistent<Function> persistent(isolate, callback); Eternal<Function> eternal(isolate, callback);
data->callback = Local<Function>::New(isolate, persistent); data->callback = eternal;
int status = uv_queue_work(uv_default_loop(), int status = uv_queue_work(uv_default_loop(),
req, async_block_time, req, async_block_time,
@ -2427,13 +2416,14 @@ async_block_time_after(uv_work_t *req) {
HandleScope scope(isolate); HandleScope scope(isolate);
async_block_time_data* data = static_cast<async_block_time_data*>(req->data); async_block_time_data* data = static_cast<async_block_time_data*>(req->data);
Local<Function> cb = data->callback.Get(isolate);
if (data->err_msg != "") { if (data->err_msg != "") {
Local<Value> err = Exception::Error(NanNew<String>(data->err_msg)); Local<Value> err = Exception::Error(NanNew<String>(data->err_msg));
const unsigned argc = 1; const unsigned argc = 1;
Local<Value> argv[argc] = { err }; Local<Value> argv[argc] = { err };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
@ -2455,15 +2445,12 @@ async_block_time_after(uv_work_t *req) {
Local<Value>::New(isolate, jsblocks) Local<Value>::New(isolate, jsblocks)
}; };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
} }
Persistent<Function> persistent(isolate, data->callback);
persistent.Reset();
delete data; delete data;
delete req; delete req;
} }
@ -2497,8 +2484,8 @@ NAN_METHOD(GetFromTx) {
data->err_msg = std::string(""); data->err_msg = std::string("");
Local<Function> callback = Local<Function>::Cast(args[1]); Local<Function> callback = Local<Function>::Cast(args[1]);
Persistent<Function> persistent(isolate, callback); Eternal<Function> eternal(isolate, callback);
data->callback = Local<Function>::New(isolate, persistent); data->callback = eternal;
int status = uv_queue_work(uv_default_loop(), int status = uv_queue_work(uv_default_loop(),
req, async_from_tx, req, async_from_tx,
@ -2549,13 +2536,14 @@ async_from_tx_after(uv_work_t *req) {
HandleScope scope(isolate); HandleScope scope(isolate);
async_from_tx_data* data = static_cast<async_from_tx_data*>(req->data); async_from_tx_data* data = static_cast<async_from_tx_data*>(req->data);
Local<Function> cb = data->callback.Get(isolate);
if (data->err_msg != "") { if (data->err_msg != "") {
Local<Value> err = Exception::Error(NanNew<String>(data->err_msg)); Local<Value> err = Exception::Error(NanNew<String>(data->err_msg));
const unsigned argc = 1; const unsigned argc = 1;
Local<Value> argv[argc] = { err }; Local<Value> argv[argc] = { err };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
@ -2577,15 +2565,12 @@ async_from_tx_after(uv_work_t *req) {
Local<Value>::New(isolate, tx) Local<Value>::New(isolate, tx)
}; };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
} }
Persistent<Function> persistent(isolate, data->callback);
persistent.Reset();
delete data; delete data;
delete req; delete req;
} }
@ -3896,8 +3881,8 @@ NAN_METHOD(WalletSendTo) {
async_wallet_sendto_data *data = new async_wallet_sendto_data(); async_wallet_sendto_data *data = new async_wallet_sendto_data();
data->err_msg = std::string(""); data->err_msg = std::string("");
Persistent<Function> persistent(isolate, callback); Eternal<Function> eternal(isolate, callback);
data->callback = Local<Function>::New(isolate, persistent); data->callback = eternal;
String::Utf8Value addr_(options->Get(NanNew<String>("address"))->ToString()); String::Utf8Value addr_(options->Get(NanNew<String>("address"))->ToString());
std::string addr = std::string(*addr_); std::string addr = std::string(*addr_);
@ -3961,13 +3946,14 @@ async_wallet_sendto_after(uv_work_t *req) {
Isolate* isolate = Isolate::GetCurrent(); Isolate* isolate = Isolate::GetCurrent();
HandleScope scope(isolate); HandleScope scope(isolate);
async_wallet_sendto_data* data = static_cast<async_wallet_sendto_data*>(req->data); async_wallet_sendto_data* data = static_cast<async_wallet_sendto_data*>(req->data);
Local<Function> cb = data->callback.Get(isolate);
if (data->err_msg != "") { if (data->err_msg != "") {
Local<Value> err = Exception::Error(NanNew<String>(data->err_msg)); Local<Value> err = Exception::Error(NanNew<String>(data->err_msg));
const unsigned argc = 1; const unsigned argc = 1;
Local<Value> argv[argc] = { err }; Local<Value> argv[argc] = { err };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
@ -3978,15 +3964,12 @@ async_wallet_sendto_after(uv_work_t *req) {
Local<Value>::New(isolate, NanNew<String>(data->txid)) Local<Value>::New(isolate, NanNew<String>(data->txid))
}; };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
} }
Persistent<Function> persistent(isolate, data->callback);
persistent.Reset();
delete data; delete data;
delete req; delete req;
} }
@ -4013,8 +3996,8 @@ NAN_METHOD(WalletSendFrom) {
async_wallet_sendfrom_data *data = new async_wallet_sendfrom_data(); async_wallet_sendfrom_data *data = new async_wallet_sendfrom_data();
data->err_msg = std::string(""); data->err_msg = std::string("");
Persistent<Function> persistent(isolate, callback); Eternal<Function> eternal(isolate, callback);
data->callback = Local<Function>::New(isolate, persistent); data->callback = eternal;
String::Utf8Value addr_(options->Get(NanNew<String>("address"))->ToString()); String::Utf8Value addr_(options->Get(NanNew<String>("address"))->ToString());
std::string addr = std::string(*addr_); std::string addr = std::string(*addr_);
@ -4097,13 +4080,14 @@ async_wallet_sendfrom_after(uv_work_t *req) {
HandleScope scope(isolate); HandleScope scope(isolate);
async_wallet_sendfrom_data* data = static_cast<async_wallet_sendfrom_data*>(req->data); async_wallet_sendfrom_data* data = static_cast<async_wallet_sendfrom_data*>(req->data);
Local<Function> cb = data->callback.Get(isolate);
if (data->err_msg != "") { if (data->err_msg != "") {
Local<Value> err = Exception::Error(NanNew<String>(data->err_msg)); Local<Value> err = Exception::Error(NanNew<String>(data->err_msg));
const unsigned argc = 1; const unsigned argc = 1;
Local<Value> argv[argc] = { err }; Local<Value> argv[argc] = { err };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
@ -4114,15 +4098,12 @@ async_wallet_sendfrom_after(uv_work_t *req) {
Local<Value>::New(isolate, NanNew<String>(data->txid)) Local<Value>::New(isolate, NanNew<String>(data->txid))
}; };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
} }
Persistent<Function> persistent(isolate, data->callback);
persistent.Reset();
delete data; delete data;
delete req; delete req;
} }
@ -5371,8 +5352,8 @@ NAN_METHOD(WalletImportKey) {
if (args.Length() > 1 && args[1]->IsFunction()) { if (args.Length() > 1 && args[1]->IsFunction()) {
callback = Local<Function>::Cast(args[1]); callback = Local<Function>::Cast(args[1]);
Persistent<Function> persistent(isolate, callback); Eternal<Function> eternal(isolate, callback);
data->callback = Local<Function>::New(isolate, persistent); data->callback = eternal;
} }
std::string strSecret = ""; std::string strSecret = "";
@ -5508,13 +5489,14 @@ async_import_key_after(uv_work_t *req) {
Isolate* isolate = Isolate::GetCurrent(); Isolate* isolate = Isolate::GetCurrent();
HandleScope scope(isolate); HandleScope scope(isolate);
async_import_key_data* data = static_cast<async_import_key_data*>(req->data); async_import_key_data* data = static_cast<async_import_key_data*>(req->data);
Local<Function> cb = data->callback.Get(isolate);
if (data->err_msg != "") { if (data->err_msg != "") {
Local<Value> err = Exception::Error(NanNew<String>(data->err_msg)); Local<Value> err = Exception::Error(NanNew<String>(data->err_msg));
const unsigned argc = 1; const unsigned argc = 1;
Local<Value> argv[argc] = { err }; Local<Value> argv[argc] = { err };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
@ -5525,15 +5507,12 @@ async_import_key_after(uv_work_t *req) {
Local<Value>::New(isolate, True(isolate)) Local<Value>::New(isolate, True(isolate))
}; };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
} }
Persistent<Function> persistent(isolate, data->callback);
persistent.Reset();
delete data; delete data;
delete req; delete req;
} }
@ -5568,8 +5547,8 @@ NAN_METHOD(WalletDumpWallet) {
} }
data->path = path; data->path = path;
Persistent<Function> persistent(isolate, callback); Eternal<Function> eternal(isolate, callback);
data->callback = Local<Function>::New(isolate, persistent); data->callback = eternal;
uv_work_t *req = new uv_work_t(); uv_work_t *req = new uv_work_t();
req->data = data; req->data = data;
@ -5658,13 +5637,14 @@ async_dump_wallet_after(uv_work_t *req) {
HandleScope scope(isolate); HandleScope scope(isolate);
async_dump_wallet_data* data = static_cast<async_dump_wallet_data*>(req->data); async_dump_wallet_data* data = static_cast<async_dump_wallet_data*>(req->data);
Local<Function> cb = data->callback.Get(isolate);
if (data->err_msg != "") { if (data->err_msg != "") {
Local<Value> err = Exception::Error(NanNew<String>(data->err_msg)); Local<Value> err = Exception::Error(NanNew<String>(data->err_msg));
const unsigned argc = 1; const unsigned argc = 1;
Local<Value> argv[argc] = { err }; Local<Value> argv[argc] = { err };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
@ -5675,15 +5655,12 @@ async_dump_wallet_after(uv_work_t *req) {
Local<Value>::New(isolate, NanNew<String>(data->path)) Local<Value>::New(isolate, NanNew<String>(data->path))
}; };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
} }
Persistent<Function> persistent(isolate, data->callback);
persistent.Reset();
delete data; delete data;
delete req; delete req;
} }
@ -5718,8 +5695,8 @@ NAN_METHOD(WalletImportWallet) {
} }
data->path = path; data->path = path;
Persistent<Function> persistent(isolate, callback); Eternal<Function> eternal(isolate, callback);
data->callback = Local<Function>::New(isolate, persistent); data->callback = eternal;
uv_work_t *req = new uv_work_t(); uv_work_t *req = new uv_work_t();
req->data = data; req->data = data;
@ -5837,13 +5814,14 @@ async_import_wallet_after(uv_work_t *req) {
HandleScope scope(isolate); HandleScope scope(isolate);
async_import_wallet_data* data = static_cast<async_import_wallet_data*>(req->data); async_import_wallet_data* data = static_cast<async_import_wallet_data*>(req->data);
Local<Function> cb = data->callback.Get(isolate);
if (data->err_msg != "") { if (data->err_msg != "") {
Local<Value> err = Exception::Error(NanNew<String>(data->err_msg)); Local<Value> err = Exception::Error(NanNew<String>(data->err_msg));
const unsigned argc = 1; const unsigned argc = 1;
Local<Value> argv[argc] = { err }; Local<Value> argv[argc] = { err };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
@ -5854,15 +5832,12 @@ async_import_wallet_after(uv_work_t *req) {
Local<Value>::New(isolate, NanNew<String>(data->path)) Local<Value>::New(isolate, NanNew<String>(data->path))
}; };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
} }
Persistent<Function> persistent(isolate, data->callback);
persistent.Reset();
delete data; delete data;
delete req; delete req;
} }
@ -6095,8 +6070,8 @@ NAN_METHOD(WalletRescan) {
Local<Function> callback = Local<Function>::Cast(args[1]); Local<Function> callback = Local<Function>::Cast(args[1]);
data->err_msg = std::string(""); data->err_msg = std::string("");
Persistent<Function> persistent(isolate, callback); Eternal<Function> eternal(isolate, callback);
data->callback = Local<Function>::New(isolate, persistent); data->callback = eternal;
uv_work_t *req = new uv_work_t(); uv_work_t *req = new uv_work_t();
req->data = data; req->data = data;
@ -6123,14 +6098,14 @@ async_rescan_after(uv_work_t *req) {
HandleScope scope(isolate); HandleScope scope(isolate);
async_rescan_data* data = static_cast<async_rescan_data*>(req->data); async_rescan_data* data = static_cast<async_rescan_data*>(req->data);
Local<Function> cb = data->callback.Get(isolate);
if (data->err_msg != "") { if (data->err_msg != "") {
Local<Value> err = Exception::Error(NanNew<String>(data->err_msg)); Local<Value> err = Exception::Error(NanNew<String>(data->err_msg));
const unsigned argc = 1; const unsigned argc = 1;
Local<Value> argv[argc] = { err }; Local<Value> argv[argc] = { err };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
@ -6141,15 +6116,12 @@ async_rescan_after(uv_work_t *req) {
Local<Value>::New(isolate, True(isolate)) Local<Value>::New(isolate, True(isolate))
}; };
TryCatch try_catch; TryCatch try_catch;
data->callback->Call(isolate->GetCurrentContext()->Global(), argc, argv); cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
} }
Persistent<Function> persistent(isolate, data->callback);
persistent.Reset();
delete data; delete data;
delete req; delete req;
} }