Skip to content

Commit f15fad2

Browse files
committed
Abstract conversions
1 parent 9db0e0d commit f15fad2

File tree

1 file changed

+76
-139
lines changed

1 file changed

+76
-139
lines changed

source/ports/go_port/source/go_port.go

Lines changed: 76 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
148135
func 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

233162
func 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+
349286
func DestroyUnsafe() {
350287
C.metacall_destroy()
351288
}

0 commit comments

Comments
 (0)