1 /* 2 * Copyright (c) 2012 Joyent, Inc. All rights reserved. 3 */ 4 5 #ifndef _V8PLUS_IMPL_H 6 #define _V8PLUS_IMPL_H 7 8 #include <sys/ccompile.h> 9 #include <stdarg.h> 10 #include <libnvpair.h> 11 #include <v8.h> 12 #include <uv.h> 13 #include <queue> 14 #include <unordered_map> 15 #include "v8plus_glue.h" 16 17 /* 18 * STOP! 19 * 20 * Do not #include this header in code that consumes v8+. This is a private 21 * implementation header for use by v8+ internal C++ code. It cannot be 22 * included from C code and contains nothing usable by consumers. 23 */ 24 25 #define V8PLUS_THROW(_t, _e, _f, _args...) \ 26 v8::ThrowException(v8plus::exception((_t), (_e), (_f), ## _args)) 27 #define V8PLUS_THROW_DEFAULT() V8PLUS_THROW(NULL, NULL, NULL) 28 #define V8PLUS_THROW_DECORATED(_e) V8PLUS_THROW(NULL, (_e), NULL) 29 30 #if NODE_MINOR_VERSION > 7 || NODE_MAJOR_VERSION > 0 31 #define NODE_MAKECALLBACK_RETURN 32 #endif 33 34 typedef struct v8plus_async_call { 35 void *ac_cop; 36 const char *ac_name; 37 const nvlist_t *ac_lp; 38 39 pthread_cond_t ac_cv; 40 pthread_mutex_t ac_mtx; 41 42 boolean_t ac_run; 43 nvlist_t *ac_return; 44 } v8plus_async_call_t; 45 46 extern "C" void v8plus_async_callback(uv_async_t *, int); 47 48 namespace v8plus { 49 50 51 class ObjectWrap; 52 53 class ObjectWrap : public node::ObjectWrap { 54 public: 55 static void init(v8::Handle<v8::Object>); 56 static v8::Handle<v8::Value> cons(const v8::Arguments &); 57 static ObjectWrap *objlookup(const void *); 58 v8::Handle<v8::Value> call(const char *, int, v8::Handle<v8::Value>[]); 59 void public_Ref(void); 60 void public_Unref(void); 61 static v8plus_async_call_t *next_async_call(void); 62 static void post_async_call(v8plus_async_call_t *); 63 static boolean_t in_event_thread(void); 64 65 private: 66 static v8::Persistent<v8::Function> _constructor; 67 static v8plus_method_descr_t *_mtbl; 68 static v8plus_static_descr_t *_stbl; 69 static std::unordered_map<void *, ObjectWrap *> _objhash; 70 void *_c_impl; 71 72 static uv_async_t _uv_async; 73 static pthread_mutex_t _callq_mutex; 74 static std::queue<v8plus_async_call_t *> _callq; 75 static boolean_t _crossthread_init_done; 76 static unsigned long _uv_event_thread; 77 78 ObjectWrap() : _c_impl(NULL) {}; 79 ~ObjectWrap(); 80 81 static v8::Handle<v8::Value> _new(const v8::Arguments &); 82 static v8::Handle<v8::Value> _entry(const v8::Arguments &); 83 static v8::Handle<v8::Value> _static_entry(const v8::Arguments &); 84 }; 85 86 extern nvlist_t *v8_Arguments_to_nvlist(const v8::Arguments &); 87 extern v8::Handle<v8::Value> nvpair_to_v8_Value(const nvpair_t *); 88 extern v8::Local<v8::Value> exception(const char *, const nvlist_t *, 89 const char *, ...) __PRINTFLIKE(3); 90 91 }; /* namespace v8plus */ 92 93 #endif /* _V8PLUS_IMPL_H */