d87ad9eb7e
The following call sequence is possible: C++ -> Lua -> C++ -> Lua -> C++ The first block of C++ is the Lean main function. The main function invokes the Lua interpreter. The Lua interpreter invokes a C++ Lean API. Then the Lean API invokes a callback implemented in Lua. The Lua callback invokes another Lean API. Now, suppose the Lean API throws an exception. We want the C++ exception to propagate over the mixed C++/Lua call stack. We use the clone/rethrow exception idiom to achieve this goal. Before this commit, the C++ exceptions were converted into strings using the method what(), and then they were propagated over the Lua stack using lua_error. A lua_error was then converted into a lua_exception when going back to C++. This solution was very unsatisfactory, since all C++ exceptions were being converted into a lua_exception, and consequently the structure of the exception was being lost. Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
14 lines
224 B
Text
14 lines
224 B
Text
Variables i j : Int
|
|
Variable p : Bool
|
|
|
|
(**
|
|
local env = get_environment()
|
|
ok, ex = pcall(
|
|
function()
|
|
print(parse_lean("i + p"))
|
|
end)
|
|
assert(not ok)
|
|
assert(is_exception(ex))
|
|
print(ex:what())
|
|
ex:rethrow()
|
|
**)
|