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 <unordered_map>
13 #include "v8plus_glue.h"
14
15 /*
16 * STOP!
17 *
18 * Do not #include this header in code that consumes v8+. This is a private
19 * implementation header for use by v8+ internal C++ code. It cannot be
20 * included from C code and contains nothing usable by consumers.
21 */
22
23 #define V8PLUS_THROW(_t, _e, _f, _args...) \
24 v8::ThrowException(v8plus::exception((_t), (_e), (_f), ## _args))
25 #define V8PLUS_THROW_DEFAULT() V8PLUS_THROW(NULL, NULL, NULL)
26 #define V8PLUS_THROW_DECORATED(_e) V8PLUS_THROW(NULL, (_e), NULL)
27
28 #if NODE_MINOR_VERSION > 7 || NODE_MAJOR_VERSION > 0
29 #define NODE_MAKECALLBACK_RETURN
30 #endif
31
32 namespace v8plus {
33
34 class ObjectWrap;
35
36 class ObjectWrap : public node::ObjectWrap {
37 public:
38 static void init(v8::Handle<v8::Object>);
39 static v8::Handle<v8::Value> cons(const v8::Arguments &);
40 static ObjectWrap *objlookup(const void *);
41 v8::Handle<v8::Value> call(const char *, int, v8::Handle<v8::Value>[]);
42 void public_Ref(void);
43 void public_Unref(void);
44
45 private:
46 static v8::Persistent<v8::Function> _constructor;
47 static v8plus_method_descr_t *_mtbl;
48 static v8plus_static_descr_t *_stbl;
49 static std::unordered_map<void *, ObjectWrap *> _objhash;
50 void *_c_impl;
51
52 ObjectWrap() : _c_impl(NULL) {};
53 ~ObjectWrap();
54
55 static v8::Handle<v8::Value> _new(const v8::Arguments &);
56 static v8::Handle<v8::Value> _entry(const v8::Arguments &);
57 static v8::Handle<v8::Value> _static_entry(const v8::Arguments &);
58 };
59
60 extern nvlist_t *v8_Arguments_to_nvlist(const v8::Arguments &);
61 extern v8::Handle<v8::Value> nvpair_to_v8_Value(const nvpair_t *);
62 extern v8::Local<v8::Value> exception(const char *, const nvlist_t *,
63 const char *, ...) __PRINTFLIKE(3);
64
65 }; /* namespace v8plus */
66
67 #endif /* _V8PLUS_IMPL_H */
|
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 */
|