@@ -408,29 +408,34 @@ private static void encodingMatchError(Ruby runtime, Regex pattern, Encoding str
408
408
pattern .getEncoding () + " regexp with " + strEnc + " string)" );
409
409
}
410
410
411
- private Encoding checkEncoding (RubyString str , boolean warn ) {
412
- if (str .scanForCodeRange () == StringSupport .CR_BROKEN ) {
413
- throw getRuntime ().newArgumentError ("invalid byte sequence in " + str .getEncoding ());
411
+ private Encoding prepareEncoding (RubyString str , boolean warn ) {
412
+ Encoding enc = str .getEncoding ();
413
+ int cr = str .scanForCodeRange ();
414
+ if (cr == StringSupport .CR_BROKEN ) {
415
+ throw getRuntime ().newArgumentError ("invalid byte sequence in " + enc );
414
416
}
415
417
check ();
416
- Encoding enc = str .getEncoding ();
417
- if (!enc .isAsciiCompatible ()) {
418
- if (enc != pattern .getEncoding ()) encodingMatchError (getRuntime (), pattern , enc );
418
+ Encoding patternEnc = pattern .getEncoding ();
419
+ if (patternEnc == enc ) {
420
+ } else if (cr == StringSupport .CR_7BIT && patternEnc == USASCIIEncoding .INSTANCE ) {
421
+ enc = patternEnc ;
422
+ } else if (!enc .isAsciiCompatible ()) {
423
+ encodingMatchError (getRuntime (), pattern , enc );
419
424
} else if (options .isFixed ()) {
420
- if (enc != pattern . getEncoding () &&
421
- (!pattern . getEncoding () .isAsciiCompatible () ||
422
- str . scanForCodeRange () != StringSupport .CR_7BIT )) encodingMatchError (getRuntime (), pattern , enc );
423
- enc = pattern . getEncoding () ;
425
+ if (enc != patternEnc &&
426
+ (!patternEnc .isAsciiCompatible () ||
427
+ cr != StringSupport .CR_7BIT )) encodingMatchError (getRuntime (), pattern , enc );
428
+ enc = patternEnc ;
424
429
}
425
- if (warn && isEncodingNone () && enc != ASCIIEncoding .INSTANCE && str . scanForCodeRange () != StringSupport .CR_7BIT ) {
430
+ if (warn && isEncodingNone () && enc != ASCIIEncoding .INSTANCE && cr != StringSupport .CR_7BIT ) {
426
431
getRuntime ().getWarnings ().warn (ID .REGEXP_MATCH_AGAINST_STRING , "regexp match /.../n against to " + enc + " string" );
427
432
}
428
433
return enc ;
429
434
}
430
435
431
436
public final Regex preparePattern (RubyString str ) {
432
437
// checkEncoding does `check();` no need to here
433
- Encoding enc = checkEncoding (str , true );
438
+ Encoding enc = prepareEncoding (str , true );
434
439
if (enc == pattern .getEncoding ()) return pattern ;
435
440
return getPreprocessedRegexpFromCache (getRuntime (), this .str , enc , options , RegexpSupport .ErrorMode .PREPROCESS );
436
441
}
0 commit comments