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: f0e2a9d28702
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 0fa8da7ac12a
Choose a head ref
  • 6 commits
  • 3 files changed
  • 1 contributor

Commits on Aug 26, 2015

  1. Copy the full SHA
    2f23342 View commit details
  2. Copy the full SHA
    004e3f3 View commit details
  3. Copy the full SHA
    36234b1 View commit details
  4. remove empty line

    kares committed Aug 26, 2015
    Copy the full SHA
    3611dbe View commit details
  5. Copy the full SHA
    7c7cffc View commit details
  6. Copy the full SHA
    0fa8da7 View commit details
13 changes: 9 additions & 4 deletions core/src/main/java/org/jruby/RubyHash.java
Original file line number Diff line number Diff line change
@@ -493,7 +493,7 @@ private void checkResize() {
if (MRI_HASH_RESIZE) MRICheckResize(); else JavaSoftCheckResize();
}

private void checkIterating() {
protected final void checkIterating() {
if (iteratorCount > 0) {
throw getRuntime().newRuntimeError("can't add a new key into hash during iteration");
}
@@ -2053,10 +2053,15 @@ public Object remove(Object key) {
}

public void putAll(Map map) {
Ruby runtime = getRuntime();
for (Iterator<Map.Entry> iter = map.entrySet().iterator(); iter.hasNext();) {
final Ruby runtime = getRuntime();
@SuppressWarnings("unchecked")
final Iterator<Map.Entry> iter = map.entrySet().iterator();
while ( iter.hasNext() ) {
Map.Entry entry = iter.next();
internalPut(JavaUtil.convertJavaToUsableRubyObject(runtime, entry.getKey()), JavaUtil.convertJavaToUsableRubyObject(runtime, entry.getValue()));
internalPut(
JavaUtil.convertJavaToUsableRubyObject(runtime, entry.getKey()),
JavaUtil.convertJavaToUsableRubyObject(runtime, entry.getValue())
);
}
}

62 changes: 37 additions & 25 deletions core/src/main/java/org/jruby/java/proxies/MapJavaProxy.java
Original file line number Diff line number Diff line change
@@ -102,64 +102,78 @@ private static class RubyHashMap extends RubyHash {
private final MapJavaProxy receiver;

public RubyHashMap(Ruby runtime, MapJavaProxy receiver) {
super(runtime);
super(runtime, 0);
this.receiver = receiver;
}

private void setSize(int size) {
this.size = size;
}
private void setSize(int size) { this.size = size; }

private Map getMap() { return receiver.getMapObject(); }
// the underlying Map object operations should be delegated to
private Map mapDelegate() { return receiver.getMapObject(); }

@Override
public void internalPut(final IRubyObject key, final IRubyObject value, final boolean checkForExisting) {
internalPutSmall(key, value, checkForExisting);
}

@Override
protected final void internalPutSmall(IRubyObject key, IRubyObject value, boolean checkForExisting) {
@SuppressWarnings("unchecked")
final Map<Object, Object> map = getMap();
final Map<Object, Object> map = mapDelegate();
map.put(key.toJava(Object.class), value.toJava(Object.class));
this.size = map.size();
}

@Override
protected final void op_asetForString(Ruby runtime, RubyString key, IRubyObject value) {
@SuppressWarnings("unchecked")
final Map<Object, Object> map = mapDelegate();
map.put(key.decodeString(), value.toJava(Object.class));
this.size = map.size();
}

@Override
protected final void op_asetSmallForString(Ruby runtime, RubyString key, IRubyObject value) {
op_asetForString(runtime, key, value);
}

@Override
public IRubyObject internalGet(IRubyObject key) {
Object result = getMap().get(key.toJava(Object.class));
Object result = mapDelegate().get(key.toJava(Object.class));
if (result == null) return null;
return JavaUtil.convertJavaToUsableRubyObject(getRuntime(), result);
}

@Override
@Override // NOTE: likely won't be called
public RubyHashEntry internalGetEntry(IRubyObject key) {
Map map = getMap();
Map map = mapDelegate();
Object convertedKey = key.toJava(Object.class);
Object value = map.get(convertedKey);

if (value != null) {
RubyHashEntry rubyEntry = new RubyHashEntry(key.hashCode(), key, JavaUtil.convertJavaToUsableRubyObject(getRuntime(), value), null, null);
return rubyEntry;
return new RubyHashEntry(key.hashCode(), key, JavaUtil.convertJavaToUsableRubyObject(getRuntime(), value), null, null);
}

return NO_ENTRY;
}

@Override
public RubyHashEntry internalDelete(final IRubyObject key) {
final Map map = getMap();
final Map map = mapDelegate();
Object convertedKey = key.toJava(Object.class);
Object value = map.get(convertedKey);

if (value != null) {
RubyHashEntry rubyEntry = new RubyHashEntry(key.hashCode(), key, JavaUtil.convertJavaToUsableRubyObject(getRuntime(), value), null, null);
map.remove(convertedKey);
this.size = map.size();
return rubyEntry;
return new RubyHashEntry(key.hashCode(), key, JavaUtil.convertJavaToUsableRubyObject(getRuntime(), value), null, null);
}

return NO_ENTRY;
}

@Override
@Override // NOTE: likely won't be called
public RubyHashEntry internalDeleteEntry(final RubyHashEntry entry) {
final Map map = getMap();
final Map map = mapDelegate();
Object convertedKey = ((IRubyObject) entry.getKey()).toJava(Object.class);

if (map.containsKey(convertedKey)) {
@@ -175,7 +189,7 @@ public RubyHashEntry internalDeleteEntry(final RubyHashEntry entry) {
public void visitAll(Visitor visitor) {
final Ruby runtime = getRuntime();
@SuppressWarnings("unchecked")
final Map<Object, Object> map = getMap();
final Map<Object, Object> map = mapDelegate();
final Map.Entry[] entries = map.entrySet().toArray( new Map.Entry[ map.size() ] );
for ( Map.Entry entry : entries ) {
IRubyObject key = JavaUtil.convertJavaToUsableRubyObject(runtime, entry.getKey());
@@ -185,11 +199,9 @@ public void visitAll(Visitor visitor) {
}

@Override
public void op_asetForString(Ruby runtime, RubyString key, IRubyObject value) {
@SuppressWarnings("unchecked")
final Map<Object, Object> map = getMap();
map.put(key.toJava(String.class), value.toJava(Object.class));
this.size = map.size();
public RubyBoolean has_key_p(IRubyObject key) {
final Object convertedKey = key.toJava(Object.class);
return getRuntime().newBoolean( mapDelegate().containsKey(convertedKey) );
}

@Override
@@ -200,7 +212,7 @@ public RubyHash rehash() {

@Override
public RubyHash rb_clear() {
getMap().clear();
mapDelegate().clear();
this.size = 0;
return this;
}
@@ -215,7 +227,7 @@ public RubyHash to_hash() {
final Ruby runtime = getRuntime();
final RubyHash hash = new RubyHash(runtime);
@SuppressWarnings("unchecked")
Set<Map.Entry> entries = getMap().entrySet();
Set<Map.Entry> entries = mapDelegate().entrySet();
for ( Map.Entry entry : entries ) {
IRubyObject key = JavaUtil.convertJavaToUsableRubyObject(runtime, entry.getKey());
IRubyObject value = JavaUtil.convertJavaToUsableRubyObject(runtime, entry.getValue());
Original file line number Diff line number Diff line change
@@ -143,7 +143,6 @@ public static Object newProxyInstance(Ruby runtime, Class superClass, Class[] in
constructorParameters == null ? EMPTY_CLASS_ARRAY : constructorParameters
);
return constructor.newInstance(constructorArgs, handler);

}

public Class getSuperclass() {