Browse Source

исправил работу guard

kpmy 10 years ago
parent
commit
ac6e994752
3 changed files with 23 additions and 14 deletions
  1. 1 1
      fw.go
  2. 14 2
      rt2/rules/field.go
  3. 8 11
      rt2/rules/guard.go

+ 1 - 1
fw.go

@@ -28,7 +28,7 @@ func close() {
 func main() {
 	flag.Parse()
 	if name == "" {
-		name = "XevDemo11"
+		name = "XevDemo13"
 	}
 	global := &stdDomain{god: true}
 	modList := rtmod.New()

+ 14 - 2
rt2/rules/field.go

@@ -17,8 +17,13 @@ func fieldSeq(in ...IN) (out OUT) {
 	f := in[0].frame
 	n := rt2.NodeOf(f)
 	sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
-	switch l := n.Left().(type) {
-	case node.VariableNode:
+	var left node.Node
+	left, _ = rt2.RegOf(f)[n.Left()].(node.Node)
+	if left == nil {
+		left = n.Left()
+	}
+	switch l := left.(type) {
+	case node.VariableNode, node.ParameterNode:
 		sc.Select(l.Object().Adr(), func(v scope.Value) {
 			rt2.ValueOf(f.Parent())[n.Adr()] = v.(scope.Record).Get(n.Object().Adr())
 		})
@@ -35,6 +40,13 @@ func fieldSeq(in ...IN) (out OUT) {
 			return End()
 		}
 		out.next = LATER
+	case node.GuardNode:
+		rt2.Push(rt2.New(l), f)
+		rt2.Assert(f, func(f frame.Frame) (bool, int) {
+			return rt2.RegOf(f)[n.Left()] != nil, 61
+		})
+		out.next = LATER
+		out.do = fieldSeq
 	default:
 		halt.As(100, reflect.TypeOf(l))
 	}

+ 8 - 11
rt2/rules/guard.go

@@ -5,28 +5,25 @@ import (
 	"fw/cp"
 	"fw/cp/constant"
 	"fw/cp/node"
-	"fw/cp/object"
 	"fw/rt2"
-	//	"fw/rt2/context"
+	"fw/rt2/context"
 	"fw/rt2/frame"
-	//	"fw/rt2/scope"
+	"fw/rt2/scope"
 	"reflect"
 )
 
 func guardSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
-	//	sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
+	sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
 	n := rt2.NodeOf(f).(node.GuardNode)
-	var obj object.Object
+	var obj scope.Value
 	switch l := n.Left().(type) {
-	case node.VariableNode:
-		obj = l.Object()
-	case node.ParameterNode:
-		//		obj = sc.Select(scope.Designator(l)).(object.Object)
+	case node.VariableNode, node.ParameterNode:
+		obj = sc.Select(l.Object().Adr())
 	default:
 		panic(fmt.Sprintln("unsupported left", reflect.TypeOf(l)))
 	}
-	if is(obj, n.Type()) {
-		rt2.DataOf(f.Parent())[n] = n.Left()
+	if scope.GoTypeFrom(scope.Ops.Is(obj, n.Type())).(bool) {
+		rt2.RegOf(f.Parent())[n] = n.Left()
 		return frame.End()
 	} else {
 		trap := node.New(constant.TRAP, int(cp.SomeAdr())).(node.TrapNode)