nashorn/src/jdk/nashorn/internal/objects/NativeRegExp.java
author sundar
Mon, 11 Feb 2013 21:26:06 +0530
changeset 16226 0e4f37e6cc40
parent 16223 dff592a332a4
child 16240 e1468b33e201
permissions -rw-r--r--
8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code Reviewed-by: lagergren, jlaskey, attila
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     1
/*
16151
97c1e756ae1e 8005663: Update copyright year to 2013
jlaskey
parents: 16147
diff changeset
     2
 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     4
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    10
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    15
 * accompanied this code).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    16
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    20
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    23
 * questions.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    24
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    25
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    26
package jdk.nashorn.internal.objects;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    27
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    28
import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    29
import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    30
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    31
import java.util.ArrayList;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    32
import java.util.Arrays;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    33
import java.util.List;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    34
import java.util.regex.Matcher;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    35
import java.util.regex.Pattern;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
import jdk.nashorn.internal.objects.annotations.Attribute;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    37
import jdk.nashorn.internal.objects.annotations.Constructor;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
import jdk.nashorn.internal.objects.annotations.Function;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    39
import jdk.nashorn.internal.objects.annotations.Getter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    40
import jdk.nashorn.internal.objects.annotations.Property;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    41
import jdk.nashorn.internal.objects.annotations.ScriptClass;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    42
import jdk.nashorn.internal.objects.annotations.SpecializedConstructor;
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
    43
import jdk.nashorn.internal.objects.annotations.Where;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    44
import jdk.nashorn.internal.runtime.BitVector;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    45
import jdk.nashorn.internal.runtime.JSType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    46
import jdk.nashorn.internal.runtime.ParserException;
16226
0e4f37e6cc40 8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents: 16223
diff changeset
    47
import jdk.nashorn.internal.runtime.RegExp;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    48
import jdk.nashorn.internal.runtime.RegExpMatch;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    49
import jdk.nashorn.internal.runtime.ScriptFunction;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    50
import jdk.nashorn.internal.runtime.ScriptObject;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    51
import jdk.nashorn.internal.runtime.ScriptRuntime;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    52
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    53
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    54
 * ECMA 15.10 RegExp Objects.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    55
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    56
@ScriptClass("RegExp")
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    57
public final class NativeRegExp extends ScriptObject {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    58
    /** ECMA 15.10.7.5 lastIndex property */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    59
    @Property(attributes = Attribute.NOT_ENUMERABLE | Attribute.NOT_CONFIGURABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    60
    public Object lastIndex;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    62
    /** Pattern string. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    63
    private String input;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    64
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    65
    /** Global search flag for this regexp. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    66
    private boolean global;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    67
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    68
    /** Case insensitive flag for this regexp */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    69
    private boolean ignoreCase;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    70
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    71
    /** Multi-line flag for this regexp */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    72
    private boolean multiline;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    73
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    74
    /** Java regex pattern to use for match. We compile to one of these */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    75
    private Pattern pattern;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    76
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    77
    private BitVector groupsInNegativeLookahead;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    78
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
    79
    // Reference to global object needed to support static RegExp properties
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
    80
    private Global globalObject;
16217
c5ac9be5c444 8007619: Add support for deprecated properties of RegExp constructor
sundar
parents: 16214
diff changeset
    81
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    82
    /*
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    83
    public NativeRegExp() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    84
        init();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    85
    }*/
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    86
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    87
    NativeRegExp(final String input, final String flagString) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    88
        RegExp regExp = null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    89
        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    90
            regExp = new RegExp(input, flagString);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    91
        } catch (final ParserException e) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    92
            // translate it as SyntaxError object and throw it
16188
d6390b0ea32a 8006678: Avoid too many Context.getGlobal() calls
sundar
parents: 16151
diff changeset
    93
            e.throwAsEcmaException();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    94
            throw new AssertionError(); //guard against null warnings below
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    95
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    96
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    97
        this.setLastIndex(0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    98
        this.input = regExp.getInput();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    99
        this.global = regExp.isGlobal();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   100
        this.ignoreCase = regExp.isIgnoreCase();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   101
        this.multiline = regExp.isMultiline();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   102
        this.pattern = regExp.getPattern();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   103
        this.groupsInNegativeLookahead = regExp.getGroupsInNegativeLookahead();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   104
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   105
        init();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   106
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   107
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   108
    NativeRegExp(final String string) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   109
        this(string, "");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   110
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   111
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   112
    NativeRegExp(final NativeRegExp regExp) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   113
        this.input      = regExp.getInput();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   114
        this.global     = regExp.getGlobal();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   115
        this.multiline  = regExp.getMultiline();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   116
        this.ignoreCase = regExp.getIgnoreCase();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   117
        this.lastIndex  = regExp.getLastIndexObject();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   118
        this.pattern    = regExp.getPattern();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   119
        this.groupsInNegativeLookahead = regExp.getGroupsInNegativeLookahead();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   120
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   121
        init();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   122
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   123
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   124
    NativeRegExp(final Pattern pattern) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   125
        this.input      = pattern.pattern();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   126
        this.multiline  = (pattern.flags() & Pattern.MULTILINE) != 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   127
        this.ignoreCase = (pattern.flags() & Pattern.CASE_INSENSITIVE) != 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   128
        this.lastIndex  = 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   129
        this.pattern    = pattern;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   130
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   131
        init();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   132
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   133
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   134
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   135
    public String getClassName() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   136
        return "RegExp";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   137
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   138
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   139
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   140
     * ECMA 15.10.4
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   141
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   142
     * Constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   143
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   144
     * @param isNew is the new operator used for instantiating this regexp
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   145
     * @param self  self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   146
     * @param args  arguments (optional: pattern and flags)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   147
     * @return new NativeRegExp
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   148
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   149
    @Constructor(arity = 2)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   150
    public static Object constructor(final boolean isNew, final Object self, final Object... args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   151
        if (args.length > 1) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   152
            return newRegExp(args[0], args[1]);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   153
        } else if (args.length > 0) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   154
            return newRegExp(args[0], UNDEFINED);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   155
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   156
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   157
        return newRegExp(UNDEFINED, UNDEFINED);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   158
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   159
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   160
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   161
     * ECMA 15.10.4
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   162
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   163
     * Constructor - specialized version, no args, empty regexp
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   164
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   165
     * @param isNew is the new operator used for instantiating this regexp
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   166
     * @param self  self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   167
     * @return new NativeRegExp
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   168
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   169
    @SpecializedConstructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   170
    public static Object constructor(final boolean isNew, final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   171
        return new NativeRegExp("", "");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   172
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   173
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   174
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   175
     * ECMA 15.10.4
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   176
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   177
     * Constructor - specialized version, pattern, no flags
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   178
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   179
     * @param isNew is the new operator used for instantiating this regexp
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   180
     * @param self  self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   181
     * @param pattern pattern
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   182
     * @return new NativeRegExp
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   183
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   184
    @SpecializedConstructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   185
    public static Object constructor(final boolean isNew, final Object self, final Object pattern) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   186
        return newRegExp(pattern, UNDEFINED);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   187
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   188
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   189
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   190
     * ECMA 15.10.4
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   191
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   192
     * Constructor - specialized version, pattern and flags
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   193
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   194
     * @param isNew is the new operator used for instantiating this regexp
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   195
     * @param self  self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   196
     * @param pattern pattern
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   197
     * @param flags  flags
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   198
     * @return new NativeRegExp
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   199
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   200
    @SpecializedConstructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   201
    public static Object constructor(final boolean isNew, final Object self, final Object pattern, final Object flags) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   202
        return newRegExp(pattern, flags);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   203
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   204
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   205
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   206
     * External constructor used in generated code created by {@link jdk.nashorn.internal.codegen.CodeGenerator}, which
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   207
     * explain the {@code public} access.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   208
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   209
     * @param regexp regexp
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   210
     * @param flags  flags
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   211
     * @return new NativeRegExp
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   212
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   213
    public static NativeRegExp newRegExp(final Object regexp, final Object flags) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   214
        String  patternString = "";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   215
        String  flagString    = "";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   216
        boolean flagsDefined  = false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   217
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   218
        if (flags != UNDEFINED) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   219
            flagsDefined = true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   220
            flagString = JSType.toString(flags);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   221
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   222
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   223
        if (regexp != UNDEFINED) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   224
            if (regexp instanceof NativeRegExp) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   225
                if (!flagsDefined) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   226
                    return (NativeRegExp)regexp; // 15.10.3.1 - undefined flags and regexp as
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   227
                }
16188
d6390b0ea32a 8006678: Avoid too many Context.getGlobal() calls
sundar
parents: 16151
diff changeset
   228
                typeError("regex.cant.supply.flags");
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   229
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   230
            patternString = JSType.toString(regexp);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   231
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   232
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   233
        return new NativeRegExp(patternString, flagString);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   234
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   235
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   236
    private String getFlagString() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   237
        final StringBuilder sb = new StringBuilder();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   238
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   239
        if (global) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   240
            sb.append('g');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   241
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   242
        if (ignoreCase) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   243
            sb.append('i');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   244
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   245
        if (multiline) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   246
            sb.append('m');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   247
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   248
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   249
        return sb.toString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   250
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   251
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   252
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   253
    public String safeToString() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   254
        return "[RegExp " + toString() + "]";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   255
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   256
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   257
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   258
    public String toString() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   259
        return "/" + input + "/" + getFlagString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   260
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   261
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   262
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   263
     * Nashorn extension: RegExp.prototype.compile - everybody implements this!
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   264
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   265
     * @param self    self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   266
     * @param pattern pattern
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   267
     * @param flags   flags
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   268
     * @return new NativeRegExp
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   269
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   270
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   271
    public static Object compile(final Object self, final Object pattern, final Object flags) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   272
        final NativeRegExp regExp   = checkRegExp(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   273
        final NativeRegExp compiled = newRegExp(pattern, flags);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   274
        // copy over fields to 'self'
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   275
        regExp.setInput(compiled.getInput());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   276
        regExp.setGlobal(compiled.getGlobal());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   277
        regExp.setIgnoreCase(compiled.getIgnoreCase());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   278
        regExp.setMultiline(compiled.getMultiline());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   279
        regExp.setPattern(compiled.getPattern());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   280
        regExp.setGroupsInNegativeLookahead(compiled.getGroupsInNegativeLookahead());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   281
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   282
        // Some implementations return undefined. Some return 'self'. Since return
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   283
        // value is most likely be ignored, we can play safe and return 'self'.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   284
        return regExp;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   285
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   286
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   287
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   288
     * ECMA 15.10.6.2 RegExp.prototype.exec(string)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   289
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   290
     * @param self   self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   291
     * @param string string to match against regexp
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   292
     * @return array containing the matches or {@code null} if no match
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   293
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   294
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   295
    public static Object exec(final Object self, final Object string) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   296
        return checkRegExp(self).exec(JSType.toString(string));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   297
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   298
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   299
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   300
     * ECMA 15.10.6.3 RegExp.prototype.test(string)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   301
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   302
     * @param self   self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   303
     * @param string string to test for matches against regexp
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   304
     * @return true if matches found, false otherwise
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   305
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   306
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   307
    public static Object test(final Object self, final Object string) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   308
        return checkRegExp(self).test(JSType.toString(string));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   309
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   310
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   311
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   312
     * ECMA 15.10.6.4 RegExp.prototype.toString()
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   313
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   314
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   315
     * @return string version of regexp
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   316
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   317
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   318
    public static Object toString(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   319
        return checkRegExp(self).toString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   320
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   321
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   322
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   323
     * ECMA 15.10.7.1 source
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   324
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   325
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   326
     * @return the input string for the regexp
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   327
     */
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   328
    @Getter(attributes = Attribute.NON_ENUMERABLE_CONSTANT)
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   329
    public static Object source(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   330
        return checkRegExp(self).input;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   331
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   332
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   333
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   334
     * ECMA 15.10.7.2 global
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   335
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   336
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   337
     * @return true if this regexp is flagged global, false otherwise
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   338
     */
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   339
    @Getter(attributes = Attribute.NON_ENUMERABLE_CONSTANT)
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   340
    public static Object global(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   341
        return checkRegExp(self).global;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   342
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   343
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   344
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   345
     * ECMA 15.10.7.3 ignoreCase
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   346
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   347
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   348
     * @return true if this regexp if flagged to ignore case, false otherwise
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   349
     */
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   350
    @Getter(attributes = Attribute.NON_ENUMERABLE_CONSTANT)
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   351
    public static Object ignoreCase(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   352
        return checkRegExp(self).ignoreCase;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   353
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   354
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   355
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   356
     * ECMA 15.10.7.4 multiline
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   357
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   358
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   359
     * @return true if this regexp is flagged to be multiline, false otherwise
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   360
     */
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   361
    @Getter(attributes = Attribute.NON_ENUMERABLE_CONSTANT)
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   362
    public static Object multiline(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   363
        return checkRegExp(self).multiline;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   364
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   365
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   366
    /**
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   367
     * Getter for non-standard RegExp.input property.
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   368
     * @param self self object
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   369
     * @return last regexp input
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   370
     */
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   371
    @Getter(where = Where.CONSTRUCTOR, attributes = Attribute.CONSTANT, name = "input")
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   372
    public static Object getLastInput(Object self) {
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   373
        final RegExpMatch match = Global.instance().getLastRegExpMatch();
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   374
        return match == null ? "" : match.getInput();
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   375
    }
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   376
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   377
    /**
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   378
     * Getter for non-standard RegExp.multiline property.
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   379
     * @param self self object
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   380
     * @return last regexp input
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   381
     */
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   382
    @Getter(where = Where.CONSTRUCTOR, attributes = Attribute.CONSTANT, name = "multiline")
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   383
    public static Object getLastMultiline(Object self) {
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   384
        return false; // doesn't ever seem to become true and isn't documented anyhwere
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   385
    }
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   386
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   387
    /**
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   388
     * Getter for non-standard RegExp.lastMatch property.
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   389
     * @param self self object
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   390
     * @return last regexp input
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   391
     */
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   392
    @Getter(where = Where.CONSTRUCTOR, attributes = Attribute.CONSTANT, name = "lastMatch")
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   393
    public static Object getLastMatch(Object self) {
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   394
        final RegExpMatch match = Global.instance().getLastRegExpMatch();
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   395
        return match == null ? "" : match.getGroup(0);
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   396
    }
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   397
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   398
    /**
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   399
     * Getter for non-standard RegExp.lastParen property.
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   400
     * @param self self object
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   401
     * @return last regexp input
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   402
     */
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   403
    @Getter(where = Where.CONSTRUCTOR, attributes = Attribute.CONSTANT, name = "lastParen")
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   404
    public static Object getLastParen(Object self) {
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   405
        final RegExpMatch match = Global.instance().getLastRegExpMatch();
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   406
        return match == null ? "" : match.getLastParen();
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   407
    }
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   408
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   409
    /**
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   410
     * Getter for non-standard RegExp.leftContext property.
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   411
     * @param self self object
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   412
     * @return last regexp input
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   413
     */
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   414
    @Getter(where = Where.CONSTRUCTOR, attributes = Attribute.CONSTANT, name = "leftContext")
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   415
    public static Object getLeftContext(Object self) {
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   416
        final RegExpMatch match = Global.instance().getLastRegExpMatch();
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   417
        return match == null ? "" : match.getInput().substring(0, match.getIndex());
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   418
    }
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   419
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   420
    /**
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   421
     * Getter for non-standard RegExp.rightContext property.
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   422
     * @param self self object
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   423
     * @return last regexp input
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   424
     */
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   425
    @Getter(where = Where.CONSTRUCTOR, attributes = Attribute.CONSTANT, name = "rightContext")
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   426
    public static Object getRightContext(Object self) {
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   427
        final RegExpMatch match = Global.instance().getLastRegExpMatch();
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   428
        return match == null ? "" : match.getInput().substring(match.getIndex() + match.length());
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   429
    }
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   430
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   431
    /**
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   432
     * Getter for non-standard RegExp.$1 property.
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   433
     * @param self self object
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   434
     * @return last regexp input
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   435
     */
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   436
    @Getter(where = Where.CONSTRUCTOR, attributes = Attribute.CONSTANT, name = "$1")
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   437
    public static Object getGroup1(Object self) {
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   438
        final RegExpMatch match = Global.instance().getLastRegExpMatch();
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   439
        return match == null ? "" : match.getGroup(1);
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   440
    }
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   441
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   442
    /**
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   443
     * Getter for non-standard RegExp.$2 property.
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   444
     * @param self self object
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   445
     * @return last regexp input
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   446
     */
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   447
    @Getter(where = Where.CONSTRUCTOR, attributes = Attribute.CONSTANT, name = "$2")
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   448
    public static Object getGroup2(Object self) {
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   449
        final RegExpMatch match = Global.instance().getLastRegExpMatch();
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   450
        return match == null ? "" : match.getGroup(2);
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   451
    }
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   452
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   453
    /**
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   454
     * Getter for non-standard RegExp.$3 property.
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   455
     * @param self self object
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   456
     * @return last regexp input
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   457
     */
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   458
    @Getter(where = Where.CONSTRUCTOR, attributes = Attribute.CONSTANT, name = "$3")
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   459
    public static Object getGroup3(Object self) {
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   460
        final RegExpMatch match = Global.instance().getLastRegExpMatch();
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   461
        return match == null ? "" : match.getGroup(3);
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   462
    }
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   463
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   464
    /**
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   465
     * Getter for non-standard RegExp.$4 property.
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   466
     * @param self self object
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   467
     * @return last regexp input
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   468
     */
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   469
    @Getter(where = Where.CONSTRUCTOR, attributes = Attribute.CONSTANT, name = "$4")
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   470
    public static Object getGroup4(Object self) {
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   471
        final RegExpMatch match = Global.instance().getLastRegExpMatch();
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   472
        return match == null ? "" : match.getGroup(4);
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   473
    }
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   474
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   475
    /**
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   476
     * Getter for non-standard RegExp.$5 property.
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   477
     * @param self self object
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   478
     * @return last regexp input
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   479
     */
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   480
    @Getter(where = Where.CONSTRUCTOR, attributes = Attribute.CONSTANT, name = "$5")
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   481
    public static Object getGroup5(Object self) {
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   482
        final RegExpMatch match = Global.instance().getLastRegExpMatch();
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   483
        return match == null ? "" : match.getGroup(5);
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   484
    }
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   485
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   486
    /**
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   487
     * Getter for non-standard RegExp.$6 property.
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   488
     * @param self self object
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   489
     * @return last regexp input
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   490
     */
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   491
    @Getter(where = Where.CONSTRUCTOR, attributes = Attribute.CONSTANT, name = "$6")
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   492
    public static Object getGroup6(Object self) {
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   493
        final RegExpMatch match = Global.instance().getLastRegExpMatch();
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   494
        return match == null ? "" : match.getGroup(6);
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   495
    }
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   496
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   497
    /**
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   498
     * Getter for non-standard RegExp.$7 property.
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   499
     * @param self self object
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   500
     * @return last regexp input
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   501
     */
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   502
    @Getter(where = Where.CONSTRUCTOR, attributes = Attribute.CONSTANT, name = "$7")
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   503
    public static Object getGroup7(Object self) {
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   504
        final RegExpMatch match = Global.instance().getLastRegExpMatch();
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   505
        return match == null ? "" : match.getGroup(7);
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   506
    }
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   507
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   508
    /**
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   509
     * Getter for non-standard RegExp.$8 property.
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   510
     * @param self self object
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   511
     * @return last regexp input
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   512
     */
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   513
    @Getter(where = Where.CONSTRUCTOR, attributes = Attribute.CONSTANT, name = "$8")
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   514
    public static Object getGroup8(Object self) {
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   515
        final RegExpMatch match = Global.instance().getLastRegExpMatch();
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   516
        return match == null ? "" : match.getGroup(8);
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   517
    }
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   518
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   519
    /**
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   520
     * Getter for non-standard RegExp.$9 property.
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   521
     * @param self self object
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   522
     * @return last regexp input
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   523
     */
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   524
    @Getter(where = Where.CONSTRUCTOR, attributes = Attribute.CONSTANT, name = "$9")
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   525
    public static Object getGroup9(Object self) {
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   526
        final RegExpMatch match = Global.instance().getLastRegExpMatch();
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   527
        return match == null ? "" : match.getGroup(9);
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   528
    }
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   529
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   530
    private RegExpMatch execInner(final String string) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   531
        if (this.pattern == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   532
            return null; // never matches or similar, e.g. a[]
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   533
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   534
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   535
        final Matcher matcher = pattern.matcher(string);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   536
        final int start = this.global ? getLastIndex() : 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   537
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   538
        if (start < 0 || start > string.length()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   539
            setLastIndex(0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   540
            return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   541
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   542
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   543
        if (!matcher.find(start)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   544
            setLastIndex(0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   545
            return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   546
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   547
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   548
        if (global) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   549
            setLastIndex(matcher.end());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   550
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   551
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   552
        final RegExpMatch match = new RegExpMatch(string, matcher.start(), groups(matcher));
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   553
        globalObject.setLastRegExpMatch(match);
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   554
        return match;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   555
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   556
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   557
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   558
     * Convert java.util.regex.Matcher groups to JavaScript groups.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   559
     * That is, replace null and groups that didn't match with undefined.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   560
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   561
    private Object[] groups(final Matcher matcher) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   562
        final int groupCount = matcher.groupCount();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   563
        final Object[] groups = new Object[groupCount + 1];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   564
        for (int i = 0, lastGroupStart = matcher.start(); i <= groupCount; i++) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   565
            final int groupStart = matcher.start(i);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   566
            if (lastGroupStart > groupStart
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   567
                    || (groupsInNegativeLookahead != null && groupsInNegativeLookahead.isSet(i))) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   568
                // (1) ECMA 15.10.2.5 NOTE 3: need to clear Atom's captures each time Atom is repeated.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   569
                // (2) ECMA 15.10.2.8 NOTE 3: Backreferences to captures in (?!Disjunction) from elsewhere
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   570
                // in the pattern always return undefined because the negative lookahead must fail.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   571
                groups[i] = UNDEFINED;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   572
                continue;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   573
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   574
            final String group = matcher.group(i);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   575
            groups[i] = group == null ? UNDEFINED : group;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   576
            lastGroupStart = groupStart;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   577
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   578
        return groups;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   579
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   580
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   581
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   582
     * Executes a search for a match within a string based on a regular
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   583
     * expression. It returns an array of information or null if no match is
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   584
     * found.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   585
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   586
     * @param string String to match.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   587
     * @return NativeArray of matches, string or null.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   588
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   589
    public Object exec(final String string) {
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   590
        final RegExpMatch match = execInner(string);
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   591
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   592
        if (match == null) {
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   593
            return null;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   594
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   595
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   596
        return new NativeRegExpExecResult(match);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   597
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   598
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   599
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   600
     * Executes a search for a match within a string based on a regular
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   601
     * expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   602
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   603
     * @param string String to match.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   604
     * @return True if a match is found.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   605
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   606
    public Object test(final String string) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   607
        return exec(string) != null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   608
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   609
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   610
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   611
     * Searches and replaces the regular expression portion (match) with the
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   612
     * replaced text instead. For the "replacement text" parameter, you can use
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   613
     * the keywords $1 to $2 to replace the original text with values from
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   614
     * sub-patterns defined within the main pattern.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   615
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   616
     * @param string String to match.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   617
     * @param replacement Replacement string.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   618
     * @return String with substitutions.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   619
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   620
    Object replace(final String string, final String replacement, final ScriptFunction function) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   621
        final Matcher matcher = pattern.matcher(string);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   622
        /*
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   623
         * $$ -> $
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   624
         * $& -> the matched substring
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   625
         * $` -> the portion of string that preceeds matched substring
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   626
         * $' -> the portion of string that follows the matched substring
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   627
         * $n -> the nth capture, where n is [1-9] and $n is NOT followed by a decimal digit
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   628
         * $nn -> the nnth capture, where nn is a two digit decimal number [01-99].
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   629
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   630
        String replace = replacement;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   631
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   632
        if (!global) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   633
            if (!matcher.find()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   634
                return string;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   635
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   636
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   637
            final StringBuilder sb = new StringBuilder();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   638
            if (function != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   639
                replace = callReplaceValue(function, matcher, string);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   640
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   641
            appendReplacement(matcher, string, replace, sb, 0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   642
            sb.append(string, matcher.end(), string.length());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   643
            return sb.toString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   644
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   645
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   646
        int end = 0; // a.k.a. lastAppendPosition
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   647
        setLastIndex(0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   648
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   649
        boolean found;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   650
        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   651
            found = matcher.find(end);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   652
        } catch (final IndexOutOfBoundsException e) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   653
            found = false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   654
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   655
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   656
        if (!found) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   657
            return string;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   658
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   659
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   660
        int previousLastIndex = 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   661
        final StringBuilder sb = new StringBuilder();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   662
        do {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   663
            if (function != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   664
                replace = callReplaceValue(function, matcher, string);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   665
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   666
            appendReplacement(matcher, string, replace, sb, end);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   667
            end = matcher.end();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   668
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   669
            // ECMA 15.5.4.10 String.prototype.match(regexp)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   670
            final int thisIndex = end;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   671
            if (thisIndex == previousLastIndex) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   672
                setLastIndex(thisIndex + 1);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   673
                previousLastIndex = thisIndex + 1;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   674
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   675
                previousLastIndex = thisIndex;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   676
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   677
        } while (matcher.find());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   678
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   679
        sb.append(string, end, string.length());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   680
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   681
        return sb.toString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   682
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   683
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   684
    private void appendReplacement(final Matcher matcher, final String text, final String replacement, final StringBuilder sb, final int lastAppendPosition) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   685
        // Process substitution string to replace group references with groups
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   686
        int cursor = 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   687
        final StringBuilder result = new StringBuilder();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   688
        Object[] groups = null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   689
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   690
        while (cursor < replacement.length()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   691
            char nextChar = replacement.charAt(cursor);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   692
            if (nextChar == '$') {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   693
                // Skip past $
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   694
                cursor++;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   695
                nextChar = replacement.charAt(cursor);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   696
                final int firstDigit = nextChar - '0';
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   697
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   698
                if (firstDigit >= 0 && firstDigit <= 9 && firstDigit <= matcher.groupCount()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   699
                    // $0 is not supported, but $01 is. implementation-defined: if n>m, ignore second digit.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   700
                    int refNum = firstDigit;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   701
                    cursor++;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   702
                    if (cursor < replacement.length() && firstDigit < matcher.groupCount()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   703
                        final int secondDigit = replacement.charAt(cursor) - '0';
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   704
                        if ((secondDigit >= 0) && (secondDigit <= 9)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   705
                            final int newRefNum = (firstDigit * 10) + secondDigit;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   706
                            if (newRefNum <= matcher.groupCount() && newRefNum > 0) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   707
                                // $nn ($01-$99)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   708
                                refNum = newRefNum;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   709
                                cursor++;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   710
                            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   711
                        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   712
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   713
                    if (refNum > 0) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   714
                        if (groups == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   715
                            groups = groups(matcher);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   716
                        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   717
                        // Append group if matched.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   718
                        if (groups[refNum] != UNDEFINED) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   719
                            result.append((String) groups[refNum]);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   720
                        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   721
                    } else { // $0. ignore.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   722
                        assert refNum == 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   723
                        result.append("$0");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   724
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   725
                } else if (nextChar == '$') {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   726
                    result.append('$');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   727
                    cursor++;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   728
                } else if (nextChar == '&') {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   729
                    result.append(matcher.group());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   730
                    cursor++;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   731
                } else if (nextChar == '`') {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   732
                    result.append(text.substring(0, matcher.start()));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   733
                    cursor++;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   734
                } else if (nextChar == '\'') {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   735
                    result.append(text.substring(matcher.end()));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   736
                    cursor++;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   737
                } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   738
                    // unknown substitution or $n with n>m. skip.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   739
                    result.append('$');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   740
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   741
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   742
                result.append(nextChar);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   743
                cursor++;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   744
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   745
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   746
        // Append the intervening text
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   747
        sb.append(text, lastAppendPosition, matcher.start());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   748
        // Append the match substitution
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   749
        sb.append(result);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   750
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   751
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   752
    private String callReplaceValue(final ScriptFunction function, final Matcher matcher, final String string) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   753
        final Object[] groups = groups(matcher);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   754
        final Object[] args   = Arrays.copyOf(groups, groups.length + 2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   755
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   756
        args[groups.length]     = matcher.start();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   757
        args[groups.length + 1] = string;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   758
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   759
        final Object self = function.isStrict() ? UNDEFINED : Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   760
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   761
        return JSType.toString(ScriptRuntime.apply(function, self, args));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   762
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   763
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   764
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   765
     * Breaks up a string into an array of substrings based on a regular
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   766
     * expression or fixed string.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   767
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   768
     * @param string String to match.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   769
     * @param limit  Split limit.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   770
     * @return Array of substrings.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   771
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   772
    Object split(final String string, final long limit) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   773
        return split(this, string, limit);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   774
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   775
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   776
    private static Object split(final NativeRegExp regexp0, final String input, final long limit) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   777
        final List<Object> matches = new ArrayList<>();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   778
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   779
        final NativeRegExp regexp = new NativeRegExp(regexp0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   780
        regexp.setGlobal(true);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   781
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   782
        if (limit == 0L) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   783
            return new NativeArray();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   784
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   785
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   786
        RegExpMatch match;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   787
        final int inputLength = input.length();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   788
        int lastLength = -1;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   789
        int lastLastIndex = 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   790
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   791
        while ((match = regexp.execInner(input)) != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   792
            final int lastIndex = match.getIndex() + match.length();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   793
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   794
            if (lastIndex > lastLastIndex) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   795
                matches.add(input.substring(lastLastIndex, match.getIndex()));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   796
                if (match.getGroups().length > 1 && match.getIndex() < inputLength) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   797
                    matches.addAll(Arrays.asList(match.getGroups()).subList(1, match.getGroups().length));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   798
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   799
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   800
                lastLength = match.length();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   801
                lastLastIndex = lastIndex;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   802
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   803
                if (matches.size() >= limit) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   804
                    break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   805
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   806
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   807
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   808
            // bump the index to avoid infinite loop
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   809
            if (regexp.getLastIndex() == match.getIndex()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   810
                regexp.setLastIndex(match.getIndex() + 1);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   811
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   812
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   813
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   814
        if (matches.size() < limit) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   815
            // check special case if we need to append an empty string at the
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   816
            // end of the match
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   817
            // if the lastIndex was the entire string
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   818
            if (lastLastIndex == input.length()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   819
                if (lastLength > 0 || regexp.test("") == Boolean.FALSE) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   820
                    matches.add("");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   821
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   822
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   823
                matches.add(input.substring(lastLastIndex, inputLength));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   824
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   825
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   826
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   827
        return new NativeArray(matches.toArray());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   828
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   829
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   830
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   831
     * Tests for a match in a string. It returns the index of the match, or -1
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   832
     * if not found.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   833
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   834
     * @param string String to match.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   835
     * @return Index of match.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   836
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   837
    Object search(final String string) {
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   838
        final RegExpMatch match = execInner(string);
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   839
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   840
        if (match == null) {
16217
c5ac9be5c444 8007619: Add support for deprecated properties of RegExp constructor
sundar
parents: 16214
diff changeset
   841
            return -1;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   842
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   843
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   844
        return match.getIndex();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   845
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   846
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   847
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   848
     * Fast lastIndex getter
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   849
     * @return last index property as int
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   850
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   851
    public int getLastIndex() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   852
        return JSType.toInt32(lastIndex);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   853
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   854
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   855
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   856
     * Fast lastIndex getter
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   857
     * @return last index property as boxed integer
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   858
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   859
    public Object getLastIndexObject() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   860
        return lastIndex;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   861
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   862
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   863
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   864
     * Fast lastIndex setter
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   865
     * @param lastIndex lastIndex
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   866
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   867
    public void setLastIndex(final int lastIndex) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   868
        this.lastIndex = JSType.toObject(lastIndex);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   869
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   870
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   871
    private void init() {
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   872
        // Keep reference to global object to support "static" properties of RegExp
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   873
        this.globalObject = Global.instance();
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16217
diff changeset
   874
        this.setProto(globalObject.getRegExpPrototype());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   875
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   876
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   877
    private static NativeRegExp checkRegExp(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   878
        Global.checkObjectCoercible(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   879
        if (self instanceof NativeRegExp) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   880
            return (NativeRegExp)self;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   881
        } else if (self != null && self == Global.instance().getRegExpPrototype()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   882
            return Global.instance().DEFAULT_REGEXP;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   883
        } else {
16188
d6390b0ea32a 8006678: Avoid too many Context.getGlobal() calls
sundar
parents: 16151
diff changeset
   884
            typeError("not.a.regexp", ScriptRuntime.safeToString(self));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   885
            return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   886
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   887
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   888
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   889
    private String getInput() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   890
        return input;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   891
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   892
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   893
    private void setInput(final String input) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   894
        this.input = input;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   895
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   896
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   897
    boolean getGlobal() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   898
        return global;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   899
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   900
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   901
    private void setGlobal(final boolean global) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   902
        this.global = global;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   903
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   904
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   905
    private boolean getIgnoreCase() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   906
        return ignoreCase;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   907
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   908
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   909
    private void setIgnoreCase(final boolean ignoreCase) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   910
        this.ignoreCase = ignoreCase;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   911
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   912
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   913
    private boolean getMultiline() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   914
        return multiline;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   915
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   916
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   917
    private void setMultiline(final boolean multiline) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   918
        this.multiline = multiline;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   919
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   920
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   921
    private Pattern getPattern() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   922
        return pattern;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   923
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   924
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   925
    private void setPattern(final Pattern pattern) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   926
        this.pattern = pattern;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   927
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   928
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   929
    private BitVector getGroupsInNegativeLookahead() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   930
        return groupsInNegativeLookahead;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   931
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   932
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   933
    private void setGroupsInNegativeLookahead(final BitVector groupsInNegativeLookahead) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   934
        this.groupsInNegativeLookahead = groupsInNegativeLookahead;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   935
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   936
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   937
}