@@ -46,9 +46,10 @@ type Bridge struct {
46
46
name string
47
47
instance wasmer.Instance
48
48
exitCode int
49
- values [] interface {}
50
- valuesMu sync. RWMutex
49
+ valueIDX int
50
+ valueMap map [ int ] interface {}
51
51
refs map [interface {}]int
52
+ valuesMu sync.RWMutex
52
53
memory []byte
53
54
exited bool
54
55
cancF context.CancelFunc
@@ -80,6 +81,7 @@ func BridgeFromBytes(name string, bytes []byte, imports *wasmer.Imports) (*Bridg
80
81
inst .SetContextData (ctx )
81
82
b .addValues ()
82
83
b .refs = make (map [interface {}]int )
84
+ b .valueIDX = 8
83
85
return b , nil
84
86
}
85
87
@@ -100,13 +102,13 @@ func (b *Bridge) addValues() {
100
102
}),
101
103
"_pendingEvent" : nil ,
102
104
})
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 {
110
112
props : map [string ]interface {}{
111
113
"Object" : & object {name : "Object" , new : func (args []interface {}) interface {} {
112
114
return & object {name : "ObjectInner" , props : map [string ]interface {}{}}
@@ -197,10 +199,10 @@ func (b *Bridge) addValues() {
197
199
}),
198
200
},
199
201
}, //global
200
- propObject ("mem" , map [string ]interface {}{
202
+ 6 : propObject ("mem" , map [string ]interface {}{
201
203
"buffer" : & buffer {data : b .mem ()}},
202
204
),
203
- goObj , // jsGo
205
+ 7 : goObj , // jsGo
204
206
}
205
207
}
206
208
@@ -341,7 +343,7 @@ func (b *Bridge) loadValue(addr int32) interface{} {
341
343
b .valuesMu .RLock ()
342
344
defer b .valuesMu .RUnlock ()
343
345
344
- return b .values [ b .getUint32 (addr )]
346
+ return b .valueMap [ int ( b .getUint32 (addr ) )]
345
347
}
346
348
347
349
func (b * Bridge ) storeValue (addr int32 , v interface {}) {
@@ -402,9 +404,10 @@ func (b *Bridge) storeValue(addr int32, v interface{}) {
402
404
ref , ok := b .refs [v ]
403
405
if ! ok {
404
406
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
407
409
b .refs [v ] = ref
410
+ b .valueIDX ++
408
411
b .valuesMu .RUnlock ()
409
412
}
410
413
@@ -472,7 +475,7 @@ type funcWrapper struct {
472
475
473
476
func (b * Bridge ) makeFuncWrapper (id , this interface {}, args * []interface {}) (interface {}, error ) {
474
477
b .valuesMu .RLock ()
475
- goObj := b .values [7 ].(* object )
478
+ goObj := b .valueMap [7 ].(* object )
476
479
b .valuesMu .RUnlock ()
477
480
event := propObject ("_pendingEvent" , map [string ]interface {}{
478
481
"id" : id ,
@@ -492,12 +495,12 @@ func (b *Bridge) makeFuncWrapper(id, this interface{}, args *[]interface{}) (int
492
495
func (b * Bridge ) CallFunc (fn string , args []interface {}) (interface {}, error ) {
493
496
b .check ()
494
497
b .valuesMu .RLock ()
495
- fw , ok := b .values [5 ].(* object ).props [fn ]
498
+ fw , ok := b .valueMap [5 ].(* object ).props [fn ]
496
499
if ! ok {
497
500
return nil , fmt .Errorf ("missing function: %v" , fn )
498
501
}
499
502
500
- this := b .values [7 ]
503
+ this := b .valueMap [7 ]
501
504
b .valuesMu .RUnlock ()
502
505
503
506
return b .makeFuncWrapper (fw .(* funcWrapper ).id , this , & args )
@@ -506,7 +509,7 @@ func (b *Bridge) CallFunc(fn string, args []interface{}) (interface{}, error) {
506
509
func (b * Bridge ) SetFunc (fname string , fn Func ) error {
507
510
b .valuesMu .RLock ()
508
511
defer b .valuesMu .RUnlock ()
509
- b .values [5 ].(* object ).props [fname ] = & fn
512
+ b .valueMap [5 ].(* object ).props [fname ] = & fn
510
513
return nil
511
514
}
512
515
0 commit comments