Skip to content

Commit a02d5fc

Browse files
committed
Abstract fix
1 parent ea0a46a commit a02d5fc

File tree

1 file changed

+55
-45
lines changed

1 file changed

+55
-45
lines changed

source/ports/go_port/source/go_port.go

Lines changed: 55 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"runtime"
1212
"sync"
1313
"unsafe"
14+
"errors"
1415
)
1516

1617
type loadFromFileSafeWork struct {
@@ -135,25 +136,25 @@ func LoadFromFileUnsafe(tag string, scripts []string) error {
135136
}
136137

137138
func 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

166167
func 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

266276
func CAPIValueToGo(value unsafe.Pointer) interface{} {

0 commit comments

Comments
 (0)