mirror of
https://github.com/i-net-software/JWebAssembly.git
synced 2025-03-15 02:44:47 +01:00
add sourceFile to WasmException
This commit is contained in:
parent
5acae6b103
commit
a3807680b7
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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 ) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user