summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorMarc Vertes <marc.vertes@tendermint.com>2023-07-24 14:20:45 +0200
committerGitHub <noreply@github.com>2023-07-24 14:20:45 +0200
commit355750be61fbf4b90d132a9560e01113f22f4c38 (patch)
treea63850914481d2450e20604424dd25a0d97ba8a5 /cmd
parentbf32256ff3014543ef5dda69c4ee1e94d01361fe (diff)
vm1: add file pos for debug and a few immediate instructions (#4)
* vm1: add file pos for debug and a few immediate instructions `op[0]` is now reserved for storing the file position computed at code compiling. No impact on performances. Added `Subi` and `Infi` which use integer immediate argument instead of stack. Experimental. Improves `fib()` speed by ~ 20%. * vm1: add benchmark as proposed by @ajnavarro
Diffstat (limited to 'cmd')
-rw-r--r--cmd/gint/main.go39
1 files changed, 36 insertions, 3 deletions
diff --git a/cmd/gint/main.go b/cmd/gint/main.go
index 44f59ac..b36eb5d 100644
--- a/cmd/gint/main.go
+++ b/cmd/gint/main.go
@@ -1,11 +1,15 @@
package main
import (
+ "fmt"
"log"
"os"
+ "github.com/gnolang/parscan/codegen"
"github.com/gnolang/parscan/lang/golang"
+ "github.com/gnolang/parscan/parser"
"github.com/gnolang/parscan/vm0"
+ "github.com/gnolang/parscan/vm1"
)
func main() {
@@ -14,12 +18,18 @@ func main() {
if err != nil {
log.Fatal(err)
}
- if err := runSrc(string(buf)); err != nil {
- log.Fatal(err)
+ if len(os.Args) > 1 {
+ if err := run1(string(buf)); err != nil {
+ log.Fatal(err)
+ }
+ } else {
+ if err := run0(string(buf)); err != nil {
+ log.Fatal(err)
+ }
}
}
-func runSrc(src string) error {
+func run0(src string) error {
i := vm0.New(golang.GoParser)
nodes, err := i.Parse(src)
if err != nil {
@@ -33,3 +43,26 @@ func runSrc(src string) error {
}
return nil
}
+
+func run1(src string) (err error) {
+ m := &vm1.Machine{}
+ c := &codegen.Compiler{Symbols: map[string]int{}}
+ c.AddSym(fmt.Println, "println")
+ n := &parser.Node{}
+ if n.Child, err = golang.GoParser.Parse(src); err != nil {
+ return err
+ }
+ n.Dot(os.Getenv("DOT"), "")
+ if err = c.CodeGen(n); err != nil {
+ return err
+ }
+ c.Emit(n, vm1.Exit)
+ log.Println("data:", c.Data)
+ log.Println("code:", vm1.Disas(c.Code))
+ for _, v := range c.Data {
+ m.Push(v)
+ }
+ m.PushCode(c.Code)
+ m.Run()
+ return
+}