summaryrefslogtreecommitdiff
path: root/src/texec
diff options
context:
space:
mode:
authorKyle Gunger <kgunger12@gmail.com>2022-04-09 14:51:42 -0400
committerKyle Gunger <kgunger12@gmail.com>2022-04-09 14:51:42 -0400
commit85bd9dcb9f66c23c17c6590ad5eb56d292f1c0ac (patch)
tree97b87c12c9252b5860fb37ff29db5cb5f56d3a23 /src/texec
parente460546fc40b8e3eb828e77422f26f267ea0d9ef (diff)
[EVAL] Inc/dec
+ Added support for increments and decrements ! Use with caution, might be especially buggy
Diffstat (limited to 'src/texec')
-rw-r--r--src/texec/eval.go25
1 files changed, 13 insertions, 12 deletions
diff --git a/src/texec/eval.go b/src/texec/eval.go
index e1f3752..be02e84 100644
--- a/src/texec/eval.go
+++ b/src/texec/eval.go
@@ -350,6 +350,10 @@ func stripType(t TType, s int) TType {
return TType{t.Pre[s:], t.T, t.Post}
}
+func prependType(t TType, p string) TType {
+ return TType{append(t.Pre, p), t.T, t.Post}
+}
+
// Value generation
func getStringLiteral(v tparse.Node) []interface{} {
@@ -455,14 +459,6 @@ func getLiteralType(v tparse.Node) TType {
}
}
-func typePrepend(t TType, p string) TType {
- return TType{append(t.Pre, p), t.T, t.Post}
-}
-
-func typeStrip(t TType) TType {
- return TType{append([]string{}, t.Pre[1:]...), t.T, t.Post}
-}
-
// Convert Value to Struct from Array (cvsa)
// USE ONLY IN THE CASE OF tStruct!
func cvsa(sct TArtifact, dat []interface{}) VarMap {
@@ -544,7 +540,6 @@ func csts(st TArtifact, dat VarMap) VarMap {
}
func convertValPS(to TType, sk int, dat interface{}) interface{} {
- fmt.Println(to)
if isPointer(to, sk) || equateTypePSO(to, tFile, sk) {
return dat
}
@@ -719,7 +714,6 @@ func isArray(t TType, skp int) bool {
// Deals with call and index nodes
func evalCIN(v tparse.Node, ctx *VarMap, wk *TVariable) *TVariable {
- fmt.Println(v, wk)
if v.Sub[0].Data.Data == "call" {
args := []TVariable{}
@@ -766,11 +760,11 @@ func evalCIN(v tparse.Node, ctx *VarMap, wk *TVariable) *TVariable {
case "index":
ind := convertVal(evalValue(v.Sub[i].Sub[0], ctx), tInt).Data.(int)
wk.Data = &(((*(wk.Data.(*interface{}))).([]interface{}))[ind])
- wk.Type.Pre = wk.Type.Pre[1:]
+ wk.Type = stripType(wk.Type, 1)
case "`":
// De-reference
wk.Data = (*(wk.Data.(*interface{})))
- wk.Type.Pre = wk.Type.Pre[1:]
+ wk.Type = stripType(wk.Type, 1)
}
}
@@ -821,6 +815,10 @@ func evalDotChain(v tparse.Node, ctx *VarMap) *TVariable {
if out == nil {
out = evalCIN(*wnd, ctx, &TVariable{TType{[]string{}, wrk, ""}, nil})
} else {
+ if wnd.Sub[len(wnd.Sub) - 1].Data.Data == "++" || v.Sub[len(wnd.Sub) - 1].Data.Data == "--" {
+ tctx := (*(out.Data.(*interface{}))).(VarMap)
+ return setVal(v, &(tctx), nil)
+ }
out = evalCIN(*wnd, ctx, out)
}
} else if out != nil {
@@ -916,6 +914,9 @@ func evalValue(v tparse.Node, ctx *VarMap) *TVariable {
return &TVariable{t, getLiteral(v, t)}
case tparse.DEFWORD:
if len(v.Sub) > 0 {
+ if v.Sub[len(v.Sub) - 1].Data.Data == "++" || v.Sub[len(v.Sub) - 1].Data.Data == "--" {
+ return setVal(v, ctx, nil)
+ }
ref := evalCIN(v, ctx, nil)
if ref == nil {
return &null