@@ -132,151 +132,46 @@ func LoadFromFileUnsafe(tag string, scripts []string) error {
132132 return nil
133133}
134134
135- func LoadFromFile (tag string , scripts []string ) error {
136- result := make (chan error , 1 )
137- w := loadFromFileSafeWork {
138- tag ,
139- scripts ,
140- result ,
141- }
142- wg .Add (1 )
143- queue <- w
144-
145- return <- result
146- }
147-
148135func CallAwaitUnsafe (function string , args ... interface {}) (interface {}, error ) {
149-
150136 cFunction := C .CString (function )
151137 defer C .free (unsafe .Pointer (cFunction ))
152-
153138 cFunc := C .metacall_function (cFunction )
154-
155139 if cFunc == nil {
156140 return nil , fmt .Errorf ("function %s not found" , function )
157141 }
158142
159- size := len (args )
160-
161- cArgs := C .malloc (C .size_t (size ) * C .size_t (unsafe .Sizeof (uintptr (0 ))))
162- defer C .free (unsafe .Pointer (cArgs ))
163-
164- for index , arg := range args {
165- cArg := (* unsafe .Pointer )(unsafe .Pointer (uintptr (unsafe .Pointer (cArgs )) + uintptr (index )* PtrSizeInBytes ))
166-
167- // Create int
168- if i , ok := arg .(int ); ok {
169- * cArg = C .metacall_value_create_int ((C .int )(i ))
170- }
171-
172- // Create float32
173- if i , ok := arg .(float32 ); ok {
174- * cArg = C .metacall_value_create_float ((C .float )(i ))
175- }
176-
177- // Create float64
178- if i , ok := arg .(float64 ); ok {
179- * cArg = C .metacall_value_create_double ((C .double )(i ))
180- }
181-
182- // Create string
183- if str , ok := arg .(string ); ok {
184- cStr := C .CString (str )
185- defer C .free (unsafe .Pointer (cStr ))
186- * cArg = C .metacall_value_create_string (cStr , (C .size_t )(len (str )))
187- }
188-
189- // TODO: Other types ...
190- }
191-
143+ cArgs := GoArgsToCAPI (args )
144+ defer C .free (cArgs )
192145 defer (func () {
193146 for index , _ := range args {
194- cArg := (* unsafe .Pointer )(unsafe .Pointer (uintptr (unsafe . Pointer ( cArgs ) ) + uintptr (index )* PtrSizeInBytes ))
147+ cArg := (* unsafe .Pointer )(unsafe .Pointer (uintptr (cArgs ) + uintptr (index )* PtrSizeInBytes ))
195148 C .metacall_value_destroy (* cArg )
196149 }
197150 })()
198151
199- //ret := C.metacallfv(cFunc, (*unsafe.Pointer)(cArgs))
200- ret := C .metacallfv_await (cFunc , (* unsafe .Pointer )(cArgs ))
152+ ret := C .metacallfv_await (cFunc , (* unsafe .Pointer )(cArgs )) // todo
201153
202154 if ret != nil {
203155 defer C .metacall_value_destroy (ret )
204-
205- switch C .metacall_value_id (unsafe .Pointer (ret )) {
206- case C .METACALL_INT :
207- {
208- return int (C .metacall_value_to_int (unsafe .Pointer (ret ))), nil
209- }
210-
211- case C .METACALL_FLOAT :
212- {
213- return float32 (C .metacall_value_to_float (unsafe .Pointer (ret ))), nil
214- }
215-
216- case C .METACALL_DOUBLE :
217- {
218- return float64 (C .metacall_value_to_double (unsafe .Pointer (ret ))), nil
219- }
220-
221- case C .METACALL_STRING :
222- {
223- return C .GoString (C .metacall_value_to_string (unsafe .Pointer (ret ))), nil
224- }
225-
226- // TODO: Other types ...
227- }
156+ return CAPIValueToGo (ret ), nil
228157 }
229158
230159 return nil , nil
231160}
232161
233162func CallUnsafe (function string , args ... interface {}) (interface {}, error ) {
234-
235163 cFunction := C .CString (function )
236164 defer C .free (unsafe .Pointer (cFunction ))
237-
238165 cFunc := C .metacall_function (cFunction )
239-
240166 if cFunc == nil {
241167 return nil , fmt .Errorf ("function %s not found" , function )
242168 }
243169
244- size := len (args )
245-
246- cArgs := C .malloc (C .size_t (size ) * C .size_t (unsafe .Sizeof (uintptr (0 ))))
247- defer C .free (unsafe .Pointer (cArgs ))
248-
249- for index , arg := range args {
250- cArg := (* unsafe .Pointer )(unsafe .Pointer (uintptr (unsafe .Pointer (cArgs )) + uintptr (index )* PtrSizeInBytes ))
251-
252- // Create int
253- if i , ok := arg .(int ); ok {
254- * cArg = C .metacall_value_create_int ((C .int )(i ))
255- }
256-
257- // Create float32
258- if i , ok := arg .(float32 ); ok {
259- * cArg = C .metacall_value_create_float ((C .float )(i ))
260- }
261-
262- // Create float64
263- if i , ok := arg .(float64 ); ok {
264- * cArg = C .metacall_value_create_double ((C .double )(i ))
265- }
266-
267- // Create string
268- if str , ok := arg .(string ); ok {
269- cStr := C .CString (str )
270- defer C .free (unsafe .Pointer (cStr ))
271- * cArg = C .metacall_value_create_string (cStr , (C .size_t )(len (str )))
272- }
273-
274- // TODO: Other types ...
275- }
276-
170+ cArgs := GoArgsToCAPI (args )
171+ defer C .free (cArgs )
277172 defer (func () {
278173 for index , _ := range args {
279- cArg := (* unsafe .Pointer )(unsafe .Pointer (uintptr (unsafe . Pointer ( cArgs ) ) + uintptr (index )* PtrSizeInBytes ))
174+ cArg := (* unsafe .Pointer )(unsafe .Pointer (uintptr (cArgs ) + uintptr (index )* PtrSizeInBytes ))
280175 C .metacall_value_destroy (* cArg )
281176 }
282177 })()
@@ -285,30 +180,7 @@ func CallUnsafe(function string, args ...interface{}) (interface{}, error) {
285180
286181 if ret != nil {
287182 defer C .metacall_value_destroy (ret )
288-
289- switch C .metacall_value_id (unsafe .Pointer (ret )) {
290- case C .METACALL_INT :
291- {
292- return int (C .metacall_value_to_int (unsafe .Pointer (ret ))), nil
293- }
294-
295- case C .METACALL_FLOAT :
296- {
297- return float32 (C .metacall_value_to_float (unsafe .Pointer (ret ))), nil
298- }
299-
300- case C .METACALL_DOUBLE :
301- {
302- return float64 (C .metacall_value_to_double (unsafe .Pointer (ret ))), nil
303- }
304-
305- case C .METACALL_STRING :
306- {
307- return C .GoString (C .metacall_value_to_string (unsafe .Pointer (ret ))), nil
308- }
309-
310- // TODO: Other types ...
311- }
183+ return CAPIValueToGo (ret ), nil
312184 }
313185
314186 return nil , nil
@@ -330,8 +202,8 @@ func Call(function string, args ...interface{}) (interface{}, error) {
330202 return result .value , result .err
331203}
332204
333- // CallAsync sends asynchronous work and blocks until it's processed
334- func CallAsync (function string , args ... interface {}) (interface {}, error ) {
205+ // Await sends asynchronous work and blocks until it's processed
206+ func Await (function string , args ... interface {}) (interface {}, error ) {
335207 ret := make (chan callReturnSafeWork , 1 )
336208 w := callSafeAsyncWork {
337209 function : function ,
@@ -346,6 +218,71 @@ func CallAsync(function string, args ...interface{}) (interface{}, error) {
346218 return result .value , result .err
347219}
348220
221+ func GoArgsToCAPI (Args ... interface {}) unsafe.Pointer {
222+ size := len (Args )
223+ cArgs := C .malloc (C .size_t (size ) * C .size_t (unsafe .Sizeof (uintptr (0 ))))
224+ for index , arg := range Args {
225+ cArg := (* unsafe .Pointer )(unsafe .Pointer (uintptr (unsafe .Pointer (cArgs )) + uintptr (index )* PtrSizeInBytes ))
226+ if i , ok := arg .(int ); ok {
227+ * cArg = C .metacall_value_create_int ((C .int )(i ))
228+ }
229+ if i , ok := arg .(float32 ); ok {
230+ * cArg = C .metacall_value_create_float ((C .float )(i ))
231+ }
232+ if i , ok := arg .(float64 ); ok {
233+ * cArg = C .metacall_value_create_double ((C .double )(i ))
234+ }
235+ if str , ok := arg .(string ); ok {
236+ cStr := C .CString (str )
237+ defer C .free (unsafe .Pointer (cStr ))
238+ * cArg = C .metacall_value_create_string (cStr , (C .size_t )(len (str )))
239+ }
240+
241+ // ...
242+ }
243+ return cArgs
244+ }
245+
246+ func CAPIValueToGo (value unsafe.Pointer ) interface {} {
247+ switch C .metacall_value_id (value ) {
248+ case C .METACALL_INT :
249+ {
250+ return int (C .metacall_value_to_int (value ))
251+ }
252+
253+ case C .METACALL_FLOAT :
254+ {
255+ return float32 (C .metacall_value_to_float (value ))
256+ }
257+
258+ case C .METACALL_DOUBLE :
259+ {
260+ return float64 (C .metacall_value_to_double (value ))
261+ }
262+
263+ case C .METACALL_STRING :
264+ {
265+ return C .GoString (C .metacall_value_to_string (value ))
266+ }
267+
268+ // ...
269+ }
270+ return nil
271+ }
272+
273+ func LoadFromFile (tag string , scripts []string ) error {
274+ result := make (chan error , 1 )
275+ w := loadFromFileSafeWork {
276+ tag ,
277+ scripts ,
278+ result ,
279+ }
280+ wg .Add (1 )
281+ queue <- w
282+
283+ return <- result
284+ }
285+
349286func DestroyUnsafe () {
350287 C .metacall_destroy ()
351288}
0 commit comments