/* File : example.i */
%module example

// placeholder() used to help SWIG generate "SWIG_From_int" call
%{
    int placeholder();
%}
int placeholder() { return 0; }

// actual demo code
%wrapper
%{
#if defined(SWIG_V8_VERSION) /* Engine: Node || V8 */
    
    static SwigV8ReturnValue JavaScript_do_work(const SwigV8Arguments &args) {
        SWIGV8_HANDLESCOPE();
        const int MY_MAGIC_NUMBER = 5;
        SWIGV8_VALUE 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());
    }

#elif defined(NAPI_VERSION) /* Engine: NAPI */

    static Napi::Value JavaScript_do_work(const Napi::CallbackInfo &args) {
        Napi::Env env = args.Env();
        Napi::EscapableHandleScope scope(env);
        const int MY_MAGIC_NUMBER = 5;
        Napi::Value jsresult =
            SWIG_From_int(env, static_cast< int >(MY_MAGIC_NUMBER));
        if (args.Length() != 0)
            SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments.");
        return scope.Escape(jsresult);
    fail:
        return Napi::Value();
    }

#else /* Engine: JavaScriptCore */

    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
%}


%native(magicNumber) void JavaScript_do_work();
