]> git.siccegge.de Git - frida/frida.git/blob - src/bindings/Guile.cxx
57d32bdd8009d02cd8fe2fad1762cf08bb5cfbbc
[frida/frida.git] / src / bindings / Guile.cxx
1 #include "Guile.hxx"
2
3 namespace {
4 SCM handler (void*, SCM tag, SCM throw_args) {
5 scm_handle_by_message_noexit ((void*)"foo", tag, throw_args);
6 return SCM_BOOL_F;
7 }
8 }
9
10 GuileInterpreter::GuileInterpreter() {
11 scm_init_guile();
12
13 scm_internal_catch(SCM_BOOL_T,
14 (SCM (*)(void *))scm_c_eval_string,
15 (void*)"(use-modules (system repl server))",
16 handler, NULL);
17 scm_internal_catch(SCM_BOOL_T,
18 (SCM (*)(void *))scm_c_eval_string,
19 (void*)"(spawn-server)",
20 handler, NULL);
21 scm_internal_catch(SCM_BOOL_T,
22 (SCM (*)(void *))scm_c_eval_string,
23 (void*)"(load-extension \"libfrida-guile\" \"scm_init_frida_module\")",
24 handler, NULL);
25
26 guile_output_port = scm_open_output_string();
27 guile_error_port = scm_open_output_string();
28 scm_set_current_output_port(guile_output_port);
29 scm_set_current_error_port(guile_error_port);
30 }
31
32 int GuileInterpreter::evaluate(const std::string& command,
33 std::ostream& stdout,
34 std::ostream& stderr,
35 std::string& result) {
36
37 SCM result_obj = scm_internal_catch(SCM_BOOL_T,
38 (SCM (*)(void *))scm_c_eval_string,
39 (void*)command.c_str(),
40 handler, NULL);
41
42 SCM result_str = scm_object_to_string(result_obj, SCM_UNDEFINED);
43
44 SCM output = scm_get_output_string(guile_output_port);
45 stdout << scm_to_locale_string(output);
46
47 output = scm_get_output_string(guile_error_port);
48 stderr << scm_to_locale_string(output);
49
50 result = scm_to_locale_string(result_str);
51
52 scm_truncate_file(guile_output_port, scm_from_uint16(0));
53 scm_truncate_file(guile_error_port, scm_from_uint16(0));
54
55 return 0;
56 }