From 3e773fc2d8d9d92b25a138b92a19506f1fe2282c Mon Sep 17 00:00:00 2001 From: Mariano Nicolini Date: Tue, 11 Jul 2023 18:59:01 -0300 Subject: [PATCH] Add LoadData test, failing right now --- pkg/vm/memory/memory_test.go | 26 ++++++++++++++++++++++++++ pkg/vm/memory/segments.go | 16 ++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/pkg/vm/memory/memory_test.go b/pkg/vm/memory/memory_test.go index 34fb01d..c9324a0 100644 --- a/pkg/vm/memory/memory_test.go +++ b/pkg/vm/memory/memory_test.go @@ -111,3 +111,29 @@ func TestAddSegment(t *testing.T) { t.Errorf("The number of memory segments should be 4") } } + +func TestLoadData(t *testing.T) { + // Instantiate memory with 3 empty segments + segment1 := []memory.MaybeRelocatable{*memory.NewMaybeRelocatableInt(1), *memory.NewMaybeRelocatableInt(3)} + segment2 := []memory.MaybeRelocatable{*memory.NewMaybeRelocatableInt(7), *memory.NewMaybeRelocatableInt(5)} + memData := [][]memory.MaybeRelocatable{segment1, segment2} + mem := memory.NewMemory(memData) + + // Instantiate MemorySegmentManager + segmentManager := memory.MemorySegmentManager{} + segmentManager.Memory = *mem + + data := []memory.MaybeRelocatable{*memory.NewMaybeRelocatableInt(8), *memory.NewMaybeRelocatableInt(13)} + + startPtr := *memory.NewRelocatable(1, 2) + + endPtr, err := segmentManager.LoadData(startPtr, data) + if err != nil { + t.Errorf("LoadData error: %s", err) + } + + expectedEndPtr := *memory.NewRelocatable(1, 3) + if !reflect.DeepEqual(endPtr, expectedEndPtr) { + t.Errorf("LoadData end pointer and expected pointer are not equal") + } +} diff --git a/pkg/vm/memory/segments.go b/pkg/vm/memory/segments.go index d19a341..7075da1 100644 --- a/pkg/vm/memory/segments.go +++ b/pkg/vm/memory/segments.go @@ -1,5 +1,7 @@ package memory +import "errors" + // MemorySegmentManager manages the list of memory segments. // Also holds metadata useful for the relocation process of // the memory at the end of the VM run. @@ -23,3 +25,17 @@ func (ms *MemorySegmentManager) Add() *Relocatable { return NewRelocatable(addedSegmentIdx, 0) } + +func (ms *MemorySegmentManager) LoadData(ptr Relocatable, data []MaybeRelocatable) (*Relocatable, error) { + dataLen := len(data) + + for i := dataLen; i >= 0; i-- { + insertAddr := NewRelocatable(ptr.SegmentIndex, ptr.Offset + uint(i)) + err := ms.Memory.Insert(insertAddr, &data[i]) + if err != nil { + return nil, errors.New("Insertion error") + } + } + + return NewRelocatable(ptr.SegmentIndex, ptr.Offset + uint(len(data))), nil +}