Minsky
node-api.cc
Go to the documentation of this file.
1 /*
2  @copyright Steve Keen 2021
3  @author Russell Standish
4  This file is part of Minsky.
5 
6  Minsky is free software: you can redistribute it and/or modify it
7  under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  Minsky is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with Minsky. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 /* A DelayLoad implementation for Windows. Because we're using Mingw,
21  not MSVC, we cannot use the declspec(dllimport) and /DELAYLOAD
22  mechanism, so instead we provide stubs here that delegate to the
23  exported functions in node.exe */
24 
25 #include "node_api.h"
26 #include <windows.h>
27 #include <iostream>
28 
29 static HINSTANCE nodeExe=GetModuleHandle(nullptr);
30 
31 extern "C"
32 {
33 
34 #define NAPIFN(name,arg_decls,args) \
35  napi_status name arg_decls \
36  { \
37  static auto symbol=(decltype(name)*)GetProcAddress(nodeExe, #name); \
38  return symbol? symbol args: napi_invalid_arg; \
39  } \
40 
41 #define VOID_NAPIFN(name,arg_decls,args) \
42  void name arg_decls \
43  { \
44  static auto symbol=(decltype(name)*)GetProcAddress(nodeExe, #name); \
45  if (symbol) symbol args; \
46  } \
47 
48 
49 
50  NAPIFN(napi_create_array, (napi_env env, napi_value* result), (env,result));
51 
52  NAPIFN(napi_create_function, (napi_env env, const char* utf8name, size_t length,
53  napi_callback cb, void* data, napi_value* result),
54  (env,utf8name,length,cb,data,result));
55 
56  NAPIFN(napi_create_object, (napi_env env, napi_value* result), (env,result));
57 
58  NAPIFN(napi_add_finalizer, (napi_env env, napi_value js_object, void* native_object,
59  napi_finalize finalize_cb, void* finalize_hint, napi_ref* result),
60  (env,js_object,native_object,finalize_cb,finalize_hint,result));
61 
62  NAPIFN(napi_create_string_utf8,
63  (napi_env env, const char* str, size_t length, napi_value* result),
64  (env,str,length,result));
65 
66  NAPIFN(napi_create_string_utf16,
67  (napi_env env, const char16_t* str, size_t length, napi_value* result),
68  (env,str,length,result));
69 
70  NAPIFN(napi_set_property,
71  (napi_env env, napi_value object, napi_value key,napi_value value),
72  (env,object,key,value));
73 
74  NAPIFN(napi_create_type_error,
75  (napi_env env, napi_value code, napi_value msg, napi_value* result),
76  (env,code,msg,result));
77 
78  NAPIFN(napi_create_reference,
79  (napi_env env,napi_value value, uint32_t initial_refcount,napi_ref* result),
80  (env,value,initial_refcount,result));
81 
82  NAPIFN(napi_delete_reference, (napi_env env, napi_ref ref), (env,ref));
83 
84  NAPIFN(napi_get_reference_value, (napi_env env, napi_ref ref, napi_value* result),
85  (env,ref,result));
86 
87  NAPIFN(napi_open_handle_scope, (napi_env env, napi_handle_scope* result),(env,result));
88  NAPIFN(napi_close_handle_scope, (napi_env env, napi_handle_scope scope), (env,scope));
89 
90  NAPIFN(napi_throw, (napi_env env, napi_value error),(env,error));
91 
92  NAPIFN(napi_get_undefined,(napi_env env, napi_value* result), (env,result));
93  NAPIFN(napi_get_null, (napi_env env, napi_value* result), (env,result));
94 
95  NAPIFN(napi_typeof,(napi_env env,napi_value value,napi_valuetype* result),
96  (env,value,result));
97 
98  NAPIFN(napi_get_boolean, (napi_env env,bool value, napi_value* result),(env,value,result));
99 
100  NAPIFN(napi_get_value_uint32,(napi_env env,napi_value value,uint32_t* result),
101  (env,value,result));
102  NAPIFN(napi_get_value_int32,(napi_env env,napi_value value,int32_t* result),
103  (env,value,result));
104 
105  NAPIFN(napi_async_destroy, (napi_env env, napi_async_context async_context), (env,async_context));
106 
107  VOID_NAPIFN(napi_fatal_error, (const char* location, size_t location_len,
108  const char* message, size_t message_len),
109  (location,location_len,message,message_len));
110 
111  NAPIFN(napi_close_callback_scope, (napi_env env, napi_callback_scope scope),(env,scope));
112 
113  NAPIFN(napi_get_last_error_info, (napi_env env,const napi_extended_error_info** result),(env,result));
114 
115  NAPIFN(napi_is_exception_pending,(napi_env env, bool* result),(env,result));
116 
117  NAPIFN(napi_get_and_clear_last_exception,(napi_env env, napi_value* result),(env,result));
118 
119  NAPIFN(napi_create_error, (napi_env env, napi_value code, napi_value msg, napi_value* result),
120  (env,code,msg,result));
121 
122  NAPIFN(napi_get_cb_info, (napi_env env, napi_callback_info cbinfo, size_t* argc,
123  napi_value* argv, napi_value* this_arg, void** data),
124  (env,cbinfo,argc,argv,this_arg,data));
125 
126  NAPIFN(napi_open_escapable_handle_scope, (napi_env env, napi_escapable_handle_scope* result),
127  (env,result));
128  NAPIFN(napi_close_escapable_handle_scope, (napi_env env, napi_escapable_handle_scope scope), (env,scope));
129 
130  NAPIFN(napi_escape_handle,(napi_env env, napi_escapable_handle_scope scope, napi_value escapee,
131  napi_value* result),(env,scope,escapee,result));
132 
133  NAPIFN(napi_get_named_property,(napi_env env, napi_value object, const char* utf8name,
134  napi_value* result),(env,object,utf8name,result));
135 
136  NAPIFN(napi_get_value_string_utf8, (napi_env env, napi_value value, char* buf,size_t bufsize,
137  size_t* result), (env,value,buf,bufsize,result));
138  NAPIFN(napi_call_function, (napi_env env, napi_value recv, napi_value func,size_t argc,
139  const napi_value* argv,napi_value* result),
140  (env,recv,func,argc,argv,result));
141 
142  VOID_NAPIFN(napi_module_register, (napi_module* mod), (mod));
143 
144  NAPIFN(napi_coerce_to_string,(napi_env env,napi_value value,napi_value* result),(env,value,result));
145 
146  NAPIFN(napi_set_element, (napi_env env, napi_value object,uint32_t index, napi_value value),
147  (env,object,index,value));
148 
149 
150  NAPIFN(napi_get_instance_data, (napi_env env, void** data),(env,data));
151 
152  NAPIFN(napi_create_threadsafe_function, (napi_env env,
153  napi_value func,
154  napi_value async_resource,
155  napi_value async_resource_name,
156  size_t max_queue_size,
157  size_t initial_thread_count,
158  void* thread_finalize_data,
159  napi_finalize thread_finalize_cb,
160  void* context,
161  napi_threadsafe_function_call_js call_js_cb,
162  napi_threadsafe_function* result),
163  (env,func,async_resource,async_resource_name,max_queue_size,initial_thread_count,thread_finalize_data,thread_finalize_cb,context,call_js_cb,result));
164 
165  NAPIFN(napi_create_promise, (napi_env env,
166  napi_deferred* deferred,
167  napi_value* promise),
168  (env,deferred,promise));
169 
170  NAPIFN(napi_define_properties, (napi_env env,
171  napi_value object,
172  size_t property_count,
173  const napi_property_descriptor* properties),
174  (env,object,property_count,properties));
175 
176  NAPIFN(napi_set_instance_data, (napi_env env,
177  void* data,
178  napi_finalize finalize_cb,
179  void* finalize_hint),
180  (env,data,finalize_cb,finalize_hint));
181 
182  NAPIFN(napi_create_double, (napi_env env,
183  double value,
184  napi_value* result),
185  (env,value,result));
186 
187  NAPIFN(napi_resolve_deferred, (napi_env env,
188  napi_deferred deferred,
189  napi_value resolution),
190  (env,deferred,resolution));
191 
192  NAPIFN(napi_reject_deferred, (napi_env env,
193  napi_deferred deferred,
194  napi_value rejection),
195  (env,deferred,rejection));
196 
197  NAPIFN(napi_call_threadsafe_function,
198  (napi_threadsafe_function func,
199  void* data,
200  napi_threadsafe_function_call_mode is_blocking),
201  (func,data,is_blocking));
202  NAPIFN(napi_add_env_cleanup_hook, (napi_env env, void (*fun)(void* arg), void* arg), (env,fun,arg));
203 
204  NAPIFN(napi_has_property, (napi_env env, napi_value object, napi_value key, bool* result),
205  (env, object, key, result));
206 
207  NAPIFN(napi_get_property,(napi_env env, napi_value object, napi_value key, napi_value* result),
208  (env, object, key, result));
209 }
210 
211 
size_t scope(const string &name)
extract scope from a qualified variable name
Definition: valueId.cc:83
#define VOID_NAPIFN(name, arg_decls, args)
Definition: node-api.cc:41
#define NAPIFN(name, arg_decls, args)
Definition: node-api.cc:34
std::string str(T x)
utility function to create a string representation of a numeric type
Definition: str.h:33
static HINSTANCE nodeExe
Definition: node-api.cc:29