Skip to content

Commit

Permalink
fix MatchData#named_captures
Browse files Browse the repository at this point in the history
  • Loading branch information
lopex committed Jul 31, 2018
1 parent 219f62d commit 4363a2e
Showing 1 changed file with 15 additions and 17 deletions.
32 changes: 15 additions & 17 deletions core/src/main/java/org/jruby/RubyMatchData.java
Original file line number Diff line number Diff line change
Expand Up @@ -810,27 +810,25 @@ public RubyFixnum hash() {

@JRubyMethod
public RubyHash named_captures(ThreadContext context) {
check();
Ruby runtime = context.runtime;

RubyHash hash = RubyHash.newHash(runtime);

if (regexp.getPattern().numberOfNames() > 0) {
Iterator<NameEntry> nameEntryIterator = regexp.getPattern().namedBackrefIterator();
while (nameEntryIterator.hasNext()) {
NameEntry entry = nameEntryIterator.next();
RubyString key = RubyString.newStringShared(runtime, new ByteList(entry.name, entry.nameP, entry.nameEnd - entry.nameP, regexp.getEncoding(), false));
boolean found = false;

for (int i : entry.getBackRefs()) {
IRubyObject value = RubyRegexp.nth_match(i, this);
if (value.isTrue()) {
hash.op_asetForString(runtime, key, value);
found = true;
}
if (regexp == context.nil) return hash;

for (Iterator<NameEntry> i = regexp.pattern.namedBackrefIterator(); i.hasNext();) {
NameEntry entry = i.next();
RubyString key = RubyString.newStringShared(runtime, new ByteList(entry.name, entry.nameP, entry.nameEnd - entry.nameP, regexp.getEncoding(), false));
boolean found = false;

for (int b : entry.getBackRefs()) {
IRubyObject value = RubyRegexp.nth_match(b, this);
if (value.isTrue()) {
hash.op_asetForString(runtime, key, value);
found = true;
}

if (!found) hash.op_asetForString(runtime, key, context.nil);
}

if (!found) hash.op_asetForString(runtime, key, context.nil);
}

return hash;
Expand Down

0 comments on commit 4363a2e

Please sign in to comment.