runtime icon indicating copy to clipboard operation
runtime copied to clipboard

Prevent crash when `compile` fails in JIT

Open PearCoding opened this issue 1 year ago • 7 comments

Simple fix to prevent thorin.opt() being called when ::compile fails due to simple syntax errors and other issues. This is mandatory for proper safe guards, error recovery and the simple fact that syntax errors are simple to make :D

PearCoding avatar Jan 31 '25 09:01 PearCoding

Doesn't error call std::abort, which causes program termination?

richardmembarth avatar Jan 31 '25 10:01 richardmembarth

Yes, thats why the new commit :P

PearCoding avatar Jan 31 '25 10:01 PearCoding

Isn't it artic that continues after syntax errors have been detected?

richardmembarth avatar Jan 31 '25 10:01 richardmembarth

It does continue parsing and does not error recovery from that. artic produces a spill of unrelated syntax errors outputs, but it does not crash.

E.g., (constructed case) let camera_dir = ERROR registry::get_global_parameter_vec3("__camera_dir", make_vec3(0,0,1));

will produce a wall of errors:

error: expected ';', got 'registry'
 in jit_531b4d2e98f8ff0e(15855, 27 - 15855, 35)
       |
 15855 |    let camera_dir  = ERROR registry::get_global_parameter_vec3("__camera_dir", make_vec3(0,0,1));
       |                          ^^^^^^^^

error: expected '}', got '::'
 in jit_531b4d2e98f8ff0e(15855, 35 - 15855, 37)
       |
 15855 |    let camera_dir  = ERROR registry::get_global_parameter_vec3("__camera_dir", make_vec3(0,0,1));
       |                                  ^^

error: expected declaration, got 'get_global_parameter_vec3'
 in jit_531b4d2e98f8ff0e(15855, 37 - 15855, 62)
       |
 15855 |    let camera_dir  = ERROR registry::get_global_parameter_vec3("__camera_dir", make_vec3(0,0,1));
       |                                    ^^^^^^^^^^^^^^^^^^^^^^^^^

error: expected declaration, got '('
 in jit_531b4d2e98f8ff0e(15855, 62 - 15855, 63)
       |
 15855 |    let camera_dir  = ERROR registry::get_global_parameter_vec3("__camera_dir", make_vec3(0,0,1));
       |                                                             ^

error: expected declaration, got '"__camera_dir"'
 in jit_531b4d2e98f8ff0e(15855, 63 - 15855, 77)
       |
 15855 |    let camera_dir  = ERROR registry::get_global_parameter_vec3("__camera_dir", make_vec3(0,0,1));
       |                                                              ^^^^^^^^^^^^^^

error: expected declaration, got ','
 in jit_531b4d2e98f8ff0e(15855, 77 - 15855, 78)
       |
 15855 |    let camera_dir  = ERROR registry::get_global_parameter_vec3("__camera_dir", make_vec3(0,0,1));
       |                                                                            ^

error: expected declaration, got 'make_vec3'
 in jit_531b4d2e98f8ff0e(15855, 79 - 15855, 88)
       |
 15855 |    let camera_dir  = ERROR registry::get_global_parameter_vec3("__camera_dir", make_vec3(0,0,1));
       |                                                                              ^^^^^^^^^

error: expected declaration, got '('
 in jit_531b4d2e98f8ff0e(15855, 88 - 15855, 89)
       |
 15855 |    let camera_dir  = ERROR registry::get_global_parameter_vec3("__camera_dir", make_vec3(0,0,1));
       |                                                                                       ^

error: expected declaration, got '0'
 in jit_531b4d2e98f8ff0e(15855, 89 - 15855, 90)
       |
 15855 |    let camera_dir  = ERROR registry::get_global_parameter_vec3("__camera_dir", make_vec3(0,0,1));
       |                                                                                        ^

error: expected declaration, got ','
 in jit_531b4d2e98f8ff0e(15855, 90 - 15855, 91)
       |
 15855 |    let camera_dir  = ERROR registry::get_global_parameter_vec3("__camera_dir", make_vec3(0,0,1));
       |                                                                                         ^

error: expected declaration, got '0'
 in jit_531b4d2e98f8ff0e(15855, 91 - 15855, 92)
       |
 15855 |    let camera_dir  = ERROR registry::get_global_parameter_vec3("__camera_dir", make_vec3(0,0,1));
       |                                                                                          ^

error: expected declaration, got ','
 in jit_531b4d2e98f8ff0e(15855, 92 - 15855, 93)
       |
 15855 |    let camera_dir  = ERROR registry::get_global_parameter_vec3("__camera_dir", make_vec3(0,0,1));
       |                                                                                           ^

error: expected declaration, got '1'
 in jit_531b4d2e98f8ff0e(15855, 93 - 15855, 94)
       |
 15855 |    let camera_dir  = ERROR registry::get_global_parameter_vec3("__camera_dir", make_vec3(0,0,1));
       |                                                                                            ^

error: expected declaration, got ')'
 in jit_531b4d2e98f8ff0e(15855, 94 - 15855, 95)
       |
 15855 |    let camera_dir  = ERROR registry::get_global_parameter_vec3("__camera_dir", make_vec3(0,0,1));
       |                                                                                             ^

error: expected declaration, got ')'
 in jit_531b4d2e98f8ff0e(15855, 95 - 15855, 96)
       |
 15855 |    let camera_dir  = ERROR registry::get_global_parameter_vec3("__camera_dir", make_vec3(0,0,1));
       |                                                                                              ^

error: expected declaration, got ';'
 in jit_531b4d2e98f8ff0e(15855, 96 - 15855, 97)
       |
 15855 |    let camera_dir  = ERROR registry::get_global_parameter_vec3("__camera_dir", make_vec3(0,0,1));

PearCoding avatar Jan 31 '25 10:01 PearCoding

I think that is an issue for another day, however :D

PearCoding avatar Jan 31 '25 10:01 PearCoding

Yes, you can pass an option to artic to limit the number of errors.

Anyways, shouldn't the program abort when error is called instead of continuing executing (calling opt)?

richardmembarth avatar Jan 31 '25 10:01 richardmembarth

It definitely should not call opt. For the standalone case it can "safely" abort, but not in the case of JIT, which might be part of a bigger application.

In some cases (Jupyter Notebooks) abort also crashes the kernel and produces no output whatsoever. The IO issue might be related to Python, but it is still annoying.

On my opinion error() should not abort at all and try to return safely, but that is another issue for another day.

PearCoding avatar Jan 31 '25 10:01 PearCoding