src/jdk/nashorn/internal/runtime/regexp/joni/ByteCodeMachine.java

Print this page




  41 
  42     private int range;            // right range
  43     private int sprev;
  44     private int sstart;
  45     private int sbegin;
  46 
  47     private final int[] code;       // byte code
  48     private int ip;                 // instruction pointer
  49 
  50     ByteCodeMachine(Regex regex, char[] chars, int p, int end) {
  51         super(regex, chars, p, end);
  52         this.code = regex.code;
  53     }
  54 
  55     private boolean stringCmpIC(int caseFlodFlag, int s1, IntHolder ps2, int mbLen, int textEnd) {
  56 
  57         int s2 = ps2.value;
  58         int end1 = s1 + mbLen;
  59 
  60         while (s1 < end1) {
  61             char c1 = Character.toLowerCase(chars[s1++]);
  62             char c2 = Character.toLowerCase(chars[s2++]);
  63 
  64             if (c1 != c2) {
  65                 return false;
  66             }
  67         }
  68         ps2.value = s2;
  69         return true;
  70     }
  71 
  72     private void debugMatchBegin() {
  73         Config.log.println("match_at: " +
  74                 "str: " + str +
  75                 ", end: " + end +
  76                 ", start: " + this.sstart +
  77                 ", sprev: " + this.sprev);
  78         Config.log.println("size: " + (end - str) + ", start offset: " + (this.sstart - str));
  79     }
  80 
  81     private void debugMatchLoop() {
  82         if (Config.DEBUG_MATCH) {


 350         ip++; s++;
 351     }
 352 
 353     private void opExactN() {
 354         int tlen = code[ip++];
 355         if (s + tlen > range) {opFail(); return;}
 356 
 357         if (Config.USE_STRING_TEMPLATES) {
 358             char[] bs = regex.templates[code[ip++]];
 359             int ps = code[ip++];
 360 
 361             while (tlen-- > 0) if (bs[ps++] != chars[s++]) {opFail(); return;}
 362 
 363         } else {
 364             while (tlen-- > 0) if (code[ip++] != chars[s++]) {opFail(); return;}
 365         }
 366         sprev = s - 1;
 367     }
 368 
 369     private void opExact1IC() {
 370         if (s >= range || code[ip] != Character.toLowerCase(chars[s++])) {opFail(); return;}
 371         ip++;
 372         sprev = sbegin; // break;
 373     }
 374 
 375     private void opExactNIC() {
 376         int tlen = code[ip++];
 377         if (s + tlen > range) {opFail(); return;}
 378 
 379         if (Config.USE_STRING_TEMPLATES) {
 380             char[] bs = regex.templates[code[ip++]];
 381             int ps = code[ip++];
 382 
 383             while (tlen-- > 0) if (bs[ps++] != Character.toLowerCase(chars[s++])) {opFail(); return;}
 384         } else {
 385 
 386             while (tlen-- > 0) if (code[ip++] != Character.toLowerCase(chars[s++])) {opFail(); return;}
 387         }
 388         sprev = s - 1;
 389     }
 390 
 391     private boolean isInBitSet() {
 392         int c = chars[s];
 393         return (c <= 0xff && (code[ip + (c >>> BitSet.ROOM_SHIFT)] & (1 << c)) != 0);
 394     }
 395 
 396     private void opCClass() {
 397         if (s >= range || !isInBitSet()) {opFail(); return;}
 398         ip += BitSet.BITSET_SIZE;
 399         s++;
 400         sprev = sbegin; // break;
 401     }
 402 
 403     private boolean isInClassMB() {
 404         int tlen = code[ip++];
 405         if (s >= range) return false;
 406         int ss = s;




  41 
  42     private int range;            // right range
  43     private int sprev;
  44     private int sstart;
  45     private int sbegin;
  46 
  47     private final int[] code;       // byte code
  48     private int ip;                 // instruction pointer
  49 
  50     ByteCodeMachine(Regex regex, char[] chars, int p, int end) {
  51         super(regex, chars, p, end);
  52         this.code = regex.code;
  53     }
  54 
  55     private boolean stringCmpIC(int caseFlodFlag, int s1, IntHolder ps2, int mbLen, int textEnd) {
  56 
  57         int s2 = ps2.value;
  58         int end1 = s1 + mbLen;
  59 
  60         while (s1 < end1) {
  61             char c1 = EncodingHelper.toLowerCase(chars[s1++]);
  62             char c2 = EncodingHelper.toLowerCase(chars[s2++]);
  63 
  64             if (c1 != c2) {
  65                 return false;
  66             }
  67         }
  68         ps2.value = s2;
  69         return true;
  70     }
  71 
  72     private void debugMatchBegin() {
  73         Config.log.println("match_at: " +
  74                 "str: " + str +
  75                 ", end: " + end +
  76                 ", start: " + this.sstart +
  77                 ", sprev: " + this.sprev);
  78         Config.log.println("size: " + (end - str) + ", start offset: " + (this.sstart - str));
  79     }
  80 
  81     private void debugMatchLoop() {
  82         if (Config.DEBUG_MATCH) {


 350         ip++; s++;
 351     }
 352 
 353     private void opExactN() {
 354         int tlen = code[ip++];
 355         if (s + tlen > range) {opFail(); return;}
 356 
 357         if (Config.USE_STRING_TEMPLATES) {
 358             char[] bs = regex.templates[code[ip++]];
 359             int ps = code[ip++];
 360 
 361             while (tlen-- > 0) if (bs[ps++] != chars[s++]) {opFail(); return;}
 362 
 363         } else {
 364             while (tlen-- > 0) if (code[ip++] != chars[s++]) {opFail(); return;}
 365         }
 366         sprev = s - 1;
 367     }
 368 
 369     private void opExact1IC() {
 370         if (s >= range || code[ip] != EncodingHelper.toLowerCase(chars[s++])) {opFail(); return;}
 371         ip++;
 372         sprev = sbegin; // break;
 373     }
 374 
 375     private void opExactNIC() {
 376         int tlen = code[ip++];
 377         if (s + tlen > range) {opFail(); return;}
 378 
 379         if (Config.USE_STRING_TEMPLATES) {
 380             char[] bs = regex.templates[code[ip++]];
 381             int ps = code[ip++];
 382 
 383             while (tlen-- > 0) if (bs[ps++] != EncodingHelper.toLowerCase(chars[s++])) {opFail(); return;}
 384         } else {
 385 
 386             while (tlen-- > 0) if (code[ip++] != EncodingHelper.toLowerCase(chars[s++])) {opFail(); return;}
 387         }
 388         sprev = s - 1;
 389     }
 390 
 391     private boolean isInBitSet() {
 392         int c = chars[s];
 393         return (c <= 0xff && (code[ip + (c >>> BitSet.ROOM_SHIFT)] & (1 << c)) != 0);
 394     }
 395 
 396     private void opCClass() {
 397         if (s >= range || !isInBitSet()) {opFail(); return;}
 398         ip += BitSet.BITSET_SIZE;
 399         s++;
 400         sprev = sbegin; // break;
 401     }
 402 
 403     private boolean isInClassMB() {
 404         int tlen = code[ip++];
 405         if (s >= range) return false;
 406         int ss = s;