1
0
Эх сурвалжийг харах

ура, заработало

kpmy 10 жил өмнө
parent
commit
b4af6ef636
2 өөрчлөгдсөн 57 нэмэгдсэн , 19 устгасан
  1. 45 19
      rt2/rules/call.go
  2. 12 0
      rt2/scope/modern/val.go

+ 45 - 19
rt2/rules/call.go

@@ -12,7 +12,9 @@ import (
 	"fw/rt2/frame"
 	rt_mod "fw/rt2/module"
 	"fw/rt2/scope"
+	"reflect"
 	"ypk/assert"
+	"ypk/halt"
 )
 
 /**
@@ -24,7 +26,7 @@ import (
 	.Right() указывает на узлы, которые передаются в параметры
 */
 
-var sys map[string]func(f frame.Frame, par node.Node)
+var sys map[string]func(f frame.Frame, par node.Node) (frame.Sequence, frame.WAIT)
 
 type Msg struct {
 	Type string
@@ -49,36 +51,61 @@ func callHandler(f frame.Frame, obj object.Object, data interface{}) {
 	rt2.Push(rt2.New(cn), f)
 }
 
-func process(f frame.Frame, par node.Node) {
+func process(f frame.Frame, par node.Node) (frame.Sequence, frame.WAIT) {
 	assert.For(par != nil, 20)
 	sm := f.Domain().Discover(context.SCOPE).(scope.Manager)
-	switch par.(type) {
-	case node.ConstantNode:
-		msg := &Msg{}
-		val := par.(node.ConstantNode).Data().(string)
-		if err := json.Unmarshal([]byte(val), msg); err == nil {
-			switch msg.Type {
-			case "log":
-				fmt.Println(msg.Data)
-				callHandler(f, scope.FindObjByName(sm, "go_handler"), `{"type":"log"}`)
-			default:
-				panic(40)
+	do := func(val string) {
+		if val != "" {
+			msg := &Msg{}
+			if err := json.Unmarshal([]byte(val), msg); err == nil {
+				switch msg.Type {
+				case "log":
+					fmt.Println(msg.Data)
+					callHandler(f, scope.FindObjByName(sm, "go_handler"), `{"type":"log"}`)
+				default:
+					panic(40)
+				}
+			} else {
+				fmt.Println(val, "not a json")
 			}
 		}
+	}
+	var val string
+	switch p := par.(type) {
+	case node.ConstantNode:
+		val = par.(node.ConstantNode).Data().(string)
+		do(val)
+		return frame.Tail(frame.STOP), frame.LATER
+	case node.VariableNode, node.ParameterNode:
+		val = scope.GoTypeFrom(sm.Select(p.Object().Adr())).(string)
+		do(val)
+		return frame.Tail(frame.STOP), frame.LATER
+	case node.DerefNode:
+		rt2.Push(rt2.New(p), f)
+		return This(expectExpr(f, p, func(...IN) (out OUT) {
+			v := rt2.ValueOf(f)[p.Adr()]
+			assert.For(v != nil, 60)
+			val = scope.GoTypeFrom(v).(string)
+			do(val)
+			out.do = Tail(STOP)
+			out.next = LATER
+			return out
+		}))
 	default:
-		panic(fmt.Sprintln("unsupported param"))
+		halt.As(100, "unsupported param", reflect.TypeOf(p))
 	}
+	panic(0)
 }
 
 func init() {
-	sys = make(map[string]func(f frame.Frame, par node.Node))
+	sys = make(map[string]func(f frame.Frame, par node.Node) (frame.Sequence, frame.WAIT))
 	sys["go_process"] = process
 }
 
-func syscall(f frame.Frame) {
+func syscall(f frame.Frame) (frame.Sequence, frame.WAIT) {
 	n := rt2.NodeOf(f)
 	name := n.Left().Object().Name()
-	sys[name](f, n.Right())
+	return sys[name](f, n.Right())
 }
 
 func callSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
@@ -137,8 +164,7 @@ func callSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 			name := n.Left().Object().Name()
 			switch {
 			case name == "go_process":
-				syscall(f)
-				return frame.Tail(frame.STOP), frame.LATER
+				return syscall(f)
 			default:
 				panic(fmt.Sprintln("unknown sysproc variable", name))
 			}

+ 12 - 0
rt2/scope/modern/val.go

@@ -467,6 +467,18 @@ func gfrom(v scope.Value) interface{} {
 		}
 	case *proc:
 		return n.link
+	case *dynarr:
+		switch n.link.Complex().(object.DynArrayType).Base() {
+		case object.SHORTCHAR:
+			if n.val != nil {
+				return n.String()
+			} else {
+				return ""
+			}
+		default:
+			halt.As(100, n.link.Complex().(object.DynArrayType).Base())
+		}
+		panic(0)
 	case INTEGER:
 		return int32(n)
 	case BOOLEAN: