From 13a9f757901595328136dbf6c4a50f9a105e5198 Mon Sep 17 00:00:00 2001 From: Eric Chatellier Date: Wed, 3 Jun 2015 16:15:35 +0200 Subject: [PATCH 1/4] Fix java 8 signatures parsing --- .../rsta/ac/java/classreader/attributes/Signature.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/fife/rsta/ac/java/classreader/attributes/Signature.java b/src/main/java/org/fife/rsta/ac/java/classreader/attributes/Signature.java index ad4e33f..fb1ef75 100644 --- a/src/main/java/org/fife/rsta/ac/java/classreader/attributes/Signature.java +++ b/src/main/java/org/fife/rsta/ac/java/classreader/attributes/Signature.java @@ -55,9 +55,14 @@ public List getClassParamTypes() { int colon = temp.indexOf(':', offs); while (offs-1) { String ident = temp.substring(offs, colon); - char ch = temp.charAt(colon+1); + int colonCount = 1; + char ch = temp.charAt(colon+colonCount); + if (ch==':') { // sometimes, there is another ':' + colonCount++; + ch = temp.charAt(colon+colonCount); + } if (ch=='L') { // A ClassTypeSignature - int semicolon = temp.indexOf(';', colon+2); + int semicolon = temp.indexOf(';', colon+colonCount+1); if (semicolon>-1) { //String type = temp.substring(colon+2, semicolon); // TODO: ... From fb3f5ba5fc49c8ad6ef4b287114eec9accd034d9 Mon Sep 17 00:00:00 2001 From: Eric Chatellier Date: Wed, 3 Jun 2015 16:16:04 +0200 Subject: [PATCH 2/4] Add bootstrap support --- .../java/org/fife/rsta/ac/java/classreader/ClassFile.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/org/fife/rsta/ac/java/classreader/ClassFile.java b/src/main/java/org/fife/rsta/ac/java/classreader/ClassFile.java index 42e9ec9..399b702 100644 --- a/src/main/java/org/fife/rsta/ac/java/classreader/ClassFile.java +++ b/src/main/java/org/fife/rsta/ac/java/classreader/ClassFile.java @@ -112,6 +112,7 @@ public class ClassFile implements AccessFlags { public static final String RUNTIME_VISIBLE_ANNOTATIONS = "RuntimeVisibleAnnotations"; public static final String SIGNATURE = "Signature"; public static final String SOURCE_FILE = "SourceFile"; + public static final String BOOTSTRAP_METHODS = "BootstrapMethods"; /** * The 4-byte class file header, "CAFEBABE". @@ -542,6 +543,13 @@ private AttributeInfo readAttribute(DataInputStream in) throws IOException { ai = sf; } + else if (BOOTSTRAP_METHODS.equals(attrName)) { // 4.7.23 + //String name = getClassFile().getClassName(false) + "." + getName(); + //System.out.println(name + ": Attribute " + attrName + " not supported"); + Util.skipBytes(in, attributeLength); + //ai = null; + } + else if (SIGNATURE.equals(attrName)) { // 4.8.8 int signatureIndex = in.readUnsignedShort(); String sig = getUtf8ValueFromConstantPool(signatureIndex); From f1c344b76213353d29f33a4ea6d79f61809867e2 Mon Sep 17 00:00:00 2001 From: Eric Chatellier Date: Wed, 3 Jun 2015 16:16:51 +0200 Subject: [PATCH 3/4] Add support for java 8 invoke dynamic constants --- .../ConstantInvokeDynamicInfo.java | 63 +++++++++++++++++++ .../ConstantMethodHandleInfo.java | 62 ++++++++++++++++++ .../constantpool/ConstantMethodTypeInfo.java | 52 +++++++++++++++ .../constantpool/ConstantPoolInfoFactory.java | 19 +++++- .../constantpool/ConstantTypes.java | 8 ++- 5 files changed, 202 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/fife/rsta/ac/java/classreader/constantpool/ConstantInvokeDynamicInfo.java create mode 100644 src/main/java/org/fife/rsta/ac/java/classreader/constantpool/ConstantMethodHandleInfo.java create mode 100644 src/main/java/org/fife/rsta/ac/java/classreader/constantpool/ConstantMethodTypeInfo.java diff --git a/src/main/java/org/fife/rsta/ac/java/classreader/constantpool/ConstantInvokeDynamicInfo.java b/src/main/java/org/fife/rsta/ac/java/classreader/constantpool/ConstantInvokeDynamicInfo.java new file mode 100644 index 0000000..6a8b955 --- /dev/null +++ b/src/main/java/org/fife/rsta/ac/java/classreader/constantpool/ConstantInvokeDynamicInfo.java @@ -0,0 +1,63 @@ +/* + * 03/21/2010 + * + * Copyright (C) 2010 Robert Futrell + * robert_futrell at users.sourceforge.net + * http://fifesoft.com/rsyntaxtextarea + * + * This library is distributed under a modified BSD license. See the included + * RSTALanguageSupport.License.txt file for details. + */ +package org.fife.rsta.ac.java.classreader.constantpool; + +/** + * Class representing a CONSTANT_InvokeDynamic_info structure. + * + * @author Robert Futrell + * @version 1.0 + */ +public class ConstantInvokeDynamicInfo extends ConstantPoolInfo { + + private int bootstrapMethodAttrIndex; + + private int nameAndTypeIndex; + + + /** + * Constructor. + * + * @param bootstrapMethodAttrIndex + * @param nameAndTypeIndex + */ + public ConstantInvokeDynamicInfo(int bootstrapMethodAttrIndex, int nameAndTypeIndex) { + super(CONSTANT_InvokeDynamic); + this.bootstrapMethodAttrIndex = bootstrapMethodAttrIndex; + this.nameAndTypeIndex = nameAndTypeIndex; + } + + + public int getBootstrapMethodAttrIndex() { + return bootstrapMethodAttrIndex; + } + + + public int getNameAndTypeIndex() { + return nameAndTypeIndex; + } + + + /** + * Returns a string representation of this object. Useful for debugging. + * + * @return A string representation of this object. + */ + @Override + public String toString() { + return "[ConstantInvokeDynamicInfo: " + + "bootstrapMethodAttrIndex=" + getBootstrapMethodAttrIndex() + + "; nameAndTypeIndex=" + getNameAndTypeIndex() + + "]"; + } + + +} \ No newline at end of file diff --git a/src/main/java/org/fife/rsta/ac/java/classreader/constantpool/ConstantMethodHandleInfo.java b/src/main/java/org/fife/rsta/ac/java/classreader/constantpool/ConstantMethodHandleInfo.java new file mode 100644 index 0000000..b4b7234 --- /dev/null +++ b/src/main/java/org/fife/rsta/ac/java/classreader/constantpool/ConstantMethodHandleInfo.java @@ -0,0 +1,62 @@ +/* + * 03/21/2010 + * + * Copyright (C) 2010 Robert Futrell + * robert_futrell at users.sourceforge.net + * http://fifesoft.com/rsyntaxtextarea + * + * This library is distributed under a modified BSD license. See the included + * RSTALanguageSupport.License.txt file for details. + */ +package org.fife.rsta.ac.java.classreader.constantpool; + +/** + * Class representing a CONSTANT_MethodHandle structure. + * + * @author Robert Futrell + * @version 1.0 + */ +public class ConstantMethodHandleInfo extends ConstantPoolInfo { + + private int referenceKind; + + private int referenceIndex; + + + /** + * Constructor. + * + * @param referenceKind + * @param referenceIndex + */ + public ConstantMethodHandleInfo(int referenceKind, int referenceIndex) { + super(CONSTANT_MethodHandle); + this.referenceKind = referenceKind; + this.referenceIndex = referenceIndex; + } + + + public int getReferenceKind() { + return referenceKind; + } + + public int getReferenceIndex() { + return referenceIndex; + } + + + /** + * Returns a string representation of this object. Useful for debugging. + * + * @return A string representation of this object. + */ + @Override + public String toString() { + return "[ConstantMethodHandleInfo: " + + "referenceKind=" + getReferenceKind() + + "; referenceIndex=" + getReferenceIndex() + + "]"; + } + + +} \ No newline at end of file diff --git a/src/main/java/org/fife/rsta/ac/java/classreader/constantpool/ConstantMethodTypeInfo.java b/src/main/java/org/fife/rsta/ac/java/classreader/constantpool/ConstantMethodTypeInfo.java new file mode 100644 index 0000000..8e4d3b5 --- /dev/null +++ b/src/main/java/org/fife/rsta/ac/java/classreader/constantpool/ConstantMethodTypeInfo.java @@ -0,0 +1,52 @@ +/* + * 03/21/2010 + * + * Copyright (C) 2010 Robert Futrell + * robert_futrell at users.sourceforge.net + * http://fifesoft.com/rsyntaxtextarea + * + * This library is distributed under a modified BSD license. See the included + * RSTALanguageSupport.License.txt file for details. + */ +package org.fife.rsta.ac.java.classreader.constantpool; + +/** + * Class representing a CONSTANT_MethodType structure. + * + * @author Robert Futrell + * @version 1.0 + */ +public class ConstantMethodTypeInfo extends ConstantPoolInfo { + + private int descriptorIndex; + + /** + * Constructor. + * + * @param descriptorIndex + */ + public ConstantMethodTypeInfo(int descriptorIndex) { + super(CONSTANT_MethodType); + this.descriptorIndex = descriptorIndex; + } + + + public int getDescriptorIndex() { + return descriptorIndex; + } + + + /** + * Returns a string representation of this object. Useful for debugging. + * + * @return A string representation of this object. + */ + @Override + public String toString() { + return "[ConstantMethodTypeInfo: " + + "bootstrapMethodAttrIndex=" + getDescriptorIndex() + + "]"; + } + + +} \ No newline at end of file diff --git a/src/main/java/org/fife/rsta/ac/java/classreader/constantpool/ConstantPoolInfoFactory.java b/src/main/java/org/fife/rsta/ac/java/classreader/constantpool/ConstantPoolInfoFactory.java index 6a91215..8fc49c2 100644 --- a/src/main/java/org/fife/rsta/ac/java/classreader/constantpool/ConstantPoolInfoFactory.java +++ b/src/main/java/org/fife/rsta/ac/java/classreader/constantpool/ConstantPoolInfoFactory.java @@ -97,6 +97,23 @@ public static ConstantPoolInfo readConstantPoolInfo(ClassFile cf, cpi = new ConstantUtf8Info(byteArray); break; + case CONSTANT_MethodHandle: + int referenceKind = in.read(); + int referenceIndex = in.readUnsignedShort(); + cpi = new ConstantMethodHandleInfo(referenceKind, referenceIndex); + break; + + case CONSTANT_MethodType: + descriptorIndex = in.readUnsignedShort(); + cpi = new ConstantMethodTypeInfo(descriptorIndex); + break; + + case CONSTANT_InvokeDynamic: + int bootstrapMethodAttrIndex = in.readUnsignedShort(); + nameAndTypeIndex = in.readUnsignedShort(); + cpi = new ConstantInvokeDynamicInfo(bootstrapMethodAttrIndex, nameAndTypeIndex); + break; + default: throw new IOException("Unknown tag for constant pool info: " + tag); @@ -107,4 +124,4 @@ public static ConstantPoolInfo readConstantPoolInfo(ClassFile cf, } -} \ No newline at end of file +} diff --git a/src/main/java/org/fife/rsta/ac/java/classreader/constantpool/ConstantTypes.java b/src/main/java/org/fife/rsta/ac/java/classreader/constantpool/ConstantTypes.java index 74dd038..5b4c9c9 100644 --- a/src/main/java/org/fife/rsta/ac/java/classreader/constantpool/ConstantTypes.java +++ b/src/main/java/org/fife/rsta/ac/java/classreader/constantpool/ConstantTypes.java @@ -41,4 +41,10 @@ interface ConstantTypes { public static final int CONSTANT_Utf8 = 1; -} \ No newline at end of file + public static final int CONSTANT_MethodHandle = 15; + + public static final int CONSTANT_MethodType = 16; + + public static final int CONSTANT_InvokeDynamic = 18; + +} From de01087201e0b7de6776c285b8bfa632c151fcbe Mon Sep 17 00:00:00 2001 From: Eric Chatellier Date: Wed, 3 Jun 2015 16:31:20 +0200 Subject: [PATCH 4/4] Update rhino dependency --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index d9c346f..8fe553e 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ group = 'com.fifesoft' archivesBaseName = 'languagesupport' dependencies { - compile group: 'org.mozilla', name: 'rhino', version: '1.7R4' + compile group: 'org.mozilla', name: 'rhino', version: '1.7.6' testCompile group: 'junit', name: 'junit', version: '4.11' } @@ -36,7 +36,7 @@ compileJava { ext.sharedManifest = manifest { attributes('Main-Class': 'org.fife.rsta.ac.demo.DemoApp', - 'Class-Path': 'rsyntaxtextarea.jar autocomplete.jar rhino-1.7R4.jar', + 'Class-Path': 'rsyntaxtextarea.jar autocomplete.jar rhino-1.7.6.jar', 'Specification-Title': 'RSyntaxTextArea Language Support', 'Specification-Version': version, 'Implementation-Title': 'org.fife.ui',