Ignore:
Timestamp:
Nov 15, 2007, 4:16:21 PM (18 years ago)
Author:
[email protected]
Message:

2007-11-15 Eric Seidel <[email protected]>

Reviewed by Sam.

Remove RETURN_ERROR, add MatchStack

  • pcre/pcre_exec.cpp: (MatchStack::MatchStack): (MatchStack::unrollAnyHeapAllocatedFrames): (matchError): (match):
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/pcre/pcre_exec.cpp

    r27828 r27829  
    266266
    267267#define RMATCH_WHERE(num) &&RRETURN_##num
    268 #define RRETURN_LABEL *frame->where
     268#define RRETURN_LABEL *stack.currentFrame->where
    269269
    270270#endif
     
    272272#define RMATCH(num, ra, rb, rc)\
    273273  {\
    274   if (frame >= stackframes && frame + 1 < stackframesend)\
    275     newframe = frame + 1;\
     274  if (stack.currentFrame >= stack.frames && stack.currentFrame + 1 < stack.framesEnd)\
     275    newframe = stack.currentFrame + 1;\
    276276  else\
    277277    newframe = new matchframe;\
    278   newframe->eptr = frame->eptr;\
     278  newframe->eptr = stack.currentFrame->eptr;\
    279279  newframe->ecode = (ra);\
    280   newframe->offset_top = frame->offset_top;\
     280  newframe->offset_top = stack.currentFrame->offset_top;\
    281281  newframe->eptrb = (rb);\
    282282  is_group_start = (rc);\
    283283  ++rdepth;\
    284   newframe->prevframe = frame;\
    285   frame = newframe;\
    286   frame->where = RMATCH_WHERE(num);\
     284  newframe->prevframe = stack.currentFrame;\
     285  stack.currentFrame = newframe;\
     286  stack.currentFrame->where = RMATCH_WHERE(num);\
    287287  DPRINTF(("restarting from line %d\n", __LINE__));\
    288288  goto RECURSE;\
    289289RRETURN_##num:\
    290   newframe = frame;\
    291   frame = frame->prevframe;\
    292   if (!(newframe >= stackframes && newframe < stackframesend))\
     290  newframe = stack.currentFrame;\
     291  stack.currentFrame = stack.currentFrame->prevframe;\
     292  if (!(newframe >= stack.frames && newframe < stack.framesEnd))\
    293293    delete newframe;\
    294294  --rdepth;\
     
    305305
    306306#define RRETURN_ERROR(error) \
    307   { \
    308     i = (error); \
    309     goto RETURN_ERROR; \
    310   }
     307    return matchError(error, stack);
    311308
    312309/*************************************************
     
    332329                 (e.g. stopped by repeated call or recursion limit)
    333330*/
     331
     332struct MatchStack {
     333    MatchStack()
     334    {
     335        framesEnd = frames + sizeof(frames) / sizeof(frames[0]);
     336        currentFrame = frames;
     337    }
     338    matchframe frames[16];
     339    matchframe* framesEnd;
     340    matchframe* currentFrame;
     341
     342    void unrollAnyHeapAllocatedFrames()
     343    {
     344        while (!(currentFrame >= frames && currentFrame < framesEnd)) {
     345            matchframe* parentFrame = currentFrame->prevframe;
     346            delete currentFrame;
     347            currentFrame = parentFrame;
     348        }
     349    }
     350};
     351
     352static int matchError(int errorCode, MatchStack& stack)
     353{
     354    stack.unrollAnyHeapAllocatedFrames();
     355    return errorCode;
     356}
    334357
    335358static int match(USPTR eptr, const uschar* ecode, int offset_top, match_data* md)
     
    350373     any calls to pcre_stack_malloc, yet the amount of stack used for the array is
    351374     modest enough that we don't run out of stack. */
    352     matchframe stackframes[16];
    353     matchframe *stackframesend = stackframes + sizeof(stackframes) / sizeof(stackframes[0]);
    354    
    355     matchframe *frame = stackframes;
    356     matchframe *newframe;
     375    MatchStack stack;
     376    matchframe* newframe;
    357377   
    358378    /* The opcode jump table. */
     
    371391   
    372392#ifdef USE_COMPUTED_GOTO_FOR_MATCH_RECURSION
    373     frame->where = &&RETURN;
     393    stack.currentFrame->where = &&RETURN;
    374394#else
    375     frame->where = 0;
     395    stack.currentFrame->where = 0;
    376396#endif
    377397   
    378     frame->eptr = eptr;
    379     frame->ecode = ecode;
    380     frame->offset_top = offset_top;
    381     frame->eptrb = NULL;
     398    stack.currentFrame->eptr = eptr;
     399    stack.currentFrame->ecode = ecode;
     400    stack.currentFrame->offset_top = offset_top;
     401    stack.currentFrame->eptrb = NULL;
    382402   
    383403    /* This is where control jumps back to to effect "recursion" */
     
    407427   
    408428    if (is_group_start) {
    409         frame->newptrb.epb_prev = frame->eptrb;
    410         frame->newptrb.epb_saved_eptr = frame->eptr;
    411         frame->eptrb = &frame->newptrb;
     429        stack.currentFrame->newptrb.epb_prev = stack.currentFrame->eptrb;
     430        stack.currentFrame->newptrb.epb_saved_eptr = stack.currentFrame->eptr;
     431        stack.currentFrame->eptrb = &stack.currentFrame->newptrb;
    412432    }
    413433   
     
    421441#ifdef USE_COMPUTED_GOTO_FOR_MATCH_OPCODE_LOOP
    422442#define BEGIN_OPCODE(opcode) LABEL_OP_##opcode
    423 #define NEXT_OPCODE goto *opcode_jump_table[*frame->ecode]
     443#define NEXT_OPCODE goto *opcode_jump_table[*stack.currentFrame->ecode]
    424444#else
    425445#define BEGIN_OPCODE(opcode) case OP_##opcode
     
    430450        NEXT_OPCODE;
    431451#else
    432         switch (*frame->ecode)
     452        switch (*stack.currentFrame->ecode)
    433453#endif
    434454        {
     
    439459                DPRINTF(("start bracket 0\n"));
    440460                do {
    441                     RMATCH(2, frame->ecode + 1 + LINK_SIZE, frame->eptrb, match_isgroup);
     461                    RMATCH(2, stack.currentFrame->ecode + 1 + LINK_SIZE, stack.currentFrame->eptrb, match_isgroup);
    442462                    if (is_match)
    443463                        RRETURN;
    444                     frame->ecode += GET(frame->ecode, 1);
    445                 } while (*frame->ecode == OP_ALT);
     464                    stack.currentFrame->ecode += GET(stack.currentFrame->ecode, 1);
     465                } while (*stack.currentFrame->ecode == OP_ALT);
    446466                DPRINTF(("bracket 0 failed\n"));
    447467                RRETURN;
     
    450470               
    451471                BEGIN_OPCODE(BRANUMBER):
    452                 frame->ecode += 3;
     472                stack.currentFrame->ecode += 3;
    453473                NEXT_OPCODE;
    454474               
     
    456476               
    457477                BEGIN_OPCODE(END):
    458                 md->end_match_ptr = frame->eptr;          /* Record where we ended */
    459                 md->end_offset_top = frame->offset_top;   /* and how many extracts were taken */
     478                md->end_match_ptr = stack.currentFrame->eptr;          /* Record where we ended */
     479                md->end_offset_top = stack.currentFrame->offset_top;   /* and how many extracts were taken */
    460480                is_match = true;
    461481                RRETURN;
     
    469489                BEGIN_OPCODE(ASSERT):
    470490                do {
    471                     RMATCH(6, frame->ecode + 1 + LINK_SIZE, NULL, match_isgroup);
     491                    RMATCH(6, stack.currentFrame->ecode + 1 + LINK_SIZE, NULL, match_isgroup);
    472492                    if (is_match) break;
    473                     frame->ecode += GET(frame->ecode, 1);
    474                 } while (*frame->ecode == OP_ALT);
    475                 if (*frame->ecode == OP_KET)
     493                    stack.currentFrame->ecode += GET(stack.currentFrame->ecode, 1);
     494                } while (*stack.currentFrame->ecode == OP_ALT);
     495                if (*stack.currentFrame->ecode == OP_KET)
    476496                    RRETURN_NO_MATCH;
    477497               
     
    479499                 mark, since extracts may have been taken during the assertion. */
    480500               
    481                 do frame->ecode += GET(frame->ecode,1); while (*frame->ecode == OP_ALT);
    482                 frame->ecode += 1 + LINK_SIZE;
    483                 frame->offset_top = md->end_offset_top;
     501                do stack.currentFrame->ecode += GET(stack.currentFrame->ecode,1); while (*stack.currentFrame->ecode == OP_ALT);
     502                stack.currentFrame->ecode += 1 + LINK_SIZE;
     503                stack.currentFrame->offset_top = md->end_offset_top;
    484504                NEXT_OPCODE;
    485505               
     
    488508                BEGIN_OPCODE(ASSERT_NOT):
    489509                do {
    490                     RMATCH(7, frame->ecode + 1 + LINK_SIZE, NULL, match_isgroup);
     510                    RMATCH(7, stack.currentFrame->ecode + 1 + LINK_SIZE, NULL, match_isgroup);
    491511                    if (is_match)
    492512                        RRETURN_NO_MATCH;
    493                     frame->ecode += GET(frame->ecode,1);
    494                 } while (*frame->ecode == OP_ALT);
    495                
    496                 frame->ecode += 1 + LINK_SIZE;
     513                    stack.currentFrame->ecode += GET(stack.currentFrame->ecode,1);
     514                } while (*stack.currentFrame->ecode == OP_ALT);
     515               
     516                stack.currentFrame->ecode += 1 + LINK_SIZE;
    497517                NEXT_OPCODE;
    498518               
     
    505525               
    506526                BEGIN_OPCODE(ONCE):
    507                 frame->prev = frame->ecode;
    508                 frame->saved_eptr = frame->eptr;
     527                stack.currentFrame->prev = stack.currentFrame->ecode;
     528                stack.currentFrame->saved_eptr = stack.currentFrame->eptr;
    509529               
    510530                do {
    511                     RMATCH(9, frame->ecode + 1 + LINK_SIZE, frame->eptrb, match_isgroup);
     531                    RMATCH(9, stack.currentFrame->ecode + 1 + LINK_SIZE, stack.currentFrame->eptrb, match_isgroup);
    512532                    if (is_match)
    513533                        break;
    514                     frame->ecode += GET(frame->ecode,1);
    515                 } while (*frame->ecode == OP_ALT);
     534                    stack.currentFrame->ecode += GET(stack.currentFrame->ecode,1);
     535                } while (*stack.currentFrame->ecode == OP_ALT);
    516536               
    517537                /* If hit the end of the group (which could be repeated), fail */
    518538               
    519                 if (*frame->ecode != OP_ONCE && *frame->ecode != OP_ALT)
     539                if (*stack.currentFrame->ecode != OP_ONCE && *stack.currentFrame->ecode != OP_ALT)
    520540                    RRETURN;
    521541               
     
    523543                 mark, since extracts may have been taken. */
    524544               
    525                 do frame->ecode += GET(frame->ecode,1); while (*frame->ecode == OP_ALT);
    526                
    527                 frame->offset_top = md->end_offset_top;
    528                 frame->eptr = md->end_match_ptr;
     545                do stack.currentFrame->ecode += GET(stack.currentFrame->ecode,1); while (*stack.currentFrame->ecode == OP_ALT);
     546               
     547                stack.currentFrame->offset_top = md->end_offset_top;
     548                stack.currentFrame->eptr = md->end_match_ptr;
    529549               
    530550                /* For a non-repeating ket, just continue at this level. This also
     
    534554                 course of events. */
    535555               
    536                 if (*frame->ecode == OP_KET || frame->eptr == frame->saved_eptr) {
    537                     frame->ecode += 1+LINK_SIZE;
     556                if (*stack.currentFrame->ecode == OP_KET || stack.currentFrame->eptr == stack.currentFrame->saved_eptr) {
     557                    stack.currentFrame->ecode += 1+LINK_SIZE;
    538558                    NEXT_OPCODE;
    539559                }
     
    544564                 opcode. */
    545565               
    546                 if (*frame->ecode == OP_KETRMIN) {
    547                     RMATCH(10, frame->ecode + 1 + LINK_SIZE, frame->eptrb, 0);
     566                if (*stack.currentFrame->ecode == OP_KETRMIN) {
     567                    RMATCH(10, stack.currentFrame->ecode + 1 + LINK_SIZE, stack.currentFrame->eptrb, 0);
    548568                    if (is_match)
    549569                        RRETURN;
    550                     RMATCH(11, frame->prev, frame->eptrb, match_isgroup);
     570                    RMATCH(11, stack.currentFrame->prev, stack.currentFrame->eptrb, match_isgroup);
    551571                    if (is_match)
    552572                        RRETURN;
    553573                } else { /* OP_KETRMAX */
    554                     RMATCH(12, frame->prev, frame->eptrb, match_isgroup);
     574                    RMATCH(12, stack.currentFrame->prev, stack.currentFrame->eptrb, match_isgroup);
    555575                    if (is_match)
    556576                        RRETURN;
    557                     RMATCH(13, frame->ecode + 1+LINK_SIZE, frame->eptrb, 0);
     577                    RMATCH(13, stack.currentFrame->ecode + 1+LINK_SIZE, stack.currentFrame->eptrb, 0);
    558578                    if (is_match)
    559579                        RRETURN;
     
    565585               
    566586                BEGIN_OPCODE(ALT):
    567                 do frame->ecode += GET(frame->ecode,1); while (*frame->ecode == OP_ALT);
     587                do stack.currentFrame->ecode += GET(stack.currentFrame->ecode,1); while (*stack.currentFrame->ecode == OP_ALT);
    568588                NEXT_OPCODE;
    569589               
     
    576596                BEGIN_OPCODE(BRAZERO):
    577597                {
    578                     frame->next = frame->ecode+1;
    579                     RMATCH(14, frame->next, frame->eptrb, match_isgroup);
     598                    stack.currentFrame->next = stack.currentFrame->ecode+1;
     599                    RMATCH(14, stack.currentFrame->next, stack.currentFrame->eptrb, match_isgroup);
    580600                    if (is_match)
    581601                        RRETURN;
    582                     do frame->next += GET(frame->next,1); while (*frame->next == OP_ALT);
    583                     frame->ecode = frame->next + 1+LINK_SIZE;
     602                    do stack.currentFrame->next += GET(stack.currentFrame->next,1); while (*stack.currentFrame->next == OP_ALT);
     603                    stack.currentFrame->ecode = stack.currentFrame->next + 1+LINK_SIZE;
    584604                }
    585605                NEXT_OPCODE;
     
    587607                BEGIN_OPCODE(BRAMINZERO):
    588608                {
    589                     frame->next = frame->ecode+1;
    590                     do frame->next += GET(frame->next,1); while (*frame->next == OP_ALT);
    591                     RMATCH(15, frame->next + 1+LINK_SIZE, frame->eptrb, match_isgroup);
     609                    stack.currentFrame->next = stack.currentFrame->ecode+1;
     610                    do stack.currentFrame->next += GET(stack.currentFrame->next,1); while (*stack.currentFrame->next == OP_ALT);
     611                    RMATCH(15, stack.currentFrame->next + 1+LINK_SIZE, stack.currentFrame->eptrb, match_isgroup);
    592612                    if (is_match)
    593613                        RRETURN;
    594                     frame->ecode++;
     614                    stack.currentFrame->ecode++;
    595615                }
    596616                NEXT_OPCODE;
     
    604624                BEGIN_OPCODE(KETRMIN):
    605625                BEGIN_OPCODE(KETRMAX):
    606                 frame->prev = frame->ecode - GET(frame->ecode, 1);
    607                 frame->saved_eptr = frame->eptrb->epb_saved_eptr;
     626                stack.currentFrame->prev = stack.currentFrame->ecode - GET(stack.currentFrame->ecode, 1);
     627                stack.currentFrame->saved_eptr = stack.currentFrame->eptrb->epb_saved_eptr;
    608628               
    609629                /* Back up the stack of bracket start pointers. */
    610630               
    611                 frame->eptrb = frame->eptrb->epb_prev;
    612                
    613                 if (*frame->prev == OP_ASSERT || *frame->prev == OP_ASSERT_NOT || *frame->prev == OP_ONCE) {
    614                     md->end_match_ptr = frame->eptr;      /* For ONCE */
    615                     md->end_offset_top = frame->offset_top;
     631                stack.currentFrame->eptrb = stack.currentFrame->eptrb->epb_prev;
     632               
     633                if (*stack.currentFrame->prev == OP_ASSERT || *stack.currentFrame->prev == OP_ASSERT_NOT || *stack.currentFrame->prev == OP_ONCE) {
     634                    md->end_match_ptr = stack.currentFrame->eptr;      /* For ONCE */
     635                    md->end_offset_top = stack.currentFrame->offset_top;
    616636                    is_match = true;
    617637                    RRETURN;
     
    622642                 extraction by setting the offsets and bumping the high water mark. */
    623643               
    624                 frame->number = *frame->prev - OP_BRA;
     644                stack.currentFrame->number = *stack.currentFrame->prev - OP_BRA;
    625645               
    626646                /* For extended extraction brackets (large number), we have to fish out
    627647                 the number from a dummy opcode at the start. */
    628648               
    629                 if (frame->number > EXTRACT_BASIC_MAX)
    630                     frame->number = GET2(frame->prev, 2+LINK_SIZE);
    631                 frame->offset = frame->number << 1;
     649                if (stack.currentFrame->number > EXTRACT_BASIC_MAX)
     650                    stack.currentFrame->number = GET2(stack.currentFrame->prev, 2+LINK_SIZE);
     651                stack.currentFrame->offset = stack.currentFrame->number << 1;
    632652               
    633653#ifdef DEBUG
    634                 printf("end bracket %d", frame->number);
     654                printf("end bracket %d", stack.currentFrame->number);
    635655                printf("\n");
    636656#endif
     
    641661                 the OP_END is reached. */
    642662               
    643                 if (frame->number > 0) {
    644                     if (frame->offset >= md->offset_max)
     663                if (stack.currentFrame->number > 0) {
     664                    if (stack.currentFrame->offset >= md->offset_max)
    645665                        md->offset_overflow = true;
    646666                    else {
    647                         md->offset_vector[frame->offset] =
    648                         md->offset_vector[md->offset_end - frame->number];
    649                         md->offset_vector[frame->offset+1] = frame->eptr - md->start_subject;
    650                         if (frame->offset_top <= frame->offset)
    651                             frame->offset_top = frame->offset + 2;
     667                        md->offset_vector[stack.currentFrame->offset] =
     668                        md->offset_vector[md->offset_end - stack.currentFrame->number];
     669                        md->offset_vector[stack.currentFrame->offset+1] = stack.currentFrame->eptr - md->start_subject;
     670                        if (stack.currentFrame->offset_top <= stack.currentFrame->offset)
     671                            stack.currentFrame->offset_top = stack.currentFrame->offset + 2;
    652672                    }
    653673                }
     
    659679                 course of events. */
    660680               
    661                 if (*frame->ecode == OP_KET || frame->eptr == frame->saved_eptr) {
    662                     frame->ecode += 1 + LINK_SIZE;
     681                if (*stack.currentFrame->ecode == OP_KET || stack.currentFrame->eptr == stack.currentFrame->saved_eptr) {
     682                    stack.currentFrame->ecode += 1 + LINK_SIZE;
    663683                    NEXT_OPCODE;
    664684                }
     
    667687                 preceding bracket, in the appropriate order. */
    668688               
    669                 if (*frame->ecode == OP_KETRMIN) {
    670                     RMATCH(16, frame->ecode + 1+LINK_SIZE, frame->eptrb, 0);
     689                if (*stack.currentFrame->ecode == OP_KETRMIN) {
     690                    RMATCH(16, stack.currentFrame->ecode + 1+LINK_SIZE, stack.currentFrame->eptrb, 0);
    671691                    if (is_match)
    672692                        RRETURN;
    673                     RMATCH(17, frame->prev, frame->eptrb, match_isgroup);
     693                    RMATCH(17, stack.currentFrame->prev, stack.currentFrame->eptrb, match_isgroup);
    674694                    if (is_match)
    675695                        RRETURN;
    676696                } else { /* OP_KETRMAX */
    677                     RMATCH(18, frame->prev, frame->eptrb, match_isgroup);
     697                    RMATCH(18, stack.currentFrame->prev, stack.currentFrame->eptrb, match_isgroup);
    678698                    if (is_match)
    679699                        RRETURN;
    680                     RMATCH(19, frame->ecode + 1+LINK_SIZE, frame->eptrb, 0);
     700                    RMATCH(19, stack.currentFrame->ecode + 1+LINK_SIZE, stack.currentFrame->eptrb, 0);
    681701                    if (is_match)
    682702                        RRETURN;
     
    687707               
    688708                BEGIN_OPCODE(CIRC):
    689                 if (frame->eptr != md->start_subject && (!md->multiline || !isNewline(frame->eptr[-1])))
    690                     RRETURN_NO_MATCH;
    691                 frame->ecode++;
     709                if (stack.currentFrame->eptr != md->start_subject && (!md->multiline || !isNewline(stack.currentFrame->eptr[-1])))
     710                    RRETURN_NO_MATCH;
     711                stack.currentFrame->ecode++;
    692712                NEXT_OPCODE;
    693713               
     
    695715               
    696716                BEGIN_OPCODE(DOLL):
    697                 if (frame->eptr < md->end_subject && (!md->multiline || !isNewline(*frame->eptr)))
    698                     RRETURN_NO_MATCH;
    699                 frame->ecode++;
     717                if (stack.currentFrame->eptr < md->end_subject && (!md->multiline || !isNewline(*stack.currentFrame->eptr)))
     718                    RRETURN_NO_MATCH;
     719                stack.currentFrame->ecode++;
    700720                NEXT_OPCODE;
    701721               
     
    708728                 be "non-word" characters. */
    709729               
    710                 if (frame->eptr == md->start_subject)
     730                if (stack.currentFrame->eptr == md->start_subject)
    711731                    prev_is_word = false;
    712732                else {
    713                     const pcre_uchar *lastptr = frame->eptr - 1;
     733                    const pcre_uchar *lastptr = stack.currentFrame->eptr - 1;
    714734                    while(ISMIDCHAR(*lastptr))
    715735                        lastptr--;
     
    717737                    prev_is_word = c < 128 && (md->ctypes[c] & ctype_word) != 0;
    718738                }
    719                 if (frame->eptr >= md->end_subject)
     739                if (stack.currentFrame->eptr >= md->end_subject)
    720740                    cur_is_word = false;
    721741                else {
    722                     GETCHAR(c, frame->eptr);
     742                    GETCHAR(c, stack.currentFrame->eptr);
    723743                    cur_is_word = c < 128 && (md->ctypes[c] & ctype_word) != 0;
    724744                }
     
    726746                /* Now see if the situation is what we want */
    727747               
    728                 if ((*frame->ecode++ == OP_WORD_BOUNDARY) ? cur_is_word == prev_is_word : cur_is_word != prev_is_word)
     748                if ((*stack.currentFrame->ecode++ == OP_WORD_BOUNDARY) ? cur_is_word == prev_is_word : cur_is_word != prev_is_word)
    729749                    RRETURN_NO_MATCH;
    730750                NEXT_OPCODE;
     
    733753               
    734754                BEGIN_OPCODE(ANY):
    735                 if (frame->eptr < md->end_subject && isNewline(*frame->eptr))
    736                     RRETURN_NO_MATCH;
    737                 if (frame->eptr++ >= md->end_subject)
    738                     RRETURN_NO_MATCH;
    739                 while (frame->eptr < md->end_subject && ISMIDCHAR(*frame->eptr))
    740                     frame->eptr++;
    741                 frame->ecode++;
     755                if (stack.currentFrame->eptr < md->end_subject && isNewline(*stack.currentFrame->eptr))
     756                    RRETURN_NO_MATCH;
     757                if (stack.currentFrame->eptr++ >= md->end_subject)
     758                    RRETURN_NO_MATCH;
     759                while (stack.currentFrame->eptr < md->end_subject && ISMIDCHAR(*stack.currentFrame->eptr))
     760                    stack.currentFrame->eptr++;
     761                stack.currentFrame->ecode++;
    742762                NEXT_OPCODE;
    743763               
    744764                BEGIN_OPCODE(NOT_DIGIT):
    745                 if (frame->eptr >= md->end_subject)
    746                     RRETURN_NO_MATCH;
    747                 GETCHARINCTEST(c, frame->eptr);
     765                if (stack.currentFrame->eptr >= md->end_subject)
     766                    RRETURN_NO_MATCH;
     767                GETCHARINCTEST(c, stack.currentFrame->eptr);
    748768                if (isASCIIDigit(c))
    749769                    RRETURN_NO_MATCH;
    750                 frame->ecode++;
     770                stack.currentFrame->ecode++;
    751771                NEXT_OPCODE;
    752772               
    753773                BEGIN_OPCODE(DIGIT):
    754                 if (frame->eptr >= md->end_subject)
    755                     RRETURN_NO_MATCH;
    756                 GETCHARINCTEST(c, frame->eptr);
     774                if (stack.currentFrame->eptr >= md->end_subject)
     775                    RRETURN_NO_MATCH;
     776                GETCHARINCTEST(c, stack.currentFrame->eptr);
    757777                if (!isASCIIDigit(c))
    758778                    RRETURN_NO_MATCH;
    759                 frame->ecode++;
     779                stack.currentFrame->ecode++;
    760780                NEXT_OPCODE;
    761781               
    762782                BEGIN_OPCODE(NOT_WHITESPACE):
    763                 if (frame->eptr >= md->end_subject)
    764                     RRETURN_NO_MATCH;
    765                 GETCHARINCTEST(c, frame->eptr);
     783                if (stack.currentFrame->eptr >= md->end_subject)
     784                    RRETURN_NO_MATCH;
     785                GETCHARINCTEST(c, stack.currentFrame->eptr);
    766786                if (c < 128 && (md->ctypes[c] & ctype_space))
    767787                    RRETURN_NO_MATCH;
    768                 frame->ecode++;
     788                stack.currentFrame->ecode++;
    769789                NEXT_OPCODE;
    770790               
    771791                BEGIN_OPCODE(WHITESPACE):
    772                 if (frame->eptr >= md->end_subject)
    773                     RRETURN_NO_MATCH;
    774                 GETCHARINCTEST(c, frame->eptr);
     792                if (stack.currentFrame->eptr >= md->end_subject)
     793                    RRETURN_NO_MATCH;
     794                GETCHARINCTEST(c, stack.currentFrame->eptr);
    775795                if (c >= 128 || !(md->ctypes[c] & ctype_space))
    776796                    RRETURN_NO_MATCH;
    777                 frame->ecode++;
     797                stack.currentFrame->ecode++;
    778798                NEXT_OPCODE;
    779799               
    780800                BEGIN_OPCODE(NOT_WORDCHAR):
    781                 if (frame->eptr >= md->end_subject)
    782                     RRETURN_NO_MATCH;
    783                 GETCHARINCTEST(c, frame->eptr);
     801                if (stack.currentFrame->eptr >= md->end_subject)
     802                    RRETURN_NO_MATCH;
     803                GETCHARINCTEST(c, stack.currentFrame->eptr);
    784804                if (c < 128 && (md->ctypes[c] & ctype_word))
    785805                    RRETURN_NO_MATCH;
    786                 frame->ecode++;
     806                stack.currentFrame->ecode++;
    787807                NEXT_OPCODE;
    788808               
    789809                BEGIN_OPCODE(WORDCHAR):
    790                 if (frame->eptr >= md->end_subject)
    791                     RRETURN_NO_MATCH;
    792                 GETCHARINCTEST(c, frame->eptr);
     810                if (stack.currentFrame->eptr >= md->end_subject)
     811                    RRETURN_NO_MATCH;
     812                GETCHARINCTEST(c, stack.currentFrame->eptr);
    793813                if (c >= 128 || !(md->ctypes[c] & ctype_word))
    794814                    RRETURN_NO_MATCH;
    795                 frame->ecode++;
     815                stack.currentFrame->ecode++;
    796816                NEXT_OPCODE;
    797817               
     
    805825               
    806826                BEGIN_OPCODE(REF):
    807                 frame->offset = GET2(frame->ecode, 1) << 1;               /* Doubled ref number */
    808                 frame->ecode += 3;                                 /* Advance past item */
     827                stack.currentFrame->offset = GET2(stack.currentFrame->ecode, 1) << 1;               /* Doubled ref number */
     828                stack.currentFrame->ecode += 3;                                 /* Advance past item */
    809829               
    810830                /* If the reference is unset, set the length to be longer than the amount
     
    813833                 minima. */
    814834               
    815                 if (frame->offset >= frame->offset_top || md->offset_vector[frame->offset] < 0)
    816                     frame->length = 0;
     835                if (stack.currentFrame->offset >= stack.currentFrame->offset_top || md->offset_vector[stack.currentFrame->offset] < 0)
     836                    stack.currentFrame->length = 0;
    817837                else
    818                     frame->length = md->offset_vector[frame->offset+1] - md->offset_vector[frame->offset];
     838                    stack.currentFrame->length = md->offset_vector[stack.currentFrame->offset+1] - md->offset_vector[stack.currentFrame->offset];
    819839               
    820840                /* Set up for repetition, or handle the non-repeated case */
    821841               
    822                 switch (*frame->ecode) {
     842                switch (*stack.currentFrame->ecode) {
    823843                case OP_CRSTAR:
    824844                case OP_CRMINSTAR:
     
    827847                case OP_CRQUERY:
    828848                case OP_CRMINQUERY:
    829                     c = *frame->ecode++ - OP_CRSTAR;
     849                    c = *stack.currentFrame->ecode++ - OP_CRSTAR;
    830850                    minimize = (c & 1) != 0;
    831851                    min = rep_min[c];                 /* Pick up values from tables; */
    832                     frame->max = rep_max[c];                 /* zero for max => infinity */
    833                     if (frame->max == 0)
    834                         frame->max = INT_MAX;
     852                    stack.currentFrame->max = rep_max[c];                 /* zero for max => infinity */
     853                    if (stack.currentFrame->max == 0)
     854                        stack.currentFrame->max = INT_MAX;
    835855                    break;
    836856                   
    837857                case OP_CRRANGE:
    838858                case OP_CRMINRANGE:
    839                     minimize = (*frame->ecode == OP_CRMINRANGE);
    840                     min = GET2(frame->ecode, 1);
    841                     frame->max = GET2(frame->ecode, 3);
    842                     if (frame->max == 0)
    843                         frame->max = INT_MAX;
    844                     frame->ecode += 5;
     859                    minimize = (*stack.currentFrame->ecode == OP_CRMINRANGE);
     860                    min = GET2(stack.currentFrame->ecode, 1);
     861                    stack.currentFrame->max = GET2(stack.currentFrame->ecode, 3);
     862                    if (stack.currentFrame->max == 0)
     863                        stack.currentFrame->max = INT_MAX;
     864                    stack.currentFrame->ecode += 5;
    845865                    break;
    846866               
    847867                default:               /* No repeat follows */
    848                     if (!match_ref(frame->offset, frame->eptr, frame->length, md))
     868                    if (!match_ref(stack.currentFrame->offset, stack.currentFrame->eptr, stack.currentFrame->length, md))
    849869                        RRETURN_NO_MATCH;
    850                     frame->eptr += frame->length;
     870                    stack.currentFrame->eptr += stack.currentFrame->length;
    851871                    NEXT_OPCODE;
    852872                }
     
    855875                 main loop. */
    856876               
    857                 if (frame->length == 0)
     877                if (stack.currentFrame->length == 0)
    858878                    NEXT_OPCODE;
    859879               
     
    861881               
    862882                for (i = 1; i <= min; i++) {
    863                     if (!match_ref(frame->offset, frame->eptr, frame->length, md))
     883                    if (!match_ref(stack.currentFrame->offset, stack.currentFrame->eptr, stack.currentFrame->length, md))
    864884                        RRETURN_NO_MATCH;
    865                     frame->eptr += frame->length;
     885                    stack.currentFrame->eptr += stack.currentFrame->length;
    866886                }
    867887               
     
    869889                 They are not both allowed to be zero. */
    870890               
    871                 if (min == frame->max)
     891                if (min == stack.currentFrame->max)
    872892                    NEXT_OPCODE;
    873893               
     
    875895               
    876896                if (minimize) {
    877                     for (frame->fi = min;; frame->fi++) {
    878                         RMATCH(20, frame->ecode, frame->eptrb, 0);
     897                    for (stack.currentFrame->fi = min;; stack.currentFrame->fi++) {
     898                        RMATCH(20, stack.currentFrame->ecode, stack.currentFrame->eptrb, 0);
    879899                        if (is_match)
    880900                            RRETURN;
    881                         if (frame->fi >= frame->max || !match_ref(frame->offset, frame->eptr, frame->length, md))
     901                        if (stack.currentFrame->fi >= stack.currentFrame->max || !match_ref(stack.currentFrame->offset, stack.currentFrame->eptr, stack.currentFrame->length, md))
    882902                            RRETURN;
    883                         frame->eptr += frame->length;
     903                        stack.currentFrame->eptr += stack.currentFrame->length;
    884904                    }
    885905                    ASSERT_NOT_REACHED();
     
    889909               
    890910                else {
    891                     frame->pp = frame->eptr;
    892                     for (i = min; i < frame->max; i++) {
    893                         if (!match_ref(frame->offset, frame->eptr, frame->length, md))
    894                             break;
    895                         frame->eptr += frame->length;
     911                    stack.currentFrame->pp = stack.currentFrame->eptr;
     912                    for (i = min; i < stack.currentFrame->max; i++) {
     913                        if (!match_ref(stack.currentFrame->offset, stack.currentFrame->eptr, stack.currentFrame->length, md))
     914                            break;
     915                        stack.currentFrame->eptr += stack.currentFrame->length;
    896916                    }
    897                     while (frame->eptr >= frame->pp) {
    898                         RMATCH(21, frame->ecode, frame->eptrb, 0);
     917                    while (stack.currentFrame->eptr >= stack.currentFrame->pp) {
     918                        RMATCH(21, stack.currentFrame->ecode, stack.currentFrame->eptrb, 0);
    899919                        if (is_match)
    900920                            RRETURN;
    901                         frame->eptr -= frame->length;
     921                        stack.currentFrame->eptr -= stack.currentFrame->length;
    902922                    }
    903923                    RRETURN_NO_MATCH;
     
    918938                BEGIN_OPCODE(NCLASS):
    919939                BEGIN_OPCODE(CLASS):
    920                 frame->data = frame->ecode + 1;                /* Save for matching */
    921                 frame->ecode += 33;                     /* Advance past the item */
    922                
    923                 switch (*frame->ecode) {
     940                stack.currentFrame->data = stack.currentFrame->ecode + 1;                /* Save for matching */
     941                stack.currentFrame->ecode += 33;                     /* Advance past the item */
     942               
     943                switch (*stack.currentFrame->ecode) {
    924944                case OP_CRSTAR:
    925945                case OP_CRMINSTAR:
     
    928948                case OP_CRQUERY:
    929949                case OP_CRMINQUERY:
    930                     c = *frame->ecode++ - OP_CRSTAR;
     950                    c = *stack.currentFrame->ecode++ - OP_CRSTAR;
    931951                    minimize = (c & 1) != 0;
    932952                    min = rep_min[c];                 /* Pick up values from tables; */
    933                     frame->max = rep_max[c];                 /* zero for max => infinity */
    934                     if (frame->max == 0)
    935                         frame->max = INT_MAX;
     953                    stack.currentFrame->max = rep_max[c];                 /* zero for max => infinity */
     954                    if (stack.currentFrame->max == 0)
     955                        stack.currentFrame->max = INT_MAX;
    936956                    break;
    937957                   
    938958                case OP_CRRANGE:
    939959                case OP_CRMINRANGE:
    940                     minimize = (*frame->ecode == OP_CRMINRANGE);
    941                     min = GET2(frame->ecode, 1);
    942                     frame->max = GET2(frame->ecode, 3);
    943                     if (frame->max == 0)
    944                         frame->max = INT_MAX;
    945                     frame->ecode += 5;
     960                    minimize = (*stack.currentFrame->ecode == OP_CRMINRANGE);
     961                    min = GET2(stack.currentFrame->ecode, 1);
     962                    stack.currentFrame->max = GET2(stack.currentFrame->ecode, 3);
     963                    if (stack.currentFrame->max == 0)
     964                        stack.currentFrame->max = INT_MAX;
     965                    stack.currentFrame->ecode += 5;
    946966                    break;
    947967                   
    948968                default:               /* No repeat follows */
    949                     min = frame->max = 1;
     969                    min = stack.currentFrame->max = 1;
    950970                    break;
    951971                }
     
    954974               
    955975                for (i = 1; i <= min; i++) {
    956                     if (frame->eptr >= md->end_subject)
     976                    if (stack.currentFrame->eptr >= md->end_subject)
    957977                        RRETURN_NO_MATCH;
    958                     GETCHARINC(c, frame->eptr);
     978                    GETCHARINC(c, stack.currentFrame->eptr);
    959979                    if (c > 255) {
    960                         if (frame->data[-1] == OP_CLASS)
     980                        if (stack.currentFrame->data[-1] == OP_CLASS)
    961981                            RRETURN_NO_MATCH;
    962982                    } else {
    963                         if ((frame->data[c/8] & (1 << (c&7))) == 0)
     983                        if ((stack.currentFrame->data[c/8] & (1 << (c&7))) == 0)
    964984                            RRETURN_NO_MATCH;
    965985                    }
     
    969989                 need to recurse. */
    970990               
    971                 if (min == frame->max)
     991                if (min == stack.currentFrame->max)
    972992                    NEXT_OPCODE;     
    973993               
     
    976996                if (minimize) {
    977997                    {
    978                         for (frame->fi = min;; frame->fi++) {
    979                             RMATCH(22, frame->ecode, frame->eptrb, 0);
     998                        for (stack.currentFrame->fi = min;; stack.currentFrame->fi++) {
     999                            RMATCH(22, stack.currentFrame->ecode, stack.currentFrame->eptrb, 0);
    9801000                            if (is_match)
    9811001                                RRETURN;
    982                             if (frame->fi >= frame->max || frame->eptr >= md->end_subject)
     1002                            if (stack.currentFrame->fi >= stack.currentFrame->max || stack.currentFrame->eptr >= md->end_subject)
    9831003                                RRETURN;
    984                             GETCHARINC(c, frame->eptr);
     1004                            GETCHARINC(c, stack.currentFrame->eptr);
    9851005                            if (c > 255) {
    986                                 if (frame->data[-1] == OP_CLASS)
     1006                                if (stack.currentFrame->data[-1] == OP_CLASS)
    9871007                                    RRETURN;
    9881008                            } else {
    989                                 if ((frame->data[c/8] & (1 << (c&7))) == 0)
     1009                                if ((stack.currentFrame->data[c/8] & (1 << (c&7))) == 0)
    9901010                                    RRETURN;
    9911011                            }
     
    9961016                /* If maximizing, find the longest possible run, then work backwards. */
    9971017                else {
    998                     frame->pp = frame->eptr;
    999                    
    1000                     for (i = min; i < frame->max; i++) {
     1018                    stack.currentFrame->pp = stack.currentFrame->eptr;
     1019                   
     1020                    for (i = min; i < stack.currentFrame->max; i++) {
    10011021                        int len = 1;
    1002                         if (frame->eptr >= md->end_subject)
    1003                             break;
    1004                         GETCHARLEN(c, frame->eptr, len);
     1022                        if (stack.currentFrame->eptr >= md->end_subject)
     1023                            break;
     1024                        GETCHARLEN(c, stack.currentFrame->eptr, len);
    10051025                        if (c > 255) {
    1006                             if (frame->data[-1] == OP_CLASS)
     1026                            if (stack.currentFrame->data[-1] == OP_CLASS)
    10071027                                break;
    10081028                        } else {
    1009                             if ((frame->data[c/8] & (1 << (c&7))) == 0)
     1029                            if ((stack.currentFrame->data[c/8] & (1 << (c&7))) == 0)
    10101030                                break;
    10111031                        }
    1012                         frame->eptr += len;
     1032                        stack.currentFrame->eptr += len;
    10131033                    }
    10141034                    for (;;) {
    1015                         RMATCH(24, frame->ecode, frame->eptrb, 0);
     1035                        RMATCH(24, stack.currentFrame->ecode, stack.currentFrame->eptrb, 0);
    10161036                        if (is_match)
    10171037                            RRETURN;
    1018                         if (frame->eptr-- == frame->pp)
     1038                        if (stack.currentFrame->eptr-- == stack.currentFrame->pp)
    10191039                            break;        /* Stop if tried at original pos */
    1020                         BACKCHAR(frame->eptr);
     1040                        BACKCHAR(stack.currentFrame->eptr);
    10211041                    }
    10221042                   
     
    10291049               
    10301050                BEGIN_OPCODE(XCLASS):
    1031                 frame->data = frame->ecode + 1 + LINK_SIZE;                /* Save for matching */
    1032                 frame->ecode += GET(frame->ecode, 1);                      /* Advance past the item */
    1033                
    1034                 switch (*frame->ecode) {
     1051                stack.currentFrame->data = stack.currentFrame->ecode + 1 + LINK_SIZE;                /* Save for matching */
     1052                stack.currentFrame->ecode += GET(stack.currentFrame->ecode, 1);                      /* Advance past the item */
     1053               
     1054                switch (*stack.currentFrame->ecode) {
    10351055                case OP_CRSTAR:
    10361056                case OP_CRMINSTAR:
     
    10391059                case OP_CRQUERY:
    10401060                case OP_CRMINQUERY:
    1041                     c = *frame->ecode++ - OP_CRSTAR;
     1061                    c = *stack.currentFrame->ecode++ - OP_CRSTAR;
    10421062                    minimize = (c & 1) != 0;
    10431063                    min = rep_min[c];                 /* Pick up values from tables; */
    1044                     frame->max = rep_max[c];                 /* zero for max => infinity */
    1045                     if (frame->max == 0)
    1046                         frame->max = INT_MAX;
     1064                    stack.currentFrame->max = rep_max[c];                 /* zero for max => infinity */
     1065                    if (stack.currentFrame->max == 0)
     1066                        stack.currentFrame->max = INT_MAX;
    10471067                    break;
    10481068                   
    10491069                case OP_CRRANGE:
    10501070                case OP_CRMINRANGE:
    1051                     minimize = (*frame->ecode == OP_CRMINRANGE);
    1052                     min = GET2(frame->ecode, 1);
    1053                     frame->max = GET2(frame->ecode, 3);
    1054                     if (frame->max == 0)
    1055                         frame->max = INT_MAX;
    1056                     frame->ecode += 5;
     1071                    minimize = (*stack.currentFrame->ecode == OP_CRMINRANGE);
     1072                    min = GET2(stack.currentFrame->ecode, 1);
     1073                    stack.currentFrame->max = GET2(stack.currentFrame->ecode, 3);
     1074                    if (stack.currentFrame->max == 0)
     1075                        stack.currentFrame->max = INT_MAX;
     1076                    stack.currentFrame->ecode += 5;
    10571077                    break;
    10581078                   
    10591079                default:               /* No repeat follows */
    1060                     min = frame->max = 1;
     1080                    min = stack.currentFrame->max = 1;
    10611081            }
    10621082               
     
    10641084               
    10651085                for (i = 1; i <= min; i++) {
    1066                     if (frame->eptr >= md->end_subject)
     1086                    if (stack.currentFrame->eptr >= md->end_subject)
    10671087                        RRETURN_NO_MATCH;
    1068                     GETCHARINC(c, frame->eptr);
    1069                     if (!_pcre_xclass(c, frame->data))
     1088                    GETCHARINC(c, stack.currentFrame->eptr);
     1089                    if (!_pcre_xclass(c, stack.currentFrame->data))
    10701090                        RRETURN_NO_MATCH;
    10711091                }
     
    10741094                 need to recurse. */
    10751095               
    1076                 if (min == frame->max)
     1096                if (min == stack.currentFrame->max)
    10771097                    NEXT_OPCODE;
    10781098               
     
    10811101               
    10821102                if (minimize) {
    1083                     for (frame->fi = min;; frame->fi++) {
    1084                         RMATCH(26, frame->ecode, frame->eptrb, 0);
     1103                    for (stack.currentFrame->fi = min;; stack.currentFrame->fi++) {
     1104                        RMATCH(26, stack.currentFrame->ecode, stack.currentFrame->eptrb, 0);
    10851105                        if (is_match)
    10861106                            RRETURN;
    1087                         if (frame->fi >= frame->max || frame->eptr >= md->end_subject)
     1107                        if (stack.currentFrame->fi >= stack.currentFrame->max || stack.currentFrame->eptr >= md->end_subject)
    10881108                            RRETURN;
    1089                         GETCHARINC(c, frame->eptr);
    1090                         if (!_pcre_xclass(c, frame->data))
     1109                        GETCHARINC(c, stack.currentFrame->eptr);
     1110                        if (!_pcre_xclass(c, stack.currentFrame->data))
    10911111                            RRETURN;
    10921112                    }
     
    10971117               
    10981118                else {
    1099                     frame->pp = frame->eptr;
    1100                     for (i = min; i < frame->max; i++) {
     1119                    stack.currentFrame->pp = stack.currentFrame->eptr;
     1120                    for (i = min; i < stack.currentFrame->max; i++) {
    11011121                        int len = 1;
    1102                         if (frame->eptr >= md->end_subject)
    1103                             break;
    1104                         GETCHARLEN(c, frame->eptr, len);
    1105                         if (!_pcre_xclass(c, frame->data))
    1106                             break;
    1107                         frame->eptr += len;
     1122                        if (stack.currentFrame->eptr >= md->end_subject)
     1123                            break;
     1124                        GETCHARLEN(c, stack.currentFrame->eptr, len);
     1125                        if (!_pcre_xclass(c, stack.currentFrame->data))
     1126                            break;
     1127                        stack.currentFrame->eptr += len;
    11081128                    }
    11091129                    for(;;) {
    1110                         RMATCH(27, frame->ecode, frame->eptrb, 0);
     1130                        RMATCH(27, stack.currentFrame->ecode, stack.currentFrame->eptrb, 0);
    11111131                        if (is_match)
    11121132                            RRETURN;
    1113                         if (frame->eptr-- == frame->pp)
     1133                        if (stack.currentFrame->eptr-- == stack.currentFrame->pp)
    11141134                            break;        /* Stop if tried at original pos */
    1115                         BACKCHAR(frame->eptr)
     1135                        BACKCHAR(stack.currentFrame->eptr)
    11161136                    }
    11171137                    RRETURN;
     
    11231143               
    11241144                BEGIN_OPCODE(CHAR):
    1125                 frame->length = 1;
    1126                 frame->ecode++;
    1127                 GETUTF8CHARLEN(frame->fc, frame->ecode, frame->length);
     1145                stack.currentFrame->length = 1;
     1146                stack.currentFrame->ecode++;
     1147                GETUTF8CHARLEN(stack.currentFrame->fc, stack.currentFrame->ecode, stack.currentFrame->length);
    11281148            {
    11291149                int dc;
    1130                 frame->ecode += frame->length;
    1131                 switch (md->end_subject - frame->eptr) {
     1150                stack.currentFrame->ecode += stack.currentFrame->length;
     1151                switch (md->end_subject - stack.currentFrame->eptr) {
    11321152                case 0:
    11331153                    RRETURN_NO_MATCH;
    11341154                case 1:
    1135                     dc = *frame->eptr++;
     1155                    dc = *stack.currentFrame->eptr++;
    11361156                    if (IS_LEADING_SURROGATE(dc))
    11371157                        RRETURN_NO_MATCH;
    11381158                    break;
    11391159                    default:
    1140                     GETCHARINC(dc, frame->eptr);
    1141                 }
    1142                 if (frame->fc != dc)
     1160                    GETCHARINC(dc, stack.currentFrame->eptr);
     1161                }
     1162                if (stack.currentFrame->fc != dc)
    11431163                    RRETURN_NO_MATCH;
    11441164            }
     
    11481168               
    11491169                BEGIN_OPCODE(CHARNC):
    1150                 frame->length = 1;
    1151                 frame->ecode++;
    1152                 GETUTF8CHARLEN(frame->fc, frame->ecode, frame->length);
    1153                
    1154                 if (md->end_subject - frame->eptr == 0)
     1170                stack.currentFrame->length = 1;
     1171                stack.currentFrame->ecode++;
     1172                GETUTF8CHARLEN(stack.currentFrame->fc, stack.currentFrame->ecode, stack.currentFrame->length);
     1173               
     1174                if (md->end_subject - stack.currentFrame->eptr == 0)
    11551175                    RRETURN_NO_MATCH;
    11561176               
    11571177            {
    11581178                int dc;
    1159                 if (md->end_subject - frame->eptr == 1) {
    1160                     dc = *frame->eptr++;
     1179                if (md->end_subject - stack.currentFrame->eptr == 1) {
     1180                    dc = *stack.currentFrame->eptr++;
    11611181                    if (IS_LEADING_SURROGATE(dc))
    11621182                        RRETURN_NO_MATCH;
    11631183                } else
    1164                     GETCHARINC(dc, frame->eptr);
    1165                 frame->ecode += frame->length;
     1184                    GETCHARINC(dc, stack.currentFrame->eptr);
     1185                stack.currentFrame->ecode += stack.currentFrame->length;
    11661186               
    11671187                /* If we have Unicode property support, we can use it to test the other
    11681188                 case of the character, if there is one. */
    11691189               
    1170                 if (frame->fc != dc) {
    1171                     if (dc != _pcre_ucp_othercase(frame->fc))
     1190                if (stack.currentFrame->fc != dc) {
     1191                    if (dc != _pcre_ucp_othercase(stack.currentFrame->fc))
    11721192                        RRETURN_NO_MATCH;
    11731193                }
     
    11781198               
    11791199                BEGIN_OPCODE(ASCII_CHAR):
    1180                 if (md->end_subject == frame->eptr)
    1181                     RRETURN_NO_MATCH;
    1182                 if (*frame->eptr != frame->ecode[1])
    1183                     RRETURN_NO_MATCH;
    1184                 ++frame->eptr;
    1185                 frame->ecode += 2;
     1200                if (md->end_subject == stack.currentFrame->eptr)
     1201                    RRETURN_NO_MATCH;
     1202                if (*stack.currentFrame->eptr != stack.currentFrame->ecode[1])
     1203                    RRETURN_NO_MATCH;
     1204                ++stack.currentFrame->eptr;
     1205                stack.currentFrame->ecode += 2;
    11861206                NEXT_OPCODE;
    11871207               
     
    11891209               
    11901210                BEGIN_OPCODE(ASCII_LETTER_NC):
    1191                 if (md->end_subject == frame->eptr)
    1192                     RRETURN_NO_MATCH;
    1193                 if ((*frame->eptr | 0x20) != frame->ecode[1])
    1194                     RRETURN_NO_MATCH;
    1195                 ++frame->eptr;
    1196                 frame->ecode += 2;
     1211                if (md->end_subject == stack.currentFrame->eptr)
     1212                    RRETURN_NO_MATCH;
     1213                if ((*stack.currentFrame->eptr | 0x20) != stack.currentFrame->ecode[1])
     1214                    RRETURN_NO_MATCH;
     1215                ++stack.currentFrame->eptr;
     1216                stack.currentFrame->ecode += 2;
    11971217                NEXT_OPCODE;
    11981218               
     
    12001220               
    12011221                BEGIN_OPCODE(EXACT):
    1202                 min = frame->max = GET2(frame->ecode, 1);
     1222                min = stack.currentFrame->max = GET2(stack.currentFrame->ecode, 1);
    12031223                minimize = false;
    1204                 frame->ecode += 3;
     1224                stack.currentFrame->ecode += 3;
    12051225                goto REPEATCHAR;
    12061226               
     
    12081228                BEGIN_OPCODE(MINUPTO):
    12091229                min = 0;
    1210                 frame->max = GET2(frame->ecode, 1);
    1211                 minimize = *frame->ecode == OP_MINUPTO;
    1212                 frame->ecode += 3;
     1230                stack.currentFrame->max = GET2(stack.currentFrame->ecode, 1);
     1231                minimize = *stack.currentFrame->ecode == OP_MINUPTO;
     1232                stack.currentFrame->ecode += 3;
    12131233                goto REPEATCHAR;
    12141234               
     
    12191239                BEGIN_OPCODE(QUERY):
    12201240                BEGIN_OPCODE(MINQUERY):
    1221                 c = *frame->ecode++ - OP_STAR;
     1241                c = *stack.currentFrame->ecode++ - OP_STAR;
    12221242                minimize = (c & 1) != 0;
    12231243                min = rep_min[c];                 /* Pick up values from tables; */
    1224                 frame->max = rep_max[c];                 /* zero for max => infinity */
    1225                 if (frame->max == 0)
    1226                     frame->max = INT_MAX;
     1244                stack.currentFrame->max = rep_max[c];                 /* zero for max => infinity */
     1245                if (stack.currentFrame->max == 0)
     1246                    stack.currentFrame->max = INT_MAX;
    12271247               
    12281248                /* Common code for all repeated single-character matches. We can give
     
    12321252            REPEATCHAR:
    12331253               
    1234                 frame->length = 1;
    1235                 GETUTF8CHARLEN(frame->fc, frame->ecode, frame->length);
    1236                 if (min * (frame->fc > 0xFFFF ? 2 : 1) > md->end_subject - frame->eptr)
    1237                     RRETURN_NO_MATCH;
    1238                 frame->ecode += frame->length;
    1239                
    1240                 if (frame->fc <= 0xFFFF) {
    1241                     int othercase = md->caseless ? _pcre_ucp_othercase(frame->fc) : -1;
     1254                stack.currentFrame->length = 1;
     1255                GETUTF8CHARLEN(stack.currentFrame->fc, stack.currentFrame->ecode, stack.currentFrame->length);
     1256                if (min * (stack.currentFrame->fc > 0xFFFF ? 2 : 1) > md->end_subject - stack.currentFrame->eptr)
     1257                    RRETURN_NO_MATCH;
     1258                stack.currentFrame->ecode += stack.currentFrame->length;
     1259               
     1260                if (stack.currentFrame->fc <= 0xFFFF) {
     1261                    int othercase = md->caseless ? _pcre_ucp_othercase(stack.currentFrame->fc) : -1;
    12421262                   
    12431263                    for (i = 1; i <= min; i++) {
    1244                         if (*frame->eptr != frame->fc && *frame->eptr != othercase)
     1264                        if (*stack.currentFrame->eptr != stack.currentFrame->fc && *stack.currentFrame->eptr != othercase)
    12451265                            RRETURN_NO_MATCH;
    1246                         ++frame->eptr;
     1266                        ++stack.currentFrame->eptr;
    12471267                    }
    12481268                   
    1249                     if (min == frame->max)
     1269                    if (min == stack.currentFrame->max)
    12501270                        NEXT_OPCODE;
    12511271                   
    12521272                    if (minimize) {
    1253                         frame->repeat_othercase = othercase;
    1254                         for (frame->fi = min;; frame->fi++) {
    1255                             RMATCH(28, frame->ecode, frame->eptrb, 0);
     1273                        stack.currentFrame->repeat_othercase = othercase;
     1274                        for (stack.currentFrame->fi = min;; stack.currentFrame->fi++) {
     1275                            RMATCH(28, stack.currentFrame->ecode, stack.currentFrame->eptrb, 0);
    12561276                            if (is_match)
    12571277                                RRETURN;
    1258                             if (frame->fi >= frame->max || frame->eptr >= md->end_subject)
     1278                            if (stack.currentFrame->fi >= stack.currentFrame->max || stack.currentFrame->eptr >= md->end_subject)
    12591279                                RRETURN;
    1260                             if (*frame->eptr != frame->fc && *frame->eptr != frame->repeat_othercase)
     1280                            if (*stack.currentFrame->eptr != stack.currentFrame->fc && *stack.currentFrame->eptr != stack.currentFrame->repeat_othercase)
    12611281                                RRETURN;
    1262                             ++frame->eptr;
     1282                            ++stack.currentFrame->eptr;
    12631283                        }
    12641284                        ASSERT_NOT_REACHED();
    12651285                    } else {
    1266                         frame->pp = frame->eptr;
    1267                         for (i = min; i < frame->max; i++) {
    1268                             if (frame->eptr >= md->end_subject)
     1286                        stack.currentFrame->pp = stack.currentFrame->eptr;
     1287                        for (i = min; i < stack.currentFrame->max; i++) {
     1288                            if (stack.currentFrame->eptr >= md->end_subject)
    12691289                                break;
    1270                             if (*frame->eptr != frame->fc && *frame->eptr != othercase)
     1290                            if (*stack.currentFrame->eptr != stack.currentFrame->fc && *stack.currentFrame->eptr != othercase)
    12711291                                break;
    1272                             ++frame->eptr;
     1292                            ++stack.currentFrame->eptr;
    12731293                        }
    1274                         while (frame->eptr >= frame->pp) {
    1275                             RMATCH(29, frame->ecode, frame->eptrb, 0);
     1294                        while (stack.currentFrame->eptr >= stack.currentFrame->pp) {
     1295                            RMATCH(29, stack.currentFrame->ecode, stack.currentFrame->eptrb, 0);
    12761296                            if (is_match)
    12771297                                RRETURN;
    1278                             --frame->eptr;
     1298                            --stack.currentFrame->eptr;
    12791299                        }
    12801300                        RRETURN_NO_MATCH;
     
    12861306                    for (i = 1; i <= min; i++) {
    12871307                        int nc;
    1288                         GETCHAR(nc, frame->eptr);
    1289                         if (nc != frame->fc)
     1308                        GETCHAR(nc, stack.currentFrame->eptr);
     1309                        if (nc != stack.currentFrame->fc)
    12901310                            RRETURN_NO_MATCH;
    1291                         frame->eptr += 2;
     1311                        stack.currentFrame->eptr += 2;
    12921312                    }
    12931313                   
    1294                     if (min == frame->max)
     1314                    if (min == stack.currentFrame->max)
    12951315                        NEXT_OPCODE;
    12961316                   
    12971317                    if (minimize) {
    1298                         for (frame->fi = min;; frame->fi++) {
     1318                        for (stack.currentFrame->fi = min;; stack.currentFrame->fi++) {
    12991319                            int nc;
    1300                             RMATCH(30, frame->ecode, frame->eptrb, 0);
     1320                            RMATCH(30, stack.currentFrame->ecode, stack.currentFrame->eptrb, 0);
    13011321                            if (is_match)
    13021322                                RRETURN;
    1303                             if (frame->fi >= frame->max || frame->eptr >= md->end_subject)
     1323                            if (stack.currentFrame->fi >= stack.currentFrame->max || stack.currentFrame->eptr >= md->end_subject)
    13041324                                RRETURN;
    1305                             GETCHAR(nc, frame->eptr);
    1306                             if (*frame->eptr != frame->fc)
     1325                            GETCHAR(nc, stack.currentFrame->eptr);
     1326                            if (*stack.currentFrame->eptr != stack.currentFrame->fc)
    13071327                                RRETURN;
    1308                             frame->eptr += 2;
     1328                            stack.currentFrame->eptr += 2;
    13091329                        }
    13101330                        ASSERT_NOT_REACHED();
    13111331                    } else {
    1312                         frame->pp = frame->eptr;
    1313                         for (i = min; i < frame->max; i++) {
     1332                        stack.currentFrame->pp = stack.currentFrame->eptr;
     1333                        for (i = min; i < stack.currentFrame->max; i++) {
    13141334                            int nc;
    1315                             if (frame->eptr > md->end_subject - 2)
     1335                            if (stack.currentFrame->eptr > md->end_subject - 2)
    13161336                                break;
    1317                             GETCHAR(nc, frame->eptr);
    1318                             if (*frame->eptr != frame->fc)
     1337                            GETCHAR(nc, stack.currentFrame->eptr);
     1338                            if (*stack.currentFrame->eptr != stack.currentFrame->fc)
    13191339                                break;
    1320                             frame->eptr += 2;
     1340                            stack.currentFrame->eptr += 2;
    13211341                        }
    1322                         while (frame->eptr >= frame->pp) {
    1323                             RMATCH(31, frame->ecode, frame->eptrb, 0);
     1342                        while (stack.currentFrame->eptr >= stack.currentFrame->pp) {
     1343                            RMATCH(31, stack.currentFrame->ecode, stack.currentFrame->eptrb, 0);
    13241344                            if (is_match)
    13251345                                RRETURN;
    1326                             frame->eptr -= 2;
     1346                            stack.currentFrame->eptr -= 2;
    13271347                        }
    13281348                        RRETURN_NO_MATCH;
     
    13361356               
    13371357                BEGIN_OPCODE(NOT):
    1338                 if (frame->eptr >= md->end_subject)
    1339                     RRETURN_NO_MATCH;
    1340                 frame->ecode++;
    1341                 GETCHARINCTEST(c, frame->eptr);
     1358                if (stack.currentFrame->eptr >= md->end_subject)
     1359                    RRETURN_NO_MATCH;
     1360                stack.currentFrame->ecode++;
     1361                GETCHARINCTEST(c, stack.currentFrame->eptr);
    13421362                if (md->caseless) {
    13431363                    if (c < 128)
    13441364                        c = md->lcc[c];
    1345                     if (md->lcc[*frame->ecode++] == c)
     1365                    if (md->lcc[*stack.currentFrame->ecode++] == c)
    13461366                        RRETURN_NO_MATCH;
    13471367                } else {
    1348                     if (*frame->ecode++ == c)
     1368                    if (*stack.currentFrame->ecode++ == c)
    13491369                        RRETURN_NO_MATCH;
    13501370                }
     
    13591379               
    13601380                BEGIN_OPCODE(NOTEXACT):
    1361                 min = frame->max = GET2(frame->ecode, 1);
     1381                min = stack.currentFrame->max = GET2(stack.currentFrame->ecode, 1);
    13621382                minimize = false;
    1363                 frame->ecode += 3;
     1383                stack.currentFrame->ecode += 3;
    13641384                goto REPEATNOTCHAR;
    13651385               
     
    13671387                BEGIN_OPCODE(NOTMINUPTO):
    13681388                min = 0;
    1369                 frame->max = GET2(frame->ecode, 1);
    1370                 minimize = *frame->ecode == OP_NOTMINUPTO;
    1371                 frame->ecode += 3;
     1389                stack.currentFrame->max = GET2(stack.currentFrame->ecode, 1);
     1390                minimize = *stack.currentFrame->ecode == OP_NOTMINUPTO;
     1391                stack.currentFrame->ecode += 3;
    13721392                goto REPEATNOTCHAR;
    13731393               
     
    13781398                BEGIN_OPCODE(NOTQUERY):
    13791399                BEGIN_OPCODE(NOTMINQUERY):
    1380                 c = *frame->ecode++ - OP_NOTSTAR;
     1400                c = *stack.currentFrame->ecode++ - OP_NOTSTAR;
    13811401                minimize = (c & 1) != 0;
    13821402                min = rep_min[c];                 /* Pick up values from tables; */
    1383                 frame->max = rep_max[c];                 /* zero for max => infinity */
    1384                 if (frame->max == 0) frame->max = INT_MAX;
     1403                stack.currentFrame->max = rep_max[c];                 /* zero for max => infinity */
     1404                if (stack.currentFrame->max == 0) stack.currentFrame->max = INT_MAX;
    13851405               
    13861406                /* Common code for all repeated single-byte matches. We can give up quickly
     
    13891409               
    13901410            REPEATNOTCHAR:
    1391                 if (min > md->end_subject - frame->eptr)
    1392                     RRETURN_NO_MATCH;
    1393                 frame->fc = *frame->ecode++;
     1411                if (min > md->end_subject - stack.currentFrame->eptr)
     1412                    RRETURN_NO_MATCH;
     1413                stack.currentFrame->fc = *stack.currentFrame->ecode++;
    13941414               
    13951415                /* The code is duplicated for the caseless and caseful cases, for speed,
     
    14011421                 characters and work backwards. */
    14021422               
    1403                 DPRINTF(("negative matching %c{%d,%d}\n", frame->fc, min, frame->max));
     1423                DPRINTF(("negative matching %c{%d,%d}\n", stack.currentFrame->fc, min, stack.currentFrame->max));
    14041424               
    14051425                if (md->caseless) {
    1406                     if (frame->fc < 128)
    1407                         frame->fc = md->lcc[frame->fc];
     1426                    if (stack.currentFrame->fc < 128)
     1427                        stack.currentFrame->fc = md->lcc[stack.currentFrame->fc];
    14081428                   
    14091429                    {
    14101430                        register int d;
    14111431                        for (i = 1; i <= min; i++) {
    1412                             GETCHARINC(d, frame->eptr);
     1432                            GETCHARINC(d, stack.currentFrame->eptr);
    14131433                            if (d < 128)
    14141434                                d = md->lcc[d];
    1415                             if (frame->fc == d)
     1435                            if (stack.currentFrame->fc == d)
    14161436                                RRETURN_NO_MATCH;
    14171437                        }
    14181438                    }
    14191439                   
    1420                     if (min == frame->max)
     1440                    if (min == stack.currentFrame->max)
    14211441                        NEXT_OPCODE;     
    14221442                   
    14231443                    if (minimize) {
    14241444                        register int d;
    1425                         for (frame->fi = min;; frame->fi++) {
    1426                             RMATCH(38, frame->ecode, frame->eptrb, 0);
     1445                        for (stack.currentFrame->fi = min;; stack.currentFrame->fi++) {
     1446                            RMATCH(38, stack.currentFrame->ecode, stack.currentFrame->eptrb, 0);
    14271447                            if (is_match)
    14281448                                RRETURN;
    1429                             GETCHARINC(d, frame->eptr);
     1449                            GETCHARINC(d, stack.currentFrame->eptr);
    14301450                            if (d < 128)
    14311451                                d = md->lcc[d];
    1432                             if (frame->fi >= frame->max || frame->eptr >= md->end_subject || frame->fc == d)
     1452                            if (stack.currentFrame->fi >= stack.currentFrame->max || stack.currentFrame->eptr >= md->end_subject || stack.currentFrame->fc == d)
    14331453                                RRETURN;
    14341454                        }
     
    14391459                   
    14401460                    else {
    1441                         frame->pp = frame->eptr;
     1461                        stack.currentFrame->pp = stack.currentFrame->eptr;
    14421462                       
    14431463                        {
    14441464                            register int d;
    1445                             for (i = min; i < frame->max; i++) {
     1465                            for (i = min; i < stack.currentFrame->max; i++) {
    14461466                                int len = 1;
    1447                                 if (frame->eptr >= md->end_subject)
     1467                                if (stack.currentFrame->eptr >= md->end_subject)
    14481468                                    break;
    1449                                 GETCHARLEN(d, frame->eptr, len);
     1469                                GETCHARLEN(d, stack.currentFrame->eptr, len);
    14501470                                if (d < 128)
    14511471                                    d = md->lcc[d];
    1452                                 if (frame->fc == d)
     1472                                if (stack.currentFrame->fc == d)
    14531473                                    break;
    1454                                 frame->eptr += len;
     1474                                stack.currentFrame->eptr += len;
    14551475                            }
    14561476                            for (;;) {
    1457                                 RMATCH(40, frame->ecode, frame->eptrb, 0);
     1477                                RMATCH(40, stack.currentFrame->ecode, stack.currentFrame->eptrb, 0);
    14581478                                if (is_match)
    14591479                                    RRETURN;
    1460                                 if (frame->eptr-- == frame->pp)
     1480                                if (stack.currentFrame->eptr-- == stack.currentFrame->pp)
    14611481                                    break;        /* Stop if tried at original pos */
    1462                                 BACKCHAR(frame->eptr);
     1482                                BACKCHAR(stack.currentFrame->eptr);
    14631483                            }
    14641484                        }
     
    14751495                        register int d;
    14761496                        for (i = 1; i <= min; i++) {
    1477                             GETCHARINC(d, frame->eptr);
    1478                             if (frame->fc == d)
     1497                            GETCHARINC(d, stack.currentFrame->eptr);
     1498                            if (stack.currentFrame->fc == d)
    14791499                                RRETURN_NO_MATCH;
    14801500                        }
    14811501                    }
    14821502                   
    1483                     if (min == frame->max)
     1503                    if (min == stack.currentFrame->max)
    14841504                        NEXT_OPCODE;
    14851505                   
    14861506                    if (minimize) {
    14871507                        register int d;
    1488                         for (frame->fi = min;; frame->fi++) {
    1489                             RMATCH(42, frame->ecode, frame->eptrb, 0);
     1508                        for (stack.currentFrame->fi = min;; stack.currentFrame->fi++) {
     1509                            RMATCH(42, stack.currentFrame->ecode, stack.currentFrame->eptrb, 0);
    14901510                            if (is_match)
    14911511                                RRETURN;
    1492                             GETCHARINC(d, frame->eptr);
    1493                             if (frame->fi >= frame->max || frame->eptr >= md->end_subject || frame->fc == d)
     1512                            GETCHARINC(d, stack.currentFrame->eptr);
     1513                            if (stack.currentFrame->fi >= stack.currentFrame->max || stack.currentFrame->eptr >= md->end_subject || stack.currentFrame->fc == d)
    14941514                                RRETURN;
    14951515                        }
     
    15001520                   
    15011521                    else {
    1502                         frame->pp = frame->eptr;
     1522                        stack.currentFrame->pp = stack.currentFrame->eptr;
    15031523                       
    15041524                        {
    15051525                            register int d;
    1506                             for (i = min; i < frame->max; i++) {
     1526                            for (i = min; i < stack.currentFrame->max; i++) {
    15071527                                int len = 1;
    1508                                 if (frame->eptr >= md->end_subject)
     1528                                if (stack.currentFrame->eptr >= md->end_subject)
    15091529                                    break;
    1510                                 GETCHARLEN(d, frame->eptr, len);
    1511                                 if (frame->fc == d)
     1530                                GETCHARLEN(d, stack.currentFrame->eptr, len);
     1531                                if (stack.currentFrame->fc == d)
    15121532                                    break;
    1513                                 frame->eptr += len;
     1533                                stack.currentFrame->eptr += len;
    15141534                            }
    15151535                            for (;;) {
    1516                                 RMATCH(44, frame->ecode, frame->eptrb, 0);
     1536                                RMATCH(44, stack.currentFrame->ecode, stack.currentFrame->eptrb, 0);
    15171537                                if (is_match)
    15181538                                    RRETURN;
    1519                                 if (frame->eptr-- == frame->pp)
     1539                                if (stack.currentFrame->eptr-- == stack.currentFrame->pp)
    15201540                                    break;        /* Stop if tried at original pos */
    1521                                 BACKCHAR(frame->eptr);
     1541                                BACKCHAR(stack.currentFrame->eptr);
    15221542                            }
    15231543                        }
     
    15331553               
    15341554                BEGIN_OPCODE(TYPEEXACT):
    1535                 min = frame->max = GET2(frame->ecode, 1);
     1555                min = stack.currentFrame->max = GET2(stack.currentFrame->ecode, 1);
    15361556                minimize = true;
    1537                 frame->ecode += 3;
     1557                stack.currentFrame->ecode += 3;
    15381558                goto REPEATTYPE;
    15391559               
     
    15411561                BEGIN_OPCODE(TYPEMINUPTO):
    15421562                min = 0;
    1543                 frame->max = GET2(frame->ecode, 1);
    1544                 minimize = *frame->ecode == OP_TYPEMINUPTO;
    1545                 frame->ecode += 3;
     1563                stack.currentFrame->max = GET2(stack.currentFrame->ecode, 1);
     1564                minimize = *stack.currentFrame->ecode == OP_TYPEMINUPTO;
     1565                stack.currentFrame->ecode += 3;
    15461566                goto REPEATTYPE;
    15471567               
     
    15521572                BEGIN_OPCODE(TYPEQUERY):
    15531573                BEGIN_OPCODE(TYPEMINQUERY):
    1554                 c = *frame->ecode++ - OP_TYPESTAR;
     1574                c = *stack.currentFrame->ecode++ - OP_TYPESTAR;
    15551575                minimize = (c & 1) != 0;
    15561576                min = rep_min[c];                 /* Pick up values from tables; */
    1557                 frame->max = rep_max[c];                 /* zero for max => infinity */
    1558                 if (frame->max == 0)
    1559                     frame->max = INT_MAX;
     1577                stack.currentFrame->max = rep_max[c];                 /* zero for max => infinity */
     1578                if (stack.currentFrame->max == 0)
     1579                    stack.currentFrame->max = INT_MAX;
    15601580               
    15611581                /* Common code for all repeated single character type matches. Note that
     
    15641584               
    15651585            REPEATTYPE:
    1566                 frame->ctype = *frame->ecode++;      /* Code for the character type */
     1586                stack.currentFrame->ctype = *stack.currentFrame->ecode++;      /* Code for the character type */
    15671587               
    15681588                /* First, ensure the minimum number of matches are present. Use inline
     
    15741594                 and single-bytes. */
    15751595               
    1576                 if (min > md->end_subject - frame->eptr)
     1596                if (min > md->end_subject - stack.currentFrame->eptr)
    15771597                    RRETURN_NO_MATCH;
    15781598                if (min > 0) {
    1579                     switch(frame->ctype) {
     1599                    switch(stack.currentFrame->ctype) {
    15801600                        case OP_ANY:
    15811601                            for (i = 1; i <= min; i++) {
    1582                                 if (frame->eptr >= md->end_subject || isNewline(*frame->eptr))
     1602                                if (stack.currentFrame->eptr >= md->end_subject || isNewline(*stack.currentFrame->eptr))
    15831603                                    RRETURN_NO_MATCH;
    1584                                 ++frame->eptr;
    1585                                 while (frame->eptr < md->end_subject && ISMIDCHAR(*frame->eptr))
    1586                                     frame->eptr++;
     1604                                ++stack.currentFrame->eptr;
     1605                                while (stack.currentFrame->eptr < md->end_subject && ISMIDCHAR(*stack.currentFrame->eptr))
     1606                                    stack.currentFrame->eptr++;
    15871607                            }
    15881608                            break;
     
    15901610                            case OP_NOT_DIGIT:
    15911611                            for (i = 1; i <= min; i++) {
    1592                                 if (frame->eptr >= md->end_subject)
     1612                                if (stack.currentFrame->eptr >= md->end_subject)
    15931613                                    RRETURN_NO_MATCH;
    1594                                 GETCHARINC(c, frame->eptr);
     1614                                GETCHARINC(c, stack.currentFrame->eptr);
    15951615                                if (isASCIIDigit(c))
    15961616                                    RRETURN_NO_MATCH;
     
    16001620                            case OP_DIGIT:
    16011621                            for (i = 1; i <= min; i++) {
    1602                                 if (frame->eptr >= md->end_subject || !isASCIIDigit(*frame->eptr++))
     1622                                if (stack.currentFrame->eptr >= md->end_subject || !isASCIIDigit(*stack.currentFrame->eptr++))
    16031623                                    RRETURN_NO_MATCH;
    16041624                                /* No need to skip more bytes - we know it's a 1-byte character */
     
    16081628                            case OP_NOT_WHITESPACE:
    16091629                            for (i = 1; i <= min; i++) {
    1610                                 if (frame->eptr >= md->end_subject ||
    1611                                     (*frame->eptr < 128 && (md->ctypes[*frame->eptr] & ctype_space) != 0))
     1630                                if (stack.currentFrame->eptr >= md->end_subject ||
     1631                                    (*stack.currentFrame->eptr < 128 && (md->ctypes[*stack.currentFrame->eptr] & ctype_space) != 0))
    16121632                                    RRETURN_NO_MATCH;
    1613                                 while (++frame->eptr < md->end_subject && ISMIDCHAR(*frame->eptr));
     1633                                while (++stack.currentFrame->eptr < md->end_subject && ISMIDCHAR(*stack.currentFrame->eptr));
    16141634                            }
    16151635                            break;
     
    16171637                            case OP_WHITESPACE:
    16181638                            for (i = 1; i <= min; i++) {
    1619                                 if (frame->eptr >= md->end_subject ||
    1620                                     *frame->eptr >= 128 || (md->ctypes[*frame->eptr++] & ctype_space) == 0)
     1639                                if (stack.currentFrame->eptr >= md->end_subject ||
     1640                                    *stack.currentFrame->eptr >= 128 || (md->ctypes[*stack.currentFrame->eptr++] & ctype_space) == 0)
    16211641                                    RRETURN_NO_MATCH;
    16221642                                /* No need to skip more bytes - we know it's a 1-byte character */
     
    16261646                            case OP_NOT_WORDCHAR:
    16271647                            for (i = 1; i <= min; i++) {
    1628                                 if (frame->eptr >= md->end_subject ||
    1629                                     (*frame->eptr < 128 && (md->ctypes[*frame->eptr] & ctype_word) != 0))
     1648                                if (stack.currentFrame->eptr >= md->end_subject ||
     1649                                    (*stack.currentFrame->eptr < 128 && (md->ctypes[*stack.currentFrame->eptr] & ctype_word) != 0))
    16301650                                    RRETURN_NO_MATCH;
    1631                                 while (++frame->eptr < md->end_subject && ISMIDCHAR(*frame->eptr));
     1651                                while (++stack.currentFrame->eptr < md->end_subject && ISMIDCHAR(*stack.currentFrame->eptr));
    16321652                            }
    16331653                            break;
     
    16351655                            case OP_WORDCHAR:
    16361656                            for (i = 1; i <= min; i++) {
    1637                                 if (frame->eptr >= md->end_subject ||
    1638                                     *frame->eptr >= 128 || (md->ctypes[*frame->eptr++] & ctype_word) == 0)
     1657                                if (stack.currentFrame->eptr >= md->end_subject ||
     1658                                    *stack.currentFrame->eptr >= 128 || (md->ctypes[*stack.currentFrame->eptr++] & ctype_word) == 0)
    16391659                                    RRETURN_NO_MATCH;
    16401660                                /* No need to skip more bytes - we know it's a 1-byte character */
     
    16451665                            ASSERT_NOT_REACHED();
    16461666                            RRETURN_ERROR(JSRegExpErrorInternal);
    1647                     }  /* End switch(frame->ctype) */
     1667                    }  /* End switch(stack.currentFrame->ctype) */
    16481668                }
    16491669               
    16501670                /* If min = max, continue at the same level without recursing */
    16511671               
    1652                 if (min == frame->max)
     1672                if (min == stack.currentFrame->max)
    16531673                    NEXT_OPCODE;   
    16541674               
     
    16571677               
    16581678                if (minimize) {
    1659                     for (frame->fi = min;; frame->fi++) {
    1660                         RMATCH(48, frame->ecode, frame->eptrb, 0);
     1679                    for (stack.currentFrame->fi = min;; stack.currentFrame->fi++) {
     1680                        RMATCH(48, stack.currentFrame->ecode, stack.currentFrame->eptrb, 0);
    16611681                        if (is_match)
    16621682                            RRETURN;
    1663                         if (frame->fi >= frame->max || frame->eptr >= md->end_subject)
     1683                        if (stack.currentFrame->fi >= stack.currentFrame->max || stack.currentFrame->eptr >= md->end_subject)
    16641684                            RRETURN;
    16651685                       
    1666                         GETCHARINC(c, frame->eptr);
    1667                         switch(frame->ctype) {
     1686                        GETCHARINC(c, stack.currentFrame->eptr);
     1687                        switch(stack.currentFrame->ctype) {
    16681688                        case OP_ANY:
    16691689                            if (isNewline(c))
     
    17131733               
    17141734                else {
    1715                     frame->pp = frame->eptr;  /* Remember where we started */
    1716                    
    1717                     switch(frame->ctype) {
     1735                    stack.currentFrame->pp = stack.currentFrame->eptr;  /* Remember where we started */
     1736                   
     1737                    switch(stack.currentFrame->ctype) {
    17181738                        case OP_ANY:
    17191739                           
     
    17221742                             worth it, because .* is quite a common idiom. */
    17231743                           
    1724                             if (frame->max < INT_MAX) {
    1725                                 for (i = min; i < frame->max; i++) {
    1726                                     if (frame->eptr >= md->end_subject || isNewline(*frame->eptr))
     1744                            if (stack.currentFrame->max < INT_MAX) {
     1745                                for (i = min; i < stack.currentFrame->max; i++) {
     1746                                    if (stack.currentFrame->eptr >= md->end_subject || isNewline(*stack.currentFrame->eptr))
    17271747                                        break;
    1728                                     frame->eptr++;
    1729                                     while (frame->eptr < md->end_subject && (*frame->eptr & 0xc0) == 0x80)
    1730                                         frame->eptr++;
     1748                                    stack.currentFrame->eptr++;
     1749                                    while (stack.currentFrame->eptr < md->end_subject && (*stack.currentFrame->eptr & 0xc0) == 0x80)
     1750                                        stack.currentFrame->eptr++;
    17311751                                }
    17321752                            }
     
    17351755                           
    17361756                            else {
    1737                                 for (i = min; i < frame->max; i++) {
    1738                                     if (frame->eptr >= md->end_subject || isNewline(*frame->eptr))
     1757                                for (i = min; i < stack.currentFrame->max; i++) {
     1758                                    if (stack.currentFrame->eptr >= md->end_subject || isNewline(*stack.currentFrame->eptr))
    17391759                                        break;
    1740                                     frame->eptr++;
     1760                                    stack.currentFrame->eptr++;
    17411761                                }
    17421762                                break;
     
    17451765                           
    17461766                            case OP_NOT_DIGIT:
    1747                             for (i = min; i < frame->max; i++) {
     1767                            for (i = min; i < stack.currentFrame->max; i++) {
    17481768                                int len = 1;
    1749                                 if (frame->eptr >= md->end_subject)
     1769                                if (stack.currentFrame->eptr >= md->end_subject)
    17501770                                    break;
    1751                                 GETCHARLEN(c, frame->eptr, len);
     1771                                GETCHARLEN(c, stack.currentFrame->eptr, len);
    17521772                                if (isASCIIDigit(c))
    17531773                                    break;
    1754                                 frame->eptr+= len;
     1774                                stack.currentFrame->eptr+= len;
    17551775                            }
    17561776                            break;
    17571777                           
    17581778                            case OP_DIGIT:
    1759                             for (i = min; i < frame->max; i++) {
     1779                            for (i = min; i < stack.currentFrame->max; i++) {
    17601780                                int len = 1;
    1761                                 if (frame->eptr >= md->end_subject)
     1781                                if (stack.currentFrame->eptr >= md->end_subject)
    17621782                                    break;
    1763                                 GETCHARLEN(c, frame->eptr, len);
     1783                                GETCHARLEN(c, stack.currentFrame->eptr, len);
    17641784                                if (!isASCIIDigit(c))
    17651785                                    break;
    1766                                 frame->eptr+= len;
     1786                                stack.currentFrame->eptr+= len;
    17671787                            }
    17681788                            break;
    17691789                           
    17701790                            case OP_NOT_WHITESPACE:
    1771                             for (i = min; i < frame->max; i++) {
     1791                            for (i = min; i < stack.currentFrame->max; i++) {
    17721792                                int len = 1;
    1773                                 if (frame->eptr >= md->end_subject)
     1793                                if (stack.currentFrame->eptr >= md->end_subject)
    17741794                                    break;
    1775                                 GETCHARLEN(c, frame->eptr, len);
     1795                                GETCHARLEN(c, stack.currentFrame->eptr, len);
    17761796                                if (c < 128 && (md->ctypes[c] & ctype_space))
    17771797                                    break;
    1778                                 frame->eptr+= len;
     1798                                stack.currentFrame->eptr+= len;
    17791799                            }
    17801800                            break;
    17811801                           
    17821802                            case OP_WHITESPACE:
    1783                             for (i = min; i < frame->max; i++) {
     1803                            for (i = min; i < stack.currentFrame->max; i++) {
    17841804                                int len = 1;
    1785                                 if (frame->eptr >= md->end_subject)
     1805                                if (stack.currentFrame->eptr >= md->end_subject)
    17861806                                    break;
    1787                                 GETCHARLEN(c, frame->eptr, len);
     1807                                GETCHARLEN(c, stack.currentFrame->eptr, len);
    17881808                                if (c >= 128 || !(md->ctypes[c] & ctype_space))
    17891809                                    break;
    1790                                 frame->eptr+= len;
     1810                                stack.currentFrame->eptr+= len;
    17911811                            }
    17921812                            break;
    17931813                           
    17941814                            case OP_NOT_WORDCHAR:
    1795                             for (i = min; i < frame->max; i++) {
     1815                            for (i = min; i < stack.currentFrame->max; i++) {
    17961816                                int len = 1;
    1797                                 if (frame->eptr >= md->end_subject)
     1817                                if (stack.currentFrame->eptr >= md->end_subject)
    17981818                                    break;
    1799                                 GETCHARLEN(c, frame->eptr, len);
     1819                                GETCHARLEN(c, stack.currentFrame->eptr, len);
    18001820                                if (c < 128 && (md->ctypes[c] & ctype_word))
    18011821                                    break;
    1802                                 frame->eptr+= len;
     1822                                stack.currentFrame->eptr+= len;
    18031823                            }
    18041824                            break;
    18051825                           
    18061826                            case OP_WORDCHAR:
    1807                             for (i = min; i < frame->max; i++) {
     1827                            for (i = min; i < stack.currentFrame->max; i++) {
    18081828                                int len = 1;
    1809                                 if (frame->eptr >= md->end_subject)
     1829                                if (stack.currentFrame->eptr >= md->end_subject)
    18101830                                    break;
    1811                                 GETCHARLEN(c, frame->eptr, len);
     1831                                GETCHARLEN(c, stack.currentFrame->eptr, len);
    18121832                                if (c >= 128 || !(md->ctypes[c] & ctype_word))
    18131833                                    break;
    1814                                 frame->eptr+= len;
     1834                                stack.currentFrame->eptr+= len;
    18151835                            }
    18161836                            break;
     
    18211841                    }
    18221842                   
    1823                     /* frame->eptr is now past the end of the maximum run */
     1843                    /* stack.currentFrame->eptr is now past the end of the maximum run */
    18241844                   
    18251845                    for (;;) {
    1826                         RMATCH(52, frame->ecode, frame->eptrb, 0);
     1846                        RMATCH(52, stack.currentFrame->ecode, stack.currentFrame->eptrb, 0);
    18271847                        if (is_match)
    18281848                            RRETURN;
    1829                         if (frame->eptr-- == frame->pp)
     1849                        if (stack.currentFrame->eptr-- == stack.currentFrame->pp)
    18301850                            break;        /* Stop if tried at original pos */
    1831                         BACKCHAR(frame->eptr);
     1851                        BACKCHAR(stack.currentFrame->eptr);
    18321852                    }
    18331853                   
     
    18681888                 here; that is handled in the code for KET. */
    18691889               
    1870                 ASSERT(*frame->ecode > OP_BRA);
    1871                
    1872                 frame->number = *frame->ecode - OP_BRA;
     1890                ASSERT(*stack.currentFrame->ecode > OP_BRA);
     1891               
     1892                stack.currentFrame->number = *stack.currentFrame->ecode - OP_BRA;
    18731893               
    18741894                /* For extended extraction brackets (large number), we have to fish out the
    18751895                 number from a dummy opcode at the start. */
    18761896               
    1877                 if (frame->number > EXTRACT_BASIC_MAX)
    1878                     frame->number = GET2(frame->ecode, 2+LINK_SIZE);
    1879                 frame->offset = frame->number << 1;
     1897                if (stack.currentFrame->number > EXTRACT_BASIC_MAX)
     1898                    stack.currentFrame->number = GET2(stack.currentFrame->ecode, 2+LINK_SIZE);
     1899                stack.currentFrame->offset = stack.currentFrame->number << 1;
    18801900               
    18811901#ifdef DEBUG
    1882                 printf("start bracket %d subject=", frame->number);
    1883                 pchars(frame->eptr, 16, true, md);
     1902                printf("start bracket %d subject=", stack.currentFrame->number);
     1903                pchars(stack.currentFrame->eptr, 16, true, md);
    18841904                printf("\n");
    18851905#endif
    18861906               
    1887                 if (frame->offset < md->offset_max) {
    1888                     frame->save_offset1 = md->offset_vector[frame->offset];
    1889                     frame->save_offset2 = md->offset_vector[frame->offset + 1];
    1890                     frame->save_offset3 = md->offset_vector[md->offset_end - frame->number];
    1891                    
    1892                     DPRINTF(("saving %d %d %d\n", frame->save_offset1, frame->save_offset2, frame->save_offset3));
    1893                     md->offset_vector[md->offset_end - frame->number] = frame->eptr - md->start_subject;
     1907                if (stack.currentFrame->offset < md->offset_max) {
     1908                    stack.currentFrame->save_offset1 = md->offset_vector[stack.currentFrame->offset];
     1909                    stack.currentFrame->save_offset2 = md->offset_vector[stack.currentFrame->offset + 1];
     1910                    stack.currentFrame->save_offset3 = md->offset_vector[md->offset_end - stack.currentFrame->number];
     1911                   
     1912                    DPRINTF(("saving %d %d %d\n", stack.currentFrame->save_offset1, stack.currentFrame->save_offset2, stack.currentFrame->save_offset3));
     1913                    md->offset_vector[md->offset_end - stack.currentFrame->number] = stack.currentFrame->eptr - md->start_subject;
    18941914                   
    18951915                    do {
    1896                         RMATCH(1, frame->ecode + 1 + LINK_SIZE, frame->eptrb, match_isgroup);
     1916                        RMATCH(1, stack.currentFrame->ecode + 1 + LINK_SIZE, stack.currentFrame->eptrb, match_isgroup);
    18971917                        if (is_match) RRETURN;
    1898                         frame->ecode += GET(frame->ecode, 1);
    1899                     } while (*frame->ecode == OP_ALT);
    1900                    
    1901                     DPRINTF(("bracket %d failed\n", frame->number));
    1902                    
    1903                     md->offset_vector[frame->offset] = frame->save_offset1;
    1904                     md->offset_vector[frame->offset + 1] = frame->save_offset2;
    1905                     md->offset_vector[md->offset_end - frame->number] = frame->save_offset3;
     1918                        stack.currentFrame->ecode += GET(stack.currentFrame->ecode, 1);
     1919                    } while (*stack.currentFrame->ecode == OP_ALT);
     1920                   
     1921                    DPRINTF(("bracket %d failed\n", stack.currentFrame->number));
     1922                   
     1923                    md->offset_vector[stack.currentFrame->offset] = stack.currentFrame->save_offset1;
     1924                    md->offset_vector[stack.currentFrame->offset + 1] = stack.currentFrame->save_offset2;
     1925                    md->offset_vector[md->offset_end - stack.currentFrame->number] = stack.currentFrame->save_offset3;
    19061926                   
    19071927                    RRETURN;
     
    19241944   
    19251945RRETURN_SWITCH:
    1926     switch (frame->where)
     1946    switch (stack.currentFrame->where)
    19271947    {
    19281948        case 0: goto RETURN;
     
    19671987RETURN:
    19681988    return is_match ? MATCH_MATCH : MATCH_NOMATCH;
    1969    
    1970 RETURN_ERROR:
    1971     while (!(frame >= stackframes && frame < stackframesend)) {
    1972         newframe = frame->prevframe;
    1973         delete frame;
    1974         frame = newframe;
    1975     }
    1976     return i;
    19771989}
    19781990
Note: See TracChangeset for help on using the changeset viewer.