Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
 package org.jruby.util;
 
 import org.jruby.Ruby;
 
import static org.jruby.runtime.Helpers.invokedynamic;
public class RecursiveComparator
    public static IRubyObject compare(ThreadContext contextfinal MethodNames methodIRubyObject aIRubyObject b) {
        Ruby runtime = context.runtime;
        if (a == b) {
            return runtime.getTrue();
        }
        
        boolean clear = false// whether to clear thread-local set (at top comparison)
        try {
            Set<Pairseen = null;
            
            if (a instanceof RubyHash && b instanceof RubyHash ||
                a instanceof RubyArray && b instanceof RubyArray) {
                RecursiveComparator.Pair pair = new RecursiveComparator.Pair(ab);
                if ((seen = context.getRecursiveSet()) == null) {
                    context.setRecursiveSet(seen = new HashSet<Pair>());
                    clear = true;
                }
                else if (seen.contains(pair)) { // are we recursing?
                    return runtime.getTrue();
                }
                seen.add(pair);
            }
            if (a instanceof RubyHash) {
                RubyHash hash = (RubyHasha;
                return hash.compare(contextmethodb);
            }
            else if (a instanceof RubyArray) {
                RubyArray array = (RubyArraya;
                return array.compare(contextmethodb);
            }
            else {
                return invokedynamic(contextamethodb);
            }
        } finally {
            if (clearcontext.setRecursiveSet(null);
        }
    }
    public static class Pair
    {
        private int a;
        private int b;
        public Pair(IRubyObject aIRubyObject b) {
            this. = System.identityHashCode(a);
            this. = System.identityHashCode(b);
        }
        @Override
        public boolean equals(Object other) {
            if (this == other) {
                return true;
            }
            if (other == null || !(other instanceof Pair)) {
                return false;
            }
            Pair pair = (Pairother;
            return  == pair.a &&  == pair.b;
        }
        @Override
        public int hashCode() {
            int result = ;
            result = 31 * result + ;
            return result;
        }
    }
New to GrepCode? Check out our FAQ X