aboutsummaryrefslogtreecommitdiff
path: root/lpvm.c
diff options
context:
space:
mode:
authorSergio Medeiros <sqmedeiros@gmail.com>2015-03-23 14:13:25 -0300
committerSergio Medeiros <sqmedeiros@gmail.com>2015-03-23 14:13:25 -0300
commit0e93d536ba2d312502737cce2ab0cc21393c4842 (patch)
tree7de1e3ae967c90a43e7086ccef61d1722881b20c /lpvm.c
parenta5a4b257e626847be3be4878c603adb51cbb420f (diff)
downloadlpeglabel-0e93d536ba2d312502737cce2ab0cc21393c4842.tar.gz
lpeglabel-0e93d536ba2d312502737cce2ab0cc21393c4842.tar.bz2
lpeglabel-0e93d536ba2d312502737cce2ab0cc21393c4842.zip
Updating to lpeg 0.12.2
Diffstat (limited to 'lpvm.c')
-rw-r--r--lpvm.c55
1 files changed, 26 insertions, 29 deletions
diff --git a/lpvm.c b/lpvm.c
index d8b854a..a9198ba 100644
--- a/lpvm.c
+++ b/lpvm.c
@@ -38,7 +38,7 @@ typedef struct Stack {
38 const char *s; /* saved position (or NULL for calls) */ 38 const char *s; /* saved position (or NULL for calls) */
39 const Instruction *p; /* next instruction */ 39 const Instruction *p; /* next instruction */
40 int caplevel; 40 int caplevel;
41 Labelset ls; /* labeled failure */ 41 Labelset ls; /* labeled failure */
42} Stack; 42} Stack;
43 43
44 44
@@ -146,7 +146,7 @@ static int removedyncap (lua_State *L, Capture *capture,
146** Opcode interpreter 146** Opcode interpreter
147*/ 147*/
148const char *match (lua_State *L, const char *o, const char *s, const char *e, 148const char *match (lua_State *L, const char *o, const char *s, const char *e,
149 Instruction *op, Capture *capture, int ptop, Labelset *labelf) { 149 Instruction *op, Capture *capture, int ptop, Labelset *labelf) { /* labeled failure */
150 Stack stackbase[INITBACK]; 150 Stack stackbase[INITBACK];
151 Stack *stacklimit = stackbase + INITBACK; 151 Stack *stacklimit = stackbase + INITBACK;
152 Stack *stack = stackbase; /* point to first empty slot in stack */ 152 Stack *stack = stackbase; /* point to first empty slot in stack */
@@ -157,7 +157,7 @@ const char *match (lua_State *L, const char *o, const char *s, const char *e,
157 stack->p = &giveup; stack->s = s; stack->caplevel = 0; stack++; 157 stack->p = &giveup; stack->s = s; stack->caplevel = 0; stack++;
158 lua_pushlightuserdata(L, stackbase); 158 lua_pushlightuserdata(L, stackbase);
159 for (;;) { 159 for (;;) {
160#if defined(LPEGDEBUG) 160#if defined(DEBUG)
161 printf("s: |%s| stck:%d, dyncaps:%d, caps:%d ", 161 printf("s: |%s| stck:%d, dyncaps:%d, caps:%d ",
162 s, stack - getstackbase(L, ptop), ndyncap, captop); 162 s, stack - getstackbase(L, ptop), ndyncap, captop);
163 printinst(op, p); 163 printinst(op, p);
@@ -183,9 +183,9 @@ const char *match (lua_State *L, const char *o, const char *s, const char *e,
183 case IAny: { 183 case IAny: {
184 if (s < e) { p++; s++; } 184 if (s < e) { p++; s++; }
185 else { 185 else {
186 *labelf = LFAIL; /* labeled failure */ 186 *labelf = LFAIL; /* labeled failure */
187 goto fail; 187 goto fail;
188 } 188 }
189 continue; 189 continue;
190 } 190 }
191 case ITestAny: { 191 case ITestAny: {
@@ -196,9 +196,9 @@ const char *match (lua_State *L, const char *o, const char *s, const char *e,
196 case IChar: { 196 case IChar: {
197 if ((byte)*s == p->i.aux && s < e) { p++; s++; } 197 if ((byte)*s == p->i.aux && s < e) { p++; s++; }
198 else { 198 else {
199 *labelf = LFAIL; /* labeled failure */ 199 *labelf = LFAIL; /* labeled failure */
200 goto fail; 200 goto fail;
201 } 201 }
202 continue; 202 continue;
203 } 203 }
204 case ITestChar: { 204 case ITestChar: {
@@ -211,9 +211,9 @@ const char *match (lua_State *L, const char *o, const char *s, const char *e,
211 if (testchar((p+1)->buff, c) && s < e) 211 if (testchar((p+1)->buff, c) && s < e)
212 { p += CHARSETINSTSIZE; s++; } 212 { p += CHARSETINSTSIZE; s++; }
213 else { 213 else {
214 *labelf = LFAIL; /* labeled failure */ 214 *labelf = LFAIL; /* labeled failure */
215 goto fail; 215 goto fail;
216 } 216 }
217 continue; 217 continue;
218 } 218 }
219 case ITestSet: { 219 case ITestSet: {
@@ -226,9 +226,9 @@ const char *match (lua_State *L, const char *o, const char *s, const char *e,
226 case IBehind: { 226 case IBehind: {
227 int n = p->i.aux; 227 int n = p->i.aux;
228 if (n > s - o) { 228 if (n > s - o) {
229 *labelf = LFAIL; /* labeled failure */ 229 *labelf = LFAIL; /* labeled failure */
230 goto fail; 230 goto fail;
231 } 231 }
232 s -= n; p++; 232 s -= n; p++;
233 continue; 233 continue;
234 } 234 }
@@ -249,24 +249,23 @@ const char *match (lua_State *L, const char *o, const char *s, const char *e,
249 stack = doublestack(L, &stacklimit, ptop); 249 stack = doublestack(L, &stacklimit, ptop);
250 stack->p = p + getoffset(p); 250 stack->p = p + getoffset(p);
251 stack->s = s; 251 stack->s = s;
252 stack->ls = LFAIL; /* labeled failure */ 252 stack->ls = LFAIL; /* labeled failure */
253 stack->caplevel = captop; 253 stack->caplevel = captop;
254 stack++; 254 stack++;
255 p += 2; 255 p += 2;
256 continue; 256 continue;
257 } 257 }
258 case ILabChoice: { /* labeled failure */ 258 case ILabChoice: { /* labeled failure */
259 if (stack == stacklimit) 259 if (stack == stacklimit)
260 stack = doublestack(L, &stacklimit, ptop); 260 stack = doublestack(L, &stacklimit, ptop);
261 stack->p = p + getoffset(p); 261 stack->p = p + getoffset(p);
262 stack->s = s; 262 stack->s = s;
263 stack->ls = (p + 2)->labels; 263 stack->ls = (p + 2)->labels;
264 stack->caplevel = captop; 264 stack->caplevel = captop;
265 stack++; 265 stack++;
266 p += 3; 266 p += 3;
267 continue; 267 continue;
268 } 268 }
269
270 case ICall: { 269 case ICall: {
271 if (stack == stacklimit) 270 if (stack == stacklimit)
272 stack = doublestack(L, &stacklimit, ptop); 271 stack = doublestack(L, &stacklimit, ptop);
@@ -296,22 +295,20 @@ const char *match (lua_State *L, const char *o, const char *s, const char *e,
296 p += getoffset(p); 295 p += getoffset(p);
297 continue; 296 continue;
298 } 297 }
299 case IThrow: { /* labeled failure */ 298 case IThrow: { /* labeled failure */
300 *labelf = (p+1)->labels; 299 *labelf = (p+1)->labels;
301 goto fail; 300 goto fail;
302 } 301 }
303 case IFailTwice: 302 case IFailTwice:
304 assert(stack > getstackbase(L, ptop)); 303 assert(stack > getstackbase(L, ptop));
305 stack--; 304 stack--;
306 /* go through */ 305 /* go through */
307 case IFail: 306 case IFail:
308 *labelf = LFAIL; /* labeled failure */ 307 *labelf = LFAIL; /* labeled failure */
309 fail: { /* pattern failed: try to backtrack */ 308 fail: { /* pattern failed: try to backtrack */
310 do { /* remove pending calls */ 309 do { /* remove pending calls */
311 assert(stack > getstackbase(L, ptop)); 310 assert(stack > getstackbase(L, ptop));
312 s = (--stack)->s; 311 s = (--stack)->s;
313 /*printf("fail (s == NULL => %d), labelf=%d stack->ls=%d (stack-> == giveup %d)\n",
314 s == NULL, labelf, stack->ls, stack->p == &giveup);*/
315 } while (s == NULL || (!(stack->ls & *labelf) && stack->p != &giveup)); 312 } while (s == NULL || (!(stack->ls & *labelf) && stack->p != &giveup));
316 if (ndyncap > 0) /* is there matchtime captures? */ 313 if (ndyncap > 0) /* is there matchtime captures? */
317 ndyncap -= removedyncap(L, capture, stack->caplevel, captop); 314 ndyncap -= removedyncap(L, capture, stack->caplevel, captop);
@@ -328,10 +325,10 @@ const char *match (lua_State *L, const char *o, const char *s, const char *e,
328 captop -= n; /* remove nested captures */ 325 captop -= n; /* remove nested captures */
329 fr -= rem; /* 'rem' items were popped from Lua stack */ 326 fr -= rem; /* 'rem' items were popped from Lua stack */
330 res = resdyncaptures(L, fr, s - o, e - o); /* get result */ 327 res = resdyncaptures(L, fr, s - o, e - o); /* get result */
331 if (res == -1) { /* fail? */ 328 if (res == -1) { /* fail? */
332 *labelf = LFAIL; /* labeled failure */ 329 *labelf = LFAIL; /* labeled failure */
333 goto fail; 330 goto fail;
334 } 331 }
335 s = o + res; /* else update current position */ 332 s = o + res; /* else update current position */
336 n = lua_gettop(L) - fr + 1; /* number of new captures */ 333 n = lua_gettop(L) - fr + 1; /* number of new captures */
337 ndyncap += n - rem; /* update number of dynamic captures */ 334 ndyncap += n - rem; /* update number of dynamic captures */