Skip to content

Commit

Permalink
Support throwing parameterized checked exception
Browse files Browse the repository at this point in the history
  • Loading branch information
pontusmelke committed May 17, 2016
1 parent 7d62291 commit fd37acc
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 69 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
*/
package org.neo4j.codegen;

import java.lang.reflect.Modifier;

public class ClassHandle extends TypeReference
{
private final TypeReference parent;
Expand All @@ -27,7 +29,7 @@ public class ClassHandle extends TypeReference

ClassHandle( String packageName, String name, TypeReference parent, CodeGenerator generator, long generation )
{
super(packageName, name, parent.isPrimitive(), parent.isArray(), false, "");
super(packageName, name, parent.isPrimitive(), parent.isArray(), false, "", Modifier.PUBLIC);
this.parent = parent;
this.generator = generator;
this.generation = generation;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
*/
package org.neo4j.codegen;

import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.List;

Expand Down Expand Up @@ -85,12 +86,12 @@ else if (type.isPrimitive())
}
}
return new TypeReference( packageName, simpleName, type.isPrimitive(), type.isArray(), false,
declaringClassName );
declaringClassName, type.getModifiers() );
}

public static TypeReference typeParameter( String name )
{
return new TypeReference( "", name, false, false, true, "" );
return new TypeReference( "", name, false, false, true, "", Modifier.PUBLIC );
}

public static TypeReference parameterizedType( Class<?> base, Class<?>... parameters )
Expand All @@ -107,7 +108,7 @@ public static TypeReference parameterizedType( TypeReference base, TypeReference
{
return new TypeReference( base.packageName, base.simpleName, false, base.isArray(), false,
base.declaringClassName,
parameters );
base.modifiers, parameters );
}

public static TypeReference[] typeReferences( Class<?> first, Class<?>[] more )
Expand Down Expand Up @@ -138,6 +139,24 @@ public static TypeReference[] typeReferences( Class<?>[] types )
private final boolean isArray;
private final boolean isTypeParameter;
private final String declaringClassName;
private final int modifiers;

public static final TypeReference VOID = new TypeReference( "", "void", true, false, false, "", void.class.getModifiers() ),
OBJECT = new TypeReference( "java.lang", "Object", false, false, false, "", Object.class.getModifiers() );
static final TypeReference[] NO_TYPES = new TypeReference[0];

TypeReference( String packageName, String simpleName, boolean isPrimitive, boolean isArray,
boolean isTypeParameter, String declaringClassName, int modifiers, TypeReference... parameters )
{
this.packageName = packageName;
this.simpleName = simpleName;
this.isPrimitive = isPrimitive;
this.isArray = isArray;
this.isTypeParameter = isTypeParameter;
this.declaringClassName = declaringClassName;
this.modifiers = modifiers;
this.parameters = parameters;
}

public String packageName()
{
Expand All @@ -159,23 +178,6 @@ public boolean isTypeParameter()
return isTypeParameter;
}


public static final TypeReference VOID = new TypeReference( "", "void", true, false, false, "" ),
OBJECT = new TypeReference( "java.lang", "Object", false, false, false, "" );
static final TypeReference[] NO_TYPES = new TypeReference[0];

TypeReference( String packageName, String simpleName, boolean isPrimitive, boolean isArray,
boolean isTypeParameter, String declaringClassName, TypeReference... parameters )
{
this.packageName = packageName;
this.simpleName = simpleName;
this.isPrimitive = isPrimitive;
this.isArray = isArray;
this.isTypeParameter = isTypeParameter;
this.declaringClassName = declaringClassName;
this.parameters = parameters;
}

public boolean isGeneric()
{
return parameters == null || parameters.length > 0;
Expand Down Expand Up @@ -211,6 +213,11 @@ public String declaringClassName()
return declaringClassName;
}

public int modifiers()
{
return modifiers;
}

@Override
public boolean equals( Object o )
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;

import java.lang.reflect.Modifier;
import java.nio.ByteBuffer;
Expand All @@ -48,51 +49,8 @@
import static org.neo4j.codegen.ByteCodeUtils.outerName;
import static org.neo4j.codegen.ByteCodeUtils.signature;
import static org.neo4j.codegen.ByteCodeUtils.typeName;
import static org.objectweb.asm.Opcodes.AASTORE;
import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
import static org.objectweb.asm.Opcodes.ACC_STATIC;
import static org.objectweb.asm.Opcodes.ACC_SUPER;
import static org.objectweb.asm.Opcodes.ALOAD;
import static org.objectweb.asm.Opcodes.ANEWARRAY;
import static org.objectweb.asm.Opcodes.ARETURN;
import static org.objectweb.asm.Opcodes.BASTORE;
import static org.objectweb.asm.Opcodes.BIPUSH;
import static org.objectweb.asm.Opcodes.CASTORE;
import static org.objectweb.asm.Opcodes.DASTORE;
import static org.objectweb.asm.Opcodes.DLOAD;
import static org.objectweb.asm.Opcodes.DRETURN;
import static org.objectweb.asm.Opcodes.DUP;
import static org.objectweb.asm.Opcodes.FASTORE;
import static org.objectweb.asm.Opcodes.FLOAD;
import static org.objectweb.asm.Opcodes.FRETURN;
import static org.objectweb.asm.Opcodes.GETFIELD;
import static org.objectweb.asm.Opcodes.GETSTATIC;
import static org.objectweb.asm.Opcodes.IASTORE;
import static org.objectweb.asm.Opcodes.ICONST_0;
import static org.objectweb.asm.Opcodes.ILOAD;
import static org.objectweb.asm.Opcodes.INVOKESPECIAL;
import static org.objectweb.asm.Opcodes.INVOKESTATIC;
import static org.objectweb.asm.Opcodes.IRETURN;
import static org.objectweb.asm.Opcodes.LASTORE;
import static org.objectweb.asm.Opcodes.LLOAD;
import static org.objectweb.asm.Opcodes.LRETURN;
import static org.objectweb.asm.Opcodes.NEWARRAY;
import static org.objectweb.asm.Opcodes.PUTFIELD;
import static org.objectweb.asm.Opcodes.PUTSTATIC;
import static org.objectweb.asm.Opcodes.RETURN;
import static org.objectweb.asm.Opcodes.SASTORE;
import static org.objectweb.asm.Opcodes.SIPUSH;
import static org.objectweb.asm.Opcodes.T_BOOLEAN;
import static org.objectweb.asm.Opcodes.T_BYTE;
import static org.objectweb.asm.Opcodes.T_CHAR;
import static org.objectweb.asm.Opcodes.T_DOUBLE;
import static org.objectweb.asm.Opcodes.T_FLOAT;
import static org.objectweb.asm.Opcodes.T_INT;
import static org.objectweb.asm.Opcodes.T_LONG;
import static org.objectweb.asm.Opcodes.T_SHORT;
import static org.objectweb.asm.Opcodes.V1_8;

class ClassByteCodeWriter implements ClassEmitter

class ClassByteCodeWriter implements ClassEmitter, Opcodes
{
private final ClassWriter classWriter;
private final TypeReference type;
Expand All @@ -112,7 +70,7 @@ class ClassByteCodeWriter implements ClassEmitter
if ( base.isInnerClass() )
{
classWriter.visitInnerClass( byteCodeName( base ), outerName(base),
base.simpleName() , ACC_PUBLIC + ACC_STATIC );
base.simpleName(), ACC_PUBLIC + ACC_STATIC );
}
this.type = type;
this.base = base;
Expand Down Expand Up @@ -190,6 +148,15 @@ public MethodByteCodeEmitter( ClassWriter classWriter, MethodDeclaration declara
{
this.declaration = declaration;
this.base = base;
for ( Parameter parameter : declaration.parameters() )
{
TypeReference type = parameter.type();
if ( type.isInnerClass() )
{
classWriter.visitInnerClass( byteCodeName( type ), outerName( type ),
type.simpleName(), type.modifiers() );
}
}
this.methodVisitor = classWriter.visitMethod( ACC_PUBLIC, declaration.name(), desc( declaration ),
signature( declaration ), exceptions( declaration ) );
this.methodVisitor.visitCode();
Expand Down Expand Up @@ -413,8 +380,18 @@ public void invoke( Expression target, MethodReference method, Expression[] argu
{
argument.accept( this );
}
methodVisitor.visitMethodInsn( INVOKESPECIAL, byteCodeName( method.owner() ), method.name(), desc( method ),
false );
if ( Modifier.isInterface( method.owner().modifiers() ))
{
methodVisitor
.visitMethodInsn( INVOKEINTERFACE, byteCodeName( method.owner() ), method.name(), desc( method ),
true );
}
else
{
methodVisitor
.visitMethodInsn( INVOKESPECIAL, byteCodeName( method.owner() ), method.name(), desc( method ),
false );
}
}

@Override
Expand Down

0 comments on commit fd37acc

Please sign in to comment.