|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
`{i, l}div` and `{i, l}rem` throw an `ArithmeticException` if the
divisor is 0.
`arraylength` throws a `NullPointerException` on a null reference.
JVM Spec:
> The only integer operations that can throw an exception are the
> integer divide instructions (idiv and ldiv) and the integer
> remainder instructions (irem and lrem), which throw an
> ArithmeticException if the divisor is zero.
> The Java virtual machine's floating-point operators do not throw
> runtime exceptions
> If the arrayref is null, the arraylength instruction throws a
> NullPointerException.
I checked the other primitives in `ICode` to see if anything else
should be considered as live code.
Pure:
// jvm : {i, l, f, d}neg
case class Negation(kind: TypeKind) extends Primitive
// jvm : if{eq, ne, lt, ge, le, gt}, if{null, nonnull}
// if_icmp{eq, ne, lt, ge, le, gt}, if_acmp{eq,ne}
case class Test(op: TestOp, kind: TypeKind, zero: Boolean) extends Primitive
// jvm : lcmp, {f, d}cmp{l, g}
case class Comparison(op: ComparisonOp, kind: TypeKind) extends Primitive
Impure: {i, l}{div, rem}, otherwise pure
// jvm : {i, l, f, d}{add, sub, mul, div, rem}
case class Arithmetic(op: ArithmeticOp, kind: TypeKind) extends Primitive
Pure (overflow is silent, NaN.toInt is defined):
// jvm : {i, l}{and, or, xor}
case class Logical(op: LogicalOp, kind: TypeKind) extends Primitive
// jvm : {i, l}{shl, ushl, shr}
case class Shift(op: ShiftOp, kind: TypeKind) extends Primitive
// jvm : i2{l, f, d}, l2{i, f, d}, f2{i, l, d}, d2{i, l, f}, i2{b, c, s}
case class Conversion(src: TypeKind, dst: TypeKind) extends Primitive
Impure! May NPE!
// jvm : arraylength
case class ArrayLength(kind: TypeKind) extends Primitive
Pure (we know that StringBuilder.{<init>, append, toString} are pure
and `append` is null safe.)
// jvm : It should call the appropiate 'append' method on StringBuffer
case class StringConcat(el: TypeKind) extends Primitive
// jvm: it should create a new StringBuffer
case object StartConcat extends Primitive
// jvm: convert StringBuffer to a String
case object EndConcat extends Primitive
|
|
`{i, l}div` and `{i, l}rem` throw an `ArithmeticException` if the
divisor is 0.
`arraylength` throws a `NullPointerException` on a null reference.
JVM Spec:
> The only integer operations that can throw an exception are the
> integer divide instructions (idiv and ldiv) and the integer
> remainder instructions (irem and lrem), which throw an
> ArithmeticException if the divisor is zero.
> The Java virtual machine's floating-point operators do not throw
> runtime exceptions
> If the arrayref is null, the arraylength instruction throws a
> NullPointerException.
I checked the other primitives in `ICode` to see if anything else
should be considered as live code.
Pure:
// jvm : {i, l, f, d}neg
case class Negation(kind: TypeKind) extends Primitive
// jvm : if{eq, ne, lt, ge, le, gt}, if{null, nonnull}
// if_icmp{eq, ne, lt, ge, le, gt}, if_acmp{eq,ne}
case class Test(op: TestOp, kind: TypeKind, zero: Boolean) extends Primitive
// jvm : lcmp, {f, d}cmp{l, g}
case class Comparison(op: ComparisonOp, kind: TypeKind) extends Primitive
Impure: {i, l}{div, rem}, otherwise pure
// jvm : {i, l, f, d}{add, sub, mul, div, rem}
case class Arithmetic(op: ArithmeticOp, kind: TypeKind) extends Primitive
Pure (overflow is silent, NaN.toInt is defined):
// jvm : {i, l}{and, or, xor}
case class Logical(op: LogicalOp, kind: TypeKind) extends Primitive
// jvm : {i, l}{shl, ushl, shr}
case class Shift(op: ShiftOp, kind: TypeKind) extends Primitive
// jvm : i2{l, f, d}, l2{i, f, d}, f2{i, l, d}, d2{i, l, f}, i2{b, c, s}
case class Conversion(src: TypeKind, dst: TypeKind) extends Primitive
Impure! May NPE!
// jvm : arraylength
case class ArrayLength(kind: TypeKind) extends Primitive
Pure (we know that StringBuilder.{<init>, append, toString} are pure
and `append` is null safe.)
// jvm : It should call the appropiate 'append' method on StringBuffer
case class StringConcat(el: TypeKind) extends Primitive
// jvm: it should create a new StringBuffer
case object StartConcat extends Primitive
// jvm: convert StringBuffer to a String
case object EndConcat extends Primitive
|