mirror of
https://github.com/revanced/smali.git
synced 2025-06-13 04:27:38 +02:00
Add lambda experimental dalvik opcodes
* Add new -X/--experimental flag to [dis]assemble opcodes not in art yet * Add new opcodes liberate-variable, box-lambda, unbox-lambda, capture-variable, create-lambda, invoke-lambda * Add support for encoding 25x instructions * Adds LambdaTest to check new opcodes assemble/disassemble properly TODO: invoke-lambda-range Change-Id: I5c8bcbfa8b6cb9a13ef2017fce2d1b7fda6e11c3
This commit is contained in:
57
examples/HelloWorldLambda/HelloWorldLambda.smali
Normal file
57
examples/HelloWorldLambda/HelloWorldLambda.smali
Normal file
@ -0,0 +1,57 @@
|
||||
.class public LHelloWorldLambda;
|
||||
|
||||
#Ye olde hello world application (with lambdas!)
|
||||
#To assemble and run this on a phone or emulator:
|
||||
#
|
||||
#java -jar smali.jar -o classes.dex HelloWorldLambda.smali HelloWorldFunctionalInterface.smali
|
||||
#zip HelloWorld.zip classes.dex
|
||||
#adb push HelloWorld.zip /data/local
|
||||
#adb shell dalvikvm -cp /data/local/HelloWorld.zip HelloWorld
|
||||
#
|
||||
#if you get out of memory type errors when running smali.jar, try
|
||||
#java -Xmx512m -jar smali.jar HelloWorldLambda.smali
|
||||
#instead
|
||||
|
||||
.super Ljava/lang/Object;
|
||||
|
||||
.method public static main([Ljava/lang/String;)V
|
||||
.registers 9 # 1 parameter, 8 locals
|
||||
|
||||
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
|
||||
|
||||
const-string v1, "Hello World!"
|
||||
const-string v2, "How" # vD
|
||||
const-string v3, "are" # vE
|
||||
const-string v4, "you" # vF
|
||||
const-string v5, "doing?" # vG
|
||||
|
||||
capture-variable v1, "helloworld"
|
||||
|
||||
# TODO: do I need to pass the type of the lambda's functional interface here as a type id?
|
||||
create-lambda v1, LHelloWorldLambda;->doHelloWorld(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
|
||||
# Method descriptor is not required here, because only the single-abstract method is ever invoked.
|
||||
invoke-lambda v1, {v2, v3, v4, v5}
|
||||
|
||||
box-lambda v6, v1 # The type of v6 is now 'LHelloWorldFunctionalInterface;'
|
||||
invoke-virtual {v6, v2, v3, v4, v5}, LHelloWorldFunctionalInterface;->applyFourStrings(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
|
||||
|
||||
# FIXME: should be \HelloWorldFunctionalInterface; instead of L...;
|
||||
|
||||
# TODO: do we really need the type descriptor here at all?
|
||||
unbox-lambda v7, v6, LHelloWorldFunctionalInterface; # The type of v7 is now \HelloWorldFunctionalInterface;
|
||||
invoke-lambda v7, {v2, v3, v4, v5}
|
||||
|
||||
return-void
|
||||
.end method
|
||||
|
||||
.method public static doHelloWorld(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
|
||||
.registers 6 # 4 parameters, 2 locals
|
||||
|
||||
# This helloworld variable is brought to you by the variable liberation front
|
||||
liberate-variable v0, p0, "helloworld"
|
||||
|
||||
sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;
|
||||
invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
|
||||
|
||||
return-void
|
||||
.end method
|
Reference in New Issue
Block a user