Mercurial > pytave
annotate pytave.cc @ 101:0c19ed1ce349
Remove Numeric array support. Use numpy exclusively.
author | David Grundberg <individ@acc.umu.se> |
---|---|
date | Mon, 09 Apr 2012 21:22:32 +0200 |
parents | ff70627aa203 |
children | 896fdc369789 |
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 |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
30 #include <octave/oct.h> |
74 | 31 |
18
7a5fbc15fc6e
Improved error messages from Octave.
David Grundberg <c04dgg@cs.umu.se>
parents:
14
diff
changeset
|
32 #include <octave/oct-map.h> |
13
dc8f6015f3e1
Use octave_main() to initiate Octave
David Grundberg <individ@acc.umu.se>
parents:
6
diff
changeset
|
33 #include <octave/octave.h> |
dc8f6015f3e1
Use octave_main() to initiate Octave
David Grundberg <individ@acc.umu.se>
parents:
6
diff
changeset
|
34 #include <octave/ov.h> |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
35 #include <octave/parse.h> |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
36 #include <octave/symtab.h> |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
37 #include <octave/toplev.h> |
74 | 38 #include <octave/utils.h> |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
39 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
40 #include <iostream> |
72 | 41 #ifdef HAVE_USELOCALE |
42 #include <locale.h> | |
43 #endif | |
74 | 44 #include <sstream> |
45 #include <sys/types.h> | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
46 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
47 #include "pytavedefs.h" |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
48 |
77
fb227ceacc65
ensure proper NumPy API init
Jaroslav Hajek <highegg@gmail.com>
parents:
74
diff
changeset
|
49 #define PYTAVE_DO_DECLARE_SYMBOL |
fb227ceacc65
ensure proper NumPy API init
Jaroslav Hajek <highegg@gmail.com>
parents:
74
diff
changeset
|
50 #include "arrayobjectdefs.h" |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
51 #include "exceptions.h" |
74 | 52 #include "octave_to_python.h" |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
53 #include "python_to_octave.h" |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
54 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
55 using namespace boost::python; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
56 using namespace std; |
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 |
42
c0851ec35936
don't display Octave banner if not interactive run
Jaroslav Hajek <highegg@gmail.com>
parents:
40
diff
changeset
|
64 void init(bool silent = true) { |
72 | 65 #ifdef HAVE_USELOCALE |
66 c_locale = newlocale(LC_ALL, "C", 0); | |
67 #endif | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
68 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
69 if (!octave_error_exception::init() |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
70 || !value_convert_exception::init() |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
71 || !object_convert_exception::init() |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
72 || !octave_parse_exception::init() |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
73 || !variable_name_exception::init ()) { |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
74 PyErr_SetString(PyExc_ImportError, "_pytave: init failed"); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
75 return; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
76 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
77 |
13
dc8f6015f3e1
Use octave_main() to initiate Octave
David Grundberg <individ@acc.umu.se>
parents:
6
diff
changeset
|
78 // Initialize Octave. |
14
56254a2e18e3
Removed interactive check (did not work properly)
David Grundberg <individ@acc.umu.se>
parents:
13
diff
changeset
|
79 // Also print Octave startup message. |
26 | 80 const char* argv[] = {"octave", |
81 "--no-line-editing", | |
82 "--no-history", | |
96
66bd40c8d36e
Make Pytave compile against Octave 3.3+. Fix configuration bugs.
David Grundberg <individ@acc.umu.se>
parents:
93
diff
changeset
|
83 "--no-init-file", |
42
c0851ec35936
don't display Octave banner if not interactive run
Jaroslav Hajek <highegg@gmail.com>
parents:
40
diff
changeset
|
84 "--silent", |
26 | 85 NULL}; |
96
66bd40c8d36e
Make Pytave compile against Octave 3.3+. Fix configuration bugs.
David Grundberg <individ@acc.umu.se>
parents:
93
diff
changeset
|
86 int argc = 5; |
42
c0851ec35936
don't display Octave banner if not interactive run
Jaroslav Hajek <highegg@gmail.com>
parents:
40
diff
changeset
|
87 |
c0851ec35936
don't display Octave banner if not interactive run
Jaroslav Hajek <highegg@gmail.com>
parents:
40
diff
changeset
|
88 if (silent) { |
96
66bd40c8d36e
Make Pytave compile against Octave 3.3+. Fix configuration bugs.
David Grundberg <individ@acc.umu.se>
parents:
93
diff
changeset
|
89 argc--; |
66bd40c8d36e
Make Pytave compile against Octave 3.3+. Fix configuration bugs.
David Grundberg <individ@acc.umu.se>
parents:
93
diff
changeset
|
90 argv[argc] = 0; |
42
c0851ec35936
don't display Octave banner if not interactive run
Jaroslav Hajek <highegg@gmail.com>
parents:
40
diff
changeset
|
91 } |
c0851ec35936
don't display Octave banner if not interactive run
Jaroslav Hajek <highegg@gmail.com>
parents:
40
diff
changeset
|
92 |
72 | 93 #ifdef HAVE_USELOCALE |
94 // Set C locale | |
95 locale_t old_locale = uselocale(c_locale); | |
96 #endif | |
97 | |
42
c0851ec35936
don't display Octave banner if not interactive run
Jaroslav Hajek <highegg@gmail.com>
parents:
40
diff
changeset
|
98 octave_main(argc, const_cast<char**>(argv), 1); |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
99 |
72 | 100 #ifdef HAVE_USELOCALE |
101 // Reset locale | |
102 uselocale(old_locale); | |
103 #endif | |
104 | |
13
dc8f6015f3e1
Use octave_main() to initiate Octave
David Grundberg <individ@acc.umu.se>
parents:
6
diff
changeset
|
105 // Initialize Python Numeric Array |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
106 |
13
dc8f6015f3e1
Use octave_main() to initiate Octave
David Grundberg <individ@acc.umu.se>
parents:
6
diff
changeset
|
107 // This is actually a macro that becomes a block expression. If an error |
dc8f6015f3e1
Use octave_main() to initiate Octave
David Grundberg <individ@acc.umu.se>
parents:
6
diff
changeset
|
108 // occurs, e.g. Numeric Array not installed, an exception is set. |
dc8f6015f3e1
Use octave_main() to initiate Octave
David Grundberg <individ@acc.umu.se>
parents:
6
diff
changeset
|
109 import_array() |
101
0c19ed1ce349
Remove Numeric array support. Use numpy exclusively.
David Grundberg <individ@acc.umu.se>
parents:
100
diff
changeset
|
110 |
83
8145ecfecfb9
Configuration changes. Detect numpy in ./configure.
David Grundberg <c04dgg@cs.umu.se>
parents:
74
diff
changeset
|
111 // Let boost use numpy |
70
e3de0f6f1552
experimental NumPy support
Jaroslav Hajek <highegg@gmail.com>
parents:
65
diff
changeset
|
112 numeric::array::set_module_and_type ("numpy", "ndarray"); |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
113 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
114 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
115 boost::python::tuple get_exceptions() { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
116 return make_tuple(object(handle<PyObject>( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
117 octave_error_exception::excclass)), |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
118 object(handle<PyObject>( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
119 value_convert_exception::excclass)), |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
120 object(handle<PyObject>( |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
121 object_convert_exception::excclass)), |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
122 object(handle<PyObject>( |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
123 octave_parse_exception::excclass)), |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
124 object(handle<PyObject>( |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
125 variable_name_exception::excclass))); |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
126 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
127 |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
128 string make_error_message (const Octave_map& map) { |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
129 ostringstream exceptionmsg; |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
130 string message = map.stringfield("message", ""); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
131 string identifier = map.stringfield("identifier", ""); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
132 Cell stackCell = map.contents("stack"); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
133 |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
134 // Trim trailing new lines |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
135 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
|
136 |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
137 if (!stackCell.is_empty() && stackCell(0).is_map()) { |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
138 // The struct element is called "stack" but only contain |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
139 // info about the top frame. |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
140 Octave_map stack = stackCell(0).map_value(); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
141 string file = stack.stringfield("file", ""); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
142 string name = stack.stringfield("name", ""); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
143 int line = stack.intfield("line", 1); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
144 int column = stack.intfield("column", 2); |
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 exceptionmsg << file << ":" << line << ":" << column << ": "; |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
147 if (!name.empty()) |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
148 exceptionmsg << "in '" << name << "': "; |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
149 } |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
150 |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
151 if (!identifier.empty()) { |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
152 exceptionmsg << "(identifier: " << identifier << ") "; |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
153 } |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
154 exceptionmsg << message; |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
155 |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
156 return exceptionmsg.str (); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
157 } |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
158 |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
159 boost::python::tuple func_eval(const int nargout, |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
160 const string &funcname, |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
161 const boost::python::tuple &arguments) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
162 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
163 octave_value_list octave_args, retval; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
164 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
165 pytuple_to_octlist(octave_args, arguments); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
166 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
167 reset_error_handler(); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
168 buffer_error_messages++; |
65
11cff59bc932
Let Octave reread changed files
David Grundberg <individ@acc.umu.se>
parents:
59
diff
changeset
|
169 |
11cff59bc932
Let Octave reread changed files
David Grundberg <individ@acc.umu.se>
parents:
59
diff
changeset
|
170 // Updating the timestamp makes Octave reread changed files |
11cff59bc932
Let Octave reread changed files
David Grundberg <individ@acc.umu.se>
parents:
59
diff
changeset
|
171 Vlast_prompt_time.stamp(); |
72 | 172 |
173 #ifdef HAVE_USELOCALE | |
174 // Set C locale | |
175 locale_t old_locale = uselocale(c_locale); | |
176 #endif | |
177 | |
93
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
178 bool bad_alloc_state = false; |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
179 Py_BEGIN_ALLOW_THREADS |
93
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
180 try { |
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
181 retval = feval(funcname, octave_args, (nargout >= 0) ? nargout : 0); |
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
182 } catch (bad_alloc) { |
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
183 bad_alloc_state = true; |
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
184 } |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
185 Py_END_ALLOW_THREADS |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
186 |
72 | 187 #ifdef HAVE_USELOCALE |
188 // Reset locale | |
189 uselocale(old_locale); | |
190 #endif | |
191 | |
93
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
192 if (bad_alloc_state) |
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
193 throw bad_alloc (); // Translated to MemoryError by boost::python |
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
194 |
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
195 else if (error_state != 0) { |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
196 // error_state values: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
197 // -2 error without traceback |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
198 // -1 traceback |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
199 // 1 general error |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
200 int parse_status = 0; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
201 reset_error_handler(); |
18
7a5fbc15fc6e
Improved error messages from Octave.
David Grundberg <c04dgg@cs.umu.se>
parents:
14
diff
changeset
|
202 octave_value_list lasterror = eval_string("lasterror", |
7a5fbc15fc6e
Improved error messages from Octave.
David Grundberg <c04dgg@cs.umu.se>
parents:
14
diff
changeset
|
203 true, parse_status, 1); |
7a5fbc15fc6e
Improved error messages from Octave.
David Grundberg <c04dgg@cs.umu.se>
parents:
14
diff
changeset
|
204 if (!lasterror.empty() && lasterror(0).is_map()) { |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
205 string exceptionmsg = make_error_message(lasterror(0).map_value ()); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
206 throw octave_error_exception(exceptionmsg); |
18
7a5fbc15fc6e
Improved error messages from Octave.
David Grundberg <c04dgg@cs.umu.se>
parents:
14
diff
changeset
|
207 } else |
7a5fbc15fc6e
Improved error messages from Octave.
David Grundberg <c04dgg@cs.umu.se>
parents:
14
diff
changeset
|
208 throw octave_error_exception("No Octave error available"); |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
209 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
210 |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
211 if (nargout >= 0) { |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
212 boost::python::tuple pytuple; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
213 octlist_to_pytuple(pytuple, retval); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
214 return pytuple; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
215 } else { |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
216 // Return () if nargout < 0. |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
217 return make_tuple(); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
218 } |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
219 } |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
220 |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
221 boost::python::tuple str_eval(int nargout, |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
222 const string &code, |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
223 bool silent) { |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
224 |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
225 octave_value_list retval; |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
226 int parse_status; |
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 reset_error_handler(); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
229 buffer_error_messages++; |
65
11cff59bc932
Let Octave reread changed files
David Grundberg <individ@acc.umu.se>
parents:
59
diff
changeset
|
230 |
11cff59bc932
Let Octave reread changed files
David Grundberg <individ@acc.umu.se>
parents:
59
diff
changeset
|
231 // Updating the timestamp makes Octave reread changed files |
11cff59bc932
Let Octave reread changed files
David Grundberg <individ@acc.umu.se>
parents:
59
diff
changeset
|
232 Vlast_prompt_time.stamp(); |
72 | 233 |
234 #ifdef HAVE_USELOCALE | |
235 // Set C locale | |
236 locale_t old_locale = uselocale(c_locale); | |
237 #endif | |
238 | |
93
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
239 bool bad_alloc_state = false; |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
240 Py_BEGIN_ALLOW_THREADS |
93
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
241 try { |
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
242 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
|
243 (nargout >= 0) ? nargout : 0); |
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
244 } catch (bad_alloc) { |
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
245 bad_alloc_state = true; |
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
246 } |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
247 Py_END_ALLOW_THREADS |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
248 |
72 | 249 #ifdef HAVE_USELOCALE |
250 // Reset locale | |
251 uselocale(old_locale); | |
252 #endif | |
253 | |
93
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
254 if (bad_alloc_state) |
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
255 throw bad_alloc (); // Translated to MemoryError by boost::python |
737d78f8495c
don't crash on out-of-memory exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
84
diff
changeset
|
256 |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
257 if (parse_status != 0 || error_state != 0) { |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
258 // error_state values: |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
259 // -2 error without traceback |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
260 // -1 traceback |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
261 // 1 general error |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
262 int parse_status1 = 0; |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
263 reset_error_handler(); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
264 octave_value_list lasterror = eval_string("lasterror", |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
265 true, parse_status1, 1); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
266 if (!lasterror.empty() && lasterror(0).is_map()) { |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
267 string exceptionmsg = make_error_message (lasterror(0).map_value ()); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
268 |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
269 if (parse_status != 0) |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
270 throw octave_parse_exception(exceptionmsg); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
271 else |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
272 throw octave_error_exception(exceptionmsg); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
273 } else |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
274 throw octave_error_exception("No Octave error available"); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
275 } |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
276 |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
277 if (nargout >= 0) { |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
278 boost::python::tuple pytuple; |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
279 octlist_to_pytuple(pytuple, retval); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
280 return pytuple; |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
281 } else { |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
282 // Return () if nargout < 0. |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
283 return make_tuple(); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
284 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
285 } |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
286 |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
287 boost::python::object getvar(const string& name, |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
288 bool global) { |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
289 octave_value val; |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
290 |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
291 if (global) |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
292 val = symbol_table::global_varval(name); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
293 else |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
294 val = symbol_table::varval(name); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
295 |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
296 if (val.is_undefined()) { |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
297 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
|
298 } |
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 boost::python::object pyobject; |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
301 octvalue_to_pyobj(pyobject, val); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
302 |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
303 return pyobject; |
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 |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
306 void setvar(const string& name, |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
307 const boost::python::object& pyobject, |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
308 bool global) { |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
309 octave_value val; |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
310 |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
311 if (!valid_identifier(name)) { |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
312 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
|
313 } |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
314 |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
315 pyobj_to_octvalue(val, pyobject); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
316 |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
317 if (global) |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
318 symbol_table::global_varref(name) = val; |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
319 else |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
320 symbol_table::varref(name) = val; |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
321 } |
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 bool isvar(const string& name, bool global) { |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
324 bool retval; |
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) |
58 | 327 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
|
328 else |
58 | 329 retval = symbol_table::is_variable (name); |
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 return retval; |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
332 } |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
333 |
59
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
334 void delvar(const string& name, bool global) { |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
335 |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
336 if (global) { |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
337 |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
338 // FIXME: workaround a bug in Octave 3.2.0. |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
339 if (! symbol_table::is_global (name)) |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
340 symbol_table::insert (name).mark_global (); |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
341 |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
342 symbol_table::clear_global (name); |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
343 } else |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
344 symbol_table::clear_variable (name); |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
345 } |
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
346 |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
347 int push_scope() { |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
348 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
|
349 symbol_table::set_scope(local_scope); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
350 octave_call_stack::push(local_scope); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
351 return local_scope; |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
352 } |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
353 |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
354 void pop_scope () { |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
355 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
|
356 if (curr_scope != symbol_table::top_scope()) |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
357 { |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
358 symbol_table::erase_scope(curr_scope); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
359 octave_call_stack::pop(); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
360 } |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
361 } |
72 | 362 |
74 | 363 // Make sure Octave is correctly unloaded. We cannot depend on Octave running |
364 // at the (true) process atexit point, because at that time the Octave library | |
365 // might have been unloaded. | |
366 // | |
367 // At least that is the hypothesis, since Octave (in certain circumstances) | |
368 // cause a segmentation fault in do_octave_atexit called from the exit | |
369 // function. (One Octave call that causes this is "sleep(0)".) | |
370 void atexit () { | |
371 #ifdef HAVE_USELOCALE | |
372 // Set C locale | |
373 locale_t old_locale = uselocale(c_locale); | |
374 #endif | |
375 | |
376 Py_BEGIN_ALLOW_THREADS | |
377 do_octave_atexit(); | |
378 Py_END_ALLOW_THREADS | |
379 | |
380 #ifdef HAVE_USELOCALE | |
381 // Reset locale | |
382 uselocale(old_locale); | |
383 #endif | |
384 } | |
385 | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
386 } /* namespace pytave }}} */ |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
387 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
388 BOOST_PYTHON_MODULE(_pytave) { /* {{{ */ |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
389 using namespace boost::python; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
390 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
391 def("init", pytave::init); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
392 def("feval", pytave::func_eval); |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
393 def("eval", pytave::str_eval); |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
394 def("getvar", pytave::getvar); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
395 def("setvar", pytave::setvar); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
396 def("isvar", pytave::isvar); |
59
f379cb14c4d4
implement deleting variables
Jaroslav Hajek <highegg@gmail.com>
parents:
58
diff
changeset
|
397 def("delvar", pytave::delvar); |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
398 def("push_scope", pytave::push_scope); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
399 def("pop_scope", pytave::pop_scope); |
74 | 400 def("atexit", pytave::atexit); |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
401 def("get_exceptions", pytave::get_exceptions); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
402 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
403 register_exception_translator<pytave::pytave_exception>( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
404 pytave::pytave_exception::translate_exception); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
405 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
406 register_exception_translator<pytave::octave_error_exception>( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
407 pytave::octave_error_exception::translate_exception); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
408 |
36
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
409 register_exception_translator<pytave::octave_parse_exception>( |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
410 pytave::octave_parse_exception::translate_exception); |
ae4554656fa1
Added an eval function.
David Grundberg <individ@acc.umu.se>
parents:
26
diff
changeset
|
411 |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
412 register_exception_translator<pytave::object_convert_exception>( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
413 pytave::object_convert_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::value_convert_exception>( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
416 pytave::value_convert_exception::translate_exception); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
417 |
40
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
418 register_exception_translator<pytave::variable_name_exception>( |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
419 pytave::variable_name_exception::translate_exception); |
824354efaa1a
implement direct variable manipulation and local scoping
Jaroslav Hajek <highegg@gmail.com>
parents:
36
diff
changeset
|
420 |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
421 } /* }}} */ |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
422 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
423 /* Emacs |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
424 * Local Variables: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
425 * fill-column:79 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
426 * coding:utf-8 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
427 * indent-tabs-mode:nil |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
428 * c-basic-offset:3 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
429 * End: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
430 * vim: set textwidth=79 expandtab shiftwidth=3 : |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
431 */ |