Skip to content

Commit

Permalink
feat(MemcpyEnterScope): enters a new scope for the memory copy operat…
Browse files Browse the repository at this point in the history
…on with a specified length (#372)

* feat(MemcpyEnterScope): enters a new scope for the memory copy operation with a specified length

* fix: addressing review comments

* adding unit test for memcpy hint

* fix lint issue plus and rename hint code to memcpyEnterScopeCode

* rename hint to newMemcpyEnterScopeHint

* fix: memcpy hint as new hint

* fix order of codes
  • Loading branch information
Alvarodb committed May 1, 2024
1 parent b2602ab commit 44af84b
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 3 deletions.
7 changes: 4 additions & 3 deletions pkg/hintrunner/zero/hintcode.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@ const (
// ------ Dictionaries hints related code ------

// ------ Other hints related code ------
allocSegmentCode string = "memory[ap] = segments.add()"
vmEnterScopeCode string = "vm_enter_scope()"
vmExitScopeCode string = "vm_exit_scope()"
allocSegmentCode string = "memory[ap] = segments.add()"
memcpyEnterScopeCode string = "vm_enter_scope({'n': ids.len})"
vmEnterScopeCode string = "vm_enter_scope()"
vmExitScopeCode string = "vm_exit_scope()"
)
2 changes: 2 additions & 0 deletions pkg/hintrunner/zero/zerohint.go
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,8 @@ func GetHintFromCode(program *zero.ZeroProgram, rawHint zero.Hint, hintPC uint64
return createAllocSegmentHinter(resolver)
case vmEnterScopeCode:
return createVMEnterScopeHinter(resolver)
case memcpyEnterScopeCode:
return createMemcpyEnterScopeHinter(resolver)
case vmExitScopeCode:
return createVMExitScopeHinter(resolver)
case testAssignCode:
Expand Down
23 changes: 23 additions & 0 deletions pkg/hintrunner/zero/zerohint_memcpy.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,29 @@ func createVMEnterScopeHinter(resolver hintReferenceResolver) (hinter.Hinter, er
}, nil
}

func newMemcpyEnterScopeHint(len hinter.ResOperander) hinter.Hinter {
return &GenericZeroHinter{
Name: "MemcpyEnterScope",
Op: func(vm *VM.VirtualMachine, ctx *hinter.HintRunnerContext) error {
//> vm_enter_scope({'n': ids.len})
len, err := hinter.ResolveAsFelt(vm, len)
if err != nil {
return err
}
ctx.ScopeManager.EnterScope(map[string]any{"n": len})
return nil
},
}
}

func createMemcpyEnterScopeHinter(resolver hintReferenceResolver) (hinter.Hinter, error) {
len, err := resolver.GetResOperander("len")
if err != nil {
return nil, err
}
return newMemcpyEnterScopeHint(len), nil
}

func createVMExitScopeHinter(resolver hintReferenceResolver) (hinter.Hinter, error) {
return &GenericZeroHinter{
Name: "VMExitScope",
Expand Down
27 changes: 27 additions & 0 deletions pkg/hintrunner/zero/zerohint_memcpy_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package zero

import (
"testing"

"github.com/NethermindEth/cairo-vm-go/pkg/hintrunner/hinter"
)

func TestZeroHintMemcpy(t *testing.T) {

runHinterTests(t, map[string][]hintTestCase{
"MemcpyEnterScope": {
{
operanders: []*hintOperander{
{Name: "len", Kind: apRelative, Value: feltUint64(1)},
},
ctxInit: func(ctx *hinter.HintRunnerContext) {
hinter.InitializeScopeManager(ctx, map[string]any{})
},
makeHinter: func(ctx *hintTestContext) hinter.Hinter {
return newMemcpyEnterScopeHint(ctx.operanders["len"])
},
check: varValueInScopeEquals("n", feltUint64(1)),
},
},
})
}

0 comments on commit 44af84b

Please sign in to comment.