From a3807680b78612d163bb09bf1c696e6688390134 Mon Sep 17 00:00:00 2001 From: Volker Berlin Date: Sun, 9 Apr 2017 18:18:53 +0200 Subject: [PATCH] add sourceFile to WasmException --- .../jwebassembly/WasmException.java | 219 ++++++++++-------- .../jwebassembly/module/ModuleWriter.java | 28 ++- 2 files changed, 139 insertions(+), 108 deletions(-) diff --git a/src/de/inetsoftware/jwebassembly/WasmException.java b/src/de/inetsoftware/jwebassembly/WasmException.java index 18d6bca..e30805c 100644 --- a/src/de/inetsoftware/jwebassembly/WasmException.java +++ b/src/de/inetsoftware/jwebassembly/WasmException.java @@ -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; + } +} diff --git a/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java b/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java index 0f4490e..134f1ba 100644 --- a/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java @@ -44,6 +44,8 @@ public abstract class ModuleWriter implements Closeable { private ArrayList 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 ) {