--- /usr/ports/lang/ruby18/work/ruby-1.8.6/regexec.c Wed Aug 2 22:16:49 2006 +++ ruby-1.8.6/regexec.c Sat Aug 25 18:11:10 2007 @@ -2408,12 +2408,70 @@ STAT_OP_OUT; /* fall */ case OP_FAIL: STAT_OP_IN(OP_FAIL); + //fprintf(stderr, "fail\n"); STACK_POP; p = stk->u.state.pcode; s = stk->u.state.pstr; sprev = stk->u.state.pstr_prev; STAT_OP_OUT; continue; + break; + + case OP_CODE_BLOCK: STAT_OP_IN(OP_CODE_BLOCK); + { + VALUE ret; + int success; + GET_LENGTH_INC(tlen, p); + VALUE groups = rb_ary_new(); + rb_define_variable("$g", &groups); + + { /* This code copied from OP_END */ + OnigRegion* region = msa->region; + best_len = n; + //fprintf(stderr, "region: %x\n", region); + if (region) { + region->beg[0] = sstart - str; + region->end[0] = s - str; + for (i = 1; i <= num_mem; i++) { + if (mem_end_stk[i] != INVALID_STACK_INDEX) { + if (BIT_STATUS_AT(reg->bt_mem_start, i)) + region->beg[i] = STACK_AT(mem_start_stk[i])->u.mem.pstr - str; + else + region->beg[i] = (UChar* )((void* )mem_start_stk[i]) - str; + + region->end[i] = (BIT_STATUS_AT(reg->bt_mem_end, i) + ? STACK_AT(mem_end_stk[i])->u.mem.pstr + : (UChar* )((void* )mem_end_stk[i])) - str; + } + else { + region->beg[i] = region->end[i] = ONIG_REGION_NOTPOS; + } + } + + for (i = 1; i <= num_mem; i++) { + UChar *tmp = NULL; + int start = region->beg[i]; + int end = region->end[i]; + tmp = malloc((end - start + 1) * sizeof(UChar)); + memcpy(tmp, str + start, end - start); + tmp[start - end + 1] = '\0'; + rb_ary_push(groups, rb_str_new2(tmp)); + free(tmp); + } + } /* if (region) */ + } + + ret = rb_eval_string(p); + p += tlen; + + /* If return value is false, then we should + * fail like a bad state match would */ + success = RTEST(ret); + //fprintf(stderr, "re: %d\n", success); + if (success == 0) + goto fail; + } + STAT_OP_OUT break; default: