|
8 | 8 |
|
9 | 9 | HIGHS_LOG_FILE() = nothing |
10 | 10 |
|
11 | | -_trace_format_value(x) = unsafe_convert(Ptr{Cvoid}, x) |
| 11 | +function _trace_format_value(x) |
| 12 | + if x === C_NULL |
| 13 | + return "C_NULL" |
| 14 | + end |
| 15 | + return Base.unsafe_convert(Ptr{Cvoid}, x) |
| 16 | +end |
| 17 | +_trace_format_value(::Nothing) = "nothing" |
12 | 18 | _trace_format_value(x::Number) = x |
13 | 19 | _trace_format_value(x::Vector) = string(x) |
14 | 20 | _trace_format_value(x::AbstractString) = repr(x) |
| 21 | +_trace_format_value(x::Base.RefValue) = repr(x) |
15 | 22 |
|
16 | 23 | macro trace(def) |
17 | 24 | @assert Meta.isexpr(def, :function, 2) |
18 | 25 | fn_signature, fn_body = def.args |
19 | 26 | fn_name, fn_args = fn_signature.args[1], fn_signature.args[2:end] |
20 | 27 | io = gensym() |
21 | 28 | print_args = Expr(:block) |
22 | | - print_output_args = Expr(:block) |
23 | 29 | for arg in fn_args |
24 | 30 | input_arg = "$arg = " |
| 31 | + if arg == :highs |
| 32 | + input_arg = "# " * input_arg |
| 33 | + end |
25 | 34 | push!(print_args.args, :(println($io, $input_arg, $_trace_format_value($arg)))) |
26 | | - push!(print_output_args.args, :(println($io, "# ", $input_arg, $_trace_format_value($arg)))) |
27 | 35 | end |
28 | 36 | call = string("$fn_name(", join(fn_args, ", "), ")") |
29 | | - print_call = :(println($io, "ret = ", $call)) |
| 37 | + if fn_name == :Highs_create |
| 38 | + call = "highs = " * call |
| 39 | + end |
30 | 40 | new_body = quote |
31 | 41 | log_file = $HIGHS_LOG_FILE() |
32 | 42 | if log_file === nothing |
33 | 43 | $fn_body |
34 | 44 | else |
35 | 45 | open(log_file, "a") do $io |
36 | | - println($io, "# === New call ===") |
37 | 46 | $print_args |
38 | | - $print_call |
39 | | - result = (() -> $fn_body)() |
40 | | - println($io, "# ret = ", $_trace_format_value(result)) |
41 | | - $print_output_args |
42 | | - println($io) |
43 | | - result |
| 47 | + println($io, "ret = ", $call) |
| 48 | + end |
| 49 | + result = (() -> $fn_body)() |
| 50 | + open(log_file, "a") do $io |
| 51 | + println($io, "# ret = ", $_trace_format_value(result), "\n") |
44 | 52 | end |
| 53 | + result |
45 | 54 | end |
46 | 55 | end |
47 | 56 | return Expr(:function, fn_signature, new_body) |> esc |
|
0 commit comments