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: 80578d1af83a
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: e40c665294ae
Choose a head ref
  • 8 commits
  • 4 files changed
  • 1 contributor

Commits on Aug 26, 2015

  1. cleanup unused imports

    kares committed Aug 26, 2015
    Copy the full SHA
    d40bc79 View commit details
  2. Copy the full SHA
    2f23342 View commit details
  3. Copy the full SHA
    004e3f3 View commit details
  4. Copy the full SHA
    36234b1 View commit details
  5. remove empty line

    kares committed Aug 26, 2015
    Copy the full SHA
    3611dbe View commit details
  6. Copy the full SHA
    7c7cffc View commit details
  7. Copy the full SHA
    0fa8da7 View commit details
  8. Merge branch 'jruby-1_7'

    * jruby-1_7:
      'more correct' MapJavaProxy key?/include? check that (only) does containsKey
      rename internal getMap to mapDelegate + add some notes on overrides
      remove empty line
      expose iteration check for sub-classes + cleanup putAll (in RubyHash)
      override more of inherited aset operations on MapJavaProxy (see #930)
      minimize MapJavaProxy's memory usage - allocate zero RubyHash buckets
    kares committed Aug 26, 2015
    Copy the full SHA
    e40c665 View commit details
8 changes: 3 additions & 5 deletions core/src/main/java/org/jruby/PrependedModule.java
Original file line number Diff line number Diff line change
@@ -13,7 +13,7 @@
* rights and limitations under the License.
*
* Copyright (C) 2014 Timur Duehr <tduehr@gmail.com>
*
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
@@ -28,14 +28,10 @@
***** END LICENSE BLOCK *****/
package org.jruby;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.jruby.internal.runtime.methods.DynamicMethod;
import org.jruby.runtime.builtin.IRubyObject;
import org.jruby.runtime.builtin.Variable;

/**
* This class is used as an intermediate superclass for Module#prepend
@@ -44,6 +40,7 @@
* @see org.jruby.RubyModule
*/
public class PrependedModule extends IncludedModule {

public PrependedModule(Ruby runtime, RubyClass superClass, RubyModule origin) {
super(runtime, superClass, origin);
methods = origin.methods;
@@ -59,4 +56,5 @@ public PrependedModule(Ruby runtime, RubyClass superClass, RubyModule origin) {
public boolean isPrepended() {
return true;
}

}
13 changes: 9 additions & 4 deletions core/src/main/java/org/jruby/RubyHash.java
Original file line number Diff line number Diff line change
@@ -499,7 +499,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");
}
@@ -2020,10 +2020,15 @@ public Object remove(Object key) {

@Override
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
@@ -103,64 +103,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)) {
@@ -176,7 +190,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());
@@ -186,11 +200,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
@@ -201,7 +213,7 @@ public RubyHash rehash() {

@Override
public RubyHash rb_clear() {
getMap().clear();
mapDelegate().clear();
this.size = 0;
return this;
}
@@ -216,7 +228,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() {