--- /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:
