Skip to content

Commit ae0ac08

Browse files
committed
Copy CallAwaitUnsafe from CallUnsafe
1 parent 0c9310d commit ae0ac08

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed

source/ports/go_port/source/go_port.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
137221
func CallUnsafe(function string, args ...interface{}) (interface{}, error) {
138222

139223
cFunction := C.CString(function)

0 commit comments

Comments
 (0)