Browse Source

исправил баг в IF

kpmy 10 years ago
parent
commit
0787c85fb1
4 changed files with 16 additions and 6 deletions
  1. 1 1
      fw.go
  2. 2 0
      rt2/rules2/wrap/data/val.go
  3. 8 5
      rt2/rules2/wrap/eval/stmt.go
  4. 5 0
      utils/debug.go

+ 1 - 1
fw.go

@@ -37,7 +37,7 @@ func main() {
 	utils.Debug(debug)
 	if name == "" {
 		name = "Start"
-		utils.Debug(false)
+		utils.Debug2(false, false)
 	}
 	global := &stdDomain{god: true}
 	global.global = global

+ 2 - 0
rt2/rules2/wrap/data/val.go

@@ -224,6 +224,7 @@ func (a *arr) Get(id scope.Value) scope.Value {
 	case *data:
 		return a.Get(i.val.(scope.Value))
 	case INTEGER:
+		assert.For(int64(i) >= 0, 21, a.link.Name())
 		assert.For(int64(i) < a.length, 20)
 		if len(a.val) == 0 {
 			a.val = make([]interface{}, int(a.length))
@@ -241,6 +242,7 @@ func (a *dynarr) Get(id scope.Value) scope.Value {
 	case *data:
 		return a.Get(i.val.(scope.Value))
 	case INTEGER:
+		assert.For(int64(i) >= 0, 21)
 		assert.For(int(i) < len(a.val), 20)
 		if len(a.val) == 0 {
 			panic(0)

+ 8 - 5
rt2/rules2/wrap/eval/stmt.go

@@ -172,6 +172,8 @@ func doAssign(in IN) (out OUT) {
 	return
 }
 
+const ifCode = 1700
+
 func doIf(in IN) OUT {
 	const left = "if:left:if"
 	i := in.IR.(node.IfNode)
@@ -187,13 +189,14 @@ func doIf(in IN) OUT {
 func doCondition(in IN) OUT {
 	const left = "if:left"
 	i := in.IR.(node.ConditionalNode)
-	rt2.RegOf(in.Frame)[0] = i.Left() // if
+	rt2.RegOf(in.Frame)[ifCode] = i.Left() // if
+
 	var next Do
 	next = func(in IN) OUT {
-		last := rt2.RegOf(in.Frame)[0].(node.Node)
+		last := rt2.RegOf(in.Frame)[ifCode].(node.Node)
 		fi := rt2.ValueOf(in.Frame)[KeyOf(in, left)]
 		done := scope.GoTypeFrom(fi).(bool)
-		rt2.RegOf(in.Frame)[0] = nil
+		rt2.RegOf(in.Frame)[ifCode] = nil
 		rt2.ValueOf(in.Frame)[KeyOf(in, left)] = nil
 
 		if done && last.Right() != nil {
@@ -202,8 +205,8 @@ func doCondition(in IN) OUT {
 		} else if last.Right() == nil {
 			return End()
 		} else if last.Link() != nil { //elsif
-			rt2.RegOf(in.Frame)[0] = last.Link()
-			return GetStrange(in, left, i.Left(), next)
+			rt2.RegOf(in.Frame)[ifCode] = last.Link()
+			return GetStrange(in, left, last.Link(), next)
 		} else if i.Right() != nil { //else
 			rt2.Push(rt2.New(i.Right()), in.Frame)
 			return Later(Tail(STOP))

+ 5 - 0
utils/debug.go

@@ -11,6 +11,11 @@ func Debug(x bool) {
 	debugScope = x
 }
 
+func Debug2(x, y bool) {
+	debugFrame = x
+	debugScope = y
+}
+
 func PrintFrame(x ...interface{}) {
 	if debugFrame {
 		fmt.Println(x...)