Skip to content

Commit f0515af

Browse files
committed
Add support for array in go loader.
1 parent be7d134 commit f0515af

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

source/ports/go_port/source/go_port.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,19 @@ func valueToGo(value unsafe.Pointer) interface{} {
408408
{
409409
return C.GoString(C.metacall_value_to_string(value))
410410
}
411+
case C.METACALL_ARRAY:
412+
{
413+
arrayValue := C.metacall_value_to_array(value)
414+
arraySize := C.metacall_value_count(value)
415+
array := make([]interface{}, arraySize)
416+
417+
for iterator := C.size_t(0); iterator < arraySize; iterator++ {
418+
currentValue := (*unsafe.Pointer)(unsafe.Pointer(uintptr(unsafe.Pointer(arrayValue))+uintptr(iterator*PtrSizeInBytes)))
419+
array[iterator] = valueToGo(*currentValue)
420+
}
421+
422+
return array
423+
}
411424

412425
// TODO: Add more types
413426
}

source/ports/go_port/source/go_port_test.go

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,47 @@ func TestMock(t *testing.T) {
4848
}
4949
}
5050

51-
func TestNodeJS(t *testing.T) {
51+
func TestNodeJSArray(t *testing.T) {
52+
buffer := "module.exports = { g: () => [0, 1, 2] }"
53+
54+
if err := LoadFromMemory("node", buffer); err != nil {
55+
t.Fatal(err)
56+
return
57+
}
58+
59+
array, err := Call("g")
60+
61+
if err != nil {
62+
t.Fatal(err)
63+
return
64+
}
65+
66+
iArray := array.([]interface{})
67+
68+
if len(iArray) != 3 {
69+
t.Fatal("Invalid size of array")
70+
return
71+
}
72+
73+
for i := 0; i < len(iArray); i++ {
74+
switch iArray[i].(type) {
75+
case float64:
76+
{
77+
if iArray[i] != float64(i) {
78+
t.Fatalf("Invalid value of array at position %d: %f (current) != %f (expected)", i, iArray[i], float64(i))
79+
return
80+
}
81+
}
82+
default:
83+
{
84+
t.Fatalf("Invalid type of array at position %d", i)
85+
return
86+
}
87+
}
88+
}
89+
}
90+
91+
func TestNodeJSAwait(t *testing.T) {
5292
buffer := "module.exports = { f: async (ms) => await new Promise(resolve => setTimeout(resolve, ms)) }"
5393

5494
if err := LoadFromMemory("node", buffer); err != nil {

0 commit comments

Comments
 (0)