| # Tests most/all DEX behaviors as of version 37. |
| # Disassembled from dexdump test files. |
| # Repo: https://android.googlesource.com/platform/art/ |
| # File: test/dexdump/all.dex |
| |
| # Compile using smali: https://github.com/JesusFreke/smali |
| # java -jar smali.jar assemble all.smali --api 25 |
| |
| .class public LA; |
| .super Ljava/lang/Object; |
| |
| |
| # static fields |
| .field private static sB:B |
| |
| .field private static sC:C |
| |
| .field private static sI:I |
| |
| .field private static sJ:J |
| |
| .field private static sO:LA; |
| |
| .field private static sS:S |
| |
| .field private static sZ:Z |
| |
| |
| # instance fields |
| .field private mB:B |
| |
| .field private mC:C |
| |
| .field private mI:I |
| |
| .field private mJ:J |
| |
| .field private mO:LA; |
| |
| .field private mS:S |
| |
| .field private mZ:Z |
| |
| |
| # direct methods |
| .method public constructor <init>()V |
| .registers 1 |
| |
| invoke-direct {p0}, Ljava/lang/Object;-><init>()V |
| |
| return-void |
| .end method |
| |
| .method public static arrays()V |
| .registers 3 |
| |
| aget v0, v1, v2 |
| |
| aget-wide v0, v1, v2 |
| |
| aget-object v0, v1, v2 |
| |
| aget-boolean v0, v1, v2 |
| |
| aget-byte v0, v1, v2 |
| |
| aget-char v0, v1, v2 |
| |
| aget-short v0, v1, v2 |
| |
| aput v0, v1, v2 |
| |
| aput-wide v0, v1, v2 |
| |
| aput-object v0, v1, v2 |
| |
| aput-boolean v0, v1, v2 |
| |
| aput-byte v0, v1, v2 |
| |
| aput-char v0, v1, v2 |
| |
| aput-short v0, v1, v2 |
| |
| return-void |
| .end method |
| |
| .method public static binary_ops()V |
| .registers 3 |
| |
| add-int v0, v1, v2 |
| |
| sub-int v0, v1, v2 |
| |
| mul-int v0, v1, v2 |
| |
| div-int v0, v1, v2 |
| |
| rem-int v0, v1, v2 |
| |
| and-int v0, v1, v2 |
| |
| or-int v0, v1, v2 |
| |
| xor-int v0, v1, v2 |
| |
| shl-int v0, v1, v2 |
| |
| shr-int v0, v1, v2 |
| |
| ushr-int v0, v1, v2 |
| |
| add-long v0, v1, v2 |
| |
| sub-long v0, v1, v2 |
| |
| mul-long v0, v1, v2 |
| |
| div-long v0, v1, v2 |
| |
| rem-long v0, v1, v2 |
| |
| and-long v0, v1, v2 |
| |
| or-long v0, v1, v2 |
| |
| xor-long v0, v1, v2 |
| |
| shl-long v0, v1, v2 |
| |
| shr-long v0, v1, v2 |
| |
| ushr-long v0, v1, v2 |
| |
| add-float v0, v1, v2 |
| |
| sub-float v0, v1, v2 |
| |
| mul-float v0, v1, v2 |
| |
| div-float v0, v1, v2 |
| |
| rem-float v0, v1, v2 |
| |
| add-double v0, v1, v2 |
| |
| sub-double v0, v1, v2 |
| |
| mul-double v0, v1, v2 |
| |
| div-double v0, v1, v2 |
| |
| rem-double v0, v1, v2 |
| |
| return-void |
| .end method |
| |
| .method public static binary_ops_2addr()V |
| .registers 2 |
| |
| add-int/2addr v0, v1 |
| |
| sub-int/2addr v0, v1 |
| |
| mul-int/2addr v0, v1 |
| |
| div-int/2addr v0, v1 |
| |
| rem-int/2addr v0, v1 |
| |
| and-int/2addr v0, v1 |
| |
| or-int/2addr v0, v1 |
| |
| xor-int/2addr v0, v1 |
| |
| shl-int/2addr v0, v1 |
| |
| shr-int/2addr v0, v1 |
| |
| ushr-int/2addr v0, v1 |
| |
| add-long/2addr v0, v1 |
| |
| sub-long/2addr v0, v1 |
| |
| mul-long/2addr v0, v1 |
| |
| div-long/2addr v0, v1 |
| |
| rem-long/2addr v0, v1 |
| |
| and-long/2addr v0, v1 |
| |
| or-long/2addr v0, v1 |
| |
| xor-long/2addr v0, v1 |
| |
| shl-long/2addr v0, v1 |
| |
| shr-long/2addr v0, v1 |
| |
| ushr-long/2addr v0, v1 |
| |
| add-float/2addr v0, v1 |
| |
| sub-float/2addr v0, v1 |
| |
| mul-float/2addr v0, v1 |
| |
| div-float/2addr v0, v1 |
| |
| rem-float/2addr v0, v1 |
| |
| add-double/2addr v0, v1 |
| |
| sub-double/2addr v0, v1 |
| |
| mul-double/2addr v0, v1 |
| |
| div-double/2addr v0, v1 |
| |
| rem-double/2addr v0, v1 |
| |
| return-void |
| .end method |
| |
| .method public static binary_ops_lit16()V |
| .registers 2 |
| |
| add-int/lit16 v0, v1, 0x1234 |
| |
| rsub-int v0, v1, 0x1234 |
| |
| mul-int/lit16 v0, v1, 0x1234 |
| |
| div-int/lit16 v0, v1, 0x1234 |
| |
| rem-int/lit16 v0, v1, 0x1234 |
| |
| and-int/lit16 v0, v1, 0x1234 |
| |
| or-int/lit16 v0, v1, 0x1234 |
| |
| xor-int/lit16 v0, v1, 0x1234 |
| |
| return-void |
| .end method |
| |
| .method public static binary_ops_lit8()V |
| .registers 2 |
| |
| add-int/lit8 v0, v1, 0x12 |
| |
| rsub-int/lit8 v0, v1, 0x12 |
| |
| mul-int/lit8 v0, v1, 0x12 |
| |
| div-int/lit8 v0, v1, 0x12 |
| |
| rem-int/lit8 v0, v1, 0x12 |
| |
| and-int/lit8 v0, v1, 0x12 |
| |
| or-int/lit8 v0, v1, 0x12 |
| |
| xor-int/lit8 v0, v1, 0x12 |
| |
| shl-int/lit8 v0, v1, 0x12 |
| |
| shr-int/lit8 v0, v1, 0x12 |
| |
| ushr-int/lit8 v0, v1, 0x12 |
| |
| return-void |
| .end method |
| |
| .method public static compares()V |
| .registers 3 |
| |
| cmpl-float v0, v1, v2 |
| |
| cmpg-float v0, v1, v2 |
| |
| cmpl-double v0, v1, v2 |
| |
| cmpg-double v0, v1, v2 |
| |
| cmp-long v0, v1, v2 |
| |
| return-void |
| .end method |
| |
| .method public static conditionals()V |
| .registers 2 |
| |
| if-eq v0, v1, :cond_18 |
| |
| if-ne v0, v1, :cond_18 |
| |
| if-lt v0, v1, :cond_18 |
| |
| if-ge v0, v1, :cond_18 |
| |
| if-gt v0, v1, :cond_18 |
| |
| if-le v0, v1, :cond_18 |
| |
| if-eqz v0, :cond_18 |
| |
| if-nez v0, :cond_18 |
| |
| if-ltz v0, :cond_18 |
| |
| if-gez v0, :cond_18 |
| |
| if-gtz v0, :cond_18 |
| |
| if-lez v0, :cond_18 |
| |
| :cond_18 |
| return-void |
| .end method |
| |
| .method public static constants()V |
| .registers 1 |
| |
| const/4 v0, 0x1 |
| |
| const/16 v0, 0x1234 |
| |
| const v0, 0x12345678 |
| |
| const/high16 v0, 0x12340000 |
| |
| const-wide/16 v0, 0x1234 |
| |
| const-wide/32 v0, 0x12345678 |
| |
| const-wide v0, 0x1234567890abcdefL # 5.626349108908516E-221 |
| |
| const-wide/high16 v0, 0x1234000000000000L |
| |
| const-string v0, "string" |
| |
| const-string/jumbo v0, "string" |
| |
| const-class v0, Ljava/lang/Object; |
| |
| return-void |
| .end method |
| |
| .method public static misc()V |
| .registers 5 |
| |
| nop |
| |
| monitor-enter v0 |
| |
| monitor-exit v0 |
| |
| check-cast v0, Ljava/lang/Object; |
| |
| instance-of v0, v1, Ljava/lang/Object; |
| |
| array-length v0, v1 |
| |
| new-instance v0, Ljava/lang/Object; |
| |
| new-array v0, v1, Ljava/lang/Object; |
| |
| filled-new-array {v0, v1, v2, v3, v4}, [Ljava/lang/Object; |
| |
| filled-new-array/range {v0 .. v4}, [Ljava/lang/Object; |
| |
| fill-array-data v0, :array_1e |
| |
| throw v0 |
| |
| goto :goto_1c |
| |
| goto/16 :goto_1c |
| |
| goto/32 :goto_1c |
| |
| :goto_1c |
| return-void |
| |
| nop |
| |
| :array_1e |
| .array-data 4 |
| 0x1 |
| 0x2 |
| 0x3 |
| 0x4 |
| 0x5 |
| 0x6 |
| 0x7 |
| 0x8 |
| 0x9 |
| 0x0 |
| .end array-data |
| .end method |
| |
| .method public static moves()V |
| .registers 2 |
| |
| move v0, v1 |
| |
| move/from16 v0, v1 |
| |
| move/16 v0, v1 |
| |
| move-wide v0, v1 |
| |
| move-wide/from16 v0, v1 |
| |
| move-wide/16 v0, v1 |
| |
| move-object v0, v1 |
| |
| move-object/from16 v0, v1 |
| |
| move-object/16 v0, v1 |
| |
| move-result v0 |
| |
| move-result-wide v0 |
| |
| move-result-object v0 |
| |
| move-exception v0 |
| |
| return-void |
| .end method |
| |
| .method public static packed_switch()V |
| .registers 1 |
| |
| packed-switch v0, :pswitch_data_8 |
| |
| :goto_3 |
| return-void |
| |
| goto :goto_3 |
| |
| :pswitch_5 |
| goto :goto_3 |
| |
| :pswitch_6 |
| goto :goto_3 |
| |
| nop |
| |
| :pswitch_data_8 |
| .packed-switch 0x7ffffffe |
| :pswitch_5 |
| :pswitch_6 |
| .end packed-switch |
| .end method |
| |
| .method public static return32()I |
| .registers 1 |
| |
| return v0 |
| .end method |
| |
| .method public static return64()I |
| .registers 2 |
| |
| return-wide v0 |
| .end method |
| |
| .method public static return_object()Ljava/lang/Object; |
| .registers 1 |
| |
| return-object v0 |
| .end method |
| |
| .method public static sparse_switch()V |
| .registers 2 |
| |
| sparse-switch v0, :sswitch_data_4 |
| |
| :sswitch_3 |
| return-void |
| |
| :sswitch_data_4 |
| .sparse-switch |
| 0x1111 -> :sswitch_3 |
| 0x2222 -> :sswitch_3 |
| 0x3333 -> :sswitch_3 |
| 0x4444 -> :sswitch_3 |
| .end sparse-switch |
| .end method |
| |
| .method public static static_fields()V |
| .registers 1 |
| |
| sget v0, LA;->sI:I |
| |
| sget-wide v0, LA;->sJ:J |
| |
| sget-object v0, LA;->sO:LA; |
| |
| sget-boolean v0, LA;->sZ:Z |
| |
| sget-byte v0, LA;->sB:B |
| |
| sget-char v0, LA;->sC:C |
| |
| sget-short v0, LA;->sS:S |
| |
| sput v0, LA;->sI:I |
| |
| sput-wide v0, LA;->sJ:J |
| |
| sput-object v0, LA;->sO:LA; |
| |
| sput-boolean v0, LA;->sZ:Z |
| |
| sput-byte v0, LA;->sB:B |
| |
| sput-char v0, LA;->sC:C |
| |
| sput-short v0, LA;->mS:S |
| |
| return-void |
| .end method |
| |
| .method public static unary_ops()V |
| .registers 2 |
| |
| neg-int v0, v1 |
| |
| not-int v0, v1 |
| |
| neg-long v0, v1 |
| |
| not-long v0, v1 |
| |
| neg-float v0, v1 |
| |
| neg-double v0, v1 |
| |
| int-to-long v0, v1 |
| |
| int-to-float v0, v1 |
| |
| int-to-double v0, v1 |
| |
| long-to-int v0, v1 |
| |
| long-to-float v0, v1 |
| |
| long-to-double v0, v1 |
| |
| float-to-int v0, v1 |
| |
| float-to-long v0, v1 |
| |
| float-to-double v0, v1 |
| |
| double-to-int v0, v1 |
| |
| double-to-long v0, v1 |
| |
| double-to-float v0, v1 |
| |
| int-to-byte v0, v1 |
| |
| int-to-char v0, v1 |
| |
| int-to-short v0, v1 |
| |
| return-void |
| .end method |
| |
| |
| # virtual methods |
| .method public instance_fields()V |
| .registers 2 |
| |
| iget v0, p0, LA;->sI:I |
| |
| iget-wide v0, p0, LA;->sJ:J |
| |
| iget-object v0, p0, LA;->sO:LA; |
| |
| iget-boolean v0, p0, LA;->sZ:Z |
| |
| iget-byte v0, p0, LA;->sB:B |
| |
| iget-char v0, p0, LA;->sC:C |
| |
| iget-short v0, p0, LA;->sS:S |
| |
| iput v0, p0, LA;->sI:I |
| |
| iput-wide v0, p0, LA;->sJ:J |
| |
| iput-object v0, p0, LA;->sO:LA; |
| |
| iput-boolean v0, p0, LA;->sZ:Z |
| |
| iput-byte v0, p0, LA;->sB:B |
| |
| iput-char v0, p0, LA;->sC:C |
| |
| iput-short v0, p0, LA;->sS:S |
| |
| return-void |
| .end method |
| |
| .method public invokes()V |
| .registers 5 |
| |
| invoke-virtual {v0, v1, v2, v3, p0}, LA;->invokes()V |
| |
| invoke-super {v0, v1, v2, v3, p0}, LA;->invokes()V |
| |
| invoke-direct {v0, v1, v2, v3, p0}, LA;->invokes()V |
| |
| invoke-static {v0, v1, v2, v3, p0}, LA;->invokes()V |
| |
| invoke-interface {v0, v1, v2, v3, p0}, LA;->invokes()V |
| .end method |