Jelajahi Sumber

исправил логику работы RETURN теперь он кладет результат в ближайший EnterNode на стеке, так как выход может быть выполнен из любой глубины.
заработали демки с динамическими списками, осталось добиться их корректности

kpmy 10 tahun lalu
induk
melakukan
54655bea6a
3 mengubah file dengan 11 tambahan dan 4 penghapusan
  1. 1 1
      fw.go
  2. 1 1
      rt2/rules2/wrap/eval/do.go
  3. 9 2
      rt2/rules2/wrap/eval/stmt.go

+ 1 - 1
fw.go

@@ -36,7 +36,7 @@ func main() {
 	flag.Parse()
 	utils.Debug(debug)
 	if name == "" {
-		//utils.Debug2(false, true)
+		utils.Debug2(false, false)
 		//name = "XevDemo23"
 		//name = "XevDemo11"
 		//name = "XevDemo12"

+ 1 - 1
rt2/rules2/wrap/eval/do.go

@@ -97,7 +97,7 @@ func GetExpression(in IN, key interface{}, expr node.Node, next Do) OUT {
 			}
 		}
 		v := rt2.RegOf(f)[key]
-		do(v != nil, 1961, key)
+		do(v != nil, 1961, " ", key)
 	})
 	return Later(func(IN) OUT {
 		return Now(next)

+ 9 - 2
rt2/rules2/wrap/eval/stmt.go

@@ -332,8 +332,15 @@ func doReturn(in IN) OUT {
 			val, _ = rt2.RegOf(in.Frame)[context.RETURN].(scope.Value)
 		}
 		assert.For(val != nil, 40)
-		rt2.ValueOf(in.Parent)[r.Object().Adr()] = val
-		rt2.RegOf(in.Parent)[context.RETURN] = val
+		in.Frame.Root().ForEach(func(f frame.Frame) bool {
+			n := rt2.NodeOf(f)
+			_, done := n.(node.EnterNode)
+			if done {
+				rt2.ValueOf(f)[r.Object().Adr()] = val
+				rt2.RegOf(f)[context.RETURN] = val
+			}
+			return !done
+		})
 		return End()
 	})
 }