Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit eb6ba90

Browse files
committed
feat: added arguments support for evaluator root
1 parent 4bd1be0 commit eb6ba90

9 files changed

Lines changed: 143 additions & 143 deletions

File tree

cmd/aurora/run.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
var runCmd = &cobra.Command{
1313
Use: "run [file]",
1414
Short: "Run program directly from source code",
15-
Args: cobra.MaximumNArgs(1),
1615
RunE: runRun,
1716
}
1817

@@ -27,9 +26,6 @@ func runRun(cmd *cobra.Command, args []string) error {
2726
return err
2827
}
2928
source := env.AbsPath(env.Profile.Source)
30-
if len(args) > 0 {
31-
source = args[0]
32-
}
3329
var pl *evaluator.Player
3430
if player, _ := cmd.Flags().GetBool("player"); player {
3531
pl = evaluator.NewPlayer(os.Stdin)
@@ -44,5 +40,6 @@ func runRun(cmd *cobra.Command, args []string) error {
4440
Stdin: os.Stdin,
4541
Stdout: ToMainWriter(),
4642
Player: pl,
43+
Args: args,
4744
})
4845
}

evaluator/environ/environ.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,7 @@ func (env *Environ) PushArgument(arg []byte) {
6969
}
7070

7171
func (env *Environ) GetArgument(index uint64) []byte {
72-
args := env.args
73-
if arg, ok := args[index]; ok {
72+
if arg, ok := env.args[index]; ok {
7473
return arg
7574
}
7675
return nil
@@ -82,6 +81,22 @@ func (env *Environ) PrintTable(w io.Writer) {
8281
}
8382
}
8483

84+
func NewWithArgs(args []byte) *Environ {
85+
argsMap := make(map[uint64][]byte, 0)
86+
for i := 0; i < len(args); i += 32 {
87+
argsMap[uint64(i/32)] = args[i : i+32]
88+
}
89+
90+
return &Environ{
91+
args: argsMap,
92+
table: make(map[string][]byte, 0),
93+
scs: make(map[string]*ScopeCallable, 0),
94+
temps: make(map[string][]byte, 0),
95+
ctx: nil,
96+
prev: nil,
97+
}
98+
}
99+
85100
func New(prev *Environ) *Environ {
86101
return &Environ{
87102
args: make(map[uint64][]byte, 0),

evaluator/evaluator.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ type Evaluator struct {
2424
assertErrors []string // Buffer to collect assert errors
2525
echoWriter io.Writer
2626
printWriter io.Writer
27+
args []byte
2728
}
2829

2930
func isTemp(bs []byte) bool {
@@ -503,12 +504,13 @@ type NewEvaluatorOptions struct {
503504
Player *Player
504505
EchoWriter io.Writer
505506
PrintWriter io.Writer
507+
Args []byte
506508
}
507509

508510
func New(options NewEvaluatorOptions) *Evaluator {
509511
return &Evaluator{
510512
player: options.Player,
511-
envpool: environ.NewPool(environ.New(nil)),
513+
envpool: environ.NewPool(environ.NewWithArgs(options.Args)),
512514
cursor: 0,
513515
logger: NewLogger(options.EnableLogging),
514516
insts: make([]emitter.Instruction, 0),
@@ -517,5 +519,6 @@ func New(options NewEvaluatorOptions) *Evaluator {
517519
assertErrors: make([]string, 0),
518520
echoWriter: options.EchoWriter,
519521
printWriter: options.PrintWriter,
522+
args: options.Args,
520523
}
521524
}

examples/evm/calc.ar

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
ident sum = {
2-
arguments 0 + arguments 1;
3-
};
1+
print arguments 0 + arguments 1;
2+
3+
print 1 + 2;

internal/cli/args.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package cli
2+
3+
import (
4+
"math/big"
5+
"strings"
6+
7+
"github.com/guiferpa/aurora/byteutil"
8+
)
9+
10+
// ParseArgs encodes each argument as a 32-byte ABI word, inferring type from the string:
11+
// - bool: "true" / "false" (case-insensitive) → 0 or 1 right-padded to 32 bytes
12+
// - number: decimal ("42") or hex ("0x2a") → uint256 big-endian
13+
// - string: anything else; use "" for empty string; quoted strings have quotes stripped
14+
func ParseArgs(args []string) []byte {
15+
data := make([]byte, 0)
16+
for _, arg := range args {
17+
data = append(data, parseArg(arg)...)
18+
}
19+
return data
20+
}
21+
22+
func parseArg(arg string) []byte {
23+
// bool
24+
switch strings.ToLower(strings.TrimSpace(arg)) {
25+
case "true":
26+
return byteutil.Padding32Bytes([]byte{1})
27+
case "false":
28+
return byteutil.Padding32Bytes([]byte{0})
29+
}
30+
// number (decimal or 0x-prefixed hex)
31+
if n := parseNumber(arg); n != nil {
32+
b := make([]byte, 32)
33+
nb := n.Bytes()
34+
if len(nb) > 32 {
35+
copy(b, nb[len(nb)-32:])
36+
} else {
37+
copy(b[32-len(nb):], nb)
38+
}
39+
return b
40+
}
41+
// string (strip surrounding double quotes; "" → empty)
42+
s := strings.TrimSpace(arg)
43+
if strings.HasPrefix(s, `"`) && strings.HasSuffix(s, `"`) && len(s) >= 2 {
44+
s = s[1 : len(s)-1]
45+
}
46+
return byteutil.Padding32Bytes([]byte(s))
47+
}
48+
49+
func parseNumber(s string) *big.Int {
50+
s = strings.TrimSpace(s)
51+
if strings.HasPrefix(s, "0x") || strings.HasPrefix(s, "0X") {
52+
n := new(big.Int)
53+
if _, ok := n.SetString(s[2:], 16); !ok {
54+
return nil
55+
}
56+
return n
57+
}
58+
n := new(big.Int)
59+
if _, ok := n.SetString(s, 10); !ok {
60+
return nil
61+
}
62+
return n
63+
}

internal/cli/args_test.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package cli
2+
3+
import (
4+
"bytes"
5+
"testing"
6+
7+
"github.com/guiferpa/aurora/byteutil"
8+
)
9+
10+
func TestParseArgs(t *testing.T) {
11+
cases := []struct {
12+
Args []string
13+
ExpectedFn func() []byte
14+
}{
15+
{
16+
Args: []string{"true", "false"},
17+
ExpectedFn: func() []byte {
18+
// bool: 1 and 0 right-padded to 32 bytes
19+
tr := byteutil.Padding32Bytes([]byte{1})
20+
fa := byteutil.Padding32Bytes([]byte{0})
21+
return append(tr, fa...)
22+
},
23+
},
24+
{
25+
Args: []string{"42", "0x2a"},
26+
ExpectedFn: func() []byte {
27+
// number 42 as uint256 big-endian (decimal and hex)
28+
word := make([]byte, 32)
29+
word[31] = 42
30+
return append(word, word...)
31+
},
32+
},
33+
{
34+
Args: []string{`""`},
35+
ExpectedFn: func() []byte {
36+
return byteutil.Padding32Bytes([]byte{}) // empty string
37+
},
38+
},
39+
{
40+
Args: []string{`"hello"`},
41+
ExpectedFn: func() []byte {
42+
return byteutil.Padding32Bytes([]byte("hello"))
43+
},
44+
},
45+
}
46+
for _, c := range cases {
47+
got := ParseArgs(c.Args)
48+
expected := c.ExpectedFn()
49+
if !bytes.Equal(got, expected) {
50+
t.Errorf("ParseArgs(%q): got %v (%d), expected: %v (%d)", c.Args, byteutil.ToHexBloom(got), len(got), byteutil.ToHexBloom(expected), len(expected))
51+
}
52+
}
53+
}

internal/cli/call.go

Lines changed: 0 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ package cli
33
import (
44
"context"
55
"fmt"
6-
"math/big"
7-
"strings"
86

97
"github.com/ethereum/go-ethereum"
108
"github.com/ethereum/go-ethereum/common"
@@ -26,69 +24,6 @@ func EncodeSelector(selector string) []byte {
2624
return byteutil.Padding32Bytes(crypto.Keccak256([]byte(selector)))
2725
}
2826

29-
func EncodeArgs(args []string) []byte {
30-
data := make([]byte, 0)
31-
for _, arg := range args {
32-
data = append(data, byteutil.Padding32Bytes([]byte(arg))...)
33-
}
34-
return data
35-
}
36-
37-
// ParseArgs encodes each argument as a 32-byte ABI word, inferring type from the string:
38-
// - bool: "true" / "false" (case-insensitive) → 0 or 1 right-padded to 32 bytes
39-
// - number: decimal ("42") or hex ("0x2a") → uint256 big-endian
40-
// - string: anything else; use "" for empty string; quoted strings have quotes stripped
41-
func ParseArgs(args []string) []byte {
42-
data := make([]byte, 0)
43-
for _, arg := range args {
44-
data = append(data, parseArg(arg)...)
45-
}
46-
return data
47-
}
48-
49-
func parseArg(arg string) []byte {
50-
// bool
51-
switch strings.ToLower(strings.TrimSpace(arg)) {
52-
case "true":
53-
return byteutil.Padding32Bytes([]byte{1})
54-
case "false":
55-
return byteutil.Padding32Bytes([]byte{0})
56-
}
57-
// number (decimal or 0x-prefixed hex)
58-
if n := parseNumber(arg); n != nil {
59-
b := make([]byte, 32)
60-
nb := n.Bytes()
61-
if len(nb) > 32 {
62-
copy(b, nb[len(nb)-32:])
63-
} else {
64-
copy(b[32-len(nb):], nb)
65-
}
66-
return b
67-
}
68-
// string (strip surrounding double quotes; "" → empty)
69-
s := strings.TrimSpace(arg)
70-
if strings.HasPrefix(s, `"`) && strings.HasSuffix(s, `"`) && len(s) >= 2 {
71-
s = s[1 : len(s)-1]
72-
}
73-
return byteutil.Padding32Bytes([]byte(s))
74-
}
75-
76-
func parseNumber(s string) *big.Int {
77-
s = strings.TrimSpace(s)
78-
if strings.HasPrefix(s, "0x") || strings.HasPrefix(s, "0X") {
79-
n := new(big.Int)
80-
if _, ok := n.SetString(s[2:], 16); !ok {
81-
return nil
82-
}
83-
return n
84-
}
85-
n := new(big.Int)
86-
if _, ok := n.SetString(s, 10); !ok {
87-
return nil
88-
}
89-
return n
90-
}
91-
9227
// Call performs an eth_call and prints the result.
9328
func Call(ctx context.Context, in CallInput) error {
9429
selector := EncodeSelector(in.Function)

internal/cli/call_test.go

Lines changed: 0 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -66,71 +66,3 @@ func TestEncodeSelector(t *testing.T) {
6666
}
6767
}
6868
}
69-
70-
func TestEncodeArgs(t *testing.T) {
71-
cases := []struct {
72-
Args []string
73-
ExpectedFn func() []byte
74-
}{
75-
{
76-
Args: []string{"1", "2", "3"},
77-
ExpectedFn: func() []byte {
78-
data := byteutil.Padding32Bytes([]byte("1"))
79-
data = append(data, byteutil.Padding32Bytes([]byte("2"))...)
80-
data = append(data, byteutil.Padding32Bytes([]byte("3"))...)
81-
return data
82-
},
83-
},
84-
}
85-
for _, c := range cases {
86-
got := EncodeArgs(c.Args)
87-
if expected := c.ExpectedFn(); !bytes.Equal(got, expected) {
88-
t.Errorf("Unexpected args: got %v (%d), expected: %v (%d)", byteutil.ToHexBloom(got), len(got), byteutil.ToHexBloom(expected), len(expected))
89-
}
90-
}
91-
}
92-
93-
func TestParseArgs(t *testing.T) {
94-
cases := []struct {
95-
Args []string
96-
ExpectedFn func() []byte
97-
}{
98-
{
99-
Args: []string{"true", "false"},
100-
ExpectedFn: func() []byte {
101-
// bool: 1 and 0 right-padded to 32 bytes
102-
tr := byteutil.Padding32Bytes([]byte{1})
103-
fa := byteutil.Padding32Bytes([]byte{0})
104-
return append(tr, fa...)
105-
},
106-
},
107-
{
108-
Args: []string{"42", "0x2a"},
109-
ExpectedFn: func() []byte {
110-
// number 42 as uint256 big-endian (decimal and hex)
111-
word := make([]byte, 32)
112-
word[31] = 42
113-
return append(word, word...)
114-
},
115-
},
116-
{
117-
Args: []string{`""`},
118-
ExpectedFn: func() []byte {
119-
return byteutil.Padding32Bytes([]byte{}) // empty string
120-
},
121-
},
122-
{
123-
Args: []string{`"hello"`},
124-
ExpectedFn: func() []byte {
125-
return byteutil.Padding32Bytes([]byte("hello"))
126-
},
127-
},
128-
}
129-
for _, c := range cases {
130-
got := ParseArgs(c.Args)
131-
expected := c.ExpectedFn()
132-
if !bytes.Equal(got, expected) {
133-
t.Errorf("ParseArgs(%q): got %v (%d), expected: %v (%d)", c.Args, byteutil.ToHexBloom(got), len(got), byteutil.ToHexBloom(expected), len(expected))
134-
}
135-
}
136-
}

internal/cli/run.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ type RunInput struct {
2020
Stdin io.Reader
2121
Stdout io.Writer // used for both Echo and Print
2222
Player *evaluator.Player
23+
Args []string
2324
}
2425

2526
// Run compiles and evaluates the Aurora source at Source.
@@ -55,6 +56,7 @@ func Run(ctx context.Context, in RunInput) error {
5556
EnableLogging: slices.Contains(in.Loggers, "evaluator"),
5657
EchoWriter: in.Stdout,
5758
PrintWriter: in.Stdout,
59+
Args: ParseArgs(in.Args),
5860
})
5961
if in.Player != nil {
6062
ev.SetPlayer(in.Player)

0 commit comments

Comments
 (0)