diff --git a/Examples/javascript/native/example.i b/Examples/javascript/native/example.i index 1d0d2e808..212765fa4 100644 --- a/Examples/javascript/native/example.i +++ b/Examples/javascript/native/example.i @@ -4,100 +4,37 @@ %wrapper %{ -#include -#include - - -#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) - typedef v8::Handle V8ReturnValue; - typedef v8::Arguments V8Arguments; -# define V8_RETURN(val) return scope.Close(val) -#else - typedef void V8ReturnValue; - typedef v8::FunctionCallbackInfo V8Arguments; -# define V8_RETURN(val) args.GetReturnValue().Set(val); return -#endif -#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032318) -# define V8_UNDEFINED() v8::Undefined() -#else -# define V8_UNDEFINED() v8::Undefined(v8::Isolate::GetCurrent()) -#endif -#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032117) -# define V8_HANDLESCOPE() v8::HandleScope scope -#elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032224) -# define V8_HANDLESCOPE() v8::HandleScope scope(v8::Isolate::GetCurrent()); -#else -# define V8_HANDLESCOPE() v8::HandleScope scope(v8::Isolate::GetCurrent()); -#endif - - -// 'unused' attribute only necessary for GNUC < v3.4 -static /* __attribute__ ((__unused__)) */ V8ErrorHandler V8_ErrorHandler; - - -typedef struct worker_packet { - // -- basic -- - uv_work_t request; - v8::Persistent callback; - // -- persistent variables -- - std::string result; - // -- async operation -- - void (*execute)(std::string&); -} worker_packet; - - -// async process - parallel with node thread -static void work_async(uv_work_t* request) { - worker_packet* packet = static_cast(request->data); - packet->execute(packet->result); - // add a delay for dramatic effect - not necessary -} - - -// send async result back to node's thread -static void work_complete(uv_work_t* request, int status) { - V8_HANDLESCOPE(); - v8::Isolate* iso = v8::Isolate::GetCurrent(); - worker_packet* packet = static_cast(request->data); - const int argc = 1; - v8::Handle argv[] = { - v8::String::NewFromUtf8(iso, packet->result.c_str()) - }; - v8::Local::New(iso, packet->callback)->Call - (iso->GetCurrentContext()->Global(), argc, argv); - packet->callback.Reset(); - delete work; -} - - -static void entry(const V8Arguments& args) { - v8::Isolate* iso = v8::Isolate::GetCurrent(); - v8::Local value = args[0]; - if (!value->IsFunction()) { - V8_ErrorHandler.error((-1), "Invalid parameter type."); - return; +#ifdef SWIG_V8_VERSION /* Engine: Node || V8 */ + + static SwigV8ReturnValue JavaScript_do_work(const SwigV8Arguments &args) { + SWIGV8_HANDLESCOPE(); + const int MY_MAGIC_NUMBER = 5; + v8::Handle jsresult = + SWIG_From_int(static_cast< int >(MY_MAGIC_NUMBER)); + if (args.Length() != 0) + SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments."); + SWIGV8_RETURN(jsresult); + fail: + SWIGV8_RETURN(SWIGV8_UNDEFINED()); } - worker_packet* packet = new worker_packet(); - packet->request.data = packet; - packet->execute = [](std::string& res) { res = "My delayed message."; }; - v8::Local callback = v8::Local::Cast(value); - packet->callback.Reset(iso, callback); - uv_queue_work(uv_default_loop(), &packet->request, - work_async, work_complete); - args.GetReturnValue().Set(Undefined(iso)); -} +#else /* Engine: JavaScriptCore */ -V8ReturnValue JavaScript_exampleV8_callback_function(const V8Arguments& args) { - V8_HANDLESCOPE(); - if (args.Length() != 1) { - V8_ErrorHandler.error((-1), "Illegal number of arguments."); - V8_RETURN(V8_UNDEFINED()); - } - entry(args); - v8::Handle jsresult = V8_UNDEFINED(); - V8_RETURN(jsresult); -} + static JSValueRef JavaScript_do_work(JSContextRef context, + JSObjectRef function, JSObjectRef thisObject, size_t argc, + const JSValueRef argv[], JSValueRef* exception) { + const int MY_MAGIC_NUMBER = 5; + JSValueRef jsresult = + SWIG_From_int SWIG_JSC_FROM_CALL_ARGS( + static_cast< int >(MY_MAGIC_NUMBER)); + if (argc != 0) + SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments."); + return jsresult; + fail: + return JSValueMakeUndefined(context); + } + +#endif %} diff --git a/Examples/test-suite/javascript/native_directive_runme.js b/Examples/test-suite/javascript/native_directive_runme.js new file mode 100644 index 000000000..5c1d69cf1 --- /dev/null +++ b/Examples/test-suite/javascript/native_directive_runme.js @@ -0,0 +1,9 @@ +var native_directive = require("native_directive"); + +(function main() { + var s = "abc.DEF-123"; + if (native_directive.CountAlphas(s) !== 6) + throw "CountAlphas failed"; + if (native_directive.CountAlphaCharacters(s) !== 6) + throw "CountAlphaCharacters failed"; +})(); diff --git a/Examples/test-suite/native_directive.i b/Examples/test-suite/native_directive.i index 39b9856a0..f2699c421 100644 --- a/Examples/test-suite/native_directive.i +++ b/Examples/test-suite/native_directive.i @@ -42,32 +42,58 @@ extern "C" JNIEXPORT jint JNICALL Java_native_1directive_native_1directiveJNI_Co #endif -#if defined(SWIG_V8_VERSION) + +#ifdef SWIGJAVASCRIPT +%native(CountAlphaCharacters) void JavaScript_alpha_count(); %{ -static SwigV8ReturnValue wrap_alpha_count(const SwigV8Arguments &args) { +#ifdef SWIG_V8_VERSION /* engine = node || v8 */ + +static SwigV8ReturnValue JavaScript_alpha_count(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); v8::Handle jsresult; - char *arg1 = (char *) 0 ; - int res1 ; - char *buf1 = 0 ; - int alloc1 = 0 ; + char *arg1 = (char *)0; + int res1; + char *buf1 = 0; + int alloc1 = 0; int result; - if(args.Length() != 1) SWIG_exception_fail(SWIG_ERROR, - "Illegal number of arguments for _wrap_count_characters."); + if(args.Length() != 1) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for _wrap_alpha_count."); res1 = SWIG_AsCharPtrAndSize(args[0], &buf1, NULL, &alloc1); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "count_characters" - "', argument " "1"" of type '" "char const *""'"); - } + if (!SWIG_IsOK(res1)) + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "alpha_count" "', argument " "1"" of type '" "char const *""'"); arg1 = reinterpret_cast< char * >(buf1); - result = (int)count_characters((char const *)arg1); + result = (int)alpha_count((char const *)arg1); jsresult = SWIG_From_int(static_cast< int >(result)); if (alloc1 == SWIG_NEWOBJ) delete[] buf1; SWIGV8_RETURN(jsresult); fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } -%} -%native(CountAlphaCharacters) void wrap_alpha_count(); -#endif + +#else /* engine = jsc */ + +static JSValueRef JavaScript_alpha_count(JSContextRef context, JSObjectRef function, + JSObjectRef thisObject, size_t argc, const JSValueRef argv[], JSValueRef* exception) +{ + char *arg1 = (char *)0; + int res1; + char *buf1 = 0; + int alloc1 = 0; + int result; + JSValueRef jsresult; + if (argc != 1) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments."); + res1 = SWIG_JSC_AsCharPtrAndSize(context, argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "alpha_count" "', argument " "1"" of type '" "char const *""'"); + arg1 = reinterpret_cast< char * >(buf1); + result = (int)alpha_count((char const *)arg1); + jsresult = SWIG_From_int SWIG_JSC_FROM_CALL_ARGS(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return jsresult; +fail: + return JSValueMakeUndefined(context); +} + +#endif /* engine */ +%} +#endif /* SWIGJAVASCRIPT */