add sourceFile to WasmException

This commit is contained in:
Volker Berlin 2017-04-09 18:18:53 +02:00
parent 5acae6b103
commit a3807680b7
2 changed files with 139 additions and 108 deletions

View File

@ -1,103 +1,116 @@
/* /*
* Copyright 2017 Volker Berlin (i-net software) * Copyright 2017 Volker Berlin (i-net software)
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package de.inetsoftware.jwebassembly; package de.inetsoftware.jwebassembly;
/** /**
* If there any error occur on converting a class file to a WebAssembly module. * If there any error occur on converting a class file to a WebAssembly module.
* *
* @author Volker Berlin * @author Volker Berlin
* *
*/ */
public class WasmException extends Exception { public class WasmException extends Exception {
private int lineNumber; private int lineNumber;
/** private String sourceFile;
* Create a new instance.
* /**
* @param message * Create a new instance.
* the error message *
* @param lineNumber * @param message
* the line number in Java Code * the error message
*/ * @param sourceFile
public WasmException( String message, int lineNumber ) { * the sourceFile of the Java code
super( message ); * @param lineNumber
this.lineNumber = lineNumber; * the line number in Java Code
} */
public WasmException( String message, String sourceFile, int lineNumber ) {
/** super( message );
* Create a new instance with a cause. this.sourceFile = sourceFile;
* this.lineNumber = lineNumber;
* @param cause }
* the cause
*/ /**
private WasmException( Throwable cause ) { * Create a new instance with a cause.
super( cause ); *
lineNumber = -1; * @param cause
} * the cause
*/
/** private WasmException( Throwable cause ) {
* Create a wrapped exception needed. super( cause );
* lineNumber = -1;
* @param cause }
* the wrapped cause
* @param lineNumber /**
* the line number in Java Code * Create a wrapped exception needed.
* @return a new instance *
*/ * @param cause
public static WasmException create( Throwable cause, int lineNumber ) { * the wrapped cause
WasmException wasmEx = create( cause ); * @param sourceFile
if( wasmEx.lineNumber < 0 ) { * the sourceFile of the Java code
wasmEx.lineNumber = lineNumber; * @param lineNumber
} * the line number in Java Code
return wasmEx; * @return a new instance
} */
public static WasmException create( Throwable cause, String sourceFile, int lineNumber ) {
/** WasmException wasmEx = create( cause );
* Create a wrapped exception needed. if( wasmEx.sourceFile == null ) {
* wasmEx.sourceFile = sourceFile;
* @param cause }
* the wrapped cause if( wasmEx.lineNumber < 0 ) {
* @return a new instance wasmEx.lineNumber = lineNumber;
*/ }
public static WasmException create( Throwable cause ) { return wasmEx;
if( cause instanceof WasmException ) { }
return (WasmException)cause;
} /**
return new WasmException( cause ); * Create a wrapped exception needed.
} *
* @param cause
/** * the wrapped cause
* Get the line number in Java code on which the error occurred. * @return a new instance
* */
* @return the line number or -1 public static WasmException create( Throwable cause ) {
*/ if( cause instanceof WasmException ) {
public int getLineNumber() { return (WasmException)cause;
return lineNumber; }
} return new WasmException( cause );
}
/**
* {@inheritDoc} /**
*/ * Get the line number in Java code on which the error occurred.
@Override *
public String toString() { * @return the line number or -1
String str = super.toString(); */
if( lineNumber > 0 ) { public int getLineNumber() {
str += " at line: " + lineNumber; return lineNumber;
} }
return str;
} /**
} * {@inheritDoc}
*/
@Override
public String toString() {
String str = super.toString();
if( sourceFile != null || lineNumber > 0 ) {
str += " at " + (sourceFile != null ? sourceFile : "line");
if( lineNumber > 0 ) {
str += ":" + lineNumber;
}
}
return str;
}
}

View File

@ -44,6 +44,8 @@ public abstract class ModuleWriter implements Closeable {
private ArrayList<ValueType> locals = new ArrayList<>(); private ArrayList<ValueType> locals = new ArrayList<>();
private String sourceFile;
/** /**
* Write the content of the class to the * Write the content of the class to the
* *
@ -55,6 +57,10 @@ public abstract class ModuleWriter implements Closeable {
* if some Java code can't converted * if some Java code can't converted
*/ */
public void write( ClassFile classFile ) throws IOException, WasmException { public void write( ClassFile classFile ) throws IOException, WasmException {
sourceFile = classFile.getSourceFile();
if( sourceFile == null ) {
sourceFile = classFile.getThisClass().getName();
}
MethodInfo[] methods = classFile.getMethods(); MethodInfo[] methods = classFile.getMethods();
for( MethodInfo method : methods ) { for( MethodInfo method : methods ) {
Code code = method.getCode(); Code code = method.getCode();
@ -201,7 +207,7 @@ public abstract class ModuleWriter implements Closeable {
javaType = signature.substring( i, i + 1 ); javaType = signature.substring( i, i + 1 );
} }
int lineNumber = method.getCode().getFirstLineNr(); int lineNumber = method.getCode().getFirstLineNr();
throw new WasmException( "Not supported Java data type in method signature: " + javaType, lineNumber ); throw new WasmException( "Not supported Java data type in method signature: " + javaType, sourceFile, lineNumber );
} }
} }
@ -235,6 +241,8 @@ public abstract class ModuleWriter implements Closeable {
* a stream of byte code * a stream of byte code
* @param lineNumber * @param lineNumber
* the current line number * the current line number
* @param constantPool
* the constant pool of the the current class
* @throws WasmException * @throws WasmException
* if some Java code can't converted * if some Java code can't converted
*/ */
@ -278,14 +286,24 @@ public abstract class ModuleWriter implements Closeable {
writeReturn(); writeReturn();
break; break;
default: default:
throw new WasmException( "Unimplemented byte code operation: " + op, lineNumber ); throw new WasmException( "Unimplemented byte code operation: " + op, sourceFile, lineNumber );
} }
} }
} catch( Exception ex ) { } catch( Exception ex ) {
throw WasmException.create( ex, lineNumber ); throw WasmException.create( ex, sourceFile, lineNumber );
} }
} }
/**
* Write a constant value.
*
* @param value
* the value
* @throws IOException
* if any I/O error occur
* @throws WasmException
* if the value type is not supported
*/
private void writeConst( Object value ) throws IOException, WasmException { private void writeConst( Object value ) throws IOException, WasmException {
Class<?> clazz = value.getClass(); Class<?> clazz = value.getClass();
if( clazz == Integer.class ) { if( clazz == Integer.class ) {
@ -297,7 +315,7 @@ public abstract class ModuleWriter implements Closeable {
} else if( clazz == Double.class ) { } else if( clazz == Double.class ) {
writeConstDouble( ((Double)value).doubleValue() ); writeConstDouble( ((Double)value).doubleValue() );
} else { } else {
throw new WasmException( "Not supported constant type: " + clazz, -1 ); throw new WasmException( "Not supported constant type: " + clazz, sourceFile, -1 );
} }
} }
@ -361,7 +379,7 @@ public abstract class ModuleWriter implements Closeable {
} }
ValueType oldType = locals.get( idx ); ValueType oldType = locals.get( idx );
if( oldType != null && oldType != valueType ) { if( oldType != null && oldType != valueType ) {
throw new WasmException( "Redefine local variable type from " + oldType + " to " + valueType, -1 ); throw new WasmException( "Redefine local variable type from " + oldType + " to " + valueType, sourceFile, -1 );
} }
locals.set( idx, valueType ); locals.set( idx, valueType );
if( load ) { if( load ) {