| /* |
| * Permission is hereby granted, free of charge, to any person obtaining a copy of |
| * this software and associated documentation files (the "Software"), to deal in |
| * the Software without restriction, including without limitation the rights to |
| * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies |
| * of the Software, and to permit persons to whom the Software is furnished to do |
| * so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included in all |
| * copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| * SOFTWARE. |
| */ |
| package jdk.nashorn.internal.runtime.regexp.joni; |
| |
| @SuppressWarnings("javadoc") |
| public final class NodeOptInfo { |
| final MinMaxLen length = new MinMaxLen(); |
| final OptAnchorInfo anchor = new OptAnchorInfo(); |
| final OptExactInfo exb = new OptExactInfo(); /* boundary */ |
| final OptExactInfo exm = new OptExactInfo(); /* middle */ |
| final OptExactInfo expr = new OptExactInfo(); /* prec read (?=...) */ |
| final OptMapInfo map = new OptMapInfo(); /* boundary */ |
| |
| public void setBoundNode(final MinMaxLen mmd) { |
| exb.mmd.copy(mmd); |
| expr.mmd.copy(mmd); |
| map.mmd.copy(mmd); |
| } |
| |
| public void clear() { |
| length.clear(); |
| anchor.clear(); |
| exb.clear(); |
| exm.clear(); |
| expr.clear(); |
| map.clear(); |
| } |
| |
| public void copy(final NodeOptInfo other) { |
| length.copy(other.length); |
| anchor.copy(other.anchor); |
| exb.copy(other.exb); |
| exm.copy(other.exm); |
| expr.copy(other.expr); |
| map.copy(other.map); |
| } |
| |
| public void concatLeftNode(final NodeOptInfo other) { |
| final OptAnchorInfo tanchor = new OptAnchorInfo(); // remove it somehow ? |
| tanchor.concat(anchor, other.anchor, length.max, other.length.max); |
| anchor.copy(tanchor); |
| |
| if (other.exb.length > 0 && length.max == 0) { |
| tanchor.concat(anchor, other.exb.anchor, length.max, other.length.max); |
| other.exb.anchor.copy(tanchor); |
| } |
| |
| if (other.map.value > 0 && length.max == 0) { |
| if (other.map.mmd.max == 0) { |
| other.map.anchor.leftAnchor |= anchor.leftAnchor; |
| } |
| } |
| |
| final boolean exbReach = exb.reachEnd; |
| final boolean exmReach = exm.reachEnd; |
| |
| if (other.length.max != 0) { |
| exb.reachEnd = exm.reachEnd = false; |
| } |
| |
| if (other.exb.length > 0) { |
| if (exbReach) { |
| exb.concat(other.exb); |
| other.exb.clear(); |
| } else if (exmReach) { |
| exm.concat(other.exb); |
| other.exb.clear(); |
| } |
| } |
| |
| exm.select(other.exb); |
| exm.select(other.exm); |
| |
| if (expr.length > 0) { |
| if (other.length.max > 0) { |
| // TODO: make sure it is not an Oniguruma bug (casting unsigned int to int for arithmetic comparison) |
| int otherLengthMax = other.length.max; |
| if (otherLengthMax == MinMaxLen.INFINITE_DISTANCE) { |
| otherLengthMax = -1; |
| } |
| if (expr.length > otherLengthMax) { |
| expr.length = otherLengthMax; |
| } |
| if (expr.mmd.max == 0) { |
| exb.select(expr); |
| } else { |
| exm.select(expr); |
| } |
| } |
| } else if (other.expr.length > 0) { |
| expr.copy(other.expr); |
| } |
| |
| map.select(other.map); |
| length.add(other.length); |
| } |
| |
| public void altMerge(final NodeOptInfo other, final OptEnvironment env) { |
| anchor.altMerge(other.anchor); |
| exb.altMerge(other.exb, env); |
| exm.altMerge(other.exm, env); |
| expr.altMerge(other.expr, env); |
| map.altMerge(other.map); |
| length.altMerge(other.length); |
| } |
| |
| public void setBound(final MinMaxLen mmd) { |
| exb.mmd.copy(mmd); |
| expr.mmd.copy(mmd); |
| map.mmd.copy(mmd); |
| } |
| |
| } |