Skip to content

Commit

Permalink
[fix] keyword extract -> don't use Hash#keySet since converts toJava
Browse files Browse the repository at this point in the history
  • Loading branch information
kares committed May 21, 2018
1 parent db8f5e3 commit bae5d69
Showing 1 changed file with 13 additions and 11 deletions.
24 changes: 13 additions & 11 deletions core/src/main/java/org/jruby/ast/util/ArgsUtil.java
Expand Up @@ -111,34 +111,36 @@ public static IRubyObject getOptionsArg(Ruby runtime, IRubyObject arg) {
*/
public static IRubyObject[] extractKeywordArgs(ThreadContext context, RubyHash options, String... validKeys) {
IRubyObject[] ret = new IRubyObject[validKeys.length];
int index = 0;
HashSet<RubySymbol> validKeySet = new HashSet<RubySymbol>();

HashSet<RubySymbol> validKeySet = new HashSet<>(ret.length);

// Build the return values
for(String key : validKeys) {
for (int i=0; i<validKeys.length; i++) {
final String key = validKeys[i];
RubySymbol keySym = context.runtime.newSymbol(key);
if (options.containsKey(keySym)) {
ret[index] = options.fastARef(keySym);
ret[i] = options.fastARef(keySym);
} else {
ret[index] = RubyBasicObject.UNDEF;
ret[i] = RubyBasicObject.UNDEF;
}
index++;
validKeySet.add(keySym);
}

// Check for any unknown keys
for(Object obj : options.keySet()) {
if (!validKeySet.contains(obj)) {
throw context.runtime.newArgumentError("unknown keyword: " + obj);
options.visitAll(context, new RubyHash.Visitor() {
public void visit(IRubyObject key, IRubyObject value) {
if (!validKeySet.contains(key)) {
throw context.runtime.newArgumentError("unknown keyword: " + key);
}
}
}
}, null);

return ret;
}

public static IRubyObject[] extractKeywordArgs(ThreadContext context, IRubyObject[] args, String... validKeys) {
IRubyObject options = ArgsUtil.getOptionsArg(context.runtime, args);
if(options instanceof RubyHash) {
if (options instanceof RubyHash) {
return extractKeywordArgs(context, (RubyHash)options, validKeys);
} else {
return null;
Expand Down

0 comments on commit bae5d69

Please sign in to comment.