[yecht] 05/13: Fix JRUBY-4345 - make it possible to have recursive links of objects
Miguel Landaeta
nomadium at moszumanska.debian.org
Sat Jan 24 21:47:01 UTC 2015
This is an automated email from the git hooks/post-receive script.
nomadium pushed a commit to branch master
in repository yecht.
commit f12835dab6eb54e70b0344e23f5e953c308d061c
Author: Ola Bini <ola.bini at gmail.com>
Date: Tue Jan 5 16:49:57 2010 +0100
Fix JRUBY-4345 - make it possible to have recursive links of objects
---
ext/ruby/src/java/org/yecht/ruby/BadAlias.java | 4 ++++
ext/ruby/src/java/org/yecht/ruby/HashStorageLink.java | 6 +++---
.../src/java/org/yecht/ruby/ObjectStorageLink.java | 19 +++++++++++++++++++
.../src/java/org/yecht/ruby/PossibleLinkNode.java | 2 ++
ext/ruby/src/java/org/yecht/ruby/Resolver.java | 17 ++++++++++++++++-
5 files changed, 44 insertions(+), 4 deletions(-)
diff --git a/ext/ruby/src/java/org/yecht/ruby/BadAlias.java b/ext/ruby/src/java/org/yecht/ruby/BadAlias.java
index 9b3b350..b40109b 100644
--- a/ext/ruby/src/java/org/yecht/ruby/BadAlias.java
+++ b/ext/ruby/src/java/org/yecht/ruby/BadAlias.java
@@ -22,6 +22,10 @@ public class BadAlias extends RubyObject implements PossibleLinkNode {
}
private List<StorageLink> links = new LinkedList<StorageLink>();
+ public List<StorageLink> getLinks() {
+ return links;
+ }
+
public void addLink(StorageLink link) {
links.add(link);
}
diff --git a/ext/ruby/src/java/org/yecht/ruby/HashStorageLink.java b/ext/ruby/src/java/org/yecht/ruby/HashStorageLink.java
index 0d6e361..28af027 100644
--- a/ext/ruby/src/java/org/yecht/ruby/HashStorageLink.java
+++ b/ext/ruby/src/java/org/yecht/ruby/HashStorageLink.java
@@ -4,9 +4,9 @@ import org.jruby.RubyHash;
import org.jruby.runtime.builtin.IRubyObject;
class HashStorageLink extends StorageLink {
- private final RubyHash hash;
- private final IRubyObject key;
- private final IRubyObject originalObject;
+ final RubyHash hash;
+ final IRubyObject key;
+ final IRubyObject originalObject;
public HashStorageLink(IRubyObject h, IRubyObject key, IRubyObject originalObject) {
this.hash = (RubyHash)h;
diff --git a/ext/ruby/src/java/org/yecht/ruby/ObjectStorageLink.java b/ext/ruby/src/java/org/yecht/ruby/ObjectStorageLink.java
new file mode 100644
index 0000000..60bdb96
--- /dev/null
+++ b/ext/ruby/src/java/org/yecht/ruby/ObjectStorageLink.java
@@ -0,0 +1,19 @@
+package org.yecht.ruby;
+
+import org.jruby.runtime.builtin.IRubyObject;
+
+class ObjectStorageLink extends StorageLink {
+ final IRubyObject obj;
+ final String ivarName;
+ final IRubyObject originalObject;
+
+ public ObjectStorageLink(IRubyObject obj, String ivarName, IRubyObject originalObject) {
+ this.obj = obj;
+ this.ivarName = ivarName;
+ this.originalObject = originalObject;
+ }
+
+ public void replaceLinkWith(IRubyObject newObject) {
+ obj.getInstanceVariables().setInstanceVariable(ivarName, newObject);
+ }
+}
diff --git a/ext/ruby/src/java/org/yecht/ruby/PossibleLinkNode.java b/ext/ruby/src/java/org/yecht/ruby/PossibleLinkNode.java
index ad9d550..131d34a 100644
--- a/ext/ruby/src/java/org/yecht/ruby/PossibleLinkNode.java
+++ b/ext/ruby/src/java/org/yecht/ruby/PossibleLinkNode.java
@@ -1,8 +1,10 @@
package org.yecht.ruby;
+import java.util.List;
import org.jruby.runtime.builtin.IRubyObject;
public interface PossibleLinkNode {
+ List<StorageLink> getLinks();
void addLink(StorageLink link);
void replaceLinks(IRubyObject newObject);
}
diff --git a/ext/ruby/src/java/org/yecht/ruby/Resolver.java b/ext/ruby/src/java/org/yecht/ruby/Resolver.java
index 215b974..f99966c 100644
--- a/ext/ruby/src/java/org/yecht/ruby/Resolver.java
+++ b/ext/ruby/src/java/org/yecht/ruby/Resolver.java
@@ -1,5 +1,7 @@
package org.yecht.ruby;
+import java.util.List;
+
import org.yecht.Data;
import org.yecht.ImplicitScanner;
import org.yecht.MapPart;
@@ -128,11 +130,24 @@ public class Resolver {
obj.callMethod(ctx, "yaml_initialize", new IRubyObject[]{type, val});
} else if(!obj.isNil() && val instanceof RubyHash) {
final IRubyObject _obj = obj;
+ final IRubyObject _val = val;
RubyEnumerable.callEach(runtime, ctx, val, new BlockCallback() {
public IRubyObject call(ThreadContext _ctx, IRubyObject[] largs, Block blk) {
IRubyObject ivname = ((RubyArray)largs[0]).entry(0);
String ivn = "@" + ivname.convertToString().toString();
- _obj.getInstanceVariables().setInstanceVariable(ivn, ((RubyArray)largs[0]).entry(1));
+ IRubyObject valueToSet = ((RubyArray)largs[0]).entry(1);
+ if(valueToSet instanceof PossibleLinkNode) {
+ List<StorageLink> sls = ((PossibleLinkNode)valueToSet).getLinks();
+ for(int i=0, j=sls.size(); i<j; i++) {
+ StorageLink sl = sls.get(i);
+ if(sl instanceof HashStorageLink) {
+ if(((HashStorageLink)sl).hash == _val) {
+ sls.set(i, new ObjectStorageLink(_obj, ivn, valueToSet));
+ }
+ }
+ }
+ }
+ _obj.getInstanceVariables().setInstanceVariable(ivn, valueToSet);
return runtime.getNil();
}
});
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/yecht.git
More information about the pkg-java-commits
mailing list