annotate libinterp/octave-value/cdef-property.cc @ 30564:796f54d4ddbf stable

update Octave Project Developers copyright for the new year In files that have the "Octave Project Developers" copyright notice, update for 2021. In all .txi and .texi files except gpl.txi and gpl.texi in the doc/liboctave and doc/interpreter directories, change the copyright to "Octave Project Developers", the same as used for other source files. Update copyright notices for 2022 (not done since 2019). For gpl.txi and gpl.texi, change the copyright notice to be "Free Software Foundation, Inc." and leave the date at 2007 only because this file only contains the text of the GPL, not anything created by the Octave Project Developers. Add Paul Thomas to contributors.in.
author John W. Eaton <jwe@octave.org>
date Tue, 28 Dec 2021 18:22:40 -0500
parents aef9c5caedcd
children 670a0d878af1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
1 ////////////////////////////////////////////////////////////////////////
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
2 //
30564
796f54d4ddbf update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents: 29403
diff changeset
3 // Copyright (C) 2012-2022 The Octave Project Developers
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
4 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
5 // See the file COPYRIGHT.md in the top-level directory of this
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
6 // distribution or <https://octave.org/copyright/>.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
7 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
8 // This file is part of Octave.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
9 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
10 // Octave is free software: you can redistribute it and/or modify it
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
11 // under the terms of the GNU General Public License as published by
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
12 // the Free Software Foundation, either version 3 of the License, or
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
13 // (at your option) any later version.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
14 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
15 // Octave is distributed in the hope that it will be useful, but
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
18 // GNU General Public License for more details.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
19 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
20 // You should have received a copy of the GNU General Public License
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
21 // along with Octave; see the file COPYING. If not, see
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
22 // <https://www.gnu.org/licenses/>.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
23 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
24 ////////////////////////////////////////////////////////////////////////
26772
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
25
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
26 #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
27 # include "config.h"
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
28 #endif
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 <algorithm>
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
31 #include <iomanip>
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
32
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
33 #include "cdef-class.h"
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
34 #include "cdef-manager.h"
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
35 #include "cdef-utils.h"
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
36 #include "errwarn.h"
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
37 #include "interpreter-private.h"
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
38 #include "interpreter.h"
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
39 #include "load-path.h"
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
40 #include "ov-builtin.h"
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
41 #include "ov-classdef.h"
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
42 #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
43 #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
44 #include "parse.h"
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
45 #include "pt-assign.h"
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
46 #include "pt-classdef.h"
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
47 #include "pt-eval.h"
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
48 #include "pt-idx.h"
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
49 #include "pt-misc.h"
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
50 #include "pt-stmt.h"
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
51 #include "pt-walk.h"
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
52
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
53 namespace octave
26772
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
54 {
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
55 static bool
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
56 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
57 {
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
58 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
59
27208
5b40cf4896f0 eliminate some direct access to call stack in classdef and inline objects
John W. Eaton <jwe@octave.org>
parents: 27187
diff changeset
60 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
61
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
62 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
63
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
64 // 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
65
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
66 if (stack_fcn && stack_fcn == method_fcn)
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
67 {
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
68 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
69
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
70 // 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
71 // 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
72 // 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
73 // methods.
26772
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
74
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
75 if (uf)
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
76 {
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
77 // 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
78 // 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
79 // 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
80 // 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
81
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
82 tree_parameter_list *pl = uf->is_classdef_constructor ()
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27923
diff changeset
83 ? uf->return_list ()
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27923
diff changeset
84 : uf->parameter_list ();
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 if (pl && pl->size () > 0)
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
87 {
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
88 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
89
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
90 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
91
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
92 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
93 {
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
94 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
95
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
96 return obj.is (arg0_obj);
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
97 }
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
98 }
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
99 }
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
100 }
26772
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
101
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
102 return false;
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
103 }
26772
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
104
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
105 octave_value
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
106 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
107 bool do_check_access,
27187
42efd1e986c7 declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents: 26774
diff changeset
108 const std::string& who) const
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
109 {
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
110 octave_value retval;
26772
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
111
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
112 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
113 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
114
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
115 if (! obj.is_constructed ())
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
116 {
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
117 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
118
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
119 if (! obj.is_partially_constructed_for (cls))
27216
823b4bcf79fc unless necessary for formatting or code, use ' instead of `
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
120 error ("cannot reference properties of class '%s' for non-constructed object",
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
121 cls.get_name ().c_str ());
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
122 }
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 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
125
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
126 // 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
127
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
128 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
129 retval = obj.get (get ("Name").string_value ());
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
130 else
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
131 {
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
132 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
133
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
134 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
135
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
136 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
137
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
138 retval = args(0);
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
139 }
26772
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
140
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
141 return retval;
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
142 }
26772
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
143
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
144 octave_value
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
145 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
146 const std::string& who) const
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
147 {
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
148 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
149 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
150
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
151 return get ("DefaultValue");
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
152 }
26772
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
153
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
154 bool
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
155 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
156 {
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
157 // FIXME: implement
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
158 return false;
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
159 }
26772
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
160
27187
42efd1e986c7 declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents: 26774
diff changeset
161 OCTAVE_NORETURN void
42efd1e986c7 declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents: 26774
diff changeset
162 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
163 (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
164 {
42efd1e986c7 declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents: 26774
diff changeset
165 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
166 std::string acc_s;
42efd1e986c7 declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents: 26774
diff changeset
167
42efd1e986c7 declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents: 26774
diff changeset
168 if (acc.is_string ())
42efd1e986c7 declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents: 26774
diff changeset
169 acc_s = acc.string_value ();
42efd1e986c7 declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents: 26774
diff changeset
170 else
42efd1e986c7 declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents: 26774
diff changeset
171 acc_s = "class-restricted";
42efd1e986c7 declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents: 26774
diff changeset
172
42efd1e986c7 declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents: 26774
diff changeset
173 if (is_set)
27216
823b4bcf79fc unless necessary for formatting or code, use ' instead of `
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
174 error ("%s: property '%s' has %s access and cannot be set in this context",
27187
42efd1e986c7 declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents: 26774
diff changeset
175 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
176 else
27216
823b4bcf79fc unless necessary for formatting or code, use ' instead of `
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
177 error ("%s: property '%s' has %s access and cannot be obtained in this context",
27187
42efd1e986c7 declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents: 26774
diff changeset
178 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
179 }
42efd1e986c7 declare classdef property get methods const
John W. Eaton <jwe@octave.org>
parents: 26774
diff changeset
180
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
181 void
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
182 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
183 const octave_value& val,
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
184 bool do_check_access,
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
185 const std::string& who)
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
186 {
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
187 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
188 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
189
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
190 if (! obj.is_constructed ())
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
191 {
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
192 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
193
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
194 if (! obj.is_partially_constructed_for (cls))
27216
823b4bcf79fc unless necessary for formatting or code, use ' instead of `
John W. Eaton <jwe@octave.org>
parents: 27208
diff changeset
195 error ("cannot reference properties of class '%s' for non-constructed object",
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
196 cls.get_name ().c_str ());
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
197 }
26772
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
198
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
199 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
200
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
201 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
202 obj.put (get ("Name").string_value (), val);
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
203 else
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
204 {
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
205 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
206
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
207 args(0) = to_ov (obj);
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
208 args(1) = val;
26772
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
209
29403
aef9c5caedcd call handle class set method with nargout = 0 (bug #60143)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
210 if (obj.is_handle_object ())
aef9c5caedcd call handle class set method with nargout = 0 (bug #60143)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
211 feval (set_fcn, args, 0);
aef9c5caedcd call handle class set method with nargout = 0 (bug #60143)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
212 else
aef9c5caedcd call handle class set method with nargout = 0 (bug #60143)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
213 {
aef9c5caedcd call handle class set method with nargout = 0 (bug #60143)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
214 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
215
29403
aef9c5caedcd call handle class set method with nargout = 0 (bug #60143)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
216 if (args.length () > 0 && args(0).is_defined ())
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
217 {
29403
aef9c5caedcd call handle class set method with nargout = 0 (bug #60143)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
218 if (args(0).is_classdef_object ())
aef9c5caedcd call handle class set method with nargout = 0 (bug #60143)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
219 {
aef9c5caedcd call handle class set method with nargout = 0 (bug #60143)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
220 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
221
29403
aef9c5caedcd call handle class set method with nargout = 0 (bug #60143)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
222 obj = new_obj;
aef9c5caedcd call handle class set method with nargout = 0 (bug #60143)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
223 }
aef9c5caedcd call handle class set method with nargout = 0 (bug #60143)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
224 else
aef9c5caedcd call handle class set method with nargout = 0 (bug #60143)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
225 ::warning ("set-method of property '%s' returned a non-classdef object",
aef9c5caedcd call handle class set method with nargout = 0 (bug #60143)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
226 get_name ().c_str ());
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
227 }
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
228 }
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
229 }
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
230 }
26772
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
231
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
232 bool
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
233 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
234 {
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
235 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
236
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
237 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
238
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
239 return false;
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
240 }
26772
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
241
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
242 bool
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
243 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
244 {
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
245 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
246
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
247 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
248
26774
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
249 return false;
568c2ab2782d move classdef classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 26772
diff changeset
250 }
26772
d1419ac09564 split method, package, and property classes from cdef-class file
John W. Eaton <jwe@octave.org>
parents:
diff changeset
251 }