Skip to content

Commit f5d1f35

Browse files
committed
Support methodHandle / invokeDynamic constant pool entries in scalap
Add support in scalap to parse new constant pool entries - MethodHandle - MethodType - InvokeDynamic Spec: https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html
1 parent 6ae2dd8 commit f5d1f35

File tree

3 files changed

+22
-0
lines changed

3 files changed

+22
-0
lines changed

src/scalap/scala/tools/scalap/scalax/rules/scalasig/ClassFileParser.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ object ClassFileParser extends ByteCodeReader {
114114
val methodRef = memberRef("Method")
115115
val interfaceMethodRef = memberRef("InterfaceMethod")
116116
val nameAndType = u2 ~ u2 ^^ add1 { case name ~ descriptor => pool => "NameAndType: " + pool(name) + ", " + pool(descriptor) }
117+
val methodHandle = u1 ~ u2 ^^ add1 { case referenceKind ~ referenceIndex => pool => "MethodHandle: " + referenceKind + ", " + pool(referenceIndex) }
118+
val methodType = u2 ^^ add1 { case descriptorIndex => pool => "MethodType: " + pool(descriptorIndex) }
119+
val invokeDynamic = u2 ~ u2 ^^ add1 { case bootstrapMethodAttrIndex ~ nameAndTypeIndex => pool => "InvokeDynamic: " + "bootstrapMethodAttrIndex = " + bootstrapMethodAttrIndex + ", " + pool(nameAndTypeIndex) }
117120

118121
val constantPoolEntry = u1 >> {
119122
case 1 => utf8String
@@ -127,6 +130,9 @@ object ClassFileParser extends ByteCodeReader {
127130
case 10 => methodRef
128131
case 11 => interfaceMethodRef
129132
case 12 => nameAndType
133+
case 15 => methodHandle
134+
case 16 => methodType
135+
case 18 => invokeDynamic
130136
}
131137

132138
val interfaces = u2 >> u2.times
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class C extends scala.AnyRef {
2+
def this() = { /* compiled code */ }
3+
def m: java.lang.String = { /* compiled code */ }
4+
}
5+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class C {
2+
def m = {
3+
val f = (x: String) => x.trim
4+
f(" H ae i ")
5+
}
6+
}
7+
8+
object Test extends App {
9+
val testClassesDir = System.getProperty("partest.output")
10+
scala.tools.scalap.Main.main(Array("-cp", testClassesDir, "C"))
11+
}

0 commit comments

Comments
 (0)