Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package org.jruby.ir.operands;
  
  import org.jruby.Ruby;
 
 import java.util.List;
 import java.util.Map;
 
 // This represents a compound string in Ruby
 // Ex: - "Hi " + "there"
 //     - "Hi #{name}"
 //
 // NOTE: This operand is only used in the initial stages of optimization.
 // Further down the line, this string operand could get converted to calls
 // that appends the components of the compound string into a single string object
 public class CompoundString extends Operand {
     final private List<Operandpieces;
     final private Encoding encoding;
 
     public CompoundString(List<OperandpiecesEncoding encoding) {
         this. = pieces;
         this. = encoding;
     }
 
     public CompoundString(List<Operandpieces) {
         this(piecesnull);
     }
 
     @Override
     public boolean hasKnownValue() {
         if ( != null) {
             for (Operand o : ) {
                 if (!o.hasKnownValue()) return false;
             }
         }
 
         return true;
     }
 
     @Override
     public String toString() {
         return "CompoundString:" + ( == null"" : ) + ( == null ? "[]" : java.util.Arrays.toString(.toArray()));
     }
 
     @Override
     public Operand getSimplifiedOperand(Map<OperandOperandvalueMapboolean force) {
         List<OperandnewPieces = new java.util.ArrayList<Operand>();
         for (Operand p : ) {
             newPieces.add(p.getSimplifiedOperand(valueMapforce));
         }
 
         return new CompoundString(newPieces);
     }

    
Append the list of variables used in this operand to the input list
 
     @Override
     public void addUsedVariables(List<Variablel) {
         for (Operand o : ) {
             o.addUsedVariables(l);
         }
     }
 
     @Override
     public Operand cloneForInlining(InlinerInfo ii) {
         if (hasKnownValue()) return this;
 
         List<OperandnewPieces = new java.util.ArrayList<Operand>();
         for (Operand p : ) {
             newPieces.add(p.cloneForInlining(ii));
         }
 
         return new CompoundString(newPieces);
     }
 
     // SSS FIXME: Buggy?
     String retrieveJavaString(ThreadContext contextIRubyObject selfDynamicScope currDynScopeObject[] temp) {
         StringBuilder buf = new StringBuilder();
 
         for (Operand p : ) {
             buf.append(p.retrieve(contextselfcurrDynScopetemp));
         }
 
         return buf.toString();
     }
 
     public boolean isSameEncoding(StringLiteral str) {
         return str.bytelist.getEncoding() == ;
     }
 
     public RubyString[] retrievePieces(ThreadContext contextIRubyObject selfDynamicScope currDynScopeObject[] temp) {
         RubyString[] strings = new RubyString[.size()];
        int i = 0;
        for (Operand p : ) {
            strings[i++] = (RubyString)p.retrieve(contextselfcurrDynScopetemp);
        }
        return strings;
    }
    @Override
    public Object retrieve(ThreadContext contextIRubyObject selfDynamicScope currDynScopeObject[] temp) {
        // SSS FIXME: Doesn't work in all cases.  See example below
        //
        //    s = "x\234\355\301\001\001\000\000\000\200\220\376\257\356\b\n#{"\000" * 31}\030\200\000\000\001"
        //    s.length prints 70 instead of 52
        //
        // return context.getRuntime().newString(retrieveJavaString(interp, context, self));
        boolean is1_9 = context.runtime.is1_9();
        ByteList bytes = new ByteList();
        if (is1_9bytes.setEncoding();
        RubyString str = RubyString.newStringShared(context.runtimebytes.);
        for (Operand p : ) {
            if ((p instanceof StringLiteral) && (!is1_9 || isSameEncoding((StringLiteral)p))) {
                str.getByteList().append(((StringLiteral)p).);
            } else {
               IRubyObject pval = (IRubyObject)p.retrieve(contextselfcurrDynScopetemp);
               if (is1_9str.append19(pval);
               else str.append(pval);
            }
        }
        return str;
    }
    @Override
    public void visit(IRVisitor visitor) {
        visitor.CompoundString(this);
    }
New to GrepCode? Check out our FAQ X