mirror of
				https://github.com/explosion/spaCy.git
				synced 2025-11-04 09:57:26 +03:00 
			
		
		
		
	* Add some bounds checking around state arrays
This commit is contained in:
		
							parent
							
								
									89ae218b75
								
							
						
					
					
						commit
						065c2e1d2d
					
				| 
						 | 
					@ -28,6 +28,8 @@ cdef class StateClass:
 | 
				
			||||||
        for i in range(length):
 | 
					        for i in range(length):
 | 
				
			||||||
            self._sent[i] = sent[i]
 | 
					            self._sent[i] = sent[i]
 | 
				
			||||||
            self._buffer[i] = i
 | 
					            self._buffer[i] = i
 | 
				
			||||||
 | 
					        for i in range(length, length + 5):
 | 
				
			||||||
 | 
					            self._sent[i].lex = &EMPTY_LEXEME
 | 
				
			||||||
        return self
 | 
					        return self
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cdef inline int S(self, int i) nogil:
 | 
					    cdef inline int S(self, int i) nogil:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,6 +34,10 @@ cdef class StateClass:
 | 
				
			||||||
        return self._sent[i].head + i
 | 
					        return self._sent[i].head + i
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cdef int E(self, int i) nogil:
 | 
					    cdef int E(self, int i) nogil:
 | 
				
			||||||
 | 
					        if self._e_i <= 0 or self._e_i >= self.length:
 | 
				
			||||||
 | 
					            return -1
 | 
				
			||||||
 | 
					        if i <= 0 or i >= self.length:
 | 
				
			||||||
 | 
					            return -1
 | 
				
			||||||
        return self._ents[self._e_i-1].start
 | 
					        return self._ents[self._e_i-1].start
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cdef int L(self, int i, int idx) nogil:
 | 
					    cdef int L(self, int i, int idx) nogil:
 | 
				
			||||||
| 
						 | 
					@ -145,6 +149,7 @@ cdef class StateClass:
 | 
				
			||||||
            return self.length - self._b_i
 | 
					            return self.length - self._b_i
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cdef void push(self) nogil:
 | 
					    cdef void push(self) nogil:
 | 
				
			||||||
 | 
					        if self.B(0) != -1:
 | 
				
			||||||
            self._stack[self._s_i] = self.B(0)
 | 
					            self._stack[self._s_i] = self.B(0)
 | 
				
			||||||
        self._s_i += 1
 | 
					        self._s_i += 1
 | 
				
			||||||
        self._b_i += 1
 | 
					        self._b_i += 1
 | 
				
			||||||
| 
						 | 
					@ -152,6 +157,7 @@ cdef class StateClass:
 | 
				
			||||||
            self._break = -1
 | 
					            self._break = -1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cdef void pop(self) nogil:
 | 
					    cdef void pop(self) nogil:
 | 
				
			||||||
 | 
					        if self._s_i >= 1:
 | 
				
			||||||
            self._s_i -= 1
 | 
					            self._s_i -= 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cdef void unshift(self) nogil:
 | 
					    cdef void unshift(self) nogil:
 | 
				
			||||||
| 
						 | 
					@ -197,6 +203,7 @@ cdef class StateClass:
 | 
				
			||||||
            self._sent[head].l_kids -= 1
 | 
					            self._sent[head].l_kids -= 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cdef void open_ent(self, int label) nogil:
 | 
					    cdef void open_ent(self, int label) nogil:
 | 
				
			||||||
 | 
					        if 0 <= self._e_i < self.length:
 | 
				
			||||||
            self._ents[self._e_i].start = self.B(0)
 | 
					            self._ents[self._e_i].start = self.B(0)
 | 
				
			||||||
            self._ents[self._e_i].label = label
 | 
					            self._ents[self._e_i].label = label
 | 
				
			||||||
            self._ents[self._e_i].end = -1
 | 
					            self._ents[self._e_i].end = -1
 | 
				
			||||||
| 
						 | 
					@ -212,6 +219,7 @@ cdef class StateClass:
 | 
				
			||||||
            self._sent[i].ent_type = ent_type
 | 
					            self._sent[i].ent_type = ent_type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cdef void set_break(self, int _) nogil:
 | 
					    cdef void set_break(self, int _) nogil:
 | 
				
			||||||
 | 
					        if 0 <= self.B(0) < self.length: 
 | 
				
			||||||
            self._sent[self.B(0)].sent_end = True
 | 
					            self._sent[self.B(0)].sent_end = True
 | 
				
			||||||
            self._break = self._b_i
 | 
					            self._break = self._b_i
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -223,6 +231,7 @@ cdef class StateClass:
 | 
				
			||||||
        self._b_i = src._b_i
 | 
					        self._b_i = src._b_i
 | 
				
			||||||
        self._s_i = src._s_i
 | 
					        self._s_i = src._s_i
 | 
				
			||||||
        self._e_i = src._e_i
 | 
					        self._e_i = src._e_i
 | 
				
			||||||
 | 
					        self._break = src._break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def print_state(self, words):
 | 
					    def print_state(self, words):
 | 
				
			||||||
        words = list(words) + ['_']
 | 
					        words = list(words) + ['_']
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user