Commit b8a68a93 by Andrew Nesbitt

Merge pull request #188 from rvagg/nan

use NAN for Node 0.8->0.11+ compatibility
parents 3bfd6799 64b87781
#include <v8.h> #include <nan.h>
#include <node.h>
#include <string> #include <string>
#include <cstring> #include <cstring>
#include <iostream> #include <iostream>
...@@ -17,7 +16,7 @@ void WorkOnContext(uv_work_t* req) { ...@@ -17,7 +16,7 @@ void WorkOnContext(uv_work_t* req) {
} }
void MakeOldCallback(uv_work_t* req) { void MakeOldCallback(uv_work_t* req) {
HandleScope scope; NanScope();
TryCatch try_catch; TryCatch try_catch;
sass_context_wrapper* ctx_w = static_cast<sass_context_wrapper*>(req->data); sass_context_wrapper* ctx_w = static_cast<sass_context_wrapper*>(req->data);
sass_context* ctx = static_cast<sass_context*>(ctx_w->ctx); sass_context* ctx = static_cast<sass_context*>(ctx_w->ctx);
...@@ -26,19 +25,19 @@ void MakeOldCallback(uv_work_t* req) { ...@@ -26,19 +25,19 @@ void MakeOldCallback(uv_work_t* req) {
// if no error, do callback(null, result) // if no error, do callback(null, result)
const unsigned argc = 2; const unsigned argc = 2;
Local<Value> argv[argc] = { Local<Value> argv[argc] = {
Local<Value>::New(Null()), NanNewLocal(Null()),
Local<Value>::New(String::New(ctx->output_string)) NanNewLocal(String::New(ctx->output_string))
}; };
ctx_w->callback->Call(Context::GetCurrent()->Global(), argc, argv); ctx_w->callback->Call(argc, argv);
} else { } else {
// if error, do callback(error) // if error, do callback(error)
const unsigned argc = 1; const unsigned argc = 1;
Local<Value> argv[argc] = { Local<Value> argv[argc] = {
Local<Value>::New(String::New(ctx->error_message)) NanNewLocal(String::New(ctx->error_message))
}; };
ctx_w->callback->Call(Context::GetCurrent()->Global(), argc, argv); ctx_w->callback->Call(argc, argv);
} }
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
...@@ -47,8 +46,8 @@ void MakeOldCallback(uv_work_t* req) { ...@@ -47,8 +46,8 @@ void MakeOldCallback(uv_work_t* req) {
sass_free_context_wrapper(ctx_w); sass_free_context_wrapper(ctx_w);
} }
Handle<Value> OldRender(const Arguments& args) { NAN_METHOD(OldRender) {
HandleScope scope; NanScope();
sass_context* ctx = sass_new_context(); sass_context* ctx = sass_new_context();
sass_context_wrapper* ctx_w = sass_new_context_wrapper(); sass_context_wrapper* ctx_w = sass_new_context_wrapper();
char *source; char *source;
...@@ -66,17 +65,17 @@ Handle<Value> OldRender(const Arguments& args) { ...@@ -66,17 +65,17 @@ Handle<Value> OldRender(const Arguments& args) {
ctx->options.output_style = args[3]->Int32Value(); ctx->options.output_style = args[3]->Int32Value();
ctx->options.source_comments = args[4]->Int32Value(); ctx->options.source_comments = args[4]->Int32Value();
ctx_w->ctx = ctx; ctx_w->ctx = ctx;
ctx_w->callback = Persistent<Function>::New(callback); ctx_w->callback = new NanCallback(callback);
ctx_w->request.data = ctx_w; ctx_w->request.data = ctx_w;
int status = uv_queue_work(uv_default_loop(), &ctx_w->request, WorkOnContext, (uv_after_work_cb)MakeOldCallback); int status = uv_queue_work(uv_default_loop(), &ctx_w->request, WorkOnContext, (uv_after_work_cb)MakeOldCallback);
assert(status == 0); assert(status == 0);
return scope.Close(Undefined()); NanReturnUndefined();
} }
void MakeCallback(uv_work_t* req) { void MakeCallback(uv_work_t* req) {
HandleScope scope; NanScope();
TryCatch try_catch; TryCatch try_catch;
sass_context_wrapper* ctx_w = static_cast<sass_context_wrapper*>(req->data); sass_context_wrapper* ctx_w = static_cast<sass_context_wrapper*>(req->data);
sass_context* ctx = static_cast<sass_context*>(ctx_w->ctx); sass_context* ctx = static_cast<sass_context*>(ctx_w->ctx);
...@@ -85,18 +84,18 @@ void MakeCallback(uv_work_t* req) { ...@@ -85,18 +84,18 @@ void MakeCallback(uv_work_t* req) {
// if no error, do callback(null, result) // if no error, do callback(null, result)
const unsigned argc = 1; const unsigned argc = 1;
Local<Value> argv[argc] = { Local<Value> argv[argc] = {
Local<Value>::New(String::New(ctx->output_string)) NanNewLocal(String::New(ctx->output_string))
}; };
ctx_w->callback->Call(Context::GetCurrent()->Global(), argc, argv); ctx_w->callback->Call(argc, argv);
} else { } else {
// if error, do callback(error) // if error, do callback(error)
const unsigned argc = 1; const unsigned argc = 1;
Local<Value> argv[argc] = { Local<Value> argv[argc] = {
Local<Value>::New(String::New(ctx->error_message)) NanNewLocal(String::New(ctx->error_message))
}; };
ctx_w->errorCallback->Call(Context::GetCurrent()->Global(), argc, argv); ctx_w->errorCallback->Call(argc, argv);
} }
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
...@@ -105,8 +104,8 @@ void MakeCallback(uv_work_t* req) { ...@@ -105,8 +104,8 @@ void MakeCallback(uv_work_t* req) {
sass_free_context_wrapper(ctx_w); sass_free_context_wrapper(ctx_w);
} }
Handle<Value> Render(const Arguments& args) { NAN_METHOD(Render) {
HandleScope scope; NanScope();
sass_context* ctx = sass_new_context(); sass_context* ctx = sass_new_context();
sass_context_wrapper* ctx_w = sass_new_context_wrapper(); sass_context_wrapper* ctx_w = sass_new_context_wrapper();
char *source; char *source;
...@@ -125,18 +124,18 @@ Handle<Value> Render(const Arguments& args) { ...@@ -125,18 +124,18 @@ Handle<Value> Render(const Arguments& args) {
ctx->options.output_style = args[4]->Int32Value(); ctx->options.output_style = args[4]->Int32Value();
ctx->options.source_comments = args[5]->Int32Value(); ctx->options.source_comments = args[5]->Int32Value();
ctx_w->ctx = ctx; ctx_w->ctx = ctx;
ctx_w->callback = Persistent<Function>::New(callback); ctx_w->callback = new NanCallback(callback);
ctx_w->errorCallback = Persistent<Function>::New(errorCallback); ctx_w->errorCallback = new NanCallback(errorCallback);
ctx_w->request.data = ctx_w; ctx_w->request.data = ctx_w;
int status = uv_queue_work(uv_default_loop(), &ctx_w->request, WorkOnContext, (uv_after_work_cb)MakeCallback); int status = uv_queue_work(uv_default_loop(), &ctx_w->request, WorkOnContext, (uv_after_work_cb)MakeCallback);
assert(status == 0); assert(status == 0);
return scope.Close(Undefined()); NanReturnUndefined();
} }
Handle<Value> RenderSync(const Arguments& args) { NAN_METHOD(RenderSync) {
HandleScope scope; NanScope();
sass_context* ctx = sass_new_context(); sass_context* ctx = sass_new_context();
char *source; char *source;
String::AsciiValue astr(args[0]); String::AsciiValue astr(args[0]);
...@@ -162,16 +161,16 @@ Handle<Value> RenderSync(const Arguments& args) { ...@@ -162,16 +161,16 @@ Handle<Value> RenderSync(const Arguments& args) {
ctx->options.image_path = NULL; ctx->options.image_path = NULL;
if (ctx->error_status == 0) { if (ctx->error_status == 0) {
Local<Value> output = Local<Value>::New(String::New(ctx->output_string)); Local<Value> output = NanNewLocal(String::New(ctx->output_string));
sass_free_context(ctx); sass_free_context(ctx);
return scope.Close(output); NanReturnValue(output);
} }
Local<String> error = String::New(ctx->error_message); Local<String> error = String::New(ctx->error_message);
sass_free_context(ctx); sass_free_context(ctx);
ThrowException(Exception::Error(error)); NanThrowError(error);
return scope.Close(Undefined()); NanReturnUndefined();
} }
/** /**
...@@ -185,7 +184,7 @@ void WorkOnFileContext(uv_work_t* req) { ...@@ -185,7 +184,7 @@ void WorkOnFileContext(uv_work_t* req) {
} }
void MakeFileCallback(uv_work_t* req) { void MakeFileCallback(uv_work_t* req) {
HandleScope scope; NanScope();
TryCatch try_catch; TryCatch try_catch;
sass_file_context_wrapper* ctx_w = static_cast<sass_file_context_wrapper*>(req->data); sass_file_context_wrapper* ctx_w = static_cast<sass_file_context_wrapper*>(req->data);
sass_file_context* ctx = static_cast<sass_file_context*>(ctx_w->ctx); sass_file_context* ctx = static_cast<sass_file_context*>(ctx_w->ctx);
...@@ -194,18 +193,18 @@ void MakeFileCallback(uv_work_t* req) { ...@@ -194,18 +193,18 @@ void MakeFileCallback(uv_work_t* req) {
// if no error, do callback(null, result) // if no error, do callback(null, result)
const unsigned argc = 1; const unsigned argc = 1;
Local<Value> argv[argc] = { Local<Value> argv[argc] = {
Local<Value>::New(String::New(ctx->output_string)) NanNewLocal(String::New(ctx->output_string))
}; };
ctx_w->callback->Call(Context::GetCurrent()->Global(), argc, argv); ctx_w->callback->Call(argc, argv);
} else { } else {
// if error, do callback(error) // if error, do callback(error)
const unsigned argc = 1; const unsigned argc = 1;
Local<Value> argv[argc] = { Local<Value> argv[argc] = {
Local<Value>::New(String::New(ctx->error_message)) NanNewLocal(String::New(ctx->error_message))
}; };
ctx_w->errorCallback->Call(Context::GetCurrent()->Global(), argc, argv); ctx_w->errorCallback->Call(argc, argv);
} }
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
...@@ -214,8 +213,8 @@ void MakeFileCallback(uv_work_t* req) { ...@@ -214,8 +213,8 @@ void MakeFileCallback(uv_work_t* req) {
sass_free_file_context_wrapper(ctx_w); sass_free_file_context_wrapper(ctx_w);
} }
Handle<Value> RenderFile(const Arguments& args) { NAN_METHOD(RenderFile) {
HandleScope scope; NanScope();
sass_file_context* ctx = sass_new_file_context(); sass_file_context* ctx = sass_new_file_context();
sass_file_context_wrapper* ctx_w = sass_new_file_context_wrapper(); sass_file_context_wrapper* ctx_w = sass_new_file_context_wrapper();
char *filename; char *filename;
...@@ -234,18 +233,18 @@ Handle<Value> RenderFile(const Arguments& args) { ...@@ -234,18 +233,18 @@ Handle<Value> RenderFile(const Arguments& args) {
ctx->options.image_path = new char[0]; ctx->options.image_path = new char[0];
ctx->options.source_comments = args[5]->Int32Value(); ctx->options.source_comments = args[5]->Int32Value();
ctx_w->ctx = ctx; ctx_w->ctx = ctx;
ctx_w->callback = Persistent<Function>::New(callback); ctx_w->callback = new NanCallback(callback);
ctx_w->errorCallback = Persistent<Function>::New(errorCallback); ctx_w->errorCallback = new NanCallback(errorCallback);
ctx_w->request.data = ctx_w; ctx_w->request.data = ctx_w;
int status = uv_queue_work(uv_default_loop(), &ctx_w->request, WorkOnFileContext, (uv_after_work_cb)MakeFileCallback); int status = uv_queue_work(uv_default_loop(), &ctx_w->request, WorkOnFileContext, (uv_after_work_cb)MakeFileCallback);
assert(status == 0); assert(status == 0);
return scope.Close(Undefined()); NanReturnUndefined();
} }
Handle<Value> RenderFileSync(const Arguments& args) { NAN_METHOD(RenderFileSync) {
HandleScope scope; NanScope();
sass_file_context* ctx = sass_new_file_context(); sass_file_context* ctx = sass_new_file_context();
char *filename; char *filename;
String::AsciiValue astr(args[0]); String::AsciiValue astr(args[0]);
...@@ -271,16 +270,16 @@ Handle<Value> RenderFileSync(const Arguments& args) { ...@@ -271,16 +270,16 @@ Handle<Value> RenderFileSync(const Arguments& args) {
ctx->options.image_path = NULL; ctx->options.image_path = NULL;
if (ctx->error_status == 0) { if (ctx->error_status == 0) {
Local<Value> output = Local<Value>::New(String::New(ctx->output_string)); Local<Value> output = NanNewLocal(String::New(ctx->output_string));
sass_free_file_context(ctx); sass_free_file_context(ctx);
return scope.Close(output); NanReturnValue(output);
} }
Local<String> error = String::New(ctx->error_message); Local<String> error = String::New(ctx->error_message);
sass_free_file_context(ctx); sass_free_file_context(ctx);
ThrowException(Exception::Error(error)); NanThrowError(error);
return scope.Close(Undefined()); NanReturnUndefined();
} }
void RegisterModule(v8::Handle<v8::Object> target) { void RegisterModule(v8::Handle<v8::Object> target) {
......
...@@ -28,6 +28,9 @@ ...@@ -28,6 +28,9 @@
'libsass/to_string.cpp', 'libsass/to_string.cpp',
'libsass/units.cpp' 'libsass/units.cpp'
], ],
'include_dirs': [
'<!(node -e \'require("nan")\')'
],
'cflags!' : [ '-fno-exceptions' ], 'cflags!' : [ '-fno-exceptions' ],
'cflags_cc!': [ '-fno-exceptions' ], 'cflags_cc!': [ '-fno-exceptions' ],
'cflags_cc' : [ '-fexceptions', '-frtti' ], 'cflags_cc' : [ '-fexceptions', '-frtti' ],
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
"optimist": "0.6.x", "optimist": "0.6.x",
"node-watch": "0.3.x", "node-watch": "0.3.x",
"mocha": "1.13.x", "mocha": "1.13.x",
"chalk": "~0.3.0" "chalk": "~0.3.0",
"nan": "~0.6.0"
} }
} }
...@@ -13,6 +13,9 @@ extern "C" { ...@@ -13,6 +13,9 @@ extern "C" {
{ {
if (ctx_w->ctx) sass_free_context(ctx_w->ctx); if (ctx_w->ctx) sass_free_context(ctx_w->ctx);
delete ctx_w->callback;
delete ctx_w->errorCallback;
free(ctx_w); free(ctx_w);
} }
...@@ -25,6 +28,9 @@ extern "C" { ...@@ -25,6 +28,9 @@ extern "C" {
{ {
if (ctx_w->ctx) sass_free_file_context(ctx_w->ctx); if (ctx_w->ctx) sass_free_file_context(ctx_w->ctx);
delete ctx_w->callback;
delete ctx_w->errorCallback;
free(ctx_w); free(ctx_w);
} }
} }
#include "libsass/sass_interface.h" #include "libsass/sass_interface.h"
#include <node.h> #include <nan.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
...@@ -8,8 +8,8 @@ extern "C" { ...@@ -8,8 +8,8 @@ extern "C" {
struct sass_context_wrapper { struct sass_context_wrapper {
sass_context* ctx; sass_context* ctx;
uv_work_t request; uv_work_t request;
v8::Persistent<v8::Function> callback; NanCallback* callback;
v8::Persistent<v8::Function> errorCallback; NanCallback* errorCallback;
}; };
struct sass_context_wrapper* sass_new_context_wrapper(void); struct sass_context_wrapper* sass_new_context_wrapper(void);
...@@ -18,8 +18,8 @@ void sass_free_context_wrapper(struct sass_context_wrapper* ctx); ...@@ -18,8 +18,8 @@ void sass_free_context_wrapper(struct sass_context_wrapper* ctx);
struct sass_file_context_wrapper { struct sass_file_context_wrapper {
sass_file_context* ctx; sass_file_context* ctx;
uv_work_t request; uv_work_t request;
v8::Persistent<v8::Function> callback; NanCallback* callback;
v8::Persistent<v8::Function> errorCallback; NanCallback* errorCallback;
}; };
struct sass_file_context_wrapper* sass_new_file_context_wrapper(void); struct sass_file_context_wrapper* sass_new_file_context_wrapper(void);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment