Package dk.brics.string.intermediate

Examples of dk.brics.string.intermediate.ArrayWriteElement


     
      switch (resultType) {
      case ARRAY:
        result = factory.createVariable(resultType);
        factory.addStatement(new ArrayNew(result));
        factory.addStatement(new ArrayWriteElement(result, temp));
        break;
     
      case STRINGBUFFER:
        result = factory.createVariable(resultType);
        factory.addStatement(new StringBufferInit(result, temp));
View Full Code Here


            else if (methodName.equals("toCharArray") && numArgs == 0) {
                Variable result = factory.createVariable(VariableType.ARRAY);
                factory.addStatement(new ArrayNew(result));
                Variable charAt = factory.createVariable(VariableType.PRIMITIVE);
                factory.addStatement(new BasicUnaryOp(charAt, callee, new CharAt2()));
                factory.addStatement(new ArrayWriteElement(result, charAt));
                return result;
            }
           
     
          return null;
View Full Code Here

    //  COLLECTIONS
    //
    if (factory.isSubtypeOf(declaringClass, Scene.v().getSootClass("java.util.Collection"))) {
      // add(String)
      if (methodName.equals("add") && numArgs == 1 && isString(expr.getArg(0).getType())) {
        factory.addStatement(new ArrayWriteElement(callee, arguments.get(0)));
        return anybool(factory);
        // note: if a non-string object was inserted, this method returns null
        // so the collection gets corrupted as it should
      }
      // add(int,String)
      else if (methodName.equals("add") && numArgs == 2 && isInt(expr.getArg(0).getType()) && isString(expr.getArg(1).getType())) {
        factory.addStatement(new ArrayWriteElement(callee, arguments.get(1)));
        return anybool(factory);
      }
      // addAll(<known collection>)
      else if (methodName.equals("addAll") && numArgs == 1 && factory.fromSootType(expr.getArg(0).getType()) == VariableType.ARRAY) {
        factory.addStatement(new ArrayWriteArray(callee, arguments.get(0)));
        return anybool(factory);
      }
      // addAll(int,<known collection>)
      else if (methodName.equals("addAll") && numArgs == 2 && isInt(expr.getArg(0).getType()) && factory.fromSootType(expr.getArg(1).getType()) == VariableType.ARRAY) {
        factory.addStatement(new ArrayWriteArray(callee, arguments.get(1)));
        return anybool(factory);
      }
      // clear()
      else if (methodName.equals("clear") && numArgs == 0) {
        // TODO Collection.clear()
        // for now just say no side-effects. this is sound.
        return factory.getNothing();
      }
      // set(int,String)
      else if (methodName.equals("set") && numArgs == 2 && isInt(expr.getArg(0).getType()) && isString(expr.getArg(1).getType())) {
        // note: List.set returns the element previously at the position
       
        // get the old element
        Variable old = factory.createVariable(VariableType.STRING);
        factory.addStatement(new StringFromArray(old, callee));
       
        // insert the new element
        factory.addStatement(new ArrayWriteElement(callee, arguments.get(1)));
       
        return old;
      }
      // get(int)
      else if (methodName.equals("get") && numArgs == 1 && isInt(expr.getArg(0).getType())) {
        Variable result = factory.createVariable(VariableType.STRING);
        factory.addStatement(new StringFromArray(result, callee));
        return result;
      }
      // iterator()
      else if (methodName.equals("iterator") && numArgs == 0) {
        // changes to the collection might reflect on the iterator
        // and vice versa (eg using ListIterator.add)
        return callee;
      }
      // listIterator()
      else if (methodName.equals("listIterator") && numArgs == 0) {
        // changes to the collection might reflect on the iterator
        // and vice versa (eg using ListIterator.add)
        return callee;
      }
      // methods without side-effects returning booleans
      else if (methodName.equals("contains")
          || methodName.equals("containsAll")
          || methodName.equals("isEmpty")) {
        return anybool(factory);
      }
      // remove() and removeAll() are just identity operations for now
      else if (methodName.equals("remove")
          || methodName.equals("removeAll")) {
        return anybool(factory);
      }
      // size()
      else if (methodName.equals("size")) {
        return factory.getNothing();
      }
      else if (methodName.equals("toArray") && numArgs == 0) {
        Variable result = factory.createVariable(VariableType.ARRAY);
        factory.addStatement(new ArrayNew(result));
        factory.addStatement(new ArrayAddAll(result, callee));
        return result;
      }
      else if (methodName.equals("toArray") && numArgs == 1) {
        Variable result = factory.createVariable(VariableType.ARRAY);
       
        // the elements MIGHT be stored into the argument
        factory.startBranch();
        // 1) not stored in argument
        {
          factory.addStatement(new ArrayNew(result));
          factory.useBranch();
        }
        // 2) stored in argument
        {
          // note: existing elements in the array may remain
          // in particular if the array is larger than the collection,
          // the exceeding elements are unchanged, so do not clear the array here
          factory.addStatement(new ArrayAssignment(result, arguments.get(0)));
          factory.useBranch();
        }
        factory.endBranch();
       
        factory.addStatement(new ArrayAddAll(result, callee));
       
        return result;
      }
    }
   
    //
    // ITERATORS
    //
    else if (factory.isSubtypeOf(declaringClass, Scene.v().getSootClass("java.util.Iterator"))) {
      if (methodName.equals("hasNext") && numArgs == 0) {
        return anybool(factory); // no side-effects
      }
      else if (methodName.equals("hasPrevious") && numArgs == 0) {
        return anybool(factory); // no side-effects
      }
      else if ((methodName.equals("next") || methodName.equals("previous")) && numArgs == 0) {
        Variable result = factory.createVariable(VariableType.STRING);
        factory.addStatement(new StringFromArray(result, callee));
        return result;
      }
      else if (methodName.equals("remove") && numArgs == 1) {
        return anybool(factory); // just prevent corruption
      }
      else if (methodName.equals("add") && numArgs == 1 && isString(expr.getArg(0).getType())) {
        factory.addStatement(new ArrayWriteElement(callee, arguments.get(0)));
        return factory.getNothing();
      }
      else if (methodName.equals("set") && numArgs == 1 && isString(expr.getArg(0).getType())) {
        factory.addStatement(new ArrayWriteElement(callee, arguments.get(0)));
        return factory.getNothing();
      }
      else if (methodName.equals("nextIndex") && numArgs == 0) {
        return factory.getNothing();
      }
View Full Code Here

        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;
      }
    }
   
    return null;
View Full Code Here

    case STRINGBUFFER:
      addStatement(new StringBufferInit(v, makeAnyStringVariable()));
      break;
    case ARRAY:
      addStatement(new ArrayNew(v));
      addStatement(new ArrayWriteElement(v, makeAnyStringVariable()));
      break;
    case PRIMITIVE:
        addStatement(new PrimitiveInit(v, Automaton.makeAnyChar()));
        break;
    default:
View Full Code Here

        }
       
        Variable var = makeVariable(VariableType.ARRAY);
        if (elementType instanceof RefType) {
            // object arrays are filled with null initially
            addStatement(new ArrayWriteElement(var, makeConstantStringVariable("null")));
        } else {
            // primitive arrays are filled zeros initially
            addStatement(new ArrayWriteElement(var, makeConstantCharVariable('\0')));
        }
        return var;
    }
View Full Code Here

        Variable arrayVariable = factory.getLocal(arrayLocal);
       
        switch (result.getType()) {
        case STRING:
        case PRIMITIVE:
          addStatement(new ArrayWriteElement(arrayVariable, result));
          break;
         
        case ARRAY:
          addStatement(new ArrayWriteArray(arrayVariable, result));
          break;
View Full Code Here

TOP

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

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.