Mercurial Hosting > luan
annotate src/luan/LuanException.java @ 1283:503bde9a7c80
add luan.require() and table.call()
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Fri, 21 Dec 2018 09:12:09 -0700 |
parents | 2531942abaf3 |
children | f41919741100 |
rev | line source |
---|---|
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
1 package luan; |
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
2 |
200
9fb218211763
add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
171
diff
changeset
|
3 import java.io.StringWriter; |
9fb218211763
add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
171
diff
changeset
|
4 import java.io.PrintWriter; |
1125
442abdfff437
include luan stack in LuanException.printStackTrace()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1122
diff
changeset
|
5 import java.io.PrintStream; |
682 | 6 import java.util.List; |
7 import java.util.ArrayList; | |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
8 |
200
9fb218211763
add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
171
diff
changeset
|
9 |
781
fbbdd369a13a
rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
10 public final class LuanException extends Exception implements LuanCloneable { |
689 | 11 private LuanTable table; |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
12 |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
645
diff
changeset
|
13 public LuanException(String msg,Throwable cause) { |
481
5d4a78c93383
luan errors are now tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
200
diff
changeset
|
14 super(msg,cause); |
42
786699c78837
implement try-catch
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
40
diff
changeset
|
15 } |
786699c78837
implement try-catch
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
40
diff
changeset
|
16 |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
645
diff
changeset
|
17 public LuanException(String msg) { |
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
645
diff
changeset
|
18 super(msg); |
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
645
diff
changeset
|
19 } |
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
645
diff
changeset
|
20 |
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
645
diff
changeset
|
21 public LuanException(Throwable cause) { |
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
645
diff
changeset
|
22 super(cause); |
689 | 23 } |
24 | |
784
6a7c6879158d
revert shallowClone()
Franklin Schmidt <fschmidt@gmail.com>
parents:
783
diff
changeset
|
25 @Override public LuanException shallowClone() { |
1282 | 26 return new LuanException(getMessage(),getCause()); |
689 | 27 } |
28 | |
781
fbbdd369a13a
rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
29 @Override public void deepenClone(LuanCloneable dc,LuanCloner cloner) { |
689 | 30 LuanException clone = (LuanException)dc; |
782
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
31 clone.table = (LuanTable)cloner.clone(table); |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
645
diff
changeset
|
32 } |
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
645
diff
changeset
|
33 |
1267 | 34 public LuanTable table(LuanState luan) { |
783 | 35 if( table==null ) { |
36 try { | |
1283
503bde9a7c80
add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1282
diff
changeset
|
37 LuanTable Boot = (LuanTable)luan.require("luan:Boot.luan"); |
503bde9a7c80
add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1282
diff
changeset
|
38 table = (LuanTable)Boot.call( "new_error_table", this ); |
503bde9a7c80
add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1282
diff
changeset
|
39 } catch(LuanException e) { |
783 | 40 throw new RuntimeException(e); |
41 } | |
42 } | |
689 | 43 return table; |
44 } | |
45 | |
481
5d4a78c93383
luan errors are now tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
200
diff
changeset
|
46 public void throwThis() throws LuanException { |
5d4a78c93383
luan errors are now tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
200
diff
changeset
|
47 throw this; |
5d4a78c93383
luan errors are now tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
200
diff
changeset
|
48 } |
5d4a78c93383
luan errors are now tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
200
diff
changeset
|
49 |
682 | 50 public String getJavaStackTraceString() { |
51 return getJavaStackTraceString(this); | |
52 } | |
53 | |
54 private static String getJavaStackTraceString(Throwable th) { | |
645 | 55 StringWriter sw = new StringWriter(); |
682 | 56 th.printStackTrace(new PrintWriter(sw)); |
645 | 57 return sw.toString(); |
37
8a57ebfdfd78
add JavaLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
2
diff
changeset
|
58 } |
481
5d4a78c93383
luan errors are now tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
200
diff
changeset
|
59 |
772
bffbef96ca6d
add public static methods to LuanException for building luan stack traces
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
60 public static List<StackTraceElement> justLuan(StackTraceElement[] orig) { |
682 | 61 List<StackTraceElement> list = new ArrayList<StackTraceElement>(); |
62 for( int i=0; i<orig.length; i++ ) { | |
63 StackTraceElement ste = orig[i]; | |
64 if( !ste.getClassName().startsWith("luan.impl.EXP") ) | |
65 continue; | |
66 list.add(ste); | |
67 if( !ste.getMethodName().equals("doCall") ) | |
68 i++; | |
69 } | |
70 return list; | |
71 } | |
72 | |
772
bffbef96ca6d
add public static methods to LuanException for building luan stack traces
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
73 public static String toString(StackTraceElement ste) { |
bffbef96ca6d
add public static methods to LuanException for building luan stack traces
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
74 StringBuilder sb = new StringBuilder(); |
bffbef96ca6d
add public static methods to LuanException for building luan stack traces
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
75 sb.append( ste.getFileName() ).append( " line " ).append( ste.getLineNumber() ); |
bffbef96ca6d
add public static methods to LuanException for building luan stack traces
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
76 String method = ste.getMethodName(); |
bffbef96ca6d
add public static methods to LuanException for building luan stack traces
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
77 if( !method.equals("doCall") ) |
bffbef96ca6d
add public static methods to LuanException for building luan stack traces
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
78 sb.append( " in function '" ).append( method.substring(1) ).append( "'" ); |
bffbef96ca6d
add public static methods to LuanException for building luan stack traces
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
79 return sb.toString(); |
bffbef96ca6d
add public static methods to LuanException for building luan stack traces
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
80 } |
bffbef96ca6d
add public static methods to LuanException for building luan stack traces
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
81 |
1125
442abdfff437
include luan stack in LuanException.printStackTrace()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1122
diff
changeset
|
82 private StringBuilder luanStackTrace() { |
682 | 83 StringBuilder sb = new StringBuilder(); |
84 sb.append( getMessage() ); | |
772
bffbef96ca6d
add public static methods to LuanException for building luan stack traces
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
85 for( StackTraceElement ste : justLuan(getStackTrace()) ) { |
bffbef96ca6d
add public static methods to LuanException for building luan stack traces
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
86 sb.append( "\n\t" ).append( toString(ste) ); |
682 | 87 } |
1125
442abdfff437
include luan stack in LuanException.printStackTrace()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1122
diff
changeset
|
88 return sb; |
442abdfff437
include luan stack in LuanException.printStackTrace()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1122
diff
changeset
|
89 } |
442abdfff437
include luan stack in LuanException.printStackTrace()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1122
diff
changeset
|
90 |
442abdfff437
include luan stack in LuanException.printStackTrace()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1122
diff
changeset
|
91 public String getLuanStackTraceString() { |
442abdfff437
include luan stack in LuanException.printStackTrace()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1122
diff
changeset
|
92 StringBuilder sb = luanStackTrace(); |
682 | 93 Throwable cause = getCause(); |
94 if( cause != null ) | |
95 sb.append( "\nCaused by: " ).append( getJavaStackTraceString(cause) ); | |
96 return sb.toString(); | |
97 } | |
98 | |
683 | 99 public static String currentSource() { |
100 LuanException ex = new LuanException("currentSource"); | |
772
bffbef96ca6d
add public static methods to LuanException for building luan stack traces
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
101 List<StackTraceElement> st = ex.justLuan(ex.getStackTrace()); |
683 | 102 return st.isEmpty() ? null : st.get(0).getFileName(); |
103 } | |
104 | |
1125
442abdfff437
include luan stack in LuanException.printStackTrace()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1122
diff
changeset
|
105 @Override public void printStackTrace(PrintStream s) { |
442abdfff437
include luan stack in LuanException.printStackTrace()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1122
diff
changeset
|
106 s.print("Luan: "); |
442abdfff437
include luan stack in LuanException.printStackTrace()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1122
diff
changeset
|
107 s.println(luanStackTrace()); |
442abdfff437
include luan stack in LuanException.printStackTrace()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1122
diff
changeset
|
108 s.print("Caused by: "); |
442abdfff437
include luan stack in LuanException.printStackTrace()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1122
diff
changeset
|
109 super.printStackTrace(s); |
442abdfff437
include luan stack in LuanException.printStackTrace()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1122
diff
changeset
|
110 } |
442abdfff437
include luan stack in LuanException.printStackTrace()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1122
diff
changeset
|
111 |
442abdfff437
include luan stack in LuanException.printStackTrace()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1122
diff
changeset
|
112 @Override public void printStackTrace(PrintWriter s) { |
442abdfff437
include luan stack in LuanException.printStackTrace()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1122
diff
changeset
|
113 s.print("Luan: "); |
442abdfff437
include luan stack in LuanException.printStackTrace()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1122
diff
changeset
|
114 s.println(luanStackTrace()); |
442abdfff437
include luan stack in LuanException.printStackTrace()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1122
diff
changeset
|
115 s.print("Caused by: "); |
442abdfff437
include luan stack in LuanException.printStackTrace()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1122
diff
changeset
|
116 super.printStackTrace(s); |
442abdfff437
include luan stack in LuanException.printStackTrace()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1122
diff
changeset
|
117 } |
442abdfff437
include luan stack in LuanException.printStackTrace()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1122
diff
changeset
|
118 |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
119 } |