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

Print this page

        

*** 18,91 **** * SOFTWARE. */ package jdk.nashorn.internal.runtime.regexp.joni; import jdk.nashorn.internal.runtime.regexp.joni.ast.CClassNode; - import jdk.nashorn.internal.runtime.regexp.joni.ast.ConsAltNode; - import jdk.nashorn.internal.runtime.regexp.joni.ast.StringNode; final class ApplyCaseFold { // i_apply_case_fold ! public void apply(int from, int[]to, int length, Object o) { ApplyCaseFoldArg arg = (ApplyCaseFoldArg)o; ScanEnvironment env = arg.env; CClassNode cc = arg.cc; BitSet bs = cc.bs; - if (length == 1) { boolean inCC = cc.isCodeInCC(from); if (Config.CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS) { if ((inCC && !cc.isNot()) || (!inCC && cc.isNot())) { ! if (to[0] >= BitSet.SINGLE_BYTE_SIZE) { ! cc.addCodeRange(env, to[0], to[0]); } else { /* /(?i:[^A-C])/.match("a") ==> fail. */ ! bs.set(to[0]); } } } else { if (inCC) { ! if (to[0] >= BitSet.SINGLE_BYTE_SIZE) { if (cc.isNot()) cc.clearNotFlag(); ! cc.addCodeRange(env, to[0], to[0]); } else { if (cc.isNot()) { ! bs.clear(to[0]); } else { ! bs.set(to[0]); } } } } // CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS - } else { - if (cc.isCodeInCC(from) && (!Config.CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS || !cc.isNot())) { - StringNode node = null; - for (int i=0; i<length; i++) { - if (i == 0) { - node = new StringNode(); - /* char-class expanded multi-char only - compare with string folded at match time. */ - node.setAmbig(); - } - node.catCode(to[i]); - } - - ConsAltNode alt = ConsAltNode.newAltNode(node, null); - - if (arg.tail == null) { - arg.altRoot = alt; - } else { - arg.tail.setCdr(alt); - } - arg.tail = alt; - } - - } - } static final ApplyCaseFold INSTANCE = new ApplyCaseFold(); } --- 18,63 ---- * SOFTWARE. */ package jdk.nashorn.internal.runtime.regexp.joni; import jdk.nashorn.internal.runtime.regexp.joni.ast.CClassNode; final class ApplyCaseFold { // i_apply_case_fold ! public void apply(int from, int to, Object o) { ApplyCaseFoldArg arg = (ApplyCaseFoldArg)o; ScanEnvironment env = arg.env; CClassNode cc = arg.cc; BitSet bs = cc.bs; boolean inCC = cc.isCodeInCC(from); if (Config.CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS) { if ((inCC && !cc.isNot()) || (!inCC && cc.isNot())) { ! if (to >= BitSet.SINGLE_BYTE_SIZE) { ! cc.addCodeRange(env, to, to); } else { /* /(?i:[^A-C])/.match("a") ==> fail. */ ! bs.set(to); } } } else { if (inCC) { ! if (to >= BitSet.SINGLE_BYTE_SIZE) { if (cc.isNot()) cc.clearNotFlag(); ! cc.addCodeRange(env, to, to); } else { if (cc.isNot()) { ! bs.clear(to); } else { ! bs.set(to); } } } } // CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS } static final ApplyCaseFold INSTANCE = new ApplyCaseFold(); }