Skip to content

Commit 0072b5c

Browse files
committed
use maps for the values
1 parent ff4ee89 commit 0072b5c

File tree

1 file changed

+21
-18
lines changed

1 file changed

+21
-18
lines changed

bridge.go

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,10 @@ type Bridge struct {
4646
name string
4747
instance wasmer.Instance
4848
exitCode int
49-
values []interface{}
50-
valuesMu sync.RWMutex
49+
valueIDX int
50+
valueMap map[int]interface{}
5151
refs map[interface{}]int
52+
valuesMu sync.RWMutex
5253
memory []byte
5354
exited bool
5455
cancF context.CancelFunc
@@ -80,6 +81,7 @@ func BridgeFromBytes(name string, bytes []byte, imports *wasmer.Imports) (*Bridg
8081
inst.SetContextData(ctx)
8182
b.addValues()
8283
b.refs = make(map[interface{}]int)
84+
b.valueIDX = 8
8385
return b, nil
8486
}
8587

@@ -100,13 +102,13 @@ func (b *Bridge) addValues() {
100102
}),
101103
"_pendingEvent": nil,
102104
})
103-
b.values = []interface{}{
104-
math.NaN(),
105-
float64(0),
106-
nil,
107-
true,
108-
false,
109-
&object{
105+
b.valueMap = map[int]interface{}{
106+
0: math.NaN(),
107+
1: float64(0),
108+
2: nil,
109+
3: true,
110+
4: false,
111+
5: &object{
110112
props: map[string]interface{}{
111113
"Object": &object{name: "Object", new: func(args []interface{}) interface{} {
112114
return &object{name: "ObjectInner", props: map[string]interface{}{}}
@@ -197,10 +199,10 @@ func (b *Bridge) addValues() {
197199
}),
198200
},
199201
}, //global
200-
propObject("mem", map[string]interface{}{
202+
6: propObject("mem", map[string]interface{}{
201203
"buffer": &buffer{data: b.mem()}},
202204
),
203-
goObj, // jsGo
205+
7: goObj, // jsGo
204206
}
205207
}
206208

@@ -341,7 +343,7 @@ func (b *Bridge) loadValue(addr int32) interface{} {
341343
b.valuesMu.RLock()
342344
defer b.valuesMu.RUnlock()
343345

344-
return b.values[b.getUint32(addr)]
346+
return b.valueMap[int(b.getUint32(addr))]
345347
}
346348

347349
func (b *Bridge) storeValue(addr int32, v interface{}) {
@@ -402,9 +404,10 @@ func (b *Bridge) storeValue(addr int32, v interface{}) {
402404
ref, ok := b.refs[v]
403405
if !ok {
404406
b.valuesMu.RLock()
405-
ref = len(b.values)
406-
b.values = append(b.values, v)
407+
b.valueMap[b.valueIDX] = v
408+
ref = b.valueIDX
407409
b.refs[v] = ref
410+
b.valueIDX++
408411
b.valuesMu.RUnlock()
409412
}
410413

@@ -472,7 +475,7 @@ type funcWrapper struct {
472475

473476
func (b *Bridge) makeFuncWrapper(id, this interface{}, args *[]interface{}) (interface{}, error) {
474477
b.valuesMu.RLock()
475-
goObj := b.values[7].(*object)
478+
goObj := b.valueMap[7].(*object)
476479
b.valuesMu.RUnlock()
477480
event := propObject("_pendingEvent", map[string]interface{}{
478481
"id": id,
@@ -492,12 +495,12 @@ func (b *Bridge) makeFuncWrapper(id, this interface{}, args *[]interface{}) (int
492495
func (b *Bridge) CallFunc(fn string, args []interface{}) (interface{}, error) {
493496
b.check()
494497
b.valuesMu.RLock()
495-
fw, ok := b.values[5].(*object).props[fn]
498+
fw, ok := b.valueMap[5].(*object).props[fn]
496499
if !ok {
497500
return nil, fmt.Errorf("missing function: %v", fn)
498501
}
499502

500-
this := b.values[7]
503+
this := b.valueMap[7]
501504
b.valuesMu.RUnlock()
502505

503506
return b.makeFuncWrapper(fw.(*funcWrapper).id, this, &args)
@@ -506,7 +509,7 @@ func (b *Bridge) CallFunc(fn string, args []interface{}) (interface{}, error) {
506509
func (b *Bridge) SetFunc(fname string, fn Func) error {
507510
b.valuesMu.RLock()
508511
defer b.valuesMu.RUnlock()
509-
b.values[5].(*object).props[fname] = &fn
512+
b.valueMap[5].(*object).props[fname] = &fn
510513
return nil
511514
}
512515

0 commit comments

Comments
 (0)