This is an automated email from the git hooks/post-receive script. henrich pushed a commit to branch debian/sid in repository jruby-joni.
commit a779d3564c797157ed9ef4bdccb66ee79034e39f Author: Marcin Mielzynski <[email protected]> Date: Thu Feb 1 18:08:42 2018 +0100 fix for Onigmo #43 --- src/org/joni/Analyser.java | 12 ++++++++-- src/org/joni/ArrayCompiler.java | 46 ++++++++++++++++++++++++--------------- src/org/joni/ByteCodeMachine.java | 2 +- test/org/joni/test/TestU8.java | 4 ++++ 4 files changed, 44 insertions(+), 20 deletions(-) diff --git a/src/org/joni/Analyser.java b/src/org/joni/Analyser.java index 467fc46..ce83cc2 100644 --- a/src/org/joni/Analyser.java +++ b/src/org/joni/Analyser.java @@ -1789,6 +1789,8 @@ final class Analyser extends Parser { private static final int IN_NOT = (1<<1); private static final int IN_REPEAT = (1<<2); private static final int IN_VAR_REPEAT = (1<<3); + private static final int IN_CALL = (1<<4); + private static final int IN_RECCALL = (1<<5); private static final int EXPAND_STRING_MAX_LENGTH = 100; /* setup_tree does the following work. @@ -1931,11 +1933,17 @@ final class Analyser extends Parser { break; case EncloseType.MEMORY: - if ((state & (IN_ALT | IN_NOT | IN_VAR_REPEAT)) != 0) { + if ((state & (IN_ALT | IN_NOT | IN_VAR_REPEAT | IN_CALL)) != 0) { env.btMemStart = bsOnAt(env.btMemStart, en.regNum); /* SET_ENCLOSE_STATUS(node, NST_MEM_IN_ALT_NOT); */ - } + if (en.isCalled()) state |= IN_CALL; + if (en.isRecursion()) { + state |= IN_RECCALL; + } else if ((state & IN_RECCALL) != 0){ + en.setRecursion(); + } + setupTree(en.target, state); break; diff --git a/src/org/joni/ArrayCompiler.java b/src/org/joni/ArrayCompiler.java index ce1a326..736d68c 100644 --- a/src/org/joni/ArrayCompiler.java +++ b/src/org/joni/ArrayCompiler.java @@ -843,8 +843,15 @@ final class ArrayCompiler extends Compiler { } else { len += node.isRecursion() ? OPSize.MEMORY_END_REC : OPSize.MEMORY_END; } - } else { // USE_SUBEXP_CALL + } else if (Config.USE_SUBEXP_CALL && node.isRecursion()) { // USE_SUBEXP_CALL len = OPSize.MEMORY_START_PUSH; // or OPSize.MEMORY_START; + len += tlen + (bsAt(regex.btMemEnd, node.regNum) ? OPSize.MEMORY_END_PUSH_REC : OPSize.MEMORY_END_REC); + } else { + if (bsAt(regex.btMemStart, node.regNum)) { + len = OPSize.MEMORY_START_PUSH; + } else { + len= OPSize.MEMORY_START; + } len += tlen + (bsAt(regex.btMemEnd, node.regNum) ? OPSize.MEMORY_END_PUSH : OPSize.MEMORY_END); } break; @@ -889,22 +896,20 @@ final class ArrayCompiler extends Compiler { int len; switch (node.type) { case EncloseType.MEMORY: - if (Config.USE_SUBEXP_CALL) { - if (node.isCalled()) { - regex.requireStack = true; - addOpcode(OPCode.CALL); - node.callAddr = codeLength + OPSize.ABSADDR + OPSize.JUMP; - node.setAddrFixed(); - addAbsAddr(node.callAddr); - len = compileLengthTree(node.target); - len += OPSize.MEMORY_START_PUSH + OPSize.RETURN; - if (bsAt(regex.btMemEnd, node.regNum)) { - len += node.isRecursion() ? OPSize.MEMORY_END_PUSH_REC : OPSize.MEMORY_END_PUSH; - } else { - len += node.isRecursion() ? OPSize.MEMORY_END_REC : OPSize.MEMORY_END; - } - addOpcodeRelAddr(OPCode.JUMP, len); + if (Config.USE_SUBEXP_CALL && node.isCalled()) { + regex.requireStack = true; + addOpcode(OPCode.CALL); + node.callAddr = codeLength + OPSize.ABSADDR + OPSize.JUMP; + node.setAddrFixed(); + addAbsAddr(node.callAddr); + len = compileLengthTree(node.target); + len += OPSize.MEMORY_START_PUSH + OPSize.RETURN; + if (bsAt(regex.btMemEnd, node.regNum)) { + len += node.isRecursion() ? OPSize.MEMORY_END_PUSH_REC : OPSize.MEMORY_END_PUSH; + } else { + len += node.isRecursion() ? OPSize.MEMORY_END_REC : OPSize.MEMORY_END; } + addOpcodeRelAddr(OPCode.JUMP, len); } // USE_SUBEXP_CALL if (bsAt(regex.btMemStart, node.regNum)) { @@ -925,7 +930,14 @@ final class ArrayCompiler extends Compiler { } addMemNum(node.regNum); addOpcode(OPCode.RETURN); - } else { // USE_SUBEXP_CALL + } else if (Config.USE_SUBEXP_CALL && node.isRecursion()) { // USE_SUBEXP_CALL + if (bsAt(regex.btMemEnd, node.regNum)) { + addOpcode(OPCode.MEMORY_END_PUSH_REC); + } else { + addOpcode(OPCode.MEMORY_END_REC); + } + addMemNum(node.regNum); + } else { if (bsAt(regex.btMemEnd, node.regNum)) { addOpcode(OPCode.MEMORY_END_PUSH); } else { diff --git a/src/org/joni/ByteCodeMachine.java b/src/org/joni/ByteCodeMachine.java index 0d01bee..85d9916 100644 --- a/src/org/joni/ByteCodeMachine.java +++ b/src/org/joni/ByteCodeMachine.java @@ -488,7 +488,7 @@ class ByteCodeMachine extends StackMachine { if (me != INVALID_INDEX) { int ms = repeatStk[memStartStk + i]; region.beg[i] = (bsAt(regex.btMemStart, i) ? stack[ms].getMemPStr() : ms) - str; - region.end[i] = bsAt(regex.btMemEnd, i) ? stack[me].getMemPStr() : me - str; + region.end[i] = (bsAt(regex.btMemEnd, i) ? stack[me].getMemPStr() : me) - str; } else { region.beg[i] = region.end[i] = Region.REGION_NOTPOS; } diff --git a/test/org/joni/test/TestU8.java b/test/org/joni/test/TestU8.java index 539e3d1..8915175 100755 --- a/test/org/joni/test/TestU8.java +++ b/test/org/joni/test/TestU8.java @@ -326,5 +326,9 @@ public class TestU8 extends Test { ns("[^a\\x{80}]", "a", Option.CR_7_BIT); ns("(\\2)(\\1)", ""); + + x3s("\\(((?:[^(]|\\g<0>)*)\\)", "(abc)(abc)", 1, 4, 1); + x3s("\\(((?:[^(]|\\g<0>)*)\\)", "((abc)(abc))", 1, 11, 1); + x3s("\\(((?:[^(]|(\\g<0>))*)\\)", "((abc)(abc))", 6, 11, 2); } } -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/jruby-joni.git _______________________________________________ pkg-java-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-java-commits

