Skip to content

Opal clean up #181

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions boomerangPDS/src/test/java/test/core/AllocationSiteOf.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ public Optional<Query> test(Edge cfgEdge) {
Statement stmt = cfgEdge.getStart();
if (stmt.isAssignStmt()) {
if (stmt.getLeftOp().isLocal() && stmt.getRightOp().isNewExpr()) {
Type expr = stmt.getRightOp().getNewExprType();
if (expr.isSubtypeOf(type)) {
Type exprType = stmt.getRightOp().getNewExprType();
if (isTypeOrSubType(exprType.toString(), type)) {
Val local = stmt.getLeftOp();
ForwardQuery forwardQuery =
new ForwardQuery(cfgEdge, new AllocVal(local, stmt, stmt.getRightOp()));
Expand All @@ -45,4 +45,12 @@ public Optional<Query> test(Edge cfgEdge) {
}
return Optional.empty();
}

private boolean isTypeOrSubType(String subType, String superType) {
try {
return Class.forName(superType).isAssignableFrom(Class.forName(subType));
} catch (ClassNotFoundException e) {
return false;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class OpalArrayRef(

override def getIndexExpr: Val = new OpalVal(indexExpr, method)

override def getType: Type = OpalType.valueInformationToType(base.asVar.valueInformation, method.project)
override def getType: Type = new OpalType(OpalType.computationalTypeToFieldType(base.cTpe), method.project)

override def asUnbalanced(stmt: ControlFlowGraph.Edge): Val = new OpalArrayRef(base, indexExpr, method, stmt)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,15 @@ import boomerang.scope.WrappedClass
import boomerang.scope.opal.transformation.TacLocal
import java.util.Objects
import org.opalj.br.ArrayType
import org.opalj.br.ComputationalType
import org.opalj.br.ComputationalTypeDouble
import org.opalj.br.ComputationalTypeFloat
import org.opalj.br.ComputationalTypeInt
import org.opalj.br.ComputationalTypeLong
import org.opalj.br.ComputationalTypeReference
import org.opalj.br.ComputationalTypeReturnAddress
import org.opalj.br.DoubleType
import org.opalj.br.FieldType
import org.opalj.br.FloatType
import org.opalj.br.IntegerType
import org.opalj.br.LongType
Expand Down Expand Up @@ -52,7 +60,6 @@ import org.opalj.tac.PrimitiveTypecastExpr
import org.opalj.tac.StaticFunctionCall
import org.opalj.tac.StringConst
import org.opalj.tac.VirtualFunctionCall
import org.opalj.value.ValueInformation

class OpalType(val delegate: org.opalj.br.Type, project: Project[_]) extends Type {

Expand Down Expand Up @@ -147,39 +154,23 @@ object OpalType {
case functionCall: NonVirtualFunctionCall[_] => return new OpalType(functionCall.descriptor.returnType, project)
case functionCall: VirtualFunctionCall[_] => return new OpalType(functionCall.descriptor.returnType, project)
case functionCall: StaticFunctionCall[_] => return new OpalType(functionCall.descriptor.returnType, project)
case v: TacLocal => return valueInformationToType(v.valueInformation, project)
case v: TacLocal => return new OpalType(computationalTypeToFieldType(v.cTpe), project)
case _ => throw new RuntimeException("Unknown expression: " + expr)
}

throw new RuntimeException("Cannot compute type for expression: " + expr)
}

def valueInformationToType(value: ValueInformation, project: Project[_]): Type = {
if (value.isIllegalValue) {
return new OpalType(ObjectType.Void, project)
def computationalTypeToFieldType(cTpe: ComputationalType): FieldType = {
cTpe match {
case ComputationalTypeInt => IntegerType
case ComputationalTypeFloat => FloatType
case ComputationalTypeLong => LongType
case ComputationalTypeDouble => DoubleType
case ComputationalTypeReference => ObjectType.Object
case ComputationalTypeReturnAddress => ObjectType.Object
case _ =>
throw new RuntimeException("Unknown computational type " + cTpe)
}

if (value.isPrimitiveValue) {
return new OpalType(value.asPrimitiveValue.primitiveType, project)
}

if (value.isReferenceValue) {
if (value.asReferenceValue.isPrecise) {
if (value.asReferenceValue.isNull.isYes) {
return OpalNullType
} else {
return new OpalType(value.asReferenceValue.asReferenceType, project)
}
} else {
return new OpalType(value.asReferenceValue.upperTypeBound.head, project)
}
}

if (value.isVoid) {
return new OpalType(ObjectType.Void, project)
}

// TODO Array and illegal types (not sure if they ever occur)
throw new RuntimeException("Type not implemented yet")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ package boomerang.scope.opal.transformation

import boomerang.scope.opal.transformation.stack.OperandStackBuilder
import boomerang.scope.opal.transformation.transformer._
import org.opalj.ai.domain.l0.PrimitiveTACAIDomain
import org.opalj.br.Method
import org.opalj.br.analyses.Project
import org.opalj.br.cfg.CFGFactory
Expand All @@ -36,12 +35,7 @@ object TacBodyBuilder {
val tacNaive = TACNaive(method, project.classHierarchy)
val stackHandler = OperandStackBuilder(method, tacNaive)

// TODO
// We are only interested in the type information, so there may be
// a more suitable domain
val domain = new PrimitiveTACAIDomain(project.classHierarchy, method)
val localTransformedTac =
LocalTransformer(project, method, tacNaive, stackHandler, domain)
val localTransformedTac = LocalTransformer(method, tacNaive, stackHandler)
assert(
tacNaive.stmts.length == localTransformedTac.length,
"Wrong transformation"
Expand Down Expand Up @@ -77,7 +71,7 @@ object TacBodyBuilder {
StmtGraph(propagatedTac, tacCfg, tacNaive.pcToIndex, exceptionHandlers)

stmtGraph = NopTransformer(stmtGraph)
stmtGraph = NullifyFieldsTransformer(project, method, stmtGraph)
stmtGraph = NullifyFieldsTransformer(method, stmtGraph)
stmtGraph = NopEliminator(stmtGraph)

new BoomerangTACode(stmtGraph)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import java.util.Objects
import org.opalj.br.ComputationalType
import org.opalj.tac.DUVar
import org.opalj.tac.Var
import org.opalj.value.IsNullValue
import org.opalj.value.ValueInformation

trait TacLocal extends Var[TacLocal] {
Expand All @@ -37,8 +36,6 @@ trait TacLocal extends Var[TacLocal] {

def cTpe: ComputationalType

def valueInformation: ValueInformation

final def isSideEffectFree: Boolean = true

override def toCanonicalForm(implicit
Expand All @@ -55,7 +52,6 @@ trait TacLocal extends Var[TacLocal] {
class StackLocal(
identifier: Int,
computationalType: ComputationalType,
valueInfo: ValueInformation,
isThis: Boolean = false
) extends TacLocal {

Expand All @@ -69,8 +65,6 @@ class StackLocal(

override def cTpe: ComputationalType = computationalType

override def valueInformation: ValueInformation = valueInfo

override def hashCode: Int = Objects.hash(this.getClass.hashCode(), id)

override def equals(other: Any): Boolean = other match {
Expand All @@ -83,7 +77,6 @@ class StackLocal(
class RegisterLocal(
identifier: Int,
computationalType: ComputationalType,
valueInfo: ValueInformation,
isThis: Boolean = false,
localName: Option[String] = Option.empty
) extends TacLocal {
Expand All @@ -103,8 +96,6 @@ class RegisterLocal(

override def cTpe: ComputationalType = computationalType

override def valueInformation: ValueInformation = valueInfo

override def hashCode: Int = Objects.hash(this.getClass.hashCode(), id)

override def equals(other: Any): Boolean = other match {
Expand All @@ -126,11 +117,6 @@ class ParameterLocal(

override def cTpe: ComputationalType = computationalType

override def valueInformation: ValueInformation =
throw new UnsupportedOperationException(
"No value information available for parameter local"
)

override def name: String = paramName

override def hashCode: Int = Objects.hash(this.getClass.hashCode(), id)
Expand All @@ -141,15 +127,12 @@ class ParameterLocal(
}
}

class NullifiedLocal(identifier: Int, computationalType: ComputationalType, valueInfo: ValueInformation)
extends TacLocal {
class NullifiedLocal(identifier: Int, computationalType: ComputationalType) extends TacLocal {

override def id: Int = identifier

override def cTpe: ComputationalType = computationalType

override def valueInformation: ValueInformation = valueInfo

override def name: String = s"n$identifier"

override def hashCode: Int = Objects.hash(this.getClass.hashCode(), id)
Expand All @@ -162,8 +145,7 @@ class NullifiedLocal(identifier: Int, computationalType: ComputationalType, valu

class ExceptionLocal(
identifier: Int,
computationalType: ComputationalType,
valueInfo: ValueInformation
computationalType: ComputationalType
) extends TacLocal {

override def id: Int = identifier
Expand All @@ -172,8 +154,6 @@ class ExceptionLocal(

override def cTpe: ComputationalType = computationalType

override def valueInformation: ValueInformation = valueInfo

override def name: String = s"e$identifier"

override def hashCode: Int = Objects.hash(this.getClass.hashCode(), id)
Expand Down
Loading