summaryrefslogtreecommitdiff
path: root/src/scalap
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@gmail.com>2015-07-06 20:13:42 +0200
committerLukas Rytz <lukas.rytz@gmail.com>2015-07-23 15:02:18 +0200
commitef9d84567655d6f8c9b8541aef4beb706f2a13ec (patch)
treea0f503f70207199dbfadbc7ba2d5d08c8deb8b17 /src/scalap
parent60747c75555fdcfefc9d10460050be5e2a11ad85 (diff)
downloadscala-ef9d84567655d6f8c9b8541aef4beb706f2a13ec.tar.gz
scala-ef9d84567655d6f8c9b8541aef4beb706f2a13ec.tar.bz2
scala-ef9d84567655d6f8c9b8541aef4beb706f2a13ec.zip
[backport] 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
Diffstat (limited to 'src/scalap')
-rw-r--r--src/scalap/scala/tools/scalap/scalax/rules/scalasig/ClassFileParser.scala6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ClassFileParser.scala b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ClassFileParser.scala
index cfd750055b..eed76c3774 100644
--- a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ClassFileParser.scala
+++ b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ClassFileParser.scala
@@ -114,6 +114,9 @@ object ClassFileParser extends ByteCodeReader {
val methodRef = memberRef("Method")
val interfaceMethodRef = memberRef("InterfaceMethod")
val nameAndType = u2 ~ u2 ^^ add1 { case name ~ descriptor => pool => "NameAndType: " + pool(name) + ", " + pool(descriptor) }
+ val methodHandle = u1 ~ u2 ^^ add1 { case referenceKind ~ referenceIndex => pool => "MethodHandle: " + referenceKind + ", " + pool(referenceIndex) }
+ val methodType = u2 ^^ add1 { case descriptorIndex => pool => "MethodType: " + pool(descriptorIndex) }
+ val invokeDynamic = u2 ~ u2 ^^ add1 { case bootstrapMethodAttrIndex ~ nameAndTypeIndex => pool => "InvokeDynamic: " + "bootstrapMethodAttrIndex = " + bootstrapMethodAttrIndex + ", " + pool(nameAndTypeIndex) }
val constantPoolEntry = u1 >> {
case 1 => utf8String
@@ -127,6 +130,9 @@ object ClassFileParser extends ByteCodeReader {
case 10 => methodRef
case 11 => interfaceMethodRef
case 12 => nameAndType
+ case 15 => methodHandle
+ case 16 => methodType
+ case 18 => invokeDynamic
}
val interfaces = u2 >> u2.times