Mercurial > octave
annotate libinterp/octave-value/cdef-property.cc @ 27208:5b40cf4896f0
eliminate some direct access to call stack in classdef and inline objects
* pt-eval.h, pt-eval.cc (tree_evaluator::get_dispatch_class,
tree_evaluator::set_dispatch_class): New functions.
* cdef-property.cc (is_method_executing):
Eliminate direct access to call stack.
* cdef-utils.cc (get_class_context): Likewise.
* ov-fcn-inline.cc (octave_fcn_inline::octave_fcn_inline): Likewise.
* ov-classdef.cc (octave_classdef_superclass_ref::is_constructed_object):
Likewise.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Mon, 01 Apr 2019 20:38:44 +0000 |
parents | 42efd1e986c7 |
children | 823b4bcf79fc |
rev | line source |
---|---|
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1 /* |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
2 |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
3 Copyright (C) 2012-2019 Michael Goffioul |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
4 |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
5 This file is part of Octave. |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
6 |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
7 Octave is free software: you can redistribute it and/or modify it |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
8 under the terms of the GNU General Public License as published by |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
9 the Free Software Foundation, either version 3 of the License, or |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
10 (at your option) any later version. |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
11 |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
12 Octave is distributed in the hope that it will be useful, but |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
13 WITHOUT ANY WARRANTY; without even the implied warranty of |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
15 GNU General Public License for more details. |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
16 |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
17 You should have received a copy of the GNU General Public License |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
18 along with Octave; see the file COPYING. If not, see |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
19 <https://www.gnu.org/licenses/>. |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
20 |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
21 */ |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
22 |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
23 #if defined (HAVE_CONFIG_H) |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
24 # include "config.h" |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
25 #endif |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
26 |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
27 #include <algorithm> |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
28 #include <iomanip> |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
29 |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
30 #include "cdef-class.h" |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
31 #include "cdef-manager.h" |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
32 #include "cdef-utils.h" |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
33 #include "errwarn.h" |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
34 #include "interpreter-private.h" |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
35 #include "interpreter.h" |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
36 #include "load-path.h" |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
37 #include "ov-builtin.h" |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
38 #include "ov-classdef.h" |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
39 #include "ov-fcn-handle.h" |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
40 #include "ov-usr-fcn.h" |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
41 #include "parse.h" |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
42 #include "pt-assign.h" |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
43 #include "pt-classdef.h" |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
44 #include "pt-eval.h" |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
45 #include "pt-idx.h" |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
46 #include "pt-misc.h" |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
47 #include "pt-stmt.h" |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
48 #include "pt-walk.h" |
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
49 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
50 namespace octave |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
51 { |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
52 static bool |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
53 is_method_executing (const octave_value& ov, const cdef_object& obj) |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
54 { |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
55 tree_evaluator& tw = __get_evaluator__ ("is_method_executing"); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
56 |
27208
5b40cf4896f0
eliminate some direct access to call stack in classdef and inline objects
John W. Eaton <jwe@octave.org>
parents:
27187
diff
changeset
|
57 octave_function *stack_fcn = tw.current_function (); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
58 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
59 octave_function *method_fcn = ov.function_value (true); |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
60 |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
61 // Does the top of the call stack match our target function? |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
62 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
63 if (stack_fcn && stack_fcn == method_fcn) |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
64 { |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
65 octave_user_function *uf = method_fcn->user_function_value (true); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
66 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
67 // We can only check the context object for user-function (not builtin), |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
68 // where we have access to the parameters (arguments and return values). |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
69 // That's ok as there's no need to call this function for builtin |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
70 // methods. |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
71 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
72 if (uf) |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
73 { |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
74 // At this point, the method is executing, but we still need to |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
75 // check the context object for which the method is executing. For |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
76 // methods, it's the first argument of the function; for ctors, it |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
77 // is the first return value. |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
78 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
79 tree_parameter_list *pl = uf->is_classdef_constructor () |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
80 ? uf->return_list () : uf->parameter_list (); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
81 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
82 if (pl && pl->size () > 0) |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
83 { |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
84 tree_decl_elt *elt = pl->front (); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
85 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
86 octave_value arg0 = tw.evaluate (elt); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
87 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
88 if (arg0.is_defined () && arg0.type_name () == "object") |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
89 { |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
90 cdef_object arg0_obj = to_cdef (arg0); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
91 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
92 return obj.is (arg0_obj); |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
93 } |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
94 } |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
95 } |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
96 } |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
97 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
98 return false; |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
99 } |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
100 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
101 octave_value |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
102 cdef_property::cdef_property_rep::get_value (const cdef_object& obj, |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
103 bool do_check_access, |
27187
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
104 const std::string& who) const |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
105 { |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
106 octave_value retval; |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
107 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
108 if (do_check_access && ! check_get_access ()) |
27187
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
109 err_property_access (who, false); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
110 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
111 if (! obj.is_constructed ()) |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
112 { |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
113 cdef_class cls (to_cdef (get ("DefiningClass"))); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
114 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
115 if (! obj.is_partially_constructed_for (cls)) |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
116 error ("cannot reference properties of class `%s' for non-constructed object", |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
117 cls.get_name ().c_str ()); |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
118 } |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
119 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
120 octave_value get_fcn = get ("GetMethod"); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
121 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
122 // FIXME: should check whether we're already in get accessor method |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
123 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
124 if (get_fcn.isempty () || is_method_executing (get_fcn, obj)) |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
125 retval = obj.get (get ("Name").string_value ()); |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
126 else |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
127 { |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
128 octave_value_list args; |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
129 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
130 args(0) = to_ov (obj); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
131 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
132 args = feval (get_fcn, args, 1); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
133 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
134 retval = args(0); |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
135 } |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
136 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
137 return retval; |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
138 } |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
139 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
140 octave_value |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
141 cdef_property::cdef_property_rep::get_value (bool do_check_access, |
27187
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
142 const std::string& who) const |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
143 { |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
144 if (do_check_access && ! check_get_access ()) |
27187
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
145 err_property_access (who, false); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
146 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
147 return get ("DefaultValue"); |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
148 } |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
149 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
150 bool |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
151 cdef_property::cdef_property_rep::is_recursive_set (const cdef_object& /* obj */) const |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
152 { |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
153 // FIXME: implement |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
154 return false; |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
155 } |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
156 |
27187
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
157 OCTAVE_NORETURN void |
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
158 cdef_property::cdef_property_rep::err_property_access |
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
159 (const std::string& from, bool is_set) const |
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
160 { |
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
161 octave_value acc = get (is_set ? "SetAccess" : "GetAccess"); |
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
162 std::string acc_s; |
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
163 |
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
164 if (acc.is_string ()) |
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
165 acc_s = acc.string_value (); |
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
166 else |
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
167 acc_s = "class-restricted"; |
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
168 |
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
169 if (is_set) |
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
170 error ("%s: property `%s' has %s access and cannot be set in this context", |
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
171 from.c_str (), get_name ().c_str (), acc_s.c_str ()); |
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
172 else |
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
173 error ("%s: property `%s' has %s access and cannot be obtained in this context", |
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
174 from.c_str (), get_name ().c_str (), acc_s.c_str ()); |
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
175 } |
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
176 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
177 void |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
178 cdef_property::cdef_property_rep::set_value (cdef_object& obj, |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
179 const octave_value& val, |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
180 bool do_check_access, |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
181 const std::string& who) |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
182 { |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
183 if (do_check_access && ! check_set_access ()) |
27187
42efd1e986c7
declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents:
26774
diff
changeset
|
184 err_property_access (who, true); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
185 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
186 if (! obj.is_constructed ()) |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
187 { |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
188 cdef_class cls (to_cdef (get ("DefiningClass"))); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
189 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
190 if (! obj.is_partially_constructed_for (cls)) |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
191 error ("cannot reference properties of class `%s' for non-constructed object", |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
192 cls.get_name ().c_str ()); |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
193 } |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
194 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
195 octave_value set_fcn = get ("SetMethod"); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
196 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
197 if (set_fcn.isempty () || is_method_executing (set_fcn, obj)) |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
198 obj.put (get ("Name").string_value (), val); |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
199 else |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
200 { |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
201 octave_value_list args; |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
202 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
203 args(0) = to_ov (obj); |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
204 args(1) = val; |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
205 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
206 args = feval (set_fcn, args, 1); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
207 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
208 if (args.length () > 0 && args(0).is_defined ()) |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
209 { |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
210 if (args (0).is_classdef_object ()) |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
211 { |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
212 cdef_object new_obj = to_cdef (args(0)); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
213 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
214 obj = new_obj; |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
215 } |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
216 else |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
217 ::warning ("set-method of property `%s' returned a non-classdef object", |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
218 get_name ().c_str ()); |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
219 } |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
220 } |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
221 } |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
222 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
223 bool |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
224 cdef_property::cdef_property_rep::check_get_access (void) const |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
225 { |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
226 cdef_class cls (to_cdef (get ("DefiningClass"))); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
227 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
228 return check_access (cls, get ("GetAccess"), "", get_name (), false); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
229 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
230 return false; |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
231 } |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
232 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
233 bool |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
234 cdef_property::cdef_property_rep::check_set_access (void) const |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
235 { |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
236 cdef_class cls (to_cdef (get ("DefiningClass"))); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
237 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
238 return check_access (cls, get ("SetAccess"), "", get_name (), true); |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
239 |
26774
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
240 return false; |
568c2ab2782d
move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26772
diff
changeset
|
241 } |
26772
d1419ac09564
split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
242 } |