annotate pycall.cc @ 306:2ecae5c6eeb6

Refactor code, have common functions in pytave_utils * pytave_utils.{h,cc}: Have the 2 functions to get builtins module and an object from python as utils. * Makefile.am: Add pytave_utils{h,cc} to the build process. * pycall.cc: Use pytave_utils to get FUNC from python and remove unused code. * python_to_octave.cc: Use pytave_utils to get the builtins module
author Abhinav Tripathi <genuinelucifer@gmail.com>
date Tue, 09 Aug 2016 11:27:38 -0700
parents b06df69f4b37
children 3e0decdf59b0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
115
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
1 /*
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
2
150
a3dc9d24ae38 maint: Add myself to copyright notices
Mike Miller <mtmiller@octave.org>
parents: 139
diff changeset
3 Copyright (C) 2015-2016 Mike Miller
115
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
4
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
5 This file is part of Pytave.
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
6
139
b12908ffa6df maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents: 132
diff changeset
7 Pytave is free software: you can redistribute it and/or modify it
115
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
139
b12908ffa6df maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents: 132
diff changeset
9 Free Software Foundation, either version 3 of the License, or (at your
115
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
10 option) any later version.
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
11
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
12 Pytave is distributed in the hope that it will be useful, but WITHOUT
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
15 for more details.
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
16
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
18 along with Pytave; see the file COPYING. If not, see
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
19 <http://www.gnu.org/licenses/>.
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
20
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
21 */
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
22
132
386772f4e12d Clean up includes thanks to Octave header changes
Mike Miller <mtmiller@octave.org>
parents: 116
diff changeset
23 #if defined (HAVE_CONFIG_H)
386772f4e12d Clean up includes thanks to Octave header changes
Mike Miller <mtmiller@octave.org>
parents: 116
diff changeset
24 # include <config.h>
115
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
25 #endif
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
26
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
27 #include <boost/python.hpp>
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
28 #include <boost/python/numeric.hpp>
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
29
234
237b71aaf6e7 pycall: support Python reference to a callable object
Mike Miller <mtmiller@octave.org>
parents: 232
diff changeset
30 #include <octave/oct.h>
237b71aaf6e7 pycall: support Python reference to a callable object
Mike Miller <mtmiller@octave.org>
parents: 232
diff changeset
31 #include <octave/parse.h>
115
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
32
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
33 #define PYTAVE_DO_DECLARE_SYMBOL
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
34 #include "arrayobjectdefs.h"
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
35 #include "exceptions.h"
172
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
36 #include "octave_to_python.h"
115
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
37 #include "python_to_octave.h"
306
2ecae5c6eeb6 Refactor code, have common functions in pytave_utils
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 281
diff changeset
38 #include "pytave_utils.h"
115
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
39
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
40 using namespace boost::python;
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
41
172
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
42 DEFUN_DLD (pycall, args, nargout,
115
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
43 "-*- texinfo -*-\n\
173
28dc607532c2 doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents: 172
diff changeset
44 @deftypefn {} {} pycall (@var{func})\n\
28dc607532c2 doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents: 172
diff changeset
45 @deftypefnx {} {@var{x} =} pycall (@var{func})\n\
28dc607532c2 doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents: 172
diff changeset
46 @deftypefnx {} {@var{x} =} pycall (@var{func}, @var{arg1}, @var{arg2}, @dots{})\n\
28dc607532c2 doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents: 172
diff changeset
47 Call a Python function or callable, passing Octave values as arguments.\n\
160
eab5c6026303 Add some examples to the documentation
Colin Macdonald <cbm@m.fsf.org>
parents: 150
diff changeset
48 \n\
eab5c6026303 Add some examples to the documentation
Colin Macdonald <cbm@m.fsf.org>
parents: 150
diff changeset
49 Examples:\n\
eab5c6026303 Add some examples to the documentation
Colin Macdonald <cbm@m.fsf.org>
parents: 150
diff changeset
50 @example\n\
eab5c6026303 Add some examples to the documentation
Colin Macdonald <cbm@m.fsf.org>
parents: 150
diff changeset
51 @group\n\
228
2a9956be24aa maint: update pycall doc string examples to reflect recent changes
Mike Miller <mtmiller@octave.org>
parents: 226
diff changeset
52 pycall (\"int\", 6)\n\
173
28dc607532c2 doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents: 172
diff changeset
53 @result{} 6\n\
28dc607532c2 doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents: 172
diff changeset
54 pycall (\"os.getuid\")\n\
28dc607532c2 doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents: 172
diff changeset
55 @result{} ...\n\
228
2a9956be24aa maint: update pycall doc string examples to reflect recent changes
Mike Miller <mtmiller@octave.org>
parents: 226
diff changeset
56 pycall (\"math.sqrt\", 2)\n\
2a9956be24aa maint: update pycall doc string examples to reflect recent changes
Mike Miller <mtmiller@octave.org>
parents: 226
diff changeset
57 @result{} 1.4142\n\
160
eab5c6026303 Add some examples to the documentation
Colin Macdonald <cbm@m.fsf.org>
parents: 150
diff changeset
58 @end group\n\
eab5c6026303 Add some examples to the documentation
Colin Macdonald <cbm@m.fsf.org>
parents: 150
diff changeset
59 @end example\n\
241
73c0b59a0ee9 Add documentation for pycall returning None
Colin Macdonald <cbm@m.fsf.org>
parents: 239
diff changeset
60 \n\
73c0b59a0ee9 Add documentation for pycall returning None
Colin Macdonald <cbm@m.fsf.org>
parents: 239
diff changeset
61 If the callable has no return, and an lvalue is specified, it will be set\n\
73c0b59a0ee9 Add documentation for pycall returning None
Colin Macdonald <cbm@m.fsf.org>
parents: 239
diff changeset
62 to @code{None}. However, if no lvalue was specified, @code{ans} will not\n\
73c0b59a0ee9 Add documentation for pycall returning None
Colin Macdonald <cbm@m.fsf.org>
parents: 239
diff changeset
63 be set. For example:\n\
73c0b59a0ee9 Add documentation for pycall returning None
Colin Macdonald <cbm@m.fsf.org>
parents: 239
diff changeset
64 @example\n\
73c0b59a0ee9 Add documentation for pycall returning None
Colin Macdonald <cbm@m.fsf.org>
parents: 239
diff changeset
65 @group\n\
242
f37d7854135c doc fixes
Colin Macdonald <cbm@m.fsf.org>
parents: 241
diff changeset
66 s = pyeval (\"set([1, 2])\");\n\
241
73c0b59a0ee9 Add documentation for pycall returning None
Colin Macdonald <cbm@m.fsf.org>
parents: 239
diff changeset
67 pycall (s.add, 3)\n\
242
f37d7854135c doc fixes
Colin Macdonald <cbm@m.fsf.org>
parents: 241
diff changeset
68 \n\
241
73c0b59a0ee9 Add documentation for pycall returning None
Colin Macdonald <cbm@m.fsf.org>
parents: 239
diff changeset
69 r = pycall (s.add, 4)\n\
242
f37d7854135c doc fixes
Colin Macdonald <cbm@m.fsf.org>
parents: 241
diff changeset
70 @result{} r = [pyobject ...]\n\
241
73c0b59a0ee9 Add documentation for pycall returning None
Colin Macdonald <cbm@m.fsf.org>
parents: 239
diff changeset
71 \n\
73c0b59a0ee9 Add documentation for pycall returning None
Colin Macdonald <cbm@m.fsf.org>
parents: 239
diff changeset
72 None\n\
73c0b59a0ee9 Add documentation for pycall returning None
Colin Macdonald <cbm@m.fsf.org>
parents: 239
diff changeset
73 \n\
73c0b59a0ee9 Add documentation for pycall returning None
Colin Macdonald <cbm@m.fsf.org>
parents: 239
diff changeset
74 @end group\n\
73c0b59a0ee9 Add documentation for pycall returning None
Colin Macdonald <cbm@m.fsf.org>
parents: 239
diff changeset
75 @end example\n\
73c0b59a0ee9 Add documentation for pycall returning None
Colin Macdonald <cbm@m.fsf.org>
parents: 239
diff changeset
76 \n\
173
28dc607532c2 doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents: 172
diff changeset
77 @seealso{pyeval, pyexec}\n\
160
eab5c6026303 Add some examples to the documentation
Colin Macdonald <cbm@m.fsf.org>
parents: 150
diff changeset
78 @end deftypefn")
115
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
79 {
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
80 octave_value_list retval;
235
bbf0b7a4e117 Return pyobject from pycall too, similar to pyeval (fixes issue #28)
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 234
diff changeset
81 object res;
bbf0b7a4e117 Return pyobject from pycall too, similar to pyeval (fixes issue #28)
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 234
diff changeset
82 std::string id;
115
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
83
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
84 int nargin = args.length ();
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
85
172
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
86 if (nargin < 1)
115
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
87 {
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
88 print_usage ();
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
89 return retval;
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
90 }
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
91
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
92 Py_Initialize ();
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
93
172
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
94 pytave::init_exceptions ();
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
95 numeric::array::set_module_and_type ("numpy", "ndarray");
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
96 _import_array ();
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
97
115
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
98 try
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
99 {
234
237b71aaf6e7 pycall: support Python reference to a callable object
Mike Miller <mtmiller@octave.org>
parents: 232
diff changeset
100 object callable;
306
2ecae5c6eeb6 Refactor code, have common functions in pytave_utils
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 281
diff changeset
101 pytave::get_object_from_python (args(0), callable);
2ecae5c6eeb6 Refactor code, have common functions in pytave_utils
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 281
diff changeset
102 if (callable.is_none ())
2ecae5c6eeb6 Refactor code, have common functions in pytave_utils
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 281
diff changeset
103 error("pycall: FUNC must be a string or a Python reference");
172
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
104
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
105 std::vector<object> pyargs;
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
106 for (int i = 1; i < nargin; i++)
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
107 {
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
108 object arg;
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
109 pytave::octvalue_to_pyobj (arg, args(i));
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
110 pyargs.push_back (arg);
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
111 }
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
112
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
113 switch (nargin - 1)
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
114 {
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
115 case 0:
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
116 res = callable ();
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
117 break;
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
118 case 1:
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
119 res = callable (pyargs[0]);
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
120 break;
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
121 case 2:
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
122 res = callable (pyargs[0], pyargs[1]);
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
123 break;
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
124 case 3:
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
125 res = callable (pyargs[0], pyargs[1], pyargs[2]);
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
126 break;
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
127 case 4:
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
128 res = callable (pyargs[0], pyargs[1], pyargs[2], pyargs[3]);
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
129 break;
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
130 case 5:
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
131 res = callable (pyargs[0], pyargs[1], pyargs[2], pyargs[3],
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
132 pyargs[4]);
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
133 break;
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
134 case 6:
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
135 res = callable (pyargs[0], pyargs[1], pyargs[2], pyargs[3],
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
136 pyargs[4], pyargs[5]);
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
137 break;
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
138 case 7:
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
139 res = callable (pyargs[0], pyargs[1], pyargs[2], pyargs[3],
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
140 pyargs[4], pyargs[5], pyargs[6]);
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
141 break;
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
142 case 8:
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
143 res = callable (pyargs[0], pyargs[1], pyargs[2], pyargs[3],
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
144 pyargs[4], pyargs[5], pyargs[6], pyargs[7]);
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
145 break;
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
146 case 9:
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
147 res = callable (pyargs[0], pyargs[1], pyargs[2], pyargs[3],
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
148 pyargs[4], pyargs[5], pyargs[6], pyargs[7],
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
149 pyargs[8]);
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
150 break;
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
151 case 10:
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
152 res = callable (pyargs[0], pyargs[1], pyargs[2], pyargs[3],
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
153 pyargs[4], pyargs[5], pyargs[6], pyargs[7],
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
154 pyargs[8], pyargs[9]);
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
155 break;
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
156 default:
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
157 error ("pycall: more than 10 arguments are not yet supported");
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
158 break;
29d9da90afcf pycall: New function to pass Octave values to a Python function
Mike Miller <mtmiller@octave.org>
parents: 160
diff changeset
159 }
115
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
160
239
0401489ea58c Allow pycall to return None
Colin Macdonald <cbm@m.fsf.org>
parents: 235
diff changeset
161 // Ensure reasonable "ans" behaviour, consistent with Python's "_".
0401489ea58c Allow pycall to return None
Colin Macdonald <cbm@m.fsf.org>
parents: 235
diff changeset
162 if (nargout > 0 || ! res.is_none ())
115
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
163 {
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
164 octave_value val;
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
165 pytave::pyobj_to_octvalue (val, res);
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
166 retval(0) = val;
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
167 }
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
168 }
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
169 catch (pytave::object_convert_exception const &)
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
170 {
278
9278a272b1c8 Drop conversion of lists, dicts and tuples (fixes issues #27, #26)
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 248
diff changeset
171 error ("pyexec: error in return value type conversion");
115
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
172 }
193
28173dc00d51 Add catch for value_convert_exception and a test. (fixes issue #16)
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 190
diff changeset
173 catch (pytave::value_convert_exception const &)
28173dc00d51 Add catch for value_convert_exception and a test. (fixes issue #16)
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 190
diff changeset
174 {
195
459b6f5c56ed maint: prefer term "argument" over "parameter" for values passed into a function
Mike Miller <mtmiller@octave.org>
parents: 194
diff changeset
175 error ("pycall: error in argument type conversion");
193
28173dc00d51 Add catch for value_convert_exception and a test. (fixes issue #16)
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 190
diff changeset
176 }
115
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
177 catch (error_already_set const &)
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
178 {
231
6fffa6219b2c Properly extract exception text from Python (fixes issue #24)
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 198
diff changeset
179 std::string message = pytave::fetch_exception_message ();
6fffa6219b2c Properly extract exception text from Python (fixes issue #24)
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 198
diff changeset
180 error ("pycall: %s", message.c_str ());
115
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
181 }
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
182
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
183 return retval;
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
184 }
00d19f71c9ca Initial implementation of py oct-file
Mike Miller <mtmiller@octave.org>
parents:
diff changeset
185
180
5f0d94afebe2 Added some basic tests
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 178
diff changeset
186 /*
190
ac377ace2ee4 More unit tests of pycall and pyeval
Mike Miller <mtmiller@octave.org>
parents: 184
diff changeset
187 %!assert (ischar (pycall ("os.getcwd")))
ac377ace2ee4 More unit tests of pycall and pyeval
Mike Miller <mtmiller@octave.org>
parents: 184
diff changeset
188 %!assert (isreal (pycall ("random.random")))
ac377ace2ee4 More unit tests of pycall and pyeval
Mike Miller <mtmiller@octave.org>
parents: 184
diff changeset
189 %!assert (pycall ("math.exp", 3), exp (3))
197
d6c44d680482 Convert Octave scalars into Python scalars (fixes issue #14)
Mike Miller <mtmiller@octave.org>
parents: 195
diff changeset
190 %!assert (pycall ("math.trunc", pi), fix (pi))
190
ac377ace2ee4 More unit tests of pycall and pyeval
Mike Miller <mtmiller@octave.org>
parents: 184
diff changeset
191 %!assert (pycall ("math.sqrt", 2), sqrt (2))
197
d6c44d680482 Convert Octave scalars into Python scalars (fixes issue #14)
Mike Miller <mtmiller@octave.org>
parents: 195
diff changeset
192 %!assert (pycall ("cmath.sqrt", 2j), sqrt (2j))
191
0500459a739b Enforce checking of attributes in builtins for pycall (fixes issue #20)
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 190
diff changeset
193 %!assert (pycall ("int", 10.2), 10)
235
bbf0b7a4e117 Return pyobject from pycall too, similar to pyeval (fixes issue #28)
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 234
diff changeset
194 %!assert (isa (pycall ("object"), "pyobject"))
281
b06df69f4b37 Remove unused code and add tests to pycall
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 279
diff changeset
195 %!assert (isa (pycall ("dict"), "pyobject"))
b06df69f4b37 Remove unused code and add tests to pycall
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 279
diff changeset
196 %!assert (isa (pycall ("list"), "pyobject"))
b06df69f4b37 Remove unused code and add tests to pycall
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 279
diff changeset
197 %!assert (isa (pycall ("tuple"), "pyobject"))
190
ac377ace2ee4 More unit tests of pycall and pyeval
Mike Miller <mtmiller@octave.org>
parents: 184
diff changeset
198
ac377ace2ee4 More unit tests of pycall and pyeval
Mike Miller <mtmiller@octave.org>
parents: 184
diff changeset
199 ## Test argument type conversion of values into Python
ac377ace2ee4 More unit tests of pycall and pyeval
Mike Miller <mtmiller@octave.org>
parents: 184
diff changeset
200 %!test
230
262832ae684f pycall: fix test failure with Python 2
Mike Miller <mtmiller@octave.org>
parents: 228
diff changeset
201 %! pyexec (["def typename(x):\n" ...
262832ae684f pycall: fix test failure with Python 2
Mike Miller <mtmiller@octave.org>
parents: 228
diff changeset
202 %! " s = type(x).__name__\n" ...
262832ae684f pycall: fix test failure with Python 2
Mike Miller <mtmiller@octave.org>
parents: 228
diff changeset
203 %! " if s == 'long':\n" ...
262832ae684f pycall: fix test failure with Python 2
Mike Miller <mtmiller@octave.org>
parents: 228
diff changeset
204 %! " return 'int'\n" ...
262832ae684f pycall: fix test failure with Python 2
Mike Miller <mtmiller@octave.org>
parents: 228
diff changeset
205 %! " return s"]);
197
d6c44d680482 Convert Octave scalars into Python scalars (fixes issue #14)
Mike Miller <mtmiller@octave.org>
parents: 195
diff changeset
206 %!assert (pycall ("typename", 0), "float")
d6c44d680482 Convert Octave scalars into Python scalars (fixes issue #14)
Mike Miller <mtmiller@octave.org>
parents: 195
diff changeset
207 %!assert (pycall ("typename", pi), "float")
d6c44d680482 Convert Octave scalars into Python scalars (fixes issue #14)
Mike Miller <mtmiller@octave.org>
parents: 195
diff changeset
208 %!assert (pycall ("typename", 2j), "complex")
d6c44d680482 Convert Octave scalars into Python scalars (fixes issue #14)
Mike Miller <mtmiller@octave.org>
parents: 195
diff changeset
209 %!assert (pycall ("typename", int32 (0)), "int")
d6c44d680482 Convert Octave scalars into Python scalars (fixes issue #14)
Mike Miller <mtmiller@octave.org>
parents: 195
diff changeset
210 %!assert (pycall ("typename", false), "bool")
d6c44d680482 Convert Octave scalars into Python scalars (fixes issue #14)
Mike Miller <mtmiller@octave.org>
parents: 195
diff changeset
211 %!assert (pycall ("typename", true), "bool")
190
ac377ace2ee4 More unit tests of pycall and pyeval
Mike Miller <mtmiller@octave.org>
parents: 184
diff changeset
212 %!assert (pycall ("typename", "Hello world"), "str")
ac377ace2ee4 More unit tests of pycall and pyeval
Mike Miller <mtmiller@octave.org>
parents: 184
diff changeset
213 %!assert (pycall ("typename", char ([1, 2, 3])), "str")
ac377ace2ee4 More unit tests of pycall and pyeval
Mike Miller <mtmiller@octave.org>
parents: 184
diff changeset
214
198
377f2dc057ea pycall: add more tests for preservation of values to and from Python
Mike Miller <mtmiller@octave.org>
parents: 197
diff changeset
215 ## Test round trip type preservation / conversion
377f2dc057ea pycall: add more tests for preservation of values to and from Python
Mike Miller <mtmiller@octave.org>
parents: 197
diff changeset
216 %!test
377f2dc057ea pycall: add more tests for preservation of values to and from Python
Mike Miller <mtmiller@octave.org>
parents: 197
diff changeset
217 %! pyexec ("def roundtrip(x): return x");
377f2dc057ea pycall: add more tests for preservation of values to and from Python
Mike Miller <mtmiller@octave.org>
parents: 197
diff changeset
218 %! values = { 0, pi, 2j, eps, false, true, version, "Hello world", ...
377f2dc057ea pycall: add more tests for preservation of values to and from Python
Mike Miller <mtmiller@octave.org>
parents: 197
diff changeset
219 %! [1, 2, 3], eye (4) };
377f2dc057ea pycall: add more tests for preservation of values to and from Python
Mike Miller <mtmiller@octave.org>
parents: 197
diff changeset
220 %! for i = 1:numel (values)
377f2dc057ea pycall: add more tests for preservation of values to and from Python
Mike Miller <mtmiller@octave.org>
parents: 197
diff changeset
221 %! assert (pycall ("roundtrip", values{i}), values{i});
377f2dc057ea pycall: add more tests for preservation of values to and from Python
Mike Miller <mtmiller@octave.org>
parents: 197
diff changeset
222 %! endfor
377f2dc057ea pycall: add more tests for preservation of values to and from Python
Mike Miller <mtmiller@octave.org>
parents: 197
diff changeset
223
195
459b6f5c56ed maint: prefer term "argument" over "parameter" for values passed into a function
Mike Miller <mtmiller@octave.org>
parents: 194
diff changeset
224 %!error <argument type conversion>
263
0fc1a58d7e89 Delete unnecessary newlines in one-line function definitions
Mike Miller <mtmiller@octave.org>
parents: 248
diff changeset
225 %! pyexec ("def intwrapper(x): return int(x)");
193
28173dc00d51 Add catch for value_convert_exception and a test. (fixes issue #16)
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 190
diff changeset
226 %! pycall ("intwrapper", ftp ());
28173dc00d51 Add catch for value_convert_exception and a test. (fixes issue #16)
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 190
diff changeset
227
180
5f0d94afebe2 Added some basic tests
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 178
diff changeset
228 %!test
263
0fc1a58d7e89 Delete unnecessary newlines in one-line function definitions
Mike Miller <mtmiller@octave.org>
parents: 248
diff changeset
229 %! pyexec ("def pyfunc(x): return 2*x");
182
0bf4b7cf16ee maint: Use Octave coding style conventions for unit tests
Mike Miller <mtmiller@octave.org>
parents: 180
diff changeset
230 %! z = pycall ("pyfunc", [20 20]);
0bf4b7cf16ee maint: Use Octave coding style conventions for unit tests
Mike Miller <mtmiller@octave.org>
parents: 180
diff changeset
231 %! assert (z, [40 40])
183
2b03585d4ddd Add proper conversion of booleans between octave and python. (fixes issue #6)
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 182
diff changeset
232
2b03585d4ddd Add proper conversion of booleans between octave and python. (fixes issue #6)
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 182
diff changeset
233 %!test
184
8b97647e48f1 maint: whitespace fixes for cset 2b03585d4ddd
Mike Miller <mtmiller@octave.org>
parents: 183
diff changeset
234 %! pyexec (["def pyfunc(x):\n" ...
197
d6c44d680482 Convert Octave scalars into Python scalars (fixes issue #14)
Mike Miller <mtmiller@octave.org>
parents: 195
diff changeset
235 %! " if x is True:\n return 30\n" ...
d6c44d680482 Convert Octave scalars into Python scalars (fixes issue #14)
Mike Miller <mtmiller@octave.org>
parents: 195
diff changeset
236 %! " elif x is False:\n return 20\n" ...
184
8b97647e48f1 maint: whitespace fixes for cset 2b03585d4ddd
Mike Miller <mtmiller@octave.org>
parents: 183
diff changeset
237 %! " else:\n return 10"]);
183
2b03585d4ddd Add proper conversion of booleans between octave and python. (fixes issue #6)
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 182
diff changeset
238 %! assert (pycall ("pyfunc", true), 30)
2b03585d4ddd Add proper conversion of booleans between octave and python. (fixes issue #6)
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 182
diff changeset
239 %! assert (pycall ("pyfunc", false), 20)
2b03585d4ddd Add proper conversion of booleans between octave and python. (fixes issue #6)
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 182
diff changeset
240 %! assert (pycall ("pyfunc", 10), 10)
231
6fffa6219b2c Properly extract exception text from Python (fixes issue #24)
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 198
diff changeset
241
6fffa6219b2c Properly extract exception text from Python (fixes issue #24)
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 198
diff changeset
242 %!error <NameError>
263
0fc1a58d7e89 Delete unnecessary newlines in one-line function definitions
Mike Miller <mtmiller@octave.org>
parents: 248
diff changeset
243 %! pyexec ("def raiseException(): raise NameError('oops')")
231
6fffa6219b2c Properly extract exception text from Python (fixes issue #24)
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 198
diff changeset
244 %! pycall ("raiseException")
239
0401489ea58c Allow pycall to return None
Colin Macdonald <cbm@m.fsf.org>
parents: 235
diff changeset
245
0401489ea58c Allow pycall to return None
Colin Macdonald <cbm@m.fsf.org>
parents: 235
diff changeset
246 ## None as a return value
0401489ea58c Allow pycall to return None
Colin Macdonald <cbm@m.fsf.org>
parents: 235
diff changeset
247 %!test
0401489ea58c Allow pycall to return None
Colin Macdonald <cbm@m.fsf.org>
parents: 235
diff changeset
248 %! f = pyeval ("lambda: None");
0401489ea58c Allow pycall to return None
Colin Macdonald <cbm@m.fsf.org>
parents: 235
diff changeset
249 %! r = pycall (f);
248
2e4c9ce0c83c maint: prefer Octave lowercase naming convention to camelCase
Mike Miller <mtmiller@octave.org>
parents: 242
diff changeset
250 %! is_none = pyeval ("lambda x: x is None");
2e4c9ce0c83c maint: prefer Octave lowercase naming convention to camelCase
Mike Miller <mtmiller@octave.org>
parents: 242
diff changeset
251 %! assert (is_none (r))
239
0401489ea58c Allow pycall to return None
Colin Macdonald <cbm@m.fsf.org>
parents: 235
diff changeset
252
0401489ea58c Allow pycall to return None
Colin Macdonald <cbm@m.fsf.org>
parents: 235
diff changeset
253 ## But returning None will not set "ans"
0401489ea58c Allow pycall to return None
Colin Macdonald <cbm@m.fsf.org>
parents: 235
diff changeset
254 %!test
0401489ea58c Allow pycall to return None
Colin Macdonald <cbm@m.fsf.org>
parents: 235
diff changeset
255 %! f = pyeval ("lambda: None");
0401489ea58c Allow pycall to return None
Colin Macdonald <cbm@m.fsf.org>
parents: 235
diff changeset
256 %! clear ans
0401489ea58c Allow pycall to return None
Colin Macdonald <cbm@m.fsf.org>
parents: 235
diff changeset
257 %! pycall (f);
0401489ea58c Allow pycall to return None
Colin Macdonald <cbm@m.fsf.org>
parents: 235
diff changeset
258 %! assert (! exist ("ans", "var"))
180
5f0d94afebe2 Added some basic tests
Abhinav Tripathi <genuinelucifer@gmail.com>
parents: 178
diff changeset
259 */