Catch browse back beyond start
This commit is contained in:
		
							parent
							
								
									4da19b3047
								
							
						
					
					
						commit
						719368301b
					
				@ -6,6 +6,13 @@ import (
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type IndexError struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func(err *IndexError) Error() string {
 | 
			
		||||
	return fmt.Sprintf("already at first index")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// State holds the command stack, error condition of a unique execution session.
 | 
			
		||||
//
 | 
			
		||||
// It also holds cached values for all results of executed symbols.
 | 
			
		||||
@ -208,7 +215,7 @@ func(st *State) Previous() (uint16, error) {
 | 
			
		||||
		return 0, fmt.Errorf("state root node not yet defined")
 | 
			
		||||
	}
 | 
			
		||||
	if st.sizeIdx == 0 {
 | 
			
		||||
		return 0, fmt.Errorf("already at first index")
 | 
			
		||||
		return 0, &IndexError{} // ("already at first index")
 | 
			
		||||
	}
 | 
			
		||||
	st.sizeIdx -= 1
 | 
			
		||||
	s, idx := st.Where()
 | 
			
		||||
 | 
			
		||||
@ -313,7 +313,18 @@ func(vm *Vm) RunInCmp(b []byte, ctx context.Context) ([]byte, error) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	target, _, err = applyTarget([]byte(target), vm.st, vm.ca, ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
	_, ok := err.(*state.IndexError)
 | 
			
		||||
	if ok {
 | 
			
		||||
		_, err = vm.st.ResetFlag(state.FLAG_INMATCH)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			panic(err)
 | 
			
		||||
		}
 | 
			
		||||
		_, err = vm.st.SetFlag(state.FLAG_READIN)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			panic(err)
 | 
			
		||||
		}
 | 
			
		||||
		return b, nil
 | 
			
		||||
	} else if err != nil {
 | 
			
		||||
		return b, err
 | 
			
		||||
	}
 | 
			
		||||
	vm.Reset()
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user