case class MethodComplexity(value: Int) extends Property with MethodComplexityPropertyMetaInformation with Product with Serializable
An upper bound for the maximum number of instructions that need to be evaluated when the method is executed/interpreted. Using this property enables other analyses to make a decision whether to "inline" method calls or not. For example, to improve the precision of an analysis it may be very useful to inline short methods. Given the following code:
def abs(i : Int) : Int = { if(i == Int.MinValue) Int.MaxValue // COND + RETURN else if(i < 0) -i // COND + RETURN else i // RETURN } // COMPLEXITY (BASED ON SOURCE CODE): 5 def ratio(i : Int, j : Int) : Int = { abs(i) / abs(j) // HERE, when we do not inline abs calls, we have no idea about the final // result; when we inline the abs calls, we can compute that the returned // value will be positive or that the method throws a // `DivisionByZeroException`. }
In general, the control flow graph is analyzed to compute an upper bound for the number of evaluated instructions; as far as (easily) possible, loops are conceptually unrolled. If the uppper bound could not be determined, the method is rated as being maximally complex.
The complexity of called methods is generally not taken into account. However, invoke instructions generally have a higher complexity than all other instructions to account for the fact that method calls are more expensive than all other types of instructions.
If an upper bound of a method's complexity cannot be estimated, the method will have
Int.MaxValue complexity.
- value
The estimated complexity of a specific method ([0...
Int.MaxMavlue])
- Alphabetic
- By Inheritance
- MethodComplexity
- Serializable
- Serializable
- Product
- Equals
- MethodComplexityPropertyMetaInformation
- Property
- PropertyMetaInformation
- PropertyKind
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Instance Constructors
-
new
MethodComplexity(value: Int)
- value
The estimated complexity of a specific method ([0...
Int.MaxMavlue])
Type Members
-
final
type
Self = MethodComplexity
- Definition Classes
- MethodComplexityPropertyMetaInformation → PropertyMetaInformation
Value Members
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
final
def
asOrderedProperty: OrderedProperty
- Definition Classes
- Property
-
def
clone(): AnyRef
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @native() @throws( ... )
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
finalize(): Unit
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
-
final
def
id: Int
- Definition Classes
- PropertyMetaInformation → PropertyKind
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
final
def
isOrderedProperty: Boolean
- Definition Classes
- Property
-
final
def
key: PropertyKey[MethodComplexity]
- Definition Classes
- MethodComplexity → PropertyMetaInformation
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
- val value: Int
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @throws( ... )