Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: jruby/jruby
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: c89e4e766d91
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 6da8512a9377
Choose a head ref
  • 8 commits
  • 14 files changed
  • 1 contributor

Commits on Jun 12, 2015

  1. Copy the full SHA
    806643d View commit details
  2. Copy the full SHA
    3b52608 View commit details
  3. Copy the full SHA
    deea82d View commit details
  4. Copy the full SHA
    45f7ecd View commit details
  5. Copy the full SHA
    2494337 View commit details
  6. Copy the full SHA
    4e349a9 View commit details
  7. Copy the full SHA
    dc8b251 View commit details
  8. Copy the full SHA
    6da8512 View commit details
Original file line number Diff line number Diff line change
@@ -13,6 +13,7 @@
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.nodes.RubyNode;
import org.jruby.truffle.nodes.core.hash.HashNodes;
import org.jruby.truffle.runtime.RubyArguments;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.control.RaiseException;
@@ -21,6 +22,8 @@
import org.jruby.truffle.runtime.hash.KeyValue;
import org.jruby.truffle.runtime.methods.Arity;

import java.util.Map;

/**
* Check arguments meet the arity of the method.
*/
@@ -67,7 +70,7 @@ public void executeVoid(VirtualFrame frame) {
}

if (!keywordsRest && keywordArguments != null) {
for (KeyValue keyValue : HashOperations.verySlowToKeyValues(keywordArguments)) {
for (Map.Entry<Object, Object> keyValue : HashNodes.iterableKeyValues(keywordArguments)) {
if (!keywordAllowed(keyValue.getKey().toString())) {
CompilerDirectives.transferToInterpreter();
throw new RaiseException(getContext().getCoreLibrary().argumentError("unknown keyword: " + keyValue.getKey().toString(), this));
Original file line number Diff line number Diff line change
@@ -16,12 +16,15 @@
import com.oracle.truffle.api.utilities.ValueProfile;
import org.jruby.truffle.nodes.RubyGuards;
import org.jruby.truffle.nodes.RubyNode;
import org.jruby.truffle.nodes.core.hash.HashNodes;
import org.jruby.truffle.runtime.RubyArguments;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.core.RubyBasicObject;
import org.jruby.truffle.runtime.hash.HashOperations;
import org.jruby.truffle.runtime.hash.KeyValue;

import java.util.Map;

public class ReadKeywordArgumentNode extends RubyNode {

private final int minimum;
@@ -75,7 +78,7 @@ public Object execute(VirtualFrame frame) {
private Object lookupKeywordInHash(RubyBasicObject hash) {
assert RubyGuards.isRubyHash(hash);

for (KeyValue keyValue : HashOperations.verySlowToKeyValues(hash)) {
for (Map.Entry<Object, Object> keyValue : HashNodes.iterableKeyValues(hash)) {
if (keyValue.getKey().toString().equals(name)) {
return keyValue.getValue();
}
Original file line number Diff line number Diff line change
@@ -19,11 +19,13 @@
import org.jruby.truffle.runtime.RubyArguments;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.core.RubyBasicObject;
import org.jruby.truffle.runtime.hash.BucketsStrategy;
import org.jruby.truffle.runtime.hash.HashOperations;
import org.jruby.truffle.runtime.hash.KeyValue;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class ReadKeywordRestArgumentNode extends RubyNode {

@@ -65,19 +67,19 @@ private Object lookupRestKeywordArgumentHash(VirtualFrame frame) {
return HashNodes.createEmptyHash(getContext().getCoreLibrary().getHashClass());
}

final List<KeyValue> entries = new ArrayList<>();
final List<Map.Entry<Object, Object>> entries = new ArrayList<>();

outer: for (KeyValue keyValue : HashOperations.verySlowToKeyValues(hash)) {
outer: for (Map.Entry<Object, Object> keyValue : HashNodes.iterableKeyValues(hash)) {
for (String excludedKeyword : excludedKeywords) {
if (excludedKeyword.equals(keyValue.getKey().toString())) {
continue outer;
}
}

entries.add(new KeyValue(keyValue.getKey(), keyValue.getValue()));
entries.add(keyValue);
}

return HashOperations.verySlowFromEntries(getContext(), entries, HashNodes.isCompareByIdentity(hash));
return BucketsStrategy.create(getContext().getCoreLibrary().getHashClass(), entries, HashNodes.isCompareByIdentity(hash));
}

}
Original file line number Diff line number Diff line change
@@ -36,6 +36,7 @@
import org.jruby.truffle.nodes.core.KernelNodesFactory.SameOrEqualNodeFactory;
import org.jruby.truffle.nodes.core.KernelNodesFactory.SingletonMethodsNodeFactory;
import org.jruby.truffle.nodes.core.array.ArrayNodes;
import org.jruby.truffle.nodes.core.hash.HashNodes;
import org.jruby.truffle.nodes.dispatch.*;
import org.jruby.truffle.nodes.objects.*;
import org.jruby.truffle.nodes.objectstorage.WriteHeadObjectFieldNode;
@@ -66,6 +67,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

@CoreClass(name = "Kernel")
public abstract class KernelNodes {
@@ -90,7 +92,7 @@ public RubyBasicObject backtick(RubyString command) {
final List<String> envp = new ArrayList<>();

// TODO(CS): cast
for (KeyValue keyValue : HashOperations.verySlowToKeyValues(env)) {
for (Map.Entry<Object, Object> keyValue : HashNodes.iterableKeyValues(env)) {
envp.add(keyValue.getKey().toString() + "=" + keyValue.getValue().toString());
}

@@ -551,7 +553,7 @@ private static void exec(RubyContext context, String[] commandLine) {

final RubyBasicObject env = context.getCoreLibrary().getENV();

for (KeyValue keyValue : HashOperations.verySlowToKeyValues(env)) {
for (Map.Entry<Object, Object> keyValue : HashNodes.iterableKeyValues(env)) {
builder.environment().put(keyValue.getKey().toString(), keyValue.getValue().toString());
}

@@ -1832,7 +1834,7 @@ public boolean system(RubyString command) {
final List<String> envp = new ArrayList<>();

// TODO(CS): cast
for (KeyValue keyValue : HashOperations.verySlowToKeyValues(env)) {
for (Map.Entry<Object, Object> keyValue : HashNodes.iterableKeyValues(env)) {
envp.add(keyValue.getKey().toString() + "=" + keyValue.getValue().toString());
}

Original file line number Diff line number Diff line change
@@ -27,15 +27,13 @@
import org.jruby.truffle.runtime.cext.CExtSubsystem;
import org.jruby.truffle.runtime.control.RaiseException;
import org.jruby.truffle.runtime.core.*;
import org.jruby.truffle.runtime.hash.BucketsStrategy;
import org.jruby.truffle.runtime.hash.HashOperations;
import org.jruby.truffle.runtime.hash.KeyValue;
import org.jruby.truffle.runtime.subsystems.SimpleShell;
import org.jruby.util.Memo;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.*;

@CoreClass(name = "Truffle::Primitive")
public abstract class TrufflePrimitiveNodes {
@@ -275,15 +273,15 @@ public RubyBasicObject coverageResult() {
throw new UnsupportedOperationException("coverage is disabled");
}

final List<KeyValue> keyValues = new ArrayList<>();
final Map<Object, Object> converted = new HashMap<>();

for (Map.Entry<Source, Long[]> source : getContext().getCoverageTracker().getCounts().entrySet()) {
final Object[] store = lineCountsStore(source.getValue());
final RubyBasicObject array = createArray(store, store.length);
keyValues.add(new KeyValue(createString(source.getKey().getPath()), array));
converted.put(createString(source.getKey().getPath()), array);
}

return HashOperations.verySlowFromEntries(getContext(), keyValues, false);
return BucketsStrategy.create(getContext().getCoreLibrary().getHashClass(), converted.entrySet(), false);
}

private Object[] lineCountsStore(Long[] array) {
Original file line number Diff line number Diff line change
@@ -15,11 +15,13 @@
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.nodes.RubyNode;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.hash.BucketsStrategy;
import org.jruby.truffle.runtime.hash.HashOperations;
import org.jruby.truffle.runtime.hash.KeyValue;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class ConcatHashLiteralNode extends RubyNode {

@@ -34,17 +36,19 @@ public ConcatHashLiteralNode(RubyContext context, SourceSection sourceSection, R
public Object execute(VirtualFrame frame) {
CompilerDirectives.transferToInterpreter();

final List<KeyValue> keyValues = new ArrayList<>();
final List<Map.Entry<Object, Object>> keyValues = new ArrayList<>();

for (RubyNode child : children) {
try {
keyValues.addAll(HashOperations.verySlowToKeyValues(child.executeRubyHash(frame)));
for (Map.Entry<Object, Object> keyValue : HashNodes.iterableKeyValues(child.executeRubyHash(frame))) {
keyValues.add(keyValue);
}
} catch (UnexpectedResultException e) {
throw new UnsupportedOperationException(child.getClass() + " " + e.getResult().getClass());
}
}

return HashOperations.verySlowFromEntries(getContext(), keyValues, false);
return BucketsStrategy.create(getContext().getCoreLibrary().getHashClass(), keyValues, false);
}

}
Original file line number Diff line number Diff line change
@@ -20,8 +20,10 @@
import org.jruby.truffle.nodes.objects.IsFrozenNode;
import org.jruby.truffle.nodes.objects.IsFrozenNodeGen;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.core.RubyBasicObject;
import org.jruby.truffle.runtime.core.RubyString;
import org.jruby.truffle.runtime.hash.HashOperations;
import org.jruby.truffle.runtime.hash.BucketsStrategy;
import org.jruby.truffle.runtime.hash.Entry;
import org.jruby.truffle.runtime.hash.KeyValue;
import org.jruby.truffle.runtime.hash.PackedArrayStrategy;

@@ -138,30 +140,35 @@ public Object execute(VirtualFrame frame) {
size++;
}

return HashNodes.createHash(getContext().getCoreLibrary().getHashClass(), null, null, store, size, null);
return HashNodes.createHash(getContext().getCoreLibrary().getHashClass(), store, size);
}

}

public static class GenericHashLiteralNode extends HashLiteralNode {

@Child HashNodes.SetIndexNode setIndexNode;

public GenericHashLiteralNode(RubyContext context, SourceSection sourceSection, RubyNode[] keyValues) {
super(context, sourceSection, keyValues);
}

@Override
public Object execute(VirtualFrame frame) {
CompilerDirectives.transferToInterpreter();
if (setIndexNode == null) {
CompilerDirectives.transferToInterpreter();
setIndexNode = insert(HashNodesFactory.SetIndexNodeFactory.create(getContext(), getEncapsulatingSourceSection(), new RubyNode[]{null, null, null}));
}

final List<KeyValue> entries = new ArrayList<>();
final RubyBasicObject hash = BucketsStrategy.create(getContext().getCoreLibrary().getHashClass(), keyValues.length / 2);

for (int n = 0; n < keyValues.length; n += 2) {
final Object key = keyValues[n].execute(frame);
final Object value = keyValues[n + 1].execute(frame);
entries.add(new KeyValue(key, value));
setIndexNode.executeSet(frame, hash, key, value);
}

return HashOperations.verySlowFromEntries(getContext(), entries, false);
return hash;
}

}
Loading