Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package org.jruby.ir.operands;
  
 
 import java.util.List;
 import java.util.Map;
 
 // This represents a method handle bound to a receiver -- it is used during
 // compilation / interpretation to represent a method handle returned by a
 // method lookup instruction.  It may not necessarily have been fully resolved.
 // During interpretation / compilation, we may get a fully resolved method handle
 // which might be stored in an inline cache.
 public class MethodHandle extends Operand {
     final protected Operand methodName;
     final protected Operand receiver;
 
     // Used during interpretation
     private String      resolvedMethodName;
     private CacheEntry  cachedMethod;
     private IRubyObject receiverObj;
 
     public MethodHandle(Operand methodNameOperand receiver) {
         this. = methodName;
         this. = receiver;
     }
 
     public Operand getMethodNameOperand() {
         return ;
     }
 
     public DynamicMethod getResolvedMethod() {
         return .;
     }
 
     public String getResolvedMethodName() {
         return ;
     }
 
     public IRubyObject getReceiverObj() {
         return ;
     }
 
     @Override
     public void addUsedVariables(List<Variablel) {
         .addUsedVariables(l);
         .addUsedVariables(l);
     }
 
     @Override
     public boolean canCopyPropagate() {
         return true;
     }
 
     @Override
     public Operand getSimplifiedOperand(Map<OperandOperandvalueMapboolean force) {
         Operand newMethodName = .getSimplifiedOperand(valueMapforce);
         Operand newReceiver = .getSimplifiedOperand(valueMapforce);
         return (newMethodName ==  && newReceiver == ) ? this : new MethodHandle(newMethodNamenewReceiver);
     }
 
     @Override
     public String toString() {
         return "<" +  + "." +  + ">";
     }
 
     @Override
     public Operand cloneForInlining(InlinerInfo ii) {
         return new MethodHandle(.cloneForInlining(ii), .cloneForInlining(ii));
     }
 
     @Override
     public Object retrieve(ThreadContext contextIRubyObject selfDynamicScope currDynScopeObject[] temp) {
          = (IRubyObject).retrieve(contextselfcurrDynScopetemp);
 
         if ( instanceof MethAddr) {
              = ((MethAddr)).getName();
         } else {
             IRubyObject mnameObj = (IRubyObject).retrieve(contextselfcurrDynScopetemp);
 
             // SSS FIXME: If this is not a ruby string or a symbol, then this is an error in the source code!
             // Raise an exception and throw an error.  This should not be an assert.
             assert (mnameObj instanceof RubyString || mnameObj instanceof RubySymbol);
 
             // Clear cached method if the method name has changed!
             if (!mnameObj.toString().equals()) {
                  = null;
                  = mnameObj.toString();
             }
         }
 
        RubyClass receiverClass = .getMetaClass();
        if ( == null || !.typeOk(receiverClass)) {
            // lookup -- 'm' can be an undefined method.  It is the caller's responsibility to deal with that
             = receiverClass.searchWithCache();
        }
        return this;
    }
    @Override
    public void visit(IRVisitor visitor) {
        visitor.MethodHandle(this);
    }
New to GrepCode? Check out our FAQ X