12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- package rules
- import (
- "fw/cp/node"
- "fw/cp/object"
- "fw/rt2"
- "fw/rt2/context"
- "fw/rt2/frame"
- "fw/rt2/scope"
- "reflect"
- "ypk/assert"
- "ypk/halt"
- )
- func derefSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
- n := rt2.NodeOf(f).(node.DerefNode)
- sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
- //fmt.Println("deref from ptr", n.Ptr())
- if n.Ptr() {
- switch l := n.Left().Object().(type) {
- case object.ParameterObject, object.VariableObject:
- sc.Select(l.Adr(), func(v scope.Value) {
- ptr, ok := v.(scope.Pointer)
- assert.For(ok, 60, reflect.TypeOf(v))
- rt2.ValueOf(f.Parent())[n.Adr()] = ptr.Get()
- })
- return frame.End()
- default:
- halt.As(100, l.Adr(), reflect.TypeOf(l))
- }
- } else {
- if n.Left().Object() != nil {
- switch l := n.Left().Object().(type) {
- case object.ParameterObject, object.VariableObject:
- rt2.ValueOf(f.Parent())[n.Adr()] = sc.Select(l.Adr())
- return frame.End()
- default:
- halt.As(100, l.Adr(), reflect.TypeOf(l))
- }
- } else {
- switch left := n.Left().(type) {
- case node.DerefNode:
- rt2.Push(rt2.New(left), f)
- rt2.Assert(f, func(f frame.Frame) (bool, int) {
- return rt2.ValueOf(f)[left.Adr()] != nil, 60
- })
- seq = Propose(func(...IN) OUT {
- rt2.ValueOf(f.Parent())[n.Adr()] = rt2.ValueOf(f)[left.Adr()]
- return End()
- })
- ret = LATER.wait()
- default:
- halt.As(100, reflect.TypeOf(left))
- }
- }
- }
- /* if ok {
- // rt2.DataOf(f.Parent())[n] = scope.Designator(n.Left())
- } else {
- for z := n.Left(); !ok && z != nil; {
- switch z.(type) {
- case node.DerefNode:
- z = z.Left()
- default:
- data := sc.Select(z.Adr())
- assert.For(data != nil, 40)
- rt2.DataOf(f.Parent())[n] = data
- ok = true
- }
- }
- } */
- return seq, ret
- }
|