@@ -134,6 +134,90 @@ func LoadFromFile(tag string, scripts []string) error {
134134 return <- result
135135}
136136
137+ func CallAwaitUnsafe (function string , args ... interface {}) (interface {}, error ) {
138+
139+ cFunction := C .CString (function )
140+ defer C .free (unsafe .Pointer (cFunction ))
141+
142+ cFunc := C .metacall_function (cFunction )
143+
144+ if cFunc == nil {
145+ return nil , fmt .Errorf ("function %s not found" , function )
146+ }
147+
148+ size := len (args )
149+
150+ cArgs := C .malloc (C .size_t (size ) * C .size_t (unsafe .Sizeof (uintptr (0 ))))
151+ defer C .free (unsafe .Pointer (cArgs ))
152+
153+ for index , arg := range args {
154+ cArg := (* unsafe .Pointer )(unsafe .Pointer (uintptr (unsafe .Pointer (cArgs )) + uintptr (index )* PtrSizeInBytes ))
155+
156+ // Create int
157+ if i , ok := arg .(int ); ok {
158+ * cArg = C .metacall_value_create_int ((C .int )(i ))
159+ }
160+
161+ // Create float32
162+ if i , ok := arg .(float32 ); ok {
163+ * cArg = C .metacall_value_create_float ((C .float )(i ))
164+ }
165+
166+ // Create float64
167+ if i , ok := arg .(float64 ); ok {
168+ * cArg = C .metacall_value_create_double ((C .double )(i ))
169+ }
170+
171+ // Create string
172+ if str , ok := arg .(string ); ok {
173+ cStr := C .CString (str )
174+ defer C .free (unsafe .Pointer (cStr ))
175+ * cArg = C .metacall_value_create_string (cStr , (C .size_t )(len (str )))
176+ }
177+
178+ // TODO: Other types ...
179+ }
180+
181+ defer (func () {
182+ for index , _ := range args {
183+ cArg := (* unsafe .Pointer )(unsafe .Pointer (uintptr (unsafe .Pointer (cArgs )) + uintptr (index )* PtrSizeInBytes ))
184+ C .metacall_value_destroy (* cArg )
185+ }
186+ })()
187+
188+ ret := C .metacallfv (cFunc , (* unsafe .Pointer )(cArgs ))
189+
190+ if ret != nil {
191+ defer C .metacall_value_destroy (ret )
192+
193+ switch C .metacall_value_id (unsafe .Pointer (ret )) {
194+ case C .METACALL_INT :
195+ {
196+ return int (C .metacall_value_to_int (unsafe .Pointer (ret ))), nil
197+ }
198+
199+ case C .METACALL_FLOAT :
200+ {
201+ return float32 (C .metacall_value_to_float (unsafe .Pointer (ret ))), nil
202+ }
203+
204+ case C .METACALL_DOUBLE :
205+ {
206+ return float64 (C .metacall_value_to_double (unsafe .Pointer (ret ))), nil
207+ }
208+
209+ case C .METACALL_STRING :
210+ {
211+ return C .GoString (C .metacall_value_to_string (unsafe .Pointer (ret ))), nil
212+ }
213+
214+ // TODO: Other types ...
215+ }
216+ }
217+
218+ return nil , nil
219+ }
220+
137221func CallUnsafe (function string , args ... interface {}) (interface {}, error ) {
138222
139223 cFunction := C .CString (function )
0 commit comments