Skip to content

Commit 4f901d5

Browse files
committed
track only latest error so it doesn't leak
1 parent dacb8fd commit 4f901d5

File tree

4 files changed

+14
-8
lines changed

4 files changed

+14
-8
lines changed

errors.go

+1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ var (
66
ErrRefNotFound = errors.New("HostRef with the given ID is not found in Refs")
77
ErrMemRead = errors.New("Memory.Read is out of bounds")
88
ErrMemWrite = errors.New("Memory.Write is out of bounds")
9+
ErrRefCast = errors.New("Reference returned by Refs.Get is not of the type expected by HostRef")
910
)

store.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ type Store struct {
3939
// Context can be retrieved by the [Context] type.
4040
Context context.Context
4141

42-
// Errors is where all errors happening during [Lift] and [Lower] are pushed.
43-
Errors []error
42+
// Error holds the latest error that happened during [Lift] or [Lower].
43+
Error error
4444
}
4545

4646
// ValueTypes implements [Value] interface.

types_mem.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func (Bytes) Lift(s Store) Bytes {
2828
offset := uint32(s.Stack.Pop())
2929
raw, ok := s.Memory.Read(offset, size)
3030
if !ok {
31-
s.Errors = append(s.Errors, ErrMemRead)
31+
s.Error = ErrMemRead
3232
}
3333
return Bytes{Offset: offset, Raw: raw}
3434
}
@@ -37,7 +37,7 @@ func (Bytes) Lift(s Store) Bytes {
3737
func (v Bytes) Lower(s Store) {
3838
ok := s.Memory.Write(v.Offset, v.Raw)
3939
if !ok {
40-
s.Errors = append(s.Errors, ErrMemWrite)
40+
s.Error = ErrMemWrite
4141
}
4242
size := len(v.Raw)
4343
s.Stack.Push(Raw(v.Offset))
@@ -72,7 +72,7 @@ func (String) Lift(s Store) String {
7272
offset := uint32(s.Stack.Pop())
7373
raw, ok := s.Memory.Read(offset, size)
7474
if !ok {
75-
s.Errors = append(s.Errors, ErrMemRead)
75+
s.Error = ErrMemRead
7676
}
7777
return String{Offset: offset, Raw: string(raw)}
7878
}
@@ -81,7 +81,7 @@ func (String) Lift(s Store) String {
8181
func (v String) Lower(s Store) {
8282
ok := s.Memory.Write(v.Offset, []byte(v.Raw))
8383
if !ok {
84-
s.Errors = append(s.Errors, ErrMemWrite)
84+
s.Error = ErrMemWrite
8585
}
8686
size := len(v.Raw)
8787
s.Stack.Push(Raw(v.Offset))

types_misc.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -295,10 +295,15 @@ func (HostRef[T]) Lift(s Store) HostRef[T] {
295295
var def T
296296
raw, found := s.Refs.Get(index, def)
297297
if !found {
298-
s.Errors = append(s.Errors, ErrRefNotFound)
298+
s.Error = ErrRefNotFound
299+
}
300+
cast, ok := raw.(T)
301+
if found && !ok {
302+
s.Error = ErrRefCast
303+
cast = def
299304
}
300305
return HostRef[T]{
301-
Raw: raw.(T),
306+
Raw: cast,
302307
index: index,
303308
refs: s.Refs,
304309
}

0 commit comments

Comments
 (0)