Explorar o código

исправил баг в deref, нашел там же еще один

kpmy %!s(int64=10) %!d(string=hai) anos
pai
achega
82dff8433c
Modificáronse 3 ficheiros con 18 adicións e 5 borrados
  1. BIN=BIN
      doc/ast.pdf
  2. 1 1
      rt2/rules2/wrap/eval/do.go
  3. 17 4
      rt2/rules2/wrap/eval/expr.go

BIN=BIN
doc/ast.pdf


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

@@ -98,7 +98,7 @@ func GetExpression(in IN, key interface{}, expr node.Node, next Do) OUT {
 func GetDesignator(in IN, key interface{}, design node.Node, next Do) OUT {
 	assert.For(design != nil, 20)
 	_, ok := design.(node.Designator)
-	assert.For(ok, 21)
+	assert.For(ok, 21, reflect.TypeOf(design))
 	assert.For(key != nil, 22)
 	nf := rt2.New(design)
 	rt2.Push(nf, in.Frame)

+ 17 - 4
rt2/rules2/wrap/eval/expr.go

@@ -128,12 +128,12 @@ func getDeref(in IN) OUT {
 				halt.As(100, t, reflect.TypeOf(cc))
 			}
 		case scope.Pointer:
-			assert.For(d.Ptr(), 41)
-			if r := v.Get(); scope.GoTypeFrom(r) == nil {
+			switch {
+			case scope.GoTypeFrom(v.Get()) == nil:
 				out = makeTrap(in.Frame, traps.NILderef)
-			} else {
+			case d.Ptr():
 				out = End()
-				switch r.(type) {
+				switch r := v.Get().(type) {
 				case scope.Record:
 					rec := r.(scope.Record)
 					rt2.ValueOf(in.Parent)[d.Adr()] = rec
@@ -147,6 +147,19 @@ func getDeref(in IN) OUT {
 				default:
 					halt.As(100, reflect.TypeOf(r))
 				}
+			case !d.Ptr():
+				out = End()
+				switch r := v.Get().(type) {
+				case scope.Array:
+					arr := r.(scope.Array)
+					rt2.ValueOf(in.Parent)[d.Adr()] = scope.TypeFromGo(scope.GoTypeFrom(arr))
+					rt2.RegOf(in.Parent)[in.Key] = d.Adr()
+					rt2.RegOf(in.Parent)[context.META] = &Meta{Arr: arr, Id: arr.Id()}
+				default:
+					halt.As(100, reflect.TypeOf(r))
+				}
+			default:
+				halt.As(100, d.Adr(), d.Ptr(), v, v.Get())
 			}
 			return out
 		default: