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)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.inetsoftware.jwebassembly;
/**
* If there any error occur on converting a class file to a WebAssembly module.
*
* @author Volker Berlin
*
*/
public class WasmException extends Exception {
private int lineNumber;
/**
* Create a new instance.
*
* @param message
* the error message
* @param lineNumber
* the line number in Java Code
*/
public WasmException( String message, int lineNumber ) {
super( message );
this.lineNumber = lineNumber;
}
/**
* Create a new instance with a cause.
*
* @param cause
* the cause
*/
private WasmException( Throwable cause ) {
super( cause );
lineNumber = -1;
}
/**
* Create a wrapped exception needed.
*
* @param cause
* the wrapped cause
* @param lineNumber
* the line number in Java Code
* @return a new instance
*/
public static WasmException create( Throwable cause, int lineNumber ) {
WasmException wasmEx = create( cause );
if( wasmEx.lineNumber < 0 ) {
wasmEx.lineNumber = lineNumber;
}
return wasmEx;
}
/**
* Create a wrapped exception needed.
*
* @param cause
* the wrapped cause
* @return a new instance
*/
public static WasmException create( Throwable cause ) {
if( cause instanceof WasmException ) {
return (WasmException)cause;
}
return new WasmException( cause );
}
/**
* Get the line number in Java code on which the error occurred.
*
* @return the line number or -1
*/
public int getLineNumber() {
return lineNumber;
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
String str = super.toString();
if( lineNumber > 0 ) {
str += " at line: " + lineNumber;
}
return str;
}
}
/*
* Copyright 2017 Volker Berlin (i-net software)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.inetsoftware.jwebassembly;
/**
* If there any error occur on converting a class file to a WebAssembly module.
*
* @author Volker Berlin
*
*/
public class WasmException extends Exception {
private int lineNumber;
private String sourceFile;
/**
* Create a new instance.
*
* @param message
* the error message
* @param sourceFile
* the sourceFile of the Java code
* @param lineNumber
* the line number in Java Code
*/
public WasmException( String message, String sourceFile, int lineNumber ) {
super( message );
this.sourceFile = sourceFile;
this.lineNumber = lineNumber;
}
/**
* Create a new instance with a cause.
*
* @param cause
* the cause
*/
private WasmException( Throwable cause ) {
super( cause );
lineNumber = -1;
}
/**
* Create a wrapped exception needed.
*
* @param cause
* the wrapped cause
* @param sourceFile
* the sourceFile of the Java code
* @param lineNumber
* the line number in Java Code
* @return a new instance
*/
public static WasmException create( Throwable cause, String sourceFile, int lineNumber ) {
WasmException wasmEx = create( cause );
if( wasmEx.sourceFile == null ) {
wasmEx.sourceFile = sourceFile;
}
if( wasmEx.lineNumber < 0 ) {
wasmEx.lineNumber = lineNumber;
}
return wasmEx;
}
/**
* Create a wrapped exception needed.
*
* @param cause
* the wrapped cause
* @return a new instance
*/
public static WasmException create( Throwable cause ) {
if( cause instanceof WasmException ) {
return (WasmException)cause;
}
return new WasmException( cause );
}
/**
* Get the line number in Java code on which the error occurred.
*
* @return the line number or -1
*/
public int getLineNumber() {
return lineNumber;
}
/**
* {@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 String sourceFile;
/**
* 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
*/
public void write( ClassFile classFile ) throws IOException, WasmException {
sourceFile = classFile.getSourceFile();
if( sourceFile == null ) {
sourceFile = classFile.getThisClass().getName();
}
MethodInfo[] methods = classFile.getMethods();
for( MethodInfo method : methods ) {
Code code = method.getCode();
@ -201,7 +207,7 @@ public abstract class ModuleWriter implements Closeable {
javaType = signature.substring( i, i + 1 );
}
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
* @param lineNumber
* the current line number
* @param constantPool
* the constant pool of the the current class
* @throws WasmException
* if some Java code can't converted
*/
@ -278,14 +286,24 @@ public abstract class ModuleWriter implements Closeable {
writeReturn();
break;
default:
throw new WasmException( "Unimplemented byte code operation: " + op, lineNumber );
throw new WasmException( "Unimplemented byte code operation: " + op, sourceFile, lineNumber );
}
}
} 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 {
Class<?> clazz = value.getClass();
if( clazz == Integer.class ) {
@ -297,7 +315,7 @@ public abstract class ModuleWriter implements Closeable {
} else if( clazz == Double.class ) {
writeConstDouble( ((Double)value).doubleValue() );
} 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 );
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 );
if( load ) {