Skip to content

Commit 20ec96d

Browse files
committed
[GR-25628] Translate regexp SyntaxExceptions in visitMatch2Node
PullRequest: truffleruby/2825
2 parents 02fe02d + 4d465b5 commit 20ec96d

File tree

3 files changed

+37
-10
lines changed

3 files changed

+37
-10
lines changed

src/main/java/org/truffleruby/core/regexp/ClassicRegexp.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,16 @@ public static Regex makeRegexp(RubyContext context, RubyDeferredWarnings rubyDef
101101
? new RegexWarnCallback(context)
102102
: new RegexWarnDeferredCallback(rubyDeferredWarnings));
103103
} catch (Exception e) {
104-
String errorMessage = BacktraceFormatter.formatJavaThrowableMessage(e) + ": /" +
105-
RopeOperations.decodeRope(source) + "/";
104+
String errorMessage = getRegexErrorMessage(source, e, options);
106105
throw new DeferredRaiseException(c -> c.getCoreExceptions().regexpError(errorMessage, currentNode));
107106
}
108107
}
109108

109+
public static String getRegexErrorMessage(Rope source, Exception e, RegexpOptions options) {
110+
return BacktraceFormatter.formatJavaThrowableMessage(e) + ": /" +
111+
RopeOperations.decodeRope(source) + "/" + options.toOptionsString();
112+
}
113+
110114
private static Regex getRegexpFromCache(RubyContext context, RopeBuilder bytes, RubyEncoding encoding,
111115
RegexpOptions options, Rope source) throws DeferredRaiseException {
112116
if (context == null) {

src/main/java/org/truffleruby/core/regexp/RegexpOptions.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,20 @@ public RegexpOptions withoutOnce() {
202202
return options;
203203
}
204204

205+
public String toOptionsString() {
206+
StringBuilder flags = new StringBuilder(3);
207+
if (isMultiline()) {
208+
flags.append('m');
209+
}
210+
if (isIgnorecase()) {
211+
flags.append('i');
212+
}
213+
if (isExtended()) {
214+
flags.append('x');
215+
}
216+
return flags.toString();
217+
}
218+
205219
@Override
206220
public int hashCode() {
207221
int hash = 7;

src/main/java/org/truffleruby/parser/BodyTranslator.java

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import org.truffleruby.core.module.ModuleNodesFactory;
4949
import org.truffleruby.core.numeric.BignumOperations;
5050
import org.truffleruby.core.range.RangeNodesFactory;
51+
import org.truffleruby.core.regexp.ClassicRegexp;
5152
import org.truffleruby.core.regexp.EncodingCache;
5253
import org.truffleruby.core.regexp.InterpolatedRegexpNode;
5354
import org.truffleruby.core.regexp.MatchDataNodes.GetIndexNode;
@@ -2114,14 +2115,22 @@ public RubyNode visitMatch2Node(Match2ParseNode node) {
21142115
if (node.getReceiverNode() instanceof RegexpParseNode) {
21152116
final RegexpParseNode regexpNode = (RegexpParseNode) node.getReceiverNode();
21162117
final byte[] bytes = regexpNode.getValue().getBytes();
2117-
final Regex regex = new Regex(
2118-
bytes,
2119-
0,
2120-
bytes.length,
2121-
regexpNode.getOptions().toOptions(),
2122-
regexpNode.getEncoding(),
2123-
Syntax.RUBY,
2124-
new RegexWarnDeferredCallback(rubyWarnings));
2118+
final Regex regex;
2119+
try {
2120+
regex = new Regex(
2121+
bytes,
2122+
0,
2123+
bytes.length,
2124+
regexpNode.getOptions().toOptions(),
2125+
regexpNode.getEncoding(),
2126+
Syntax.RUBY,
2127+
new RegexWarnDeferredCallback(rubyWarnings));
2128+
} catch (Exception e) {
2129+
String errorMessage = ClassicRegexp
2130+
.getRegexErrorMessage(regexpNode.getValue(), e, regexpNode.getOptions());
2131+
final RubyContext context = RubyLanguage.getCurrentContext();
2132+
throw new RaiseException(context, context.getCoreExceptions().regexpError(errorMessage, currentNode));
2133+
}
21252134
final int numberOfNames = regex.numberOfNames();
21262135

21272136
if (numberOfNames > 0) {

0 commit comments

Comments
 (0)