[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