mirror of
https://github.com/i-net-software/JWebAssembly.git
synced 2025-03-25 07:27:52 +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)
|
* 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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 ) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user