1 /* 2 * Permission is hereby granted, free of charge, to any person obtaining a copy of 3 * this software and associated documentation files (the "Software"), to deal in 4 * the Software without restriction, including without limitation the rights to 5 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 6 * of the Software, and to permit persons to whom the Software is furnished to do 7 * so, subject to the following conditions: 8 * 9 * The above copyright notice and this permission notice shall be included in all 10 * copies or substantial portions of the Software. 11 * 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 13 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 14 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 15 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 16 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 17 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 18 * SOFTWARE. 19 */ 20 package jdk.nashorn.internal.runtime.regexp.joni.constants; 21 22 import jdk.nashorn.internal.runtime.regexp.joni.Config; 23 24 public interface OPCode { 25 final int FINISH = 0; /* matching process terminator (no more alternative) */ 26 final int END = 1; /* pattern code terminator (success end) */ 27 28 final int EXACT1 = 2; /* single byte, N = 1 */ 29 final int EXACT2 = 3; /* single byte, N = 2 */ 30 final int EXACT3 = 4; /* single byte, N = 3 */ 31 final int EXACT4 = 5; /* single byte, N = 4 */ 32 final int EXACT5 = 6; /* single byte, N = 5 */ 33 final int EXACTN = 7; /* single byte */ 34 final int EXACTMB2N1 = 8; /* mb-length = 2 N = 1 */ 35 final int EXACTMB2N2 = 9; /* mb-length = 2 N = 2 */ 36 final int EXACTMB2N3 = 10; /* mb-length = 2 N = 3 */ 37 final int EXACTMB2N = 11; /* mb-length = 2 */ 38 final int EXACTMB3N = 12; /* mb-length = 3 */ 39 final int EXACTMBN = 13; /* other length */ 40 41 final int EXACT1_IC = 14; /* single byte, N = 1, ignore case */ 42 final int EXACTN_IC = 15; /* single byte, ignore case */ 43 44 final int CCLASS = 16; 45 final int CCLASS_MB = 17; 46 final int CCLASS_MIX = 18; 47 final int CCLASS_NOT = 19; 48 final int CCLASS_MB_NOT = 20; 49 final int CCLASS_MIX_NOT = 21; 50 final int CCLASS_NODE = 22; /* pointer to CClassNode node */ 51 52 final int ANYCHAR = 23; /* "." */ 53 final int ANYCHAR_ML = 24; /* "." multi-line */ 54 final int ANYCHAR_STAR = 25; /* ".*" */ 55 final int ANYCHAR_ML_STAR = 26; /* ".*" multi-line */ 56 final int ANYCHAR_STAR_PEEK_NEXT = 27; 57 final int ANYCHAR_ML_STAR_PEEK_NEXT = 28; 58 59 final int WORD = 29; 60 final int NOT_WORD = 30; 61 final int WORD_BOUND = 31; 62 final int NOT_WORD_BOUND = 32; 63 final int WORD_BEGIN = 33; 64 final int WORD_END = 34; 65 66 final int BEGIN_BUF = 35; 67 final int END_BUF = 36; 68 final int BEGIN_LINE = 37; 69 final int END_LINE = 38; 70 final int SEMI_END_BUF = 39; 71 final int BEGIN_POSITION = 40; 72 73 final int BACKREF1 = 41; 74 final int BACKREF2 = 42; 75 final int BACKREFN = 43; 76 final int BACKREFN_IC = 44; 77 final int BACKREF_MULTI = 45; 78 final int BACKREF_MULTI_IC = 46; 79 final int BACKREF_WITH_LEVEL = 47; /* \k<xxx+n>, \k<xxx-n> */ 80 81 final int MEMORY_START = 48; 82 final int MEMORY_START_PUSH = 49; /* push back-tracker to stack */ 83 final int MEMORY_END_PUSH = 50; /* push back-tracker to stack */ 84 final int MEMORY_END_PUSH_REC = 51; /* push back-tracker to stack */ 85 final int MEMORY_END = 52; 86 final int MEMORY_END_REC = 53; /* push marker to stack */ 87 88 final int FAIL = 54; /* pop stack and move */ 89 final int JUMP = 55; 90 final int PUSH = 56; 91 final int POP = 57; 92 final int PUSH_OR_JUMP_EXACT1 = 58; /* if match exact then push, else jump. */ 93 final int PUSH_IF_PEEK_NEXT = 59; /* if match exact then push, else none. */ 94 95 final int REPEAT = 60; /* {n,m} */ 96 final int REPEAT_NG = 61; /* {n,m}? (non greedy) */ 97 final int REPEAT_INC = 62; 98 final int REPEAT_INC_NG = 63; /* non greedy */ 99 final int REPEAT_INC_SG = 64; /* search and get in stack */ 100 final int REPEAT_INC_NG_SG = 65; /* search and get in stack (non greedy) */ 101 102 final int NULL_CHECK_START = 66; /* null loop checker start */ 103 final int NULL_CHECK_END = 67; /* null loop checker end */ 104 final int NULL_CHECK_END_MEMST = 68; /* null loop checker end (with capture status) */ 105 final int NULL_CHECK_END_MEMST_PUSH = 69; /* with capture status and push check-end */ 106 107 final int PUSH_POS = 70; /* (?=...) start */ 108 final int POP_POS = 71; /* (?=...) end */ 109 final int PUSH_POS_NOT = 72; /* (?!...) start */ 110 final int FAIL_POS = 73; /* (?!...) end */ 111 final int PUSH_STOP_BT = 74; /* (?>...) start */ 112 final int POP_STOP_BT = 75; /* (?>...) end */ 113 final int LOOK_BEHIND = 76; /* (?<=...) start (no needs end opcode) */ 114 final int PUSH_LOOK_BEHIND_NOT = 77; /* (?<!...) start */ 115 final int FAIL_LOOK_BEHIND_NOT = 78; /* (?<!...) end */ 116 117 final int CALL = 79; /* \g<name> */ 118 final int RETURN = 80; 119 120 final int STATE_CHECK_PUSH = 81; /* combination explosion check and push */ 121 final int STATE_CHECK_PUSH_OR_JUMP = 82; /* check ok -> push, else jump */ 122 final int STATE_CHECK = 83; /* check only */ 123 final int STATE_CHECK_ANYCHAR_STAR = 84; 124 final int STATE_CHECK_ANYCHAR_ML_STAR = 85; 125 126 /* no need: IS_DYNAMIC_OPTION() == 0 */ 127 final int SET_OPTION_PUSH = 86; /* set option and push recover option */ 128 final int SET_OPTION = 87; /* set option */ 129 130 // single byte versions 131 final int ANYCHAR_SB = 88; /* "." */ 132 final int ANYCHAR_ML_SB = 89; /* "." multi-line */ 133 final int ANYCHAR_STAR_SB = 90; /* ".*" */ 134 final int ANYCHAR_ML_STAR_SB = 91; /* ".*" multi-line */ 135 final int ANYCHAR_STAR_PEEK_NEXT_SB = 92; 136 final int ANYCHAR_ML_STAR_PEEK_NEXT_SB = 93; 137 final int STATE_CHECK_ANYCHAR_STAR_SB = 94; 138 final int STATE_CHECK_ANYCHAR_ML_STAR_SB= 95; 139 140 final int CCLASS_SB = 96; 141 final int CCLASS_NOT_SB = 97; 142 final int WORD_SB = 98; 143 final int NOT_WORD_SB = 99; 144 final int WORD_BOUND_SB = 100; 145 final int NOT_WORD_BOUND_SB = 101; 146 final int WORD_BEGIN_SB = 102; 147 final int WORD_END_SB = 103; 148 149 final int LOOK_BEHIND_SB = 104; 150 151 final int EXACT1_IC_SB = 105; /* single byte, N = 1, ignore case */ 152 final int EXACTN_IC_SB = 106; /* single byte, ignore case */ 153 154 155 public final String OpCodeNames[] = Config.DEBUG_COMPILE ? new String[] { 156 "finish", /*OP_FINISH*/ 157 "end", /*OP_END*/ 158 "exact1", /*OP_EXACT1*/ 159 "exact2", /*OP_EXACT2*/ 160 "exact3", /*OP_EXACT3*/ 161 "exact4", /*OP_EXACT4*/ 162 "exact5", /*OP_EXACT5*/ 163 "exactn", /*OP_EXACTN*/ 164 "exactmb2-n1", /*OP_EXACTMB2N1*/ 165 "exactmb2-n2", /*OP_EXACTMB2N2*/ 166 "exactmb2-n3", /*OP_EXACTMB2N3*/ 167 "exactmb2-n", /*OP_EXACTMB2N*/ 168 "exactmb3n", /*OP_EXACTMB3N*/ 169 "exactmbn", /*OP_EXACTMBN*/ 170 "exact1-ic", /*OP_EXACT1_IC*/ 171 "exactn-ic", /*OP_EXACTN_IC*/ 172 "cclass", /*OP_CCLASS*/ 173 "cclass-mb", /*OP_CCLASS_MB*/ 174 "cclass-mix", /*OP_CCLASS_MIX*/ 175 "cclass-not", /*OP_CCLASS_NOT*/ 176 "cclass-mb-not", /*OP_CCLASS_MB_NOT*/ 177 "cclass-mix-not", /*OP_CCLASS_MIX_NOT*/ 178 "cclass-node", /*OP_CCLASS_NODE*/ 179 "anychar", /*OP_ANYCHAR*/ 180 "anychar-ml", /*OP_ANYCHAR_ML*/ 181 "anychar*", /*OP_ANYCHAR_STAR*/ 182 "anychar-ml*", /*OP_ANYCHAR_ML_STAR*/ 183 "anychar*-peek-next", /*OP_ANYCHAR_STAR_PEEK_NEXT*/ 184 "anychar-ml*-peek-next", /*OP_ANYCHAR_ML_STAR_PEEK_NEXT*/ 185 "word", /*OP_WORD*/ 186 "not-word", /*OP_NOT_WORD*/ 187 "word-bound", /*OP_WORD_BOUND*/ 188 "not-word-bound", /*OP_NOT_WORD_BOUND*/ 189 "word-begin", /*OP_WORD_BEGIN*/ 190 "word-end", /*OP_WORD_END*/ 191 "begin-buf", /*OP_BEGIN_BUF*/ 192 "end-buf", /*OP_END_BUF*/ 193 "begin-line", /*OP_BEGIN_LINE*/ 194 "end-line", /*OP_END_LINE*/ 195 "semi-end-buf", /*OP_SEMI_END_BUF*/ 196 "begin-position", /*OP_BEGIN_POSITION*/ 197 "backref1", /*OP_BACKREF1*/ 198 "backref2", /*OP_BACKREF2*/ 199 "backrefn", /*OP_BACKREFN*/ 200 "backrefn-ic", /*OP_BACKREFN_IC*/ 201 "backref_multi", /*OP_BACKREF_MULTI*/ 202 "backref_multi-ic", /*OP_BACKREF_MULTI_IC*/ 203 "backref_at_level", /*OP_BACKREF_AT_LEVEL*/ 204 "mem-start", /*OP_MEMORY_START*/ 205 "mem-start-push", /*OP_MEMORY_START_PUSH*/ 206 "mem-end-push", /*OP_MEMORY_END_PUSH*/ 207 "mem-end-push-rec", /*OP_MEMORY_END_PUSH_REC*/ 208 "mem-end", /*OP_MEMORY_END*/ 209 "mem-end-rec", /*OP_MEMORY_END_REC*/ 210 "fail", /*OP_FAIL*/ 211 "jump", /*OP_JUMP*/ 212 "push", /*OP_PUSH*/ 213 "pop", /*OP_POP*/ 214 "push-or-jump-e1", /*OP_PUSH_OR_JUMP_EXACT1*/ 215 "push-if-peek-next", /*OP_PUSH_IF_PEEK_NEXT*/ 216 "repeat", /*OP_REPEAT*/ 217 "repeat-ng", /*OP_REPEAT_NG*/ 218 "repeat-inc", /*OP_REPEAT_INC*/ 219 "repeat-inc-ng", /*OP_REPEAT_INC_NG*/ 220 "repeat-inc-sg", /*OP_REPEAT_INC_SG*/ 221 "repeat-inc-ng-sg", /*OP_REPEAT_INC_NG_SG*/ 222 "null-check-start", /*OP_NULL_CHECK_START*/ 223 "null-check-end", /*OP_NULL_CHECK_END*/ 224 "null-check-end-memst", /*OP_NULL_CHECK_END_MEMST*/ 225 "null-check-end-memst-push", /*OP_NULL_CHECK_END_MEMST_PUSH*/ 226 "push-pos", /*OP_PUSH_POS*/ 227 "pop-pos", /*OP_POP_POS*/ 228 "push-pos-not", /*OP_PUSH_POS_NOT*/ 229 "fail-pos", /*OP_FAIL_POS*/ 230 "push-stop-bt", /*OP_PUSH_STOP_BT*/ 231 "pop-stop-bt", /*OP_POP_STOP_BT*/ 232 "look-behind", /*OP_LOOK_BEHIND*/ 233 "push-look-behind-not", /*OP_PUSH_LOOK_BEHIND_NOT*/ 234 "fail-look-behind-not", /*OP_FAIL_LOOK_BEHIND_NOT*/ 235 "call", /*OP_CALL*/ 236 "return", /*OP_RETURN*/ 237 "state-check-push", /*OP_STATE_CHECK_PUSH*/ 238 "state-check-push-or-jump", /*OP_STATE_CHECK_PUSH_OR_JUMP*/ 239 "state-check", /*OP_STATE_CHECK*/ 240 "state-check-anychar*", /*OP_STATE_CHECK_ANYCHAR_STAR*/ 241 "state-check-anychar-ml*", /*OP_STATE_CHECK_ANYCHAR_ML_STAR*/ 242 "set-option-push", /*OP_SET_OPTION_PUSH*/ 243 "set-option", /*OP_SET_OPTION*/ 244 245 // single byte versions 246 "anychar-sb", /*OP_ANYCHAR*/ 247 "anychar-ml-sb", /*OP_ANYCHAR_ML*/ 248 "anychar*-sb", /*OP_ANYCHAR_STAR*/ 249 "anychar-ml*-sb", /*OP_ANYCHAR_ML_STAR*/ 250 "anychar*-peek-next-sb", /*OP_ANYCHAR_STAR_PEEK_NEXT*/ 251 "anychar-ml*-peek-next-sb", /*OP_ANYCHAR_ML_STAR_PEEK_NEXT*/ 252 "state-check-anychar*-sb", /*OP_STATE_CHECK_ANYCHAR_STAR*/ 253 "state-check-anychar-ml*-sb", /*OP_STATE_CHECK_ANYCHAR_ML_STAR*/ 254 255 "cclass-sb", /*OP_CCLASS*/ 256 "cclass-not-sb", /*OP_CCLASS_NOT*/ 257 258 "word-sb", /*OP_WORD*/ 259 "not-word-sb", /*OP_NOT_WORD*/ 260 "word-bound-sb", /*OP_WORD_BOUND*/ 261 "not-word-bound-sb", /*OP_NOT_WORD_BOUND*/ 262 "word-begin-sb", /*OP_WORD_BEGIN*/ 263 "word-end-sb", /*OP_WORD_END*/ 264 265 "look-behind-sb", /*OP_LOOK_BEHIND*/ 266 267 "exact1-ic-sb", /*OP_EXACT1_IC*/ 268 "exactn-ic-sb", /*OP_EXACTN_IC*/ 269 270 } : null; 271 272 public final int OpCodeArgTypes[] = Config.DEBUG_COMPILE ? new int[] { 273 Arguments.NON, /*OP_FINISH*/ 274 Arguments.NON, /*OP_END*/ 275 Arguments.SPECIAL, /*OP_EXACT1*/ 276 Arguments.SPECIAL, /*OP_EXACT2*/ 277 Arguments.SPECIAL, /*OP_EXACT3*/ 278 Arguments.SPECIAL, /*OP_EXACT4*/ 279 Arguments.SPECIAL, /*OP_EXACT5*/ 280 Arguments.SPECIAL, /*OP_EXACTN*/ 281 Arguments.SPECIAL, /*OP_EXACTMB2N1*/ 282 Arguments.SPECIAL, /*OP_EXACTMB2N2*/ 283 Arguments.SPECIAL, /*OP_EXACTMB2N3*/ 284 Arguments.SPECIAL, /*OP_EXACTMB2N*/ 285 Arguments.SPECIAL, /*OP_EXACTMB3N*/ 286 Arguments.SPECIAL, /*OP_EXACTMBN*/ 287 Arguments.SPECIAL, /*OP_EXACT1_IC*/ 288 Arguments.SPECIAL, /*OP_EXACTN_IC*/ 289 Arguments.SPECIAL, /*OP_CCLASS*/ 290 Arguments.SPECIAL, /*OP_CCLASS_MB*/ 291 Arguments.SPECIAL, /*OP_CCLASS_MIX*/ 292 Arguments.SPECIAL, /*OP_CCLASS_NOT*/ 293 Arguments.SPECIAL, /*OP_CCLASS_MB_NOT*/ 294 Arguments.SPECIAL, /*OP_CCLASS_MIX_NOT*/ 295 Arguments.SPECIAL, /*OP_CCLASS_NODE*/ 296 Arguments.NON, /*OP_ANYCHAR*/ 297 Arguments.NON, /*OP_ANYCHAR_ML*/ 298 Arguments.NON, /*OP_ANYCHAR_STAR*/ 299 Arguments.NON, /*OP_ANYCHAR_ML_STAR*/ 300 Arguments.SPECIAL, /*OP_ANYCHAR_STAR_PEEK_NEXT*/ 301 Arguments.SPECIAL, /*OP_ANYCHAR_ML_STAR_PEEK_NEXT*/ 302 Arguments.NON, /*OP_WORD*/ 303 Arguments.NON, /*OP_NOT_WORD*/ 304 Arguments.NON, /*OP_WORD_BOUND*/ 305 Arguments.NON, /*OP_NOT_WORD_BOUND*/ 306 Arguments.NON, /*OP_WORD_BEGIN*/ 307 Arguments.NON, /*OP_WORD_END*/ 308 Arguments.NON, /*OP_BEGIN_BUF*/ 309 Arguments.NON, /*OP_END_BUF*/ 310 Arguments.NON, /*OP_BEGIN_LINE*/ 311 Arguments.NON, /*OP_END_LINE*/ 312 Arguments.NON, /*OP_SEMI_END_BUF*/ 313 Arguments.NON, /*OP_BEGIN_POSITION*/ 314 Arguments.NON, /*OP_BACKREF1*/ 315 Arguments.NON, /*OP_BACKREF2*/ 316 Arguments.MEMNUM, /*OP_BACKREFN*/ 317 Arguments.SPECIAL, /*OP_BACKREFN_IC*/ 318 Arguments.SPECIAL, /*OP_BACKREF_MULTI*/ 319 Arguments.SPECIAL, /*OP_BACKREF_MULTI_IC*/ 320 Arguments.SPECIAL, /*OP_BACKREF_AT_LEVEL*/ 321 Arguments.MEMNUM, /*OP_MEMORY_START*/ 322 Arguments.MEMNUM, /*OP_MEMORY_START_PUSH*/ 323 Arguments.MEMNUM, /*OP_MEMORY_END_PUSH*/ 324 Arguments.MEMNUM, /*OP_MEMORY_END_PUSH_REC*/ 325 Arguments.MEMNUM, /*OP_MEMORY_END*/ 326 Arguments.MEMNUM, /*OP_MEMORY_END_REC*/ 327 Arguments.NON, /*OP_FAIL*/ 328 Arguments.RELADDR, /*OP_JUMP*/ 329 Arguments.RELADDR, /*OP_PUSH*/ 330 Arguments.NON, /*OP_POP*/ 331 Arguments.SPECIAL, /*OP_PUSH_OR_JUMP_EXACT1*/ 332 Arguments.SPECIAL, /*OP_PUSH_IF_PEEK_NEXT*/ 333 Arguments.SPECIAL, /*OP_REPEAT*/ 334 Arguments.SPECIAL, /*OP_REPEAT_NG*/ 335 Arguments.MEMNUM, /*OP_REPEAT_INC*/ 336 Arguments.MEMNUM, /*OP_REPEAT_INC_NG*/ 337 Arguments.MEMNUM, /*OP_REPEAT_INC_SG*/ 338 Arguments.MEMNUM, /*OP_REPEAT_INC_NG_SG*/ 339 Arguments.MEMNUM, /*OP_NULL_CHECK_START*/ 340 Arguments.MEMNUM, /*OP_NULL_CHECK_END*/ 341 Arguments.MEMNUM, /*OP_NULL_CHECK_END_MEMST*/ 342 Arguments.MEMNUM, /*OP_NULL_CHECK_END_MEMST_PUSH*/ 343 Arguments.NON, /*OP_PUSH_POS*/ 344 Arguments.NON, /*OP_POP_POS*/ 345 Arguments.RELADDR, /*OP_PUSH_POS_NOT*/ 346 Arguments.NON, /*OP_FAIL_POS*/ 347 Arguments.NON, /*OP_PUSH_STOP_BT*/ 348 Arguments.NON, /*OP_POP_STOP_BT*/ 349 Arguments.SPECIAL, /*OP_LOOK_BEHIND*/ 350 Arguments.SPECIAL, /*OP_PUSH_LOOK_BEHIND_NOT*/ 351 Arguments.NON, /*OP_FAIL_LOOK_BEHIND_NOT*/ 352 Arguments.ABSADDR, /*OP_CALL*/ 353 Arguments.NON, /*OP_RETURN*/ 354 Arguments.SPECIAL, /*OP_STATE_CHECK_PUSH*/ 355 Arguments.SPECIAL, /*OP_STATE_CHECK_PUSH_OR_JUMP*/ 356 Arguments.STATE_CHECK, /*OP_STATE_CHECK*/ 357 Arguments.STATE_CHECK, /*OP_STATE_CHECK_ANYCHAR_STAR*/ 358 Arguments.STATE_CHECK, /*OP_STATE_CHECK_ANYCHAR_ML_STAR*/ 359 Arguments.OPTION, /*OP_SET_OPTION_PUSH*/ 360 Arguments.OPTION, /*OP_SET_OPTION*/ 361 362 // single byte versions 363 Arguments.NON, /*OP_ANYCHAR*/ 364 Arguments.NON, /*OP_ANYCHAR_ML*/ 365 Arguments.NON, /*OP_ANYCHAR_STAR*/ 366 Arguments.NON, /*OP_ANYCHAR_ML_STAR*/ 367 Arguments.SPECIAL, /*OP_ANYCHAR_STAR_PEEK_NEXT*/ 368 Arguments.SPECIAL, /*OP_ANYCHAR_ML_STAR_PEEK_NEXT*/ 369 Arguments.STATE_CHECK, /*OP_STATE_CHECK_ANYCHAR_STAR*/ 370 Arguments.STATE_CHECK, /*OP_STATE_CHECK_ANYCHAR_ML_STAR*/ 371 372 Arguments.SPECIAL, /*OP_CCLASS*/ 373 Arguments.SPECIAL, /*OP_CCLASS_NOT*/ 374 375 Arguments.NON, /*OP_WORD*/ 376 Arguments.NON, /*OP_NOT_WORD*/ 377 Arguments.NON, /*OP_WORD_BOUND*/ 378 Arguments.NON, /*OP_NOT_WORD_BOUND*/ 379 Arguments.NON, /*OP_WORD_BEGIN*/ 380 Arguments.NON, /*OP_WORD_END*/ 381 382 Arguments.SPECIAL, /*OP_LOOK_BEHIND*/ 383 384 Arguments.SPECIAL, /*OP_EXACT1_IC*/ 385 Arguments.SPECIAL, /*OP_EXACTN_IC*/ 386 } : null; 387 }