Package org.eclipse.jdt.internal.compiler.lookup

Examples of org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding


        return getConstant(info, x.constant);
      }
      Binding binding = x.binding;
      JExpression result = null;
      if (binding instanceof LocalVariableBinding) {
        LocalVariableBinding b = (LocalVariableBinding) binding;
        if ((x.bits & ASTNode.DepthMASK) != 0) {
          VariableBinding[] path = scope.getEmulationPath(b);
          if (path == null) {
            /*
             * Don't like this, but in rare cases (e.g. the variable is only
             * ever used as an unnecessary qualifier) JDT provides no emulation
             * to the desired variable.
             */
            // throw new InternalCompilerException("No emulation path.");
            return null;
          }
          assert path.length == 1;
          if (curMethod.scope.isInsideInitializer() && path[0] instanceof SyntheticArgumentBinding) {
            SyntheticArgumentBinding sb = (SyntheticArgumentBinding) path[0];
            JField field = curClass.syntheticFields.get(sb);
            assert field != null;
            result = makeInstanceFieldRef(info, field);
          } else if (path[0] instanceof LocalVariableBinding) {
            result = makeLocalRef(info, (LocalVariableBinding) path[0]);
          } else if (path[0] instanceof FieldBinding) {
            FieldBinding fb = (FieldBinding) path[0];
            assert curClass.typeDecl.binding.isCompatibleWith(x.actualReceiverType.erasure());
            JField field = typeMap.get(fb);
            assert field != null;
            result = makeInstanceFieldRef(info, field);
          } else {
            throw new InternalCompilerException("Unknown emulation path.");
          }
        } else {
          result = makeLocalRef(info, b);
        }
      } else if (binding instanceof FieldBinding) {
        FieldBinding b = ((FieldBinding) x.binding).original();
        JField field = typeMap.get(b);
        assert field != null;
        JExpression thisRef = null;
        if (!b.isStatic()) {
          thisRef = makeThisReference(info, (ReferenceBinding) x.actualReceiverType, false, scope);
        }
        result = new JFieldRef(info, thisRef, field, curClass.type);
      } else {
        return null;
View Full Code Here


        if (scope == scope.methodScope()) {
          return true;
        }

        SourceInfo info = makeSourceInfo(argument);
        LocalVariableBinding b = argument.binding;
        JType localType = (JType) typeMap.get(b.type);
        JMethodBody enclosingBody = findEnclosingMethod(scope);
        JLocal newLocal = program.createLocal(info, argument.name, localType,
            b.isFinal(), enclosingBody);
        typeMap.put(b, newLocal);
        return true;
      } catch (Throwable e) {
        throw translateException(argument, e);
      }
View Full Code Here

      }
    }

    public boolean visit(LocalDeclaration localDeclaration, BlockScope scope) {
      try {
        LocalVariableBinding b = localDeclaration.binding;
        JType localType = (JType) typeMap.get(localDeclaration.type.resolvedType);
        JMethodBody enclosingBody = findEnclosingMethod(scope);
        SourceInfo info = makeSourceInfo(localDeclaration);
        JLocal newLocal = program.createLocal(info, localDeclaration.name,
            localType, b.isFinal(), enclosingBody);
        typeMap.put(b, newLocal);
        return true;
      } catch (Throwable e) {
        throw translateException(localDeclaration, e);
      }
View Full Code Here

     */
    private JVariable possiblyReferenceOuterLocal(JVariable variable,
        Binding binding) {

      if (variable instanceof JLocal || variable instanceof JParameter) {
        LocalVariableBinding localBinding = (LocalVariableBinding) binding;
        if (localBinding.declaringScope.methodScope() != currentMethodScope) {
          variable = null;
          VariableBinding[] vars = currentMethodScope.getEmulationPath(localBinding);
          if (vars == null) {
            return null;
View Full Code Here

  }
  else { // no enclosing loop, be as precise as possible right now
    for (int i = 0; i < this.nullCount; i++) {
      Expression expression = this.nullReferences[i];
      // final local variable
      LocalVariableBinding local = this.nullLocals[i];
      switch (this.nullCheckTypes[i]) {
        case CAN_ONLY_NULL_NON_NULL | IN_COMPARISON_NULL:
        case CAN_ONLY_NULL_NON_NULL | IN_COMPARISON_NON_NULL:
          if (flowInfo.isDefinitelyNonNull(local)) {
            if (this.nullCheckTypes[i] == (CAN_ONLY_NULL_NON_NULL | IN_COMPARISON_NON_NULL)) {
View Full Code Here

        }
      }
      switch(this.kind) {
        case ARRAY :
          // allocate #index secret variable (of type int)
          this.indexVariable = new LocalVariableBinding(SecretIndexVariableName, TypeBinding.INT, ClassFileConstants.AccDefault, false);
          this.scope.addLocalVariable(this.indexVariable);
          this.indexVariable.setConstant(Constant.NotAConstant); // not inlinable
          // allocate #max secret variable
          this.maxVariable = new LocalVariableBinding(SecretMaxVariableName, TypeBinding.INT, ClassFileConstants.AccDefault, false);
          this.scope.addLocalVariable(this.maxVariable);
          this.maxVariable.setConstant(Constant.NotAConstant); // not inlinable
          // add #array secret variable (of collection type)
          if (expectedCollectionType == null) {
            this.collectionVariable = new LocalVariableBinding(SecretCollectionVariableName, collectionType, ClassFileConstants.AccDefault, false);
          } else {
            this.collectionVariable = new LocalVariableBinding(SecretCollectionVariableName, expectedCollectionType, ClassFileConstants.AccDefault, false);
          }
          this.scope.addLocalVariable(this.collectionVariable);
          this.collectionVariable.setConstant(Constant.NotAConstant); // not inlinable
          break;
        case RAW_ITERABLE :
        case GENERIC_ITERABLE :
          // allocate #index secret variable (of type Iterator)
          this.indexVariable = new LocalVariableBinding(SecretIteratorVariableName, this.scope.getJavaUtilIterator(), ClassFileConstants.AccDefault, false);
          this.scope.addLocalVariable(this.indexVariable);
          this.indexVariable.setConstant(Constant.NotAConstant); // not inlinable
          break;
        default :
          this.scope.problemReporter().invalidTypeForCollection(this.collection);
View Full Code Here

  UnconditionalFlowInfo flowInfo = this.upstreamNullFlowInfo.
    addPotentialNullInfoFrom(callerFlowInfo.unconditionalInitsWithoutSideEffect());
  if (this.deferNullDiagnostic) {
    // check only immutable null checks on innermost looping context
    for (int i = 0; i < this.nullCount; i++) {
      LocalVariableBinding local = this.nullLocals[i];
      Expression expression = this.nullReferences[i];
      // final local variable
      switch (this.nullCheckTypes[i]) {
        case CAN_ONLY_NON_NULL | IN_COMPARISON_NULL:
        case CAN_ONLY_NON_NULL | IN_COMPARISON_NON_NULL:
          if (flowInfo.isDefinitelyNonNull(local)) {
            this.nullReferences[i] = null;
            if (this.nullCheckTypes[i] == (CAN_ONLY_NON_NULL | IN_COMPARISON_NON_NULL)) {
              scope.problemReporter().localVariableRedundantCheckOnNonNull(local, expression);
            } else {
              scope.problemReporter().localVariableNonNullComparedToNull(local, expression);
            }
            continue;
          }
          break;
        case CAN_ONLY_NULL_NON_NULL | IN_COMPARISON_NULL:
        case CAN_ONLY_NULL_NON_NULL | IN_COMPARISON_NON_NULL:
          if (flowInfo.isDefinitelyNonNull(local)) {
            this.nullReferences[i] = null;
            if (this.nullCheckTypes[i] == (CAN_ONLY_NULL_NON_NULL | IN_COMPARISON_NON_NULL)) {
              scope.problemReporter().localVariableRedundantCheckOnNonNull(local, expression);
            } else {
              scope.problemReporter().localVariableNonNullComparedToNull(local, expression);
            }
            continue;
          }
          if (flowInfo.isDefinitelyNull(local)) {
            this.nullReferences[i] = null;
            if (this.nullCheckTypes[i] == (CAN_ONLY_NULL_NON_NULL | IN_COMPARISON_NULL)) {
              scope.problemReporter().localVariableRedundantCheckOnNull(local, expression);
            } else {
              scope.problemReporter().localVariableNullComparedToNonNull(local, expression);
            }
            continue;
          }
          break;
        case CAN_ONLY_NULL | IN_COMPARISON_NULL:
        case CAN_ONLY_NULL | IN_COMPARISON_NON_NULL:
        case CAN_ONLY_NULL | IN_ASSIGNMENT:
        case CAN_ONLY_NULL | IN_INSTANCEOF:
          if (flowInfo.isDefinitelyNull(local)) {
            this.nullReferences[i] = null;
            switch(this.nullCheckTypes[i] & CONTEXT_MASK) {
              case FlowContext.IN_COMPARISON_NULL:
                scope.problemReporter().localVariableRedundantCheckOnNull(local, expression);
                continue;
              case FlowContext.IN_COMPARISON_NON_NULL:
                scope.problemReporter().localVariableNullComparedToNonNull(local, expression);
                continue;
              case FlowContext.IN_ASSIGNMENT:
                scope.problemReporter().localVariableRedundantNullAssignment(local, expression);
                continue;
              case FlowContext.IN_INSTANCEOF:
                scope.problemReporter().localVariableNullInstanceof(local, expression);
                continue;
            }
          }
          break;
        case MAY_NULL:
          if (flowInfo.isDefinitelyNull(local)) {
            this.nullReferences[i] = null;
            scope.problemReporter().localVariableNullReference(local, expression);
            continue;
          }
          break;
        default:
          // never happens
      }
      this.parent.recordUsingNullReference(scope, local, expression,
          this.nullCheckTypes[i], flowInfo);
    }
  }
  else {
    // check inconsistent null checks on outermost looping context
    for (int i = 0; i < this.nullCount; i++) {
      Expression expression = this.nullReferences[i];
      // final local variable
      LocalVariableBinding local = this.nullLocals[i];
      switch (this.nullCheckTypes[i]) {
        case CAN_ONLY_NULL_NON_NULL | IN_COMPARISON_NULL:
        case CAN_ONLY_NULL_NON_NULL | IN_COMPARISON_NON_NULL:
          if (flowInfo.isDefinitelyNonNull(local)) {
            this.nullReferences[i] = null;
View Full Code Here

  this.generateAttributes |= ClassFileConstants.ATTR_STACK_MAP;
}
public void addDefinitelyAssignedVariables(Scope scope, int initStateIndex) {
  // Required to fix 1PR0XVS: LFRE:WINNT - Compiler: variable table for method appears incorrect
  loop: for (int i = 0; i < this.visibleLocalsCount; i++) {
    LocalVariableBinding localBinding = this.visibleLocals[i];
    if (localBinding != null) {
      // Check if the local is definitely assigned
      boolean isDefinitelyAssigned = isDefinitelyAssigned(scope, initStateIndex, localBinding);
      if (!isDefinitelyAssigned) {
        if (this.stateIndexes != null) {
          for (int j = 0, max = this.stateIndexesCounter; j < max; j++) {
            if (isDefinitelyAssigned(scope, this.stateIndexes[j], localBinding)) {
              if ((localBinding.initializationCount == 0) || (localBinding.initializationPCs[((localBinding.initializationCount - 1) << 1) + 1] != -1)) {
                /* There are two cases:
                 * 1) there is no initialization interval opened ==> add an opened interval
                 * 2) there is already some initialization intervals but the last one is closed ==> add an opened interval
                 * An opened interval means that the value at localBinding.initializationPCs[localBinding.initializationCount - 1][1]
                 * is equals to -1.
                 * initializationPCs is a collection of pairs of int:
                 *   first value is the startPC and second value is the endPC. -1 one for the last value means that the interval
                 *   is not closed yet.
                 */
                localBinding.recordInitializationStartPC(this.position);
              }
              continue loop;
            }
          }
        }
      } else {
        if ((localBinding.initializationCount == 0) || (localBinding.initializationPCs[((localBinding.initializationCount - 1) << 1) + 1] != -1)) {
          /* There are two cases:
           * 1) there is no initialization interval opened ==> add an opened interval
           * 2) there is already some initialization intervals but the last one is closed ==> add an opened interval
           * An opened interval means that the value at localBinding.initializationPCs[localBinding.initializationCount - 1][1]
           * is equals to -1.
           * initializationPCs is a collection of pairs of int:
           *   first value is the startPC and second value is the endPC. -1 one for the last value means that the interval
           *   is not closed yet.
           */
          localBinding.recordInitializationStartPC(this.position);
        }
      }
    }
  }
}
 
View Full Code Here

  this.stateIndexes[this.stateIndexesCounter++] = naturalExitMergeInitStateIndex;
}
public void removeNotDefinitelyAssignedVariables(Scope scope, int initStateIndex) {
  int index = this.visibleLocalsCount;
  loop : for (int i = 0; i < index; i++) {
    LocalVariableBinding localBinding = this.visibleLocals[i];
    if (localBinding != null && localBinding.initializationCount > 0) {
      boolean isDefinitelyAssigned = isDefinitelyAssigned(scope, initStateIndex, localBinding);
      if (!isDefinitelyAssigned) {
        if (this.stateIndexes != null) {
          for (int j = 0, max = this.stateIndexesCounter; j < max; j++) {
            if (isDefinitelyAssigned(scope, this.stateIndexes[j], localBinding)) {
              continue loop;
            }
          }
        }
        localBinding.recordInitializationEndPC(this.position);
      }
    }
  }
}
View Full Code Here

  this.resetSecretLocals();
  super.resetInWideMode();
}
public void resetSecretLocals() {
  for (int i = 0, max = this.locals.length; i < max; i++) {
    LocalVariableBinding localVariableBinding = this.locals[i];
    if (localVariableBinding != null && localVariableBinding.isSecret()) {
      // all other locals are reinitialized inside the computation of their resolved positions
      localVariableBinding.resetInitializations();
    }
  }
}
View Full Code Here

TOP

Related Classes of org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding

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.