Skip to content

Commit

Permalink
[Truffle] Push some overrides from Array, Hash, String down into Ruby…
Browse files Browse the repository at this point in the history
…BasicObject.
  • Loading branch information
chrisseaton committed May 29, 2015
1 parent 2d8876d commit 65dfed0
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,8 @@
*/
package org.jruby.truffle.runtime.core;

import com.oracle.truffle.api.interop.ForeignAccessFactory;

import org.jruby.truffle.nodes.core.array.ArrayNodes;
import org.jruby.truffle.runtime.subsystems.ObjectSpaceManager;

/**
* Implements the Ruby {@code Array} class.
*/
public final class RubyArray extends RubyBasicObject {

public Object store;
Expand All @@ -27,18 +21,4 @@ public RubyArray(RubyClass arrayClass, Object store, int size) {
ArrayNodes.setStore(this, store, size);
}

@Override
public void visitObjectGraphChildren(ObjectSpaceManager.ObjectGraphVisitor visitor) {
for (Object object : ArrayNodes.slowToArray(this)) {
if (object instanceof RubyBasicObject) {
((RubyBasicObject) object).visitObjectGraph(visitor);
}
}
}

@Override
public ForeignAccessFactory getForeignAccessFactory() {
return new ArrayForeignAccessFactory(getContext());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,12 @@
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.object.*;

import org.jruby.truffle.nodes.core.array.ArrayNodes;
import org.jruby.truffle.nodes.objects.Allocator;
import org.jruby.truffle.runtime.ModuleOperations;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.hash.HashOperations;
import org.jruby.truffle.runtime.hash.KeyValue;
import org.jruby.truffle.runtime.object.BasicObjectType;
import org.jruby.truffle.runtime.subsystems.ObjectSpaceManager;

Expand Down Expand Up @@ -116,7 +119,15 @@ public boolean isFieldDefined(String name) {

@Override
public ForeignAccessFactory getForeignAccessFactory() {
return new BasicForeignAccessFactory(getContext());
if (this instanceof RubyArray) {
return new ArrayForeignAccessFactory(getContext());
} else if (this instanceof RubyHash) {
return new HashForeignAccessFactory(getContext());
} else if (this instanceof RubyString) {
return new StringForeignAccessFactory(getContext());
} else {
return new BasicForeignAccessFactory(getContext());
}
}

public final void visitObjectGraph(ObjectSpaceManager.ObjectGraphVisitor visitor) {
Expand All @@ -134,6 +145,23 @@ public final void visitObjectGraph(ObjectSpaceManager.ObjectGraphVisitor visitor
}

public void visitObjectGraphChildren(ObjectSpaceManager.ObjectGraphVisitor visitor) {
if (this instanceof RubyArray) {
for (Object object : ArrayNodes.slowToArray((RubyArray) this)) {
if (object instanceof RubyBasicObject) {
((RubyBasicObject) object).visitObjectGraph(visitor);
}
}
} else if (this instanceof RubyHash) {
for (KeyValue keyValue : HashOperations.verySlowToKeyValues((RubyHash) this)) {
if (keyValue.getKey() instanceof RubyBasicObject) {
((RubyBasicObject) keyValue.getKey()).visitObjectGraph(visitor);
}

if (keyValue.getValue() instanceof RubyBasicObject) {
((RubyBasicObject) keyValue.getValue()).visitObjectGraph(visitor);
}
}
}
}

public boolean isNumeric() {
Expand Down
24 changes: 0 additions & 24 deletions truffle/src/main/java/org/jruby/truffle/runtime/core/RubyHash.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,8 @@
*/
package org.jruby.truffle.runtime.core;

import com.oracle.truffle.api.interop.ForeignAccessFactory;
import com.oracle.truffle.api.nodes.Node;
import org.jruby.truffle.nodes.objects.Allocator;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.hash.Entry;
import org.jruby.truffle.runtime.hash.HashOperations;
import org.jruby.truffle.runtime.hash.KeyValue;
import org.jruby.truffle.runtime.subsystems.ObjectSpaceManager;

public class RubyHash extends RubyBasicObject {

Expand All @@ -38,22 +32,4 @@ public RubyHash(RubyClass rubyClass, RubyProc defaultBlock, Object defaultValue,
assert HashOperations.verifyStore(this);
}

@Override
public ForeignAccessFactory getForeignAccessFactory() {
return new HashForeignAccessFactory(getContext());
}

@Override
public void visitObjectGraphChildren(ObjectSpaceManager.ObjectGraphVisitor visitor) {
for (KeyValue keyValue : HashOperations.verySlowToKeyValues(this)) {
if (keyValue.getKey() instanceof RubyBasicObject) {
((RubyBasicObject) keyValue.getKey()).visitObjectGraph(visitor);
}

if (keyValue.getValue() instanceof RubyBasicObject) {
((RubyBasicObject) keyValue.getValue()).visitObjectGraph(visitor);
}
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,25 +9,13 @@
*/
package org.jruby.truffle.runtime.core;

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.interop.ForeignAccessFactory;
import com.oracle.truffle.api.nodes.Node;
import org.jcodings.Encoding;
import org.jcodings.specific.USASCIIEncoding;
import org.jruby.runtime.Helpers;
import org.jruby.truffle.nodes.core.array.ArrayNodes;
import org.jruby.truffle.nodes.objects.Allocator;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.control.RaiseException;
import org.jruby.util.ByteList;
import org.jruby.util.CodeRangeable;
import org.jruby.util.StringSupport;
import org.jruby.util.io.EncodingUtils;

/**
* Represents the Ruby {@code String} class.
*/
public class RubyString extends RubyBasicObject implements CodeRangeable {

public ByteList bytes;
Expand All @@ -44,11 +32,6 @@ public String toString() {
return Helpers.decodeByteList(getContext().getRuntime(), bytes);
}

@Override
public ForeignAccessFactory getForeignAccessFactory() {
return new StringForeignAccessFactory(getContext());
}

@Override
public int getCodeRange() {
return codeRange;
Expand Down

0 comments on commit 65dfed0

Please sign in to comment.