Pārlūkot izejas kodu

новое демо на охрану типа, похоже ошибка не совсем в IS, хотя и его надо модернизировать

kpmy 10 gadi atpakaļ
vecāks
revīzija
6264ece437
4 mainītis faili ar 11 papildinājumiem un 2 dzēšanām
  1. BIN
      code/XevDemo23.oz
  2. 3 0
      cp/traps/t.go
  3. 1 1
      fw.go
  4. 7 1
      rt2/rules2/wrap/eval/expr.go

BIN
code/XevDemo23.oz


+ 3 - 0
cp/traps/t.go

@@ -9,6 +9,7 @@ type TRAP int
 const (
 	Default TRAP = iota
 	NILderef
+	GUARDfail
 )
 
 func This(i interface{}) TRAP { return TRAP(i.(int32)) }
@@ -18,6 +19,8 @@ func (t TRAP) String() string {
 		return "0"
 	case NILderef:
 		return "NIL dereference"
+	case GUARDfail:
+		return "type guard failed"
 	default:
 		return strconv.Itoa(int(t))
 	}

+ 1 - 1
fw.go

@@ -37,7 +37,7 @@ func main() {
 	flag.Parse()
 	utils.Debug(debug)
 	if name == "" {
-		name = "XevDemo11"
+		name = "XevDemo23"
 	}
 	global := &stdDomain{god: true}
 	global.global = global

+ 7 - 1
rt2/rules2/wrap/eval/expr.go

@@ -366,13 +366,19 @@ func getGuard(in IN) OUT {
 	return GetDesignator(in, left, g.Left(), func(IN) OUT {
 		v := rt2.ValueOf(in.Frame)[KeyOf(in, left)]
 		assert.For(v != nil, 20)
+		switch vv := v.(type) {
+		case scope.Pointer:
+			v = vv.Get()
+		}
 		if scope.GoTypeFrom(scope.Ops.Is(v, g.Type())).(bool) {
 			rt2.ValueOf(in.Parent)[g.Adr()] = v
 			rt2.RegOf(in.Parent)[in.Key] = g.Adr()
 			rt2.RegOf(in.Parent)[context.META] = rt2.RegOf(in.Frame)[context.META] //&Meta{Id: vv.Id(), }
 			return End()
-		} else {
+		} else if scope.GoTypeFrom(v) == nil {
 			return makeTrap(in.Frame, traps.NILderef)
+		} else {
+			return makeTrap(in.Frame, traps.GUARDfail)
 		}
 
 	})