Package dk.brics.string.intermediate

Examples of dk.brics.string.intermediate.Variable


   
    return null;
  }
 
  private Variable anybool(IntermediateFactory factory) {
    Variable var = factory.createVariable(VariableType.PRIMITIVE);
    factory.addStatement(new PrimitiveInit(var, Basic.getBinaryBooleans()));
    return var;
  }
View Full Code Here


      }
      else if (methodName.equals("reverse")) {
        return factory.getNothing();
      }
      else if (methodName.equals("singleton") && numArgs == 1 && isString(expr.getArg(0).getType())) {
        Variable v = factory.createVariable(VariableType.ARRAY);
        factory.addStatement(new ArrayNew(v));
        factory.addStatement(new ArrayWriteElement(v, arguments.get(0)));
        return v;
      }
      else if (methodName.equals("singletonList") && numArgs == 1 && isString(expr.getArg(0).getType())) {
        Variable v = factory.createVariable(VariableType.ARRAY);
        factory.addStatement(new ArrayNew(v));
        factory.addStatement(new ArrayWriteElement(v, arguments.get(0)));
        return v;
      }
    }
View Full Code Here

            factory.addStatement(new StringInit(callee, Basic.makeAnyString()));
    }
    else if (isBufferOrBuilder(declaringClass)) {
      // new StringBuffer(); new StringBuffer(int capacity)
      if (numArgs == 0 || (numArgs == 1 && isInt(method.getParameterType(0)))) {
        Variable empty = factory.createVariable(VariableType.STRING);
        factory.addStatement(new StringInit(empty, Basic.makeEmptyString()));
        factory.addStatement(new StringBufferInit(callee, empty));
        return true;
      }
     
      // new StringBuffer(String)
      if (numArgs == 1 && isString(method.getParameterType(0))) {
        factory.addStatement(new StringBufferInit(callee, arguments.get(0)));
        return true;
      }
     
      // new StringBuffer(CharSequence)
      if (numArgs == 1 && isCharSequence(method.getParameterType(0))) {
        // use the valueOf of the CharSequence, which will be its ToString-method, or
        // in case we know the argument is a StringBuffer/String/Array, we can use its language
        // directly
        Variable value = valueOf(expr.getArgBox(0), arguments.get(0), 10, method.getParameterType(0), factory);
        factory.addStatement(new StringBufferInit(callee, value));
        return true;
      }
    }
    // known collection type
View Full Code Here

        if (val instanceof Local && val.getType() instanceof RefLikeType && !(isString(val.getType()))) {
          canBeNull = factory.canBeNull((Local)val);
        }
       
        if (canBeNull) {
          Variable resultVar = factory.createVariable(VariableType.STRING);
         
          // if the variable might be null, split the graph in two, one for the case
          // where it is non-null, and one where it is null.
          // both branches should assign to 'resultVar' so we can return a variable
          factory.startBranch();
         
          // not null
          Variable notNull = valueOfNonNull(box, argument, radix, type, factory);
          factory.addStatement(new StringAssignment(resultVar, notNull));
          factory.useBranch();
         
          // null
          factory.addStatement(new StringInit(resultVar, Automatons.getNull()));
View Full Code Here

        // don't create a new variable if the type is STRING
        if (argument.getType() == VariableType.STRING)
          return argument;
       
        Value val = box.getValue();
        Variable result = factory.createVariable(VariableType.STRING);
        switch (argument.getType()) {
        case STRINGBUFFER:
          if (isStringBuffer(val.getType()) || isStringBuilder(val.getType())) {
            factory.addStatement(new StringFromStringBuffer(result, argument));
          } else {
            // if the type implements Appendable, we can't really know its value
            factory.addStatement(new StringInit(result, Basic.makeAnyString()));
          }
          break;
         
        case ARRAY:
          if (val.getType() instanceof ArrayType) {  // the argument's type only says it *might* be an array
            // TODO because of covariant arrays, we might not actually know it is a String array??
            factory.addStatement(new StringInit(result, ARRAY_OBJECT_AUTOMATON));
          } else {
            factory.addStatement(new StringInit(result, Basic.makeAnyString()));
          }
          break;
         
        case OBJECT:
          Automaton auto = Basic.makeAnyString();
          if (val.getType() instanceof RefType) {
            Automaton resolved = factory.resolveToStringMethod(((RefType)val.getType()).getSootClass());
            if (resolved != null)
              auto = resolved;
          }
          factory.addStatement(new StringInit(result, auto));
          break;
         
        case NULL:
          factory.addStatement(new StringInit(result, Automatons.getNull()));
          break;
         
        case NONE:
            if (val instanceof Constant) {
              String s = constantToString((Constant) val, radix, type);
              if (s != null)
                factory.addStatement(new StringInit(result, Basic.makeConstString(s)));
              else
                factory.addStatement(new StringInit(result, Basic.makeAnyString()));
               
            } else if (radix == 10 && Automatons.fromType(type.toString()) != null) { // TODO: handle radix!=10
             
              factory.addStatement(new StringInit(result, Automatons.fromType(type.toString())));
             
            } else if (val.getType() instanceof RefType) {
                // Call the corresponding toString method
                Method tostring_method = factory.getToStringMethod(((RefType) val.getType()).getSootClass());
                if (tostring_method != null && !isInterface(val.getType())) {
                  factory.addStatement(new Call(result, tostring_method, new Variable[0]));
                } else {
                  factory.addStatement(new StringInit(result, Basic.makeAnyString()));
                }
            } else { // If all else fails, give any string
              factory.addStatement(new StringInit(result, Basic.makeAnyString())); // not currently reachable, but good to have here
            }
           
            break;
           
        case PRIMITIVE:
            // TODO: If type is another primitive type, add a UnaryOp to extract this primitive type as a boolean, int, etc.
            if (val instanceof Constant) {
                // NOTE: This for char-variables, this does the same as the if-clause below, but is a bit more efficient
                factory.addStatement(new StringInit(result, Basic.makeConstString(constantToString((Constant) val, radix, type))));
               
            } else if (type.equals(CharType.v())) {
                // create a string buffer, append the char, convert it to a string and return that
                Variable tmp = factory.createVariable(VariableType.STRINGBUFFER);
                factory.addStatement(new StringBufferInit(tmp, makeStringConstant("", factory)));
                factory.addStatement(new StringBufferAppendChar(tmp, argument));
                factory.addStatement(new StringFromStringBuffer(result, tmp));
           
            } else if (type.equals(BooleanType.v())) {
View Full Code Here

    private Variable makeStringBufferClone(Variable buffer, IntermediateFactory factory) {
      if (buffer == null || buffer.getType() != VariableType.STRINGBUFFER) {
        throw new IllegalArgumentException("Can only clone STRINGBUFFER variables");
      }
      // get the current possible values of the buffer
      Variable currentValue = factory.createVariable(VariableType.STRING);
      factory.addStatement(new StringFromStringBuffer(currentValue, buffer));
     
      // create a new string buffer with this initial value
      Variable clone = factory.createVariable(VariableType.STRINGBUFFER);
      factory.addStatement(new StringBufferInit(clone, currentValue));
     
      return clone;
    }
View Full Code Here

     
      return clone;
    }

    private Variable makeStringVariable(Automaton auto, IntermediateFactory factory) {
      Variable var = factory.createVariable(VariableType.STRING);
      factory.addStatement(new StringInit(var, auto));
      return var;
    }
View Full Code Here

      Variable var = factory.createVariable(VariableType.STRING);
      factory.addStatement(new StringInit(var, auto));
      return var;
    }
    private Variable makeStringConstant(String value, IntermediateFactory factory) {
      Variable var = factory.createVariable(VariableType.STRING);
      factory.addStatement(new StringInit(var, Automaton.makeString(value)));
      return var;
    }
View Full Code Here

                boolean equals = relation == Relation.EQUAL;
                VariableType lefttype = context.fromSootType(v.getOp1().getType());
                VariableType righttype = context.fromSootType(v.getOp2().getType());
                if (lefttype.leastUpperBound(VariableType.NONE) != VariableType.NONE
                    && righttype.leastUpperBound(VariableType.NONE) != VariableType.NONE) {
                    Variable left = context.getExpressionVariable(v.getOp1());
                    Variable right = context.getExpressionVariable(v.getOp2());
                    if (equals == true) {
                        makeBinaryAssertion(left, right, new AssertEquals());
                        makeBinaryAssertion(right, left, new AssertEquals());
                        // assert aliases as well
                        if (lefttype.mightBeUsefulMutable() && righttype.mightBeUsefulMutable()) {
View Full Code Here

        }
        private void instanceInvokeExpr(InstanceInvokeExpr v) {
            SootMethodRef m = v.getMethodRef();
            if (m.getSignature().equals("<java.lang.String: boolean contains(java.lang.CharSequence)>")) {
                if (expected == true) {
                    Variable base = getBase(v);
                    Variable arg = getArgument(v, 0);
                    makeBinaryAssertion(base, arg, new AssertContainsOther());
                    makeBinaryAssertion(arg, base, new AssertContainedInOther());
                }
            }
            else if (m.getSignature().equals("<java.lang.String: boolean equals(java.lang.Object)>")) {
                Variable base = getBase(v);
                Variable arg = getArgument(v, 0);
                if (expected == true) {
                    makeBinaryAssertion(base, arg, new AssertEquals());
                    makeBinaryAssertion(arg, base, new AssertEquals());
                } else {
                    makeBinaryAssertion(base, arg, new AssertNotEquals());
                    makeBinaryAssertion(arg, base, new AssertNotEquals());
                }
            }
            else if (m.getSignature().equals("<java.lang.String: boolean startsWith(java.lang.String)>")) {
                if (expected == true) {
                    Variable base = getBase(v);
                    Variable arg = getArgument(v, 0);
                    makeBinaryAssertion(base, arg, new AssertStartsWith());
                    makeBinaryAssertion(arg, base, new AssertPrefixOf());
                } else {
                    // TODO negated startsWith assertions [note: it is sound to ignore this]
                }
            }
            else if (m.getSignature().equals("<java.lang.String: boolean endsWith(java.lang.String)>")) {
                if (expected == true) {
                    Variable base = getBase(v);
                    Variable arg = getArgument(v, 0);
                    makeBinaryAssertion(base, arg, new AssertEndsWith());
                    makeBinaryAssertion(arg, base, new AssertSuffixOf());
                } else {
                    // TODO negated endsWith assertions [note: it is sound to ignore this]
                }
            }
            else if (m.getSignature().equals("<java.lang.String: boolean isEmpty()>")) {
                Variable base = getBase(v);
                if (expected == true) {
                    makeUnaryAssertion(base, new AssertEmpty());
                } else {
                    makeUnaryAssertion(base, new AssertNotEmpty());
                }
            }
            else if (m.getSignature().equals("<java.lang.String: boolean contentEquals(java.lang.StringBuffer)>")
                    || m.getSignature().equals("<java.lang.String: boolean contentEquals(java.lang.CharSequence)>")) {
                Variable base = getBase(v);
                Variable arg = getArgument(v, 0);
                if (expected == true) {
                    makeBinaryAssertion(base, arg, new AssertEquals());
                    makeBinaryAssertion(arg, base, new AssertEquals());
                } else {
                    makeBinaryAssertion(base, arg, new AssertNotEquals());
View Full Code Here

TOP

Related Classes of dk.brics.string.intermediate.Variable

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.