Skip to content

Commit

Permalink
Add setNativeHandle/getNativeHandle to RubyBasicObject and use that t…
Browse files Browse the repository at this point in the history
…o store/retrieve the native cext handle.
  • Loading branch information
vp-of-awesome committed Sep 23, 2011
1 parent 6565312 commit 25428dc
Show file tree
Hide file tree
Showing 7 changed files with 37 additions and 36 deletions.
15 changes: 0 additions & 15 deletions src/org/jruby/RubyArray.java
Expand Up @@ -53,7 +53,6 @@

import org.jruby.anno.JRubyClass;
import org.jruby.anno.JRubyMethod;
import org.jruby.cext.RArray;
import org.jruby.common.IRubyWarnings.ID;
import org.jruby.java.addons.ArrayJavaAddons;
import org.jruby.javasupport.JavaUtil;
Expand Down Expand Up @@ -400,20 +399,6 @@ public int getLength() {
return realLength;
}

public RArray getRArray() {
return (RArray)getMetaClass().getRealClass().getNativeHandleAccessorForRead().get(this);
}

public final void setRArray(RArray rarray) {
setRArray(getMetaClass().getRealClass().getNativeHandleAccessorForWrite().getIndex(), rarray);
}

private void setRArray(int index, RArray value) {
if (index < 0) return;
Object[] ivarTable = getVariableTableForWrite(index);
ivarTable[index] = value;
}

public IRubyObject[] toJavaArray() {
IRubyObject[] copy = new IRubyObject[realLength];
safeArrayCopy(values, begin, copy, 0, realLength);
Expand Down
10 changes: 10 additions & 0 deletions src/org/jruby/RubyBasicObject.java
Expand Up @@ -1281,6 +1281,16 @@ private void setObjectId(int index, long value) {
Object[] ivarTable = getVariableTableForWrite(index);
ivarTable[index] = value;
}

public final Object getNativeHandle() {
return getMetaClass().getRealClass().getNativeHandleAccessorForRead().get(this);
}

public final void setNativeHandle(Object value) {
int index = getMetaClass().getRealClass().getNativeHandleAccessorForWrite().getIndex();
Object[] ivarTable = getVariableTableForWrite(index);
ivarTable[index] = value;
}

//
// COMMON VARIABLE METHODS
Expand Down
15 changes: 0 additions & 15 deletions src/org/jruby/RubyString.java
Expand Up @@ -77,7 +77,6 @@
import org.joni.Region;
import org.jruby.anno.JRubyClass;
import org.jruby.anno.JRubyMethod;
import org.jruby.cext.RString;
import org.jruby.javasupport.util.RuntimeHelpers;
import org.jruby.runtime.Block;
import org.jruby.runtime.ClassIndex;
Expand Down Expand Up @@ -190,20 +189,6 @@ public final void setCodeRange(int codeRange) {
flags |= codeRange & CR_MASK;
}

public final RString getRString() {
return (RString)getMetaClass().getRealClass().getNativeHandleAccessorForRead().get(this);
}

public final void setRString(RString rstring) {
setRString(getMetaClass().getRealClass().getNativeHandleAccessorForWrite().getIndex(), rstring);
}

private void setRString(int index, RString value) {
if (index < 0) return;
Object[] ivarTable = getVariableTableForWrite(index);
ivarTable[index] = value;
}

public final void clearCodeRange() {
flags &= ~CR_MASK;
}
Expand Down
12 changes: 10 additions & 2 deletions src/org/jruby/cext/GC.java
Expand Up @@ -37,6 +37,7 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;

import org.jruby.RubyBasicObject;
import org.jruby.runtime.builtin.IRubyObject;
import org.jruby.threading.DaemonThreadFactory;
import org.jruby.util.SoftReferenceReaper;
Expand Down Expand Up @@ -89,15 +90,22 @@ public void run() {
}

static final Handle lookup(IRubyObject obj) {
return nativeHandles.get(obj);
return obj instanceof RubyBasicObject
? (Handle) ((RubyBasicObject) obj).getNativeHandle()
: nativeHandles.get(obj);
}

/**
* Called from Handle.valueOf
* @param obj
*/
static final void register(IRubyObject obj, Handle h) {
nativeHandles.put(obj, h);
if (obj instanceof RubyBasicObject) {
((RubyBasicObject) obj).setNativeHandle(h);
} else {
nativeHandles.put(obj, h);
}

Cleaner.register(h);
}

Expand Down
10 changes: 10 additions & 0 deletions src/org/jruby/cext/Handle.java
Expand Up @@ -60,6 +60,7 @@ public final class Handle extends Cleaner {

private final Ruby runtime;
private final long address;
private Object data; // RString or RArray

static Handle newHandle(Ruby runtime, Object rubyObject, long nativeHandle) {
return new Handle(runtime, rubyObject, nativeHandle);
Expand Down Expand Up @@ -103,6 +104,15 @@ public String toString() {
void dispose() {
Native.freeHandle(address);
}

void setDataObject(Object data) {
this.data = data;
}

Object getDataObject() {
return data;
}


/**
* Retrieves the Handle object associated with a {@link RubyObject}. Retrieval is either done
Expand Down
5 changes: 3 additions & 2 deletions src/org/jruby/cext/RArray.java
Expand Up @@ -53,11 +53,12 @@ static RArray newRArray(RubyArray ary, long address) {
}

static RArray valueOf(RubyArray ary) {
RArray rarray = ary.getRArray();
Handle h = Handle.valueOf(ary);
RArray rarray = (RArray) h.getDataObject();
if (rarray != null) {
return rarray;
}
ary.setRArray(rarray = RArray.newRArray(ary, Native.newRArray()));
h.setDataObject(rarray = RArray.newRArray(ary, Native.newRArray()));

return rarray;
}
Expand Down
6 changes: 4 additions & 2 deletions src/org/jruby/cext/RString.java
Expand Up @@ -53,11 +53,13 @@ static RString newRString(RubyString str, long address) {
}

static RString valueOf(RubyString str) {
RString rstring = str.getRString();
Handle h = Handle.valueOf(str);
RString rstring = (RString) h.getDataObject();
if (rstring != null) {
return rstring;
}
str.setRString(rstring = RString.newRString(str, Native.newRString()));

h.setDataObject(rstring = RString.newRString(str, Native.newRString()));

return rstring;
}
Expand Down

0 comments on commit 25428dc

Please sign in to comment.