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 <[email protected]> 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 _______________________________________________ pkg-java-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-java-commits

