Mercurial Hosting > luan
changeset 682:0c334975d526
finish stack trace
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 14 Apr 2016 21:41:40 -0600 |
parents | f1c935be546d |
children | 67dd1449e354 |
files | core/src/luan/LuanException.java core/src/luan/impl/LuanParser.java |
diffstat | 2 files changed, 70 insertions(+), 37 deletions(-) [+] |
line wrap: on
line diff
--- a/core/src/luan/LuanException.java Thu Apr 14 20:10:38 2016 -0600 +++ b/core/src/luan/LuanException.java Thu Apr 14 21:41:40 2016 -0600 @@ -2,27 +2,26 @@ import java.io.StringWriter; import java.io.PrintWriter; +import java.util.List; +import java.util.ArrayList; -public final class LuanException extends Exception implements DeepCloneable { - private LuanTable table = new LuanTable(); +public final class LuanException extends Exception { public LuanException(String msg,Throwable cause) { super(msg,cause); - setTable(); } public LuanException(String msg) { super(msg); - setTable(); } public LuanException(Throwable cause) { super(cause); - setTable(); } - private void setTable() { + public LuanTable table() { + LuanTable table = new LuanTable(); table.rawPut( "java", this ); /* for( StackTraceElement ste : luan.stackTrace ) { @@ -42,24 +41,15 @@ table.rawPut( "throw", new LuanJavaFunction( LuanException.class.getMethod( "throwThis" ), this ) ); + table.rawPut( "get_java_stack_trace_string", new LuanJavaFunction( + LuanException.class.getMethod( "getJavaStackTraceString" ), this + ) ); metatable.rawPut( "__to_string", new LuanJavaFunction( - LuanException.class.getMethod( "__to_string", LuanTable.class ), null + LuanException.class.getMethod( "getFullMessage" ), this ) ); } catch(NoSuchMethodException e) { throw new RuntimeException(e); } - } - - @Override public LuanException shallowClone() { - return new LuanException(getMessage(),getCause()); - } - - @Override public void deepenClone(DeepCloneable dc,DeepCloner cloner) { - LuanException clone = (LuanException)dc; - clone.table = (LuanTable)cloner.get(table); - } - - public LuanTable table() { return table; } @@ -68,10 +58,7 @@ } public String getFullMessage() { - return __to_string(table); - } - - public static String __to_string(LuanTable table) { + return getLuanStackTraceString(); /* StringBuilder buf = new StringBuilder(); @@ -97,10 +84,45 @@ return buf.toString(); */ - LuanException ex = (LuanException)table.rawGet("java"); + } + + public String getJavaStackTraceString() { + return getJavaStackTraceString(this); + } + + private static String getJavaStackTraceString(Throwable th) { StringWriter sw = new StringWriter(); - ex.printStackTrace(new PrintWriter(sw)); + th.printStackTrace(new PrintWriter(sw)); return sw.toString(); } + private List<StackTraceElement> justLuan() { + List<StackTraceElement> list = new ArrayList<StackTraceElement>(); + StackTraceElement[] orig = getStackTrace(); + for( int i=0; i<orig.length; i++ ) { + StackTraceElement ste = orig[i]; + if( !ste.getClassName().startsWith("luan.impl.EXP") ) + continue; + list.add(ste); + if( !ste.getMethodName().equals("doCall") ) + i++; + } + return list; + } + + public String getLuanStackTraceString() { + StringBuilder sb = new StringBuilder(); + sb.append( getMessage() ); + for( StackTraceElement ste : justLuan() ) { + sb.append( "\n\t" ).append( ste.getFileName() ).append( " line " ).append( ste.getLineNumber() ); + String method = ste.getMethodName(); + if( !method.equals("doCall") ) + sb.append( " in function '" ).append( method.substring(1) ).append( "'" ); + } + Throwable cause = getCause(); + if( cause != null ) + sb.append( "\nCaused by: " ).append( getJavaStackTraceString(cause) ); + return sb.toString(); + } + }
--- a/core/src/luan/impl/LuanParser.java Thu Apr 14 20:10:38 2016 -0600 +++ b/core/src/luan/impl/LuanParser.java Thu Apr 14 21:41:40 2016 -0600 @@ -1098,31 +1098,44 @@ parser.begin(); if( !parser.match('{') ) return parser.failure(null); + Expr tblExp = new Expr(Val.SINGLE,false); + tblExp.add( "LuanImpl.table(" ); + Expr lastExp = tblExp; + List<Expr> builder = new ArrayList<Expr>(); +/* Spaces(); - List<Expr> builder = new ArrayList<Expr>(); Field(builder); while( FieldSep() ) { Spaces(); Field(builder); } +*/ + do { + Spaces(); lastExp.addNewLines(); + Expr exp = Field(); + if( exp != null ) { + builder.add(exp); + lastExp = exp; + Spaces(); lastExp.addNewLines(); + } + } while( FieldSep() ); Expr exp = TemplateExpressions(In.NOTHING); if( exp != null ) builder.add(exp); if( !parser.match('}') ) throw parser.exception("Expected table element or '}'"); + tblExp.addAll( expString(builder).array() ); + tblExp.add( ")" ); Spaces(); - exp = new Expr(Val.SINGLE,false); - exp.add( "LuanImpl.table(" ); - exp.addAll( expString(builder).array() ); - exp.add( ")" ); - return parser.success( exp ); + tblExp.addNewLines(); + return parser.success( tblExp ); } private boolean FieldSep() throws ParseException { return parser.anyOf(",;") || EndOfLine(); } - private boolean Field(List<Expr> builder) throws ParseException { + private Expr Field() throws ParseException { parser.begin(); Expr exp = SubExpr(In.NOTHING); if( exp==null ) @@ -1136,16 +1149,14 @@ newExp.add( "," ); newExp.addAll( val ); newExp.add( ")" ); - builder.add( newExp ); - return parser.success(); + return parser.success(newExp); } parser.rollback(); Expr exprs = ExprZ(In.NOTHING); if( exprs != null ) { - builder.add(exprs); - return parser.success(); + return parser.success(exprs); } - return parser.failure(); + return parser.failure(null); } private Expr VarExp(In in) throws ParseException {