diff options
-rw-r--r-- | bugs | 27 | ||||
-rw-r--r-- | lstrlib.c | 9 |
2 files changed, 31 insertions, 5 deletions
@@ -3575,6 +3575,33 @@ patch = [[ | |||
3575 | } | 3575 | } |
3576 | 3576 | ||
3577 | 3577 | ||
3578 | Bug{ | ||
3579 | what = [['gmatch' iterator fails when called from a coroutine different | ||
3580 | from the one that created it]], | ||
3581 | report = [[Nagaev Boris, 2016/03/18]], | ||
3582 | since = [[5.3.2]], | ||
3583 | fix = nil, | ||
3584 | example = [[ | ||
3585 | local f = string.gmatch("1 2 3 4 5", "%d+") | ||
3586 | print(f()) --> 1 | ||
3587 | co = coroutine.wrap(f) | ||
3588 | print(co()) --> ??? (should be 2) | ||
3589 | ]], | ||
3590 | patch = [[ | ||
3591 | --- lstrlib.c 2016/02/25 19:42:55 1.240 | ||
3592 | +++ lstrlib.c 2016/03/21 17:27:07 | ||
3593 | @@ -688,14 +688,13 @@ | ||
3594 | static int gmatch_aux (lua_State *L) { | ||
3595 | GMatchState *gm = (GMatchState *)lua_touserdata(L, lua_upvalueindex(3)); | ||
3596 | const char *src; | ||
3597 | + gm->ms.L = L; | ||
3598 | for (src = gm->src; src <= gm->ms.src_end; src++) { | ||
3599 | const char *e; | ||
3600 | reprepstate(&gm->ms); | ||
3601 | ]] | ||
3602 | } | ||
3603 | |||
3604 | |||
3578 | --[=[ | 3605 | --[=[ |
3579 | Bug{ | 3606 | Bug{ |
3580 | what = [[ ]], | 3607 | what = [[ ]], |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lstrlib.c,v 1.239 2015/11/25 16:28:17 roberto Exp roberto $ | 2 | ** $Id: lstrlib.c,v 1.240 2016/02/25 19:42:55 roberto Exp roberto $ |
3 | ** Standard library for string operations and pattern-matching | 3 | ** Standard library for string operations and pattern-matching |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -688,14 +688,13 @@ typedef struct GMatchState { | |||
688 | static int gmatch_aux (lua_State *L) { | 688 | static int gmatch_aux (lua_State *L) { |
689 | GMatchState *gm = (GMatchState *)lua_touserdata(L, lua_upvalueindex(3)); | 689 | GMatchState *gm = (GMatchState *)lua_touserdata(L, lua_upvalueindex(3)); |
690 | const char *src; | 690 | const char *src; |
691 | gm->ms.L = L; | ||
691 | for (src = gm->src; src <= gm->ms.src_end; src++) { | 692 | for (src = gm->src; src <= gm->ms.src_end; src++) { |
692 | const char *e; | 693 | const char *e; |
693 | reprepstate(&gm->ms); | 694 | reprepstate(&gm->ms); |
694 | if ((e = match(&gm->ms, src, gm->p)) != NULL) { | 695 | if ((e = match(&gm->ms, src, gm->p)) != NULL) { |
695 | if (e == src) /* empty match? */ | 696 | /* in empty matches, advance at least one position */ |
696 | gm->src =src + 1; /* go at least one position */ | 697 | gm->src = (e == src) ? src + 1 : e; |
697 | else | ||
698 | gm->src = e; | ||
699 | return push_captures(&gm->ms, src, e); | 698 | return push_captures(&gm->ms, src, e); |
700 | } | 699 | } |
701 | } | 700 | } |