コミットメタ情報

リビジョン5eebe2a4407103dbc1060e9e625c2cb2c79b0f0c (tree)
日時2023-03-19 15:42:20
作者miyakawataku
コミッターmiyakawataku

ログメッセージ

replace invocations of CORE.reraise by Exception.raise

変更サマリ

差分

diff -r 8c4ddeb7f519 -r 5eebe2a44071 src/main/java/org/kink_lang/kink/ExceptionHelper.java
--- a/src/main/java/org/kink_lang/kink/ExceptionHelper.java Sat Mar 18 14:20:04 2023 +0900
+++ b/src/main/java/org/kink_lang/kink/ExceptionHelper.java Sun Mar 19 15:42:20 2023 +0900
@@ -53,7 +53,7 @@
5353 * @param traces the exception traces.
5454 * @return an exception val without chaining.
5555 */
56- public ExceptionVal of(String message, List<TraceVal> traces) {
56+ public ExceptionVal of(String message, List<? extends TraceVal> traces) {
5757 return new ExceptionVal(vm, message, traces);
5858 }
5959
diff -r 8c4ddeb7f519 -r 5eebe2a44071 src/main/java/org/kink_lang/kink/ExceptionVal.java
--- a/src/main/java/org/kink_lang/kink/ExceptionVal.java Sat Mar 18 14:20:04 2023 +0900
+++ b/src/main/java/org/kink_lang/kink/ExceptionVal.java Sun Mar 19 15:42:20 2023 +0900
@@ -26,7 +26,7 @@
2626 private ExceptionVal(
2727 Vm vm,
2828 String message,
29- List<TraceVal> traces,
29+ List<? extends TraceVal> traces,
3030 Optional<ExceptionVal> next) {
3131 super(vm);
3232 this.message = message;
@@ -37,14 +37,14 @@
3737 /**
3838 * Constructs an exception val without cahining.
3939 */
40- ExceptionVal(Vm vm, String message, List<TraceVal> traces) {
40+ ExceptionVal(Vm vm, String message, List<? extends TraceVal> traces) {
4141 this(vm, message, traces, Optional.empty());
4242 }
4343
4444 /**
4545 * Constructs an exception val with the next in the chain.
4646 */
47- ExceptionVal(Vm vm, String message, List<TraceVal> traces, ExceptionVal next) {
47+ ExceptionVal(Vm vm, String message, List<? extends TraceVal> traces, ExceptionVal next) {
4848 this(vm, message, traces, Optional.of(next));
4949 }
5050
diff -r 8c4ddeb7f519 -r 5eebe2a44071 src/main/java/org/kink_lang/kink/StackMachine.java
--- a/src/main/java/org/kink_lang/kink/StackMachine.java Sat Mar 18 14:20:04 2023 +0900
+++ b/src/main/java/org/kink_lang/kink/StackMachine.java Sun Mar 19 15:42:20 2023 +0900
@@ -39,11 +39,8 @@
3939 /** The dataStack. */
4040 private final DataStack dataStack;
4141
42- /** Handle of {@code reraise}. */
43- private final int reraiseHandle;
44-
45- /** Handle of {@code format}. */
46- private final int formatHandle;
42+ /** Handle of {@code raise}. */
43+ private final int raiseHandle;
4744
4845 /**
4946 * Constructs a stack machine.
@@ -52,8 +49,7 @@
5249 this.vm = vm;
5350 this.callStack = callStack;
5451 this.dataStack = dataStack;
55- this.reraiseHandle = vm.sym.getHandle("reraise");
56- this.formatHandle = vm.sym.getHandle("format");
52+ this.raiseHandle = vm.sym.getHandle("raise");
5753 }
5854
5955 /**
@@ -281,8 +277,8 @@
281277 /**
282278 * Returns traces on the specified trace.
283279 */
284- private List<Val> getTracesOn(Trace trace) {
285- List<Val> traces = new ArrayList<>(this.callStack.getTraces().stream()
280+ private List<TraceVal> getTracesOn(Trace trace) {
281+ List<TraceVal> traces = new ArrayList<>(this.callStack.getTraces().stream()
286282 .map(traceCse -> traceCse.toTraceVal(vm))
287283 .collect(Collectors.toList()));
288284 traces.add(trace.toTraceVal(this.vm));
@@ -290,20 +286,34 @@
290286 }
291287
292288 /**
293- * Makes a fun to reraise(template.format(...args)).
289+ * Fun to call exception(template.format(...args), traces).raise.
294290 */
295291 private FunVal makeRaiseFormatFun(
296- List<? extends Val> traces, String template, GraphNode... args) {
292+ List<? extends TraceVal> traces, String template, GraphNode... args) {
297293 return vm.fun.make("(raise-after-format)").action(c -> {
298- Val binding = vm.binding.newBinding();
299- return c.call(vm.graph.call(vm.graph.of(binding), reraiseHandle).args(
300- vm.graph.call(vm.graph.of(vm.str.of(template)), formatHandle).args(args),
301- vm.graph.of(vm.vec.of(traces))));
294+ var makeMessage = vm.fun.make().action(cc -> cc.call(vm.graph.format(template, args)));
295+ return c.call(makeMessage)
296+ .on((cc, message) -> cc.call(exceptionRaiseCaller(message, traces)));
302297 });
303298 }
304299
305300 /**
306- * Transitions to reraise(template.format(...args) traces).
301+ * Fun to call exception(message, traces).raise.
302+ */
303+ FunVal exceptionRaiseCaller(Val messageVal, List<? extends TraceVal> traces) {
304+ return vm.fun.make().action(c -> {
305+ if (! (messageVal instanceof StrVal messageStr)) {
306+ return c.call(vm.graph.raiseFormat(
307+ "Str.format must return str, but got {}",
308+ vm.graph.repr(messageVal)));
309+ }
310+ var exc = vm.exception.of(messageStr.getString(), traces);
311+ return c.call(exc, raiseHandle);
312+ });
313+ }
314+
315+ /**
316+ * Transitions to exception(template.format(...args) traces).new.
307317 */
308318 private void transitionToRaiseFormatOn(
309319 Trace trace, String template, GraphNode... args) {
diff -r 8c4ddeb7f519 -r 5eebe2a44071 src/main/resources/kink-mods/kink/javahost/JAVA_EXCEPTION.kn
--- a/src/main/resources/kink-mods/kink/javahost/JAVA_EXCEPTION.kn Sat Mar 18 14:20:04 2023 +0900
+++ b/src/main/resources/kink-mods/kink/javahost/JAVA_EXCEPTION.kn Sun Mar 19 15:42:20 2023 +0900
@@ -2,6 +2,7 @@
22 # Handles Java exceptions or throwables.
33
44 :JAVA.require_from('kink/javahost/')
5+:EXCEPTION.require_from('kink/')
56
67 :Throwable_class <- JAVA.class('java.lang.Throwable')
78 :Vm <- JAVA.wrap(new_val).get_field('vm')
@@ -17,7 +18,7 @@
1718 .format(Th.repr))
1819 :Msg = Th.call_method('toString' []).to_kink_str
1920 :Th_traces = traces_from_throwable(Th)
20- reraise(Msg (traces + Th_traces))
21+ EXCEPTION.new(Msg (traces + Th_traces)).raise
2122 }
2223
2324 ## JAVA_EXCEPTION.traces_from_throwable(Th)
diff -r 8c4ddeb7f519 -r 5eebe2a44071 src/test/java/org/kink_lang/kink/StackMachineTest.java
--- a/src/test/java/org/kink_lang/kink/StackMachineTest.java Sat Mar 18 14:20:04 2023 +0900
+++ b/src/test/java/org/kink_lang/kink/StackMachineTest.java Sun Mar 19 15:42:20 2023 +0900
@@ -862,6 +862,16 @@
862862 assertThat(msg).contains("something wrong", "RuntimeException");
863863 }
864864
865+ @Test
866+ public void exceptionRaiseCaller_checks_message_type() {
867+ var caller = stackMachine.exceptionRaiseCaller(vm.nada, List.of());
868+ var outcome = stackMachine.run(caller);
869+ var excMessage = outcome.accept(
870+ r -> { throw new AssertionError(); },
871+ exc -> exc.message());
872+ assertThat(excMessage).contains("nada").contains("format");
873+ }
874+
865875 // }}}1
866876
867877 // test CallContext#getArg {{{1
diff -r 8c4ddeb7f519 -r 5eebe2a44071 src/test/kink/CONTROL_test.kn
--- a/src/test/kink/CONTROL_test.kn Sat Mar 18 14:20:04 2023 +0900
+++ b/src/test/kink/CONTROL_test.kn Sun Mar 19 15:42:20 2023 +0900
@@ -1,6 +1,7 @@
11 #!/usr/bin/env kink
22
33 :CONTROL.require_from('kink/')
4+:EXCEPTION.require_from('kink/')
45 :KONT.require_from('kink/')
56 :TRACE.require_from('kink/')
67 :VEC.require_from('kink/')
@@ -111,7 +112,7 @@
111112 TRACE.new{(:C) C.sym('bar') }
112113 ]
113114 [:Msg :Traces] = CONTROL.try(
114- { reraise('bang!' Expected_traces) }
115+ { EXCEPTION.new('bang!' Expected_traces).raise }
115116 { raise('not here') }
116117 {(:Exc) [Exc.message Exc.traces] }
117118 )
diff -r 8c4ddeb7f519 -r 5eebe2a44071 src/test/kink/CORE_test.kn
--- a/src/test/kink/CORE_test.kn Sat Mar 18 14:20:04 2023 +0900
+++ b/src/test/kink/CORE_test.kn Sun Mar 19 15:42:20 2023 +0900
@@ -59,24 +59,6 @@
5959
6060 # }}}1
6161
62-TEST.group('CORE.reraise'){ # {{{1
63- TEST.test('alternative message for non-str argument'){
64- CONTROL.try(
65- { reraise(42 []) }
66- {(:Result) raise('expected an exception, but got {}'.format(Result.repr)) }
67- {(:Exc)
68- Exc.message == 'exception message is not str' || Exc.raise
69- }
70- )
71- }
72-
73- TEST.test('.repr'){
74- :Repr = $reraise.repr
75- Repr == 'Fun(_variant=CORE.reraise(Msg Traces))' || raise('got {}'.format(Repr.repr))
76- }
77-}
78-
79-# }}}1
8062 TEST.group('CORE.require'){ # {{{1
8163 :save_mod_paths <- {(:thunk)
8264 CONTROL.with_on_exit{(:on_exit)
旧リポジトリブラウザで表示