Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package org.jruby.ir.instructions;
  
  import org.jruby.Ruby;
 
 import java.util.Map;
 
 // This instruction is similar to EQQInstr, except it also verifies that
 // the type to EQQ with is actually a class or a module since rescue clauses
 // have this requirement unlike case statements.
 //
 // If v2 is an array, compare v1 with every element of v2 and stop on first match!
 public class RescueEQQInstr extends Instr implements ResultInstr {
     private Operand arg1;
     private Operand arg2;
     private Variable result;
 
     public RescueEQQInstr(Variable resultOperand v1Operand v2) {
         super(.);
 
         assert result != null"RescueEQQInstr result is null";
 
         this. = v1;
         this. = v2;
         this. = result;
     }
 
     public Operand[] getOperands() {
         return new Operand[]{};
     }
 
     public Variable getResult() {
         return ;
     }
 
     public void updateResult(Variable v) {
         this. = v;
     }
 
     @Override
     public void simplifyOperands(Map<OperandOperandvalueMapboolean force) {
          = .getSimplifiedOperand(valueMapforce);
          = .getSimplifiedOperand(valueMapforce);
     }
 
     @Override
     public String toString() {
         return super.toString() + "(" +  + ", " +  + ")";
     }
 
     @Override
     public Instr cloneForInlining(InlinerInfo ii) {
         return new RescueEQQInstr(ii.getRenamedVariable(),
                 .cloneForInlining(ii), .cloneForInlining(ii));
     }
 
     // SSS FIXME: Is this code effectively equivalent to Helpers.isJavaExceptionHandled?
     private boolean exceptionHandled(ThreadContext contextIRubyObject excTypeObject excObj) {
         Ruby runtime = context.runtime;
         if (excObj instanceof IRubyObject) {
             // regular ruby exception
             if (!(excType instanceof RubyModule)) throw runtime.newTypeError("class or module required for rescue clause. Found: " + excType);
             return excType.callMethod(context"===", (IRubyObject)excObj).isTrue();
         } else if (runtime.getException().op_ge(excType).isTrue() || runtime.getObject() == excType) {
             // convert java obj to a ruby object and try again
             return excType.callMethod(context"===", JavaUtil.convertJavaToUsableRubyObject(runtimeexcObj)).isTrue();
         } else if (excType instanceof RubyClass && excType.getInstanceVariables().hasInstanceVariable("@java_class")) {
             // java exception where the rescue clause has an embedded java class that could catch it
             RubyClass rubyClass = (RubyClass)excType;
             JavaClass javaClass = (JavaClass)rubyClass.getInstanceVariable("@java_class");
             if (javaClass != null) {
                 Class cls = javaClass.javaClass();
                 if (cls.isInstance(excObj)) return true;
             }
         }
 
         return false;
     }
 
     @Override
     public Object interpret(ThreadContext contextDynamicScope currDynScopeIRubyObject selfObject[] tempBlock block) {
         Ruby runtime = context.runtime;
         IRubyObject excType = (IRubyObject.retrieve(contextselfcurrDynScopetemp);
         Object excObj = .retrieve(contextselfcurrDynScopetemp);
 
        boolean isUndefExc = excObj == .;
        if (excType instanceof RubyArray) {
            RubyArray testTypes = (RubyArray)excType;
            for (int i = 0, n = testTypes.getLength(); i < ni++) {
                IRubyObject testType = (IRubyObject)testTypes.eltInternal(i);
                boolean handled = isUndefExc ? testType.isTrue() : exceptionHandled(contexttestTypeexcObj);
                if (handledreturn runtime.newBoolean(true);
            }
            return runtime.newBoolean(false);
        } else {
            return isUndefExc ? excType : runtime.newBoolean(exceptionHandled(contextexcTypeexcObj));
        }
    }
    @Override
    public void visit(IRVisitor visitor) {
        visitor.RescueEQQInstr(this);
    }
New to GrepCode? Check out our FAQ X