@@ -11,6 +11,7 @@ import (
1111 "runtime"
1212 "sync"
1313 "unsafe"
14+ "errors"
1415)
1516
1617type loadFromFileSafeWork struct {
@@ -135,25 +136,25 @@ func LoadFromFileUnsafe(tag string, scripts []string) error {
135136}
136137
137138func CallAwaitUnsafe (function string , ResolveCallback , RejectCallBack func (unsafe.Pointer , unsafe.Pointer ), args ... interface {}) (interface {}, error ) {
138- cFunction := C .CString (function )
139- defer C .free (unsafe .Pointer (cFunction ))
140- cFunc := C .metacall_function (cFunction )
141- if cFunc == nil {
142- return nil , fmt .Errorf ("function %s not found" , function )
139+ cFunc , err := StringToCFunc (function )
140+ if err != nil {
141+ return nil , err
143142 }
144143
145- cArgs := GoArgsToCAPI (args )
146- defer C .free (cArgs )
147- defer (func () {
144+ cArgs := C .malloc (C .size_t (len (args )) * C .size_t (unsafe .Sizeof (uintptr (0 ))))
145+ for index , arg := range args {
146+ GoArgToCAPI (arg , (* unsafe .Pointer )(unsafe .Pointer (uintptr (unsafe .Pointer (cArgs )) + uintptr (index )* PtrSizeInBytes )))
147+ }
148+ defer C .free (unsafe .Pointer (cArgs ))
149+ defer func (){
148150 for index , _ := range args {
149- cArg := (* unsafe .Pointer )(unsafe .Pointer (uintptr (cArgs ) + uintptr (index )* PtrSizeInBytes ))
150- C .metacall_value_destroy (* cArg )
151+ C .metacall_value_destroy (* (* unsafe .Pointer )(unsafe .Pointer (uintptr (unsafe .Pointer (cArgs )) + uintptr (index )* PtrSizeInBytes )))
151152 }
152- }) ()
153+ }()
153154
154155 var Context interface {} // undefined
155156
156- ret := C .metacallfv_await (cFunc , (* unsafe .Pointer )(cArgs ), * unsafe .Pointer (& ResolveCallback ), * unsafe .Pointer (& RejectCallBack ), & Context )
157+ ret := C .metacallfv_await (cFunc , (* unsafe .Pointer )(cArgs ), unsafe .Pointer (& ResolveCallback ), unsafe .Pointer (& RejectCallBack ), unsafe . Pointer ( & Context ) )
157158
158159 if ret != nil {
159160 defer C .metacall_value_destroy (ret )
@@ -164,21 +165,21 @@ func CallAwaitUnsafe(function string, ResolveCallback, RejectCallBack func(unsaf
164165}
165166
166167func CallUnsafe (function string , args ... interface {}) (interface {}, error ) {
167- cFunction := C .CString (function )
168- defer C .free (unsafe .Pointer (cFunction ))
169- cFunc := C .metacall_function (cFunction )
170- if cFunc == nil {
171- return nil , fmt .Errorf ("function %s not found" , function )
168+ cFunc , err := StringToCFunc (function )
169+ if err != nil {
170+ return nil , err
172171 }
173172
174- cArgs := GoArgsToCAPI (args )
175- defer C .free (cArgs )
176- defer (func () {
173+ cArgs := C .malloc (C .size_t (len (args )) * C .size_t (unsafe .Sizeof (uintptr (0 ))))
174+ for index , arg := range args {
175+ GoArgToCAPI (arg , (* unsafe .Pointer )(unsafe .Pointer (uintptr (unsafe .Pointer (cArgs )) + uintptr (index )* PtrSizeInBytes )))
176+ }
177+ defer C .free (unsafe .Pointer (cArgs ))
178+ defer func (){
177179 for index , _ := range args {
178- cArg := (* unsafe .Pointer )(unsafe .Pointer (uintptr (cArgs ) + uintptr (index )* PtrSizeInBytes ))
179- C .metacall_value_destroy (* cArg )
180+ C .metacall_value_destroy (* (* unsafe .Pointer )(unsafe .Pointer (uintptr (unsafe .Pointer (cArgs )) + uintptr (index )* PtrSizeInBytes )))
180181 }
181- }) ()
182+ }()
182183
183184 ret := C .metacallfv (cFunc , (* unsafe .Pointer )(cArgs ))
184185
@@ -219,7 +220,7 @@ func Await(function string, args ...interface{}) (interface{}, error) {
219220
220221 Reject := func (pointer unsafe.Pointer , pointer2 unsafe.Pointer ) {
221222 // todo
222-
223+
223224 }
224225
225226 w := callSafeAsyncWork {
@@ -238,29 +239,38 @@ func Await(function string, args ...interface{}) (interface{}, error) {
238239 return result .value , result .err
239240}
240241
241- func GoArgsToCAPI (Args ... interface {}) unsafe.Pointer {
242- size := len (Args )
243- cArgs := C .malloc (C .size_t (size ) * C .size_t (unsafe .Sizeof (uintptr (0 ))))
244- for index , arg := range Args {
245- cArg := (* unsafe .Pointer )(unsafe .Pointer (uintptr (unsafe .Pointer (cArgs )) + uintptr (index )* PtrSizeInBytes ))
246- if i , ok := arg .(int ); ok {
247- * cArg = C .metacall_value_create_int ((C .int )(i ))
248- }
249- if i , ok := arg .(float32 ); ok {
250- * cArg = C .metacall_value_create_float ((C .float )(i ))
251- }
252- if i , ok := arg .(float64 ); ok {
253- * cArg = C .metacall_value_create_double ((C .double )(i ))
254- }
255- if str , ok := arg .(string ); ok {
256- cStr := C .CString (str )
257- defer C .free (unsafe .Pointer (cStr ))
258- * cArg = C .metacall_value_create_string (cStr , (C .size_t )(len (str )))
259- }
242+ func StringToCFunc (FString string ) (unsafe.Pointer , error ) {
243+ cFunction := C .CString (FString )
244+ defer C .free (unsafe .Pointer (cFunction ))
245+ cFunc := C .metacall_function (cFunction )
246+ if cFunc == nil {
247+ return nil , errors .New ("function %s not found: " + FString )
248+ }
249+ return cFunc , nil
250+ }
260251
261- // ...
252+ func GoArgToCAPI (Arg interface {}, Ptr * unsafe.Pointer ) {
253+ // Create int
254+ if i , ok := Arg .(int ); ok {
255+ * Ptr = C .metacall_value_create_int ((C .int )(i ))
256+ }
257+
258+ // Create float32
259+ if i , ok := Arg .(float32 ); ok {
260+ * Ptr = C .metacall_value_create_float ((C .float )(i ))
261+ }
262+
263+ // Create float64
264+ if i , ok := Arg .(float64 ); ok {
265+ * Ptr = C .metacall_value_create_double ((C .double )(i ))
266+ }
267+
268+ // Create string
269+ if str , ok := Arg .(string ); ok {
270+ cStr := C .CString (str )
271+ defer C .free (unsafe .Pointer (cStr ))
272+ * Ptr = C .metacall_value_create_string (cStr , (C .size_t )(len (str )))
262273 }
263- return cArgs
264274}
265275
266276func CAPIValueToGo (value unsafe.Pointer ) interface {} {
0 commit comments