Mercurial > pytave
annotate pytave.cc @ 113:6552040d6d4c
pytave.cc: Second attempt to make return type Python 2 or 3 compatible
author | Mike Miller <mtmiller@octave.org> |
---|---|
date | Sun, 20 Sep 2015 02:41:36 +0200 |
parents | f89a4eb2e864 |
children | 386772f4e12d |
rev | line source |
---|---|
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
1 /* |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
2 * Copyright 2008 David Grundberg, HÃ¥kan Fors Nilsson |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
3 * Copyright 2009 Jaroslav Hajek, VZLU Prague |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
4 * |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
5 * This file is part of Pytave. |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
6 * |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
7 * Pytave is free software: you can redistribute it and/or modify |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
8 * it under the terms of the GNU General Public License as published by |
6 | 9 * the Free Software Foundation, either version 3 of the License, or |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
10 * (at your option) any later version. |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
11 * |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
12 * Pytave is distributed in the hope that it will be useful, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
15 * GNU General Public License for more details. |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
16 * |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
17 * You should have received a copy of the GNU General Public License |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
18 * along with Pytave. If not, see <http://www.gnu.org/licenses/>. |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
19 */ |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
20 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
21 #include <boost/python.hpp> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
22 #include <boost/python/numeric.hpp> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
23 |
100
ff70627aa203
Undef HAVE_STAT and HAVE_FSTAT consistently through-out all files
David Grundberg <individ@acc.umu.se>
parents:
96
diff
changeset
|
24 /* Both boost::python and octave define HAVE_STAT and HAVE_FSTAT. Ideally, |
ff70627aa203
Undef HAVE_STAT and HAVE_FSTAT consistently through-out all files
David Grundberg <individ@acc.umu.se>
parents:
96
diff
changeset
|
25 they shouldn't expose their configuration in the header files, but they do. |
ff70627aa203
Undef HAVE_STAT and HAVE_FSTAT consistently through-out all files
David Grundberg <individ@acc.umu.se>
parents:
96
diff
changeset
|
26 This silences the compiler warning. */ |
ff70627aa203
Undef HAVE_STAT and HAVE_FSTAT consistently through-out all files
David Grundberg <individ@acc.umu.se>
parents:
96
diff
changeset
|
27 #undef HAVE_STAT |
ff70627aa203
Undef HAVE_STAT and HAVE_FSTAT consistently through-out all files
David Grundberg <individ@acc.umu.se>
parents:
96
diff
changeset
|
28 #undef HAVE_FSTAT |
ff70627aa203
Undef HAVE_STAT and HAVE_FSTAT consistently through-out all files
David Grundberg <individ@acc.umu.se>
parents:
96
diff
changeset
|
29 |
106
896fdc369789
Use latest Octave library API
Mike Miller <mtmiller@octave.org>
parents:
101
diff
changeset
|
30 #include <octave/config.h> |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
31 #include <octave/oct.h> |
74 | 32 |
18
7a5fbc15fc6e
Improved error messages from Octave.
David Grundberg <c04dgg@cs.umu.se>
parents:
14
diff
changeset
|
33 #include <octave/oct-map.h> |
13
dc8f6015f3e1
Use octave_main() to initiate Octave
David Grundberg <individ@acc.umu.se>
parents:
6
diff
changeset
|
34 #include <octave/octave.h> |
dc8f6015f3e1
Use octave_main() to initiate Octave
David Grundberg <individ@acc.umu.se>
parents:
6
diff
changeset
|
35 #include <octave/ov.h> |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
36 #include <octave/parse.h> |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
37 #include <octave/symtab.h> |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
38 #include <octave/toplev.h> |
74 | 39 #include <octave/utils.h> |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
40 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
41 #include <iostream> |
72 | 42 #ifdef HAVE_USELOCALE |
43 #include <locale.h> | |
44 #endif | |
74 | 45 #include <sstream> |
46 #include <sys/types.h> | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
47 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
48 #include "pytavedefs.h" |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
49 |
77
fb227ceacc65
ensure proper NumPy API init
Jaroslav Hajek <highegg@gmail.com>
parents:
74
diff
changeset
|
50 #define PYTAVE_DO_DECLARE_SYMBOL |
fb227ceacc65
ensure proper NumPy API init
Jaroslav Hajek <highegg@gmail.com>
parents:
74
diff
changeset
|
51 #include "arrayobjectdefs.h" |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
52 #include "exceptions.h" |
74 | 53 #include "octave_to_python.h" |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
54 #include "python_to_octave.h" |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
55 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
56 using namespace boost::python; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
57 |
72 | 58 namespace pytave { /* {{{ */ |
59 | |
60 #ifdef HAVE_USELOCALE | |
61 locale_t c_locale; | |
62 #endif | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
63 |
113
6552040d6d4c
pytave.cc: Second attempt to make return type Python 2 or 3 compatible
Mike Miller <mtmiller@octave.org>
parents:
111
diff
changeset
|
64 #if defined (PYTHON_ABI_VERSION) |
6552040d6d4c
pytave.cc: Second attempt to make return type Python 2 or 3 compatible
Mike Miller <mtmiller@octave.org>
parents:
111
diff
changeset
|
65 PyObject* |
6552040d6d4c
pytave.cc: Second attempt to make return type Python 2 or 3 compatible
Mike Miller <mtmiller@octave.org>
parents:
111
diff
changeset
|
66 #else |
6552040d6d4c
pytave.cc: Second attempt to make return type Python 2 or 3 compatible
Mike Miller <mtmiller@octave.org>
parents:
111
diff
changeset
|
67 void |
6552040d6d4c
pytave.cc: Second attempt to make return type Python 2 or 3 compatible
Mike Miller <mtmiller@octave.org>
parents:
111
diff
changeset
|
68 #endif |
6552040d6d4c
pytave.cc: Second attempt to make return type Python 2 or 3 compatible
Mike Miller <mtmiller@octave.org>
parents:
111
diff
changeset
|
69 init(bool silent = true) { |
72 | 70 #ifdef HAVE_USELOCALE |
71 c_locale = newlocale(LC_ALL, "C", 0); | |
72 #endif | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
73 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
74 if (!octave_error_exception::init() |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
75 || !value_convert_exception::init() |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
76 || !object_convert_exception::init() |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
77 || !octave_parse_exception::init() |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
78 || !variable_name_exception::init ()) { |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
79 PyErr_SetString(PyExc_ImportError, "_pytave: init failed"); |
113
6552040d6d4c
pytave.cc: Second attempt to make return type Python 2 or 3 compatible
Mike Miller <mtmiller@octave.org>
parents:
111
diff
changeset
|
80 #if defined (PYTHON_ABI_VERSION) |
6552040d6d4c
pytave.cc: Second attempt to make return type Python 2 or 3 compatible
Mike Miller <mtmiller@octave.org>
parents:
111
diff
changeset
|
81 return 0; |
6552040d6d4c
pytave.cc: Second attempt to make return type Python 2 or 3 compatible
Mike Miller <mtmiller@octave.org>
parents:
111
diff
changeset
|
82 #else |
6552040d6d4c
pytave.cc: Second attempt to make return type Python 2 or 3 compatible
Mike Miller <mtmiller@octave.org>
parents:
111
diff
changeset
|
83 return; |
6552040d6d4c
pytave.cc: Second attempt to make return type Python 2 or 3 compatible
Mike Miller <mtmiller@octave.org>
parents:
111
diff
changeset
|
84 #endif |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
85 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
86 |
13
dc8f6015f3e1
Use octave_main() to initiate Octave
David Grundberg <individ@acc.umu.se>
parents:
6
diff
changeset
|
87 // Initialize Octave. |
14
56254a2e18e3
Removed interactive check (did not work properly)
David Grundberg <individ@acc.umu.se>
parents:
13
diff
changeset
|
88 // Also print Octave startup message. |
26 | 89 const char* argv[] = {"octave", |
90 "--no-line-editing", | |
91 "--no-history", | |
96
66bd40c8d36e
Make Pytave compile against Octave 3.3+. Fix configuration bugs.
David Grundberg <individ@acc.umu.se>
parents:
93
diff
changeset
|
92 "--no-init-file", |
42
c0851ec35936
don't display Octave banner if not interactive run
Jaroslav Hajek <highegg@gmail.com>
parents:
40
diff
changeset
|
93 "--silent", |
26 | 94 NULL}; |
96
66bd40c8d36e
Make Pytave compile against Octave 3.3+. Fix configuration bugs.
David Grundberg <individ@acc.umu.se>
parents:
93
diff
changeset
|
95 int argc = 5; |
42
c0851ec35936
don't display Octave banner if not interactive run
Jaroslav Hajek <highegg@gmail.com>
parents:
40
diff
changeset
|
96 |
c0851ec35936
don't display Octave banner if not interactive run
Jaroslav Hajek <highegg@gmail.com>
parents:
40
diff
changeset
|
97 if (silent) { |
96
66bd40c8d36e
Make Pytave compile against Octave 3.3+. Fix configuration bugs.
David Grundberg <individ@acc.umu.se>
parents:
93
diff
changeset
|
98 argc--; |
66bd40c8d36e
Make Pytave compile against Octave 3.3+. Fix configuration bugs.
David Grundberg <individ@acc.umu.se>
parents:
93
diff
changeset
|
99 argv[argc] = 0; |
42
c0851ec35936
don't display Octave banner if not interactive run
Jaroslav Hajek <highegg@gmail.com>
parents:
40
diff
changeset
|
100 } |
c0851ec35936
don't display Octave banner if not interactive run
Jaroslav Hajek <highegg@gmail.com>
parents:
40
diff
changeset
|
101 |
72 | 102 #ifdef HAVE_USELOCALE |
103 // Set C locale | |
104 locale_t old_locale = uselocale(c_locale); | |
105 #endif | |
106 | |
42
c0851ec35936
don't display Octave banner if not interactive run
Jaroslav Hajek <highegg@gmail.com>
parents:
40
diff
changeset
|
107 octave_main(argc, const_cast<char**>(argv), 1); |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
108 |
72 | 109 #ifdef HAVE_USELOCALE |
110 // Reset locale | |
111 uselocale(old_locale); | |
112 #endif | |
113 | |
108 | 114 // Initialize NumPy Array |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
115 |
111
f89a4eb2e864
pytave::init: Make compatible with Python 3 module initialization
Mike Miller <mtmiller@octave.org>
parents:
108
diff
changeset
|
116 // Let boost use numpy |
f89a4eb2e864
pytave::init: Make compatible with Python 3 module initialization
Mike Miller <mtmiller@octave.org>
parents:
108
diff
changeset
|
117 numeric::array::set_module_and_type ("numpy", "ndarray"); |
f89a4eb2e864
pytave::init: Make compatible with Python 3 module initialization
Mike Miller <mtmiller@octave.org>
parents:
108
diff
changeset
|
118 |
13
dc8f6015f3e1
Use octave_main() to initiate Octave
David Grundberg <individ@acc.umu.se>
parents:
6
diff
changeset
|
119 // This is actually a macro that becomes a block expression. If an error |
108 | 120 // occurs, e.g. NumPy not installed, an exception is set. |
13
dc8f6015f3e1
Use octave_main() to initiate Octave
David Grundberg <individ@acc.umu.se>
parents:
6
diff
changeset
|
121 import_array() |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
122 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
123 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
124 boost::python::tuple get_exceptions() { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
125 return make_tuple(object(handle<PyObject>( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
126 octave_error_exception::excclass)), |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
127 object(handle<PyObject>( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
128 value_convert_exception::excclass)), |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
129 object(handle<PyObject>( |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
130 object_convert_exception::excclass)), |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
131 object(handle<PyObject>( |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
132 octave_parse_exception::excclass)), |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
133 object(handle<PyObject>( |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
134 variable_name_exception::excclass))); |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
135 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
136 |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
137 std::string make_error_message (const octave_map& map) { |
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
138 std::ostringstream exceptionmsg; |
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
139 std::string message = map(0).getfield("message").string_value(); |
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
140 std::string identifier = map(0).getfield("identifier").string_value(); |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
141 Cell stackCell = map.contents("stack"); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
142 |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
143 // Trim trailing new lines |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
144 message = message.substr(0, message.find_last_not_of("\r\n") + 1); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
145 |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
146 if (!stackCell.is_empty() && stackCell(0).is_map()) { |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
147 // The struct element is called "stack" but only contain |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
148 // info about the top frame. |
106
896fdc369789
Use latest Octave library API
Mike Miller <mtmiller@octave.org>
parents:
101
diff
changeset
|
149 octave_map stack = stackCell(0).map_value(); |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
150 std::string file = stack(0).getfield("file").string_value(); |
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
151 std::string name = stack(0).getfield("name").string_value(); |
106
896fdc369789
Use latest Octave library API
Mike Miller <mtmiller@octave.org>
parents:
101
diff
changeset
|
152 int line = stack(0).getfield("line").int_value(); |
896fdc369789
Use latest Octave library API
Mike Miller <mtmiller@octave.org>
parents:
101
diff
changeset
|
153 int column = stack(0).getfield("column").int_value(); |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
154 |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
155 exceptionmsg << file << ":" << line << ":" << column << ": "; |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
156 if (!name.empty()) |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
157 exceptionmsg << "in '" << name << "': "; |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
158 } |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
159 |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
160 if (!identifier.empty()) { |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
161 exceptionmsg << "(identifier: " << identifier << ") "; |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
162 } |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
163 exceptionmsg << message; |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
164 |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
165 return exceptionmsg.str (); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
166 } |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
167 |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
168 boost::python::tuple func_eval(const int nargout, |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
169 const std::string &funcname, |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
170 const boost::python::tuple &arguments) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
171 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
172 octave_value_list octave_args, retval; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
173 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
174 pytuple_to_octlist(octave_args, arguments); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
175 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
176 reset_error_handler(); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
177 buffer_error_messages++; |
65
11cff59bc932
Let Octave reread changed files
David Grundberg <individ@acc.umu.se>
parents:
59
diff
changeset
|
178 |
11cff59bc932
Let Octave reread changed files
David Grundberg <individ@acc.umu.se>
parents:
59
diff
changeset
|
179 // Updating the timestamp makes Octave reread changed files |
11cff59bc932
Let Octave reread changed files
David Grundberg <individ@acc.umu.se>
parents:
59
diff
changeset
|
180 Vlast_prompt_time.stamp(); |
72 | 181 |
182 #ifdef HAVE_USELOCALE | |
183 // Set C locale | |
184 locale_t old_locale = uselocale(c_locale); | |
185 #endif | |
186 | |
93
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
187 bool bad_alloc_state = false; |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
188 Py_BEGIN_ALLOW_THREADS |
93
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
189 try { |
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
190 retval = feval(funcname, octave_args, (nargout >= 0) ? nargout : 0); |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
191 } catch (std::bad_alloc) { |
93
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
192 bad_alloc_state = true; |
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
193 } |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
194 Py_END_ALLOW_THREADS |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
195 |
72 | 196 #ifdef HAVE_USELOCALE |
197 // Reset locale | |
198 uselocale(old_locale); | |
199 #endif | |
200 | |
93
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
201 if (bad_alloc_state) |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
202 throw std::bad_alloc (); // Translated to MemoryError by boost::python |
93
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
203 |
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
204 else if (error_state != 0) { |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
205 // error_state values: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
206 // -2 error without traceback |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
207 // -1 traceback |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
208 // 1 general error |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
209 int parse_status = 0; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
210 reset_error_handler(); |
18
7a5fbc15fc6e
Improved error messages from Octave.
David Grundberg <c04dgg@cs.umu.se>
parents:
14
diff
changeset
|
211 octave_value_list lasterror = eval_string("lasterror", |
7a5fbc15fc6e
Improved error messages from Octave.
David Grundberg <c04dgg@cs.umu.se>
parents:
14
diff
changeset
|
212 true, parse_status, 1); |
7a5fbc15fc6e
Improved error messages from Octave.
David Grundberg <c04dgg@cs.umu.se>
parents:
14
diff
changeset
|
213 if (!lasterror.empty() && lasterror(0).is_map()) { |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
214 std::string exceptionmsg = make_error_message(lasterror(0).map_value ()); |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
215 throw octave_error_exception(exceptionmsg); |
18
7a5fbc15fc6e
Improved error messages from Octave.
David Grundberg <c04dgg@cs.umu.se>
parents:
14
diff
changeset
|
216 } else |
7a5fbc15fc6e
Improved error messages from Octave.
David Grundberg <c04dgg@cs.umu.se>
parents:
14
diff
changeset
|
217 throw octave_error_exception("No Octave error available"); |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
218 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
219 |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
220 if (nargout >= 0) { |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
221 boost::python::tuple pytuple; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
222 octlist_to_pytuple(pytuple, retval); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
223 return pytuple; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
224 } else { |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
225 // Return () if nargout < 0. |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
226 return make_tuple(); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
227 } |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
228 } |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
229 |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
230 boost::python::tuple str_eval(int nargout, |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
231 const std::string &code, |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
232 bool silent) { |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
233 |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
234 octave_value_list retval; |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
235 int parse_status; |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
236 |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
237 reset_error_handler(); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
238 buffer_error_messages++; |
65
11cff59bc932
Let Octave reread changed files
David Grundberg <individ@acc.umu.se>
parents:
59
diff
changeset
|
239 |
11cff59bc932
Let Octave reread changed files
David Grundberg <individ@acc.umu.se>
parents:
59
diff
changeset
|
240 // Updating the timestamp makes Octave reread changed files |
11cff59bc932
Let Octave reread changed files
David Grundberg <individ@acc.umu.se>
parents:
59
diff
changeset
|
241 Vlast_prompt_time.stamp(); |
72 | 242 |
243 #ifdef HAVE_USELOCALE | |
244 // Set C locale | |
245 locale_t old_locale = uselocale(c_locale); | |
246 #endif | |
247 | |
93
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
248 bool bad_alloc_state = false; |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
249 Py_BEGIN_ALLOW_THREADS |
93
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
250 try { |
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
251 retval = eval_string(code, silent, parse_status, |
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
252 (nargout >= 0) ? nargout : 0); |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
253 } catch (std::bad_alloc) { |
93
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
254 bad_alloc_state = true; |
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
255 } |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
256 Py_END_ALLOW_THREADS |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
257 |
72 | 258 #ifdef HAVE_USELOCALE |
259 // Reset locale | |
260 uselocale(old_locale); | |
261 #endif | |
262 | |
93
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
263 if (bad_alloc_state) |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
264 throw std::bad_alloc (); // Translated to MemoryError by boost::python |
93
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
265 |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
266 if (parse_status != 0 || error_state != 0) { |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
267 // error_state values: |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
268 // -2 error without traceback |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
269 // -1 traceback |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
270 // 1 general error |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
271 int parse_status1 = 0; |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
272 reset_error_handler(); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
273 octave_value_list lasterror = eval_string("lasterror", |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
274 true, parse_status1, 1); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
275 if (!lasterror.empty() && lasterror(0).is_map()) { |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
276 std::string exceptionmsg = make_error_message (lasterror(0).map_value ()); |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
277 |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
278 if (parse_status != 0) |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
279 throw octave_parse_exception(exceptionmsg); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
280 else |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
281 throw octave_error_exception(exceptionmsg); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
282 } else |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
283 throw octave_error_exception("No Octave error available"); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
284 } |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
285 |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
286 if (nargout >= 0) { |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
287 boost::python::tuple pytuple; |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
288 octlist_to_pytuple(pytuple, retval); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
289 return pytuple; |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
290 } else { |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
291 // Return () if nargout < 0. |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
292 return make_tuple(); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
293 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
294 } |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
295 |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
296 boost::python::object getvar(const std::string& name, |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
297 bool global) { |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
298 octave_value val; |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
299 |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
300 if (global) |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
301 val = symbol_table::global_varval(name); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
302 else |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
303 val = symbol_table::varval(name); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
304 |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
305 if (val.is_undefined()) { |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
306 throw variable_name_exception (name + " not defined in current scope"); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
307 } |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
308 |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
309 boost::python::object pyobject; |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
310 octvalue_to_pyobj(pyobject, val); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
311 |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
312 return pyobject; |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
313 } |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
314 |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
315 void setvar(const std::string& name, |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
316 const boost::python::object& pyobject, |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
317 bool global) { |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
318 octave_value val; |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
319 |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
320 if (!valid_identifier(name)) { |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
321 throw variable_name_exception (name + " is not a valid identifier"); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
322 } |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
323 |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
324 pyobj_to_octvalue(val, pyobject); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
325 |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
326 if (global) |
106
896fdc369789
Use latest Octave library API
Mike Miller <mtmiller@octave.org>
parents:
101
diff
changeset
|
327 symbol_table::global_assign (name, val); |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
328 else |
106
896fdc369789
Use latest Octave library API
Mike Miller <mtmiller@octave.org>
parents:
101
diff
changeset
|
329 symbol_table::assign (name, val); |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
330 } |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
331 |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
332 bool isvar(const std::string& name, bool global) { |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
333 bool retval; |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
334 |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
335 if (global) |
58 | 336 retval = symbol_table::global_varval (name).is_defined (); |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
337 else |
58 | 338 retval = symbol_table::is_variable (name); |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
339 |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
340 return retval; |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
341 } |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
342 |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
343 void delvar(const std::string& name, bool global) { |
59
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
344 |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
345 if (global) { |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
346 |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
347 // FIXME: workaround a bug in Octave 3.2.0. |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
348 if (! symbol_table::is_global (name)) |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
349 symbol_table::insert (name).mark_global (); |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
350 |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
351 symbol_table::clear_global (name); |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
352 } else |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
353 symbol_table::clear_variable (name); |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
354 } |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
355 |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
356 int push_scope() { |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
357 symbol_table::scope_id local_scope = symbol_table::alloc_scope(); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
358 symbol_table::set_scope(local_scope); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
359 octave_call_stack::push(local_scope); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
360 return local_scope; |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
361 } |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
362 |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
363 void pop_scope () { |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
364 symbol_table::scope_id curr_scope = symbol_table::current_scope(); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
365 if (curr_scope != symbol_table::top_scope()) |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
366 { |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
367 symbol_table::erase_scope(curr_scope); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
368 octave_call_stack::pop(); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
369 } |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
370 } |
72 | 371 |
74 | 372 // Make sure Octave is correctly unloaded. We cannot depend on Octave running |
373 // at the (true) process atexit point, because at that time the Octave library | |
374 // might have been unloaded. | |
375 // | |
376 // At least that is the hypothesis, since Octave (in certain circumstances) | |
377 // cause a segmentation fault in do_octave_atexit called from the exit | |
378 // function. (One Octave call that causes this is "sleep(0)".) | |
379 void atexit () { | |
380 #ifdef HAVE_USELOCALE | |
381 // Set C locale | |
382 locale_t old_locale = uselocale(c_locale); | |
383 #endif | |
384 | |
385 Py_BEGIN_ALLOW_THREADS | |
106
896fdc369789
Use latest Octave library API
Mike Miller <mtmiller@octave.org>
parents:
101
diff
changeset
|
386 clean_up_and_exit (0); |
74 | 387 Py_END_ALLOW_THREADS |
388 | |
389 #ifdef HAVE_USELOCALE | |
390 // Reset locale | |
391 uselocale(old_locale); | |
392 #endif | |
393 } | |
394 | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
395 } /* namespace pytave }}} */ |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
396 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
397 BOOST_PYTHON_MODULE(_pytave) { /* {{{ */ |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
398 using namespace boost::python; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
399 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
400 def("init", pytave::init); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
401 def("feval", pytave::func_eval); |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
402 def("eval", pytave::str_eval); |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
403 def("getvar", pytave::getvar); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
404 def("setvar", pytave::setvar); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
405 def("isvar", pytave::isvar); |
59
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
406 def("delvar", pytave::delvar); |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
407 def("push_scope", pytave::push_scope); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
408 def("pop_scope", pytave::pop_scope); |
74 | 409 def("atexit", pytave::atexit); |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
410 def("get_exceptions", pytave::get_exceptions); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
411 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
412 register_exception_translator<pytave::pytave_exception>( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
413 pytave::pytave_exception::translate_exception); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
414 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
415 register_exception_translator<pytave::octave_error_exception>( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
416 pytave::octave_error_exception::translate_exception); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
417 |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
418 register_exception_translator<pytave::octave_parse_exception>( |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
419 pytave::octave_parse_exception::translate_exception); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
420 |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
421 register_exception_translator<pytave::object_convert_exception>( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
422 pytave::object_convert_exception::translate_exception); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
423 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
424 register_exception_translator<pytave::value_convert_exception>( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
425 pytave::value_convert_exception::translate_exception); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
426 |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
427 register_exception_translator<pytave::variable_name_exception>( |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
428 pytave::variable_name_exception::translate_exception); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
429 |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
430 } /* }}} */ |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
431 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
432 /* Emacs |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
433 * Local Variables: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
434 * fill-column:79 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
435 * coding:utf-8 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
436 * indent-tabs-mode:nil |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
437 * c-basic-offset:3 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
438 * End: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
439 * vim: set textwidth=79 expandtab shiftwidth=3 : |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
440 */ |