Mercurial > octave-nkf
annotate libinterp/octave-value/ov-classdef.cc @ 20615:729a85dafba8
use new string_value method to handle value extraction errors
* ov-class.cc, ov-classdef.cc, ov-fcn-handle.cc, ov-fcn-inline.cc,
ov.cc, pt-idx.cc: Use new string_value method.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Thu, 08 Oct 2015 17:55:57 -0400 |
parents | c1a6c31ac29a |
children |
rev | line source |
---|---|
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1 /* |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2 |
19731
4197fc428c7d
maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents:
19675
diff
changeset
|
3 Copyright (C) 2012-2015 Michael Goffioul |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
4 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
5 This file is part of Octave. |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
6 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
7 Octave is free software; you can redistribute it and/or modify it |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
8 under the terms of the GNU General Public License as published by the |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
9 Free Software Foundation; either version 3 of the License, or (at your |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
10 option) any later version. |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
11 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
12 Octave is distributed in the hope that it will be useful, but WITHOUT |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
15 for more details. |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
16 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
17 You should have received a copy of the GNU General Public License |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
18 along with Octave; see the file COPYING. If not, see |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
19 <http://www.gnu.org/licenses/>. |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
20 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
21 */ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
22 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
23 #ifdef HAVE_CONFIG_H |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
24 #include <config.h> |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
25 #endif |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
26 |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
27 #include <algorithm> |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
28 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
29 #include "defun.h" |
16676
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
30 #include "load-path.h" |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
31 #include "ov-builtin.h" |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
32 #include "ov-classdef.h" |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
33 #include "ov-fcn-handle.h" |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
34 #include "ov-typeinfo.h" |
18263
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
35 #include "ov-usr-fcn.h" |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
36 #include "pt-assign.h" |
15037
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
37 #include "pt-classdef.h" |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
38 #include "pt-funcall.h" |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
39 #include "pt-misc.h" |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
40 #include "pt-stmt.h" |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
41 #include "pt-walk.h" |
16048
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
42 #include "singleton-cleanup.h" |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
43 #include "symtab.h" |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
44 #include "toplev.h" |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
45 |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
46 #include "Array.cc" |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
47 |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
48 // Define to 1 to enable debugging statements. |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
49 #define DEBUG_TRACE 0 |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
50 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
51 static void |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
52 gripe_method_access (const std::string& from, const cdef_method& meth) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
53 { |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
54 octave_value acc = meth.get ("Access"); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
55 std::string acc_s; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
56 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
57 if (acc.is_string ()) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
58 acc_s = acc.string_value (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
59 else |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
60 acc_s = "class-restricted"; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
61 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
62 error ("%s: method `%s' has %s access and cannot be run in this context", |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
63 from.c_str (), meth.get_name ().c_str (), acc_s.c_str ()); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
64 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
65 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
66 static void |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
67 gripe_property_access (const std::string& from, const cdef_property& prop, |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
68 bool is_set = false) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
69 { |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
70 octave_value acc = prop.get (is_set ? "SetAccess" : "GetAccess"); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
71 std::string acc_s; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
72 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
73 if (acc.is_string ()) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
74 acc_s = acc.string_value (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
75 else |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
76 acc_s = "class-restricted"; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
77 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
78 if (is_set) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
79 error ("%s: property `%s' has %s access and cannot be set in this context", |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
80 from.c_str (), prop.get_name ().c_str (), acc_s.c_str ()); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
81 else |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
82 error ("%s: property `%s' has %s access and cannot be obtained in this context", |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
83 from.c_str (), prop.get_name ().c_str (), acc_s.c_str ()); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
84 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
85 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
86 static std::string |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
87 get_base_name (const std::string& nm) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
88 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
89 std::string::size_type pos = nm.find_last_of ('.'); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
90 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
91 if (pos != std::string::npos) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
92 return nm.substr (pos + 1); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
93 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
94 return nm; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
95 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
96 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
97 static void |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
98 make_function_of_class (const std::string& class_name, |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
99 const octave_value& fcn) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
100 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
101 octave_function *of = fcn.function_value (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
102 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
103 of->stash_dispatch_class (class_name); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
104 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
105 octave_user_function *uf = of->user_function_value (true); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
106 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
107 if (uf) |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
108 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
109 if (get_base_name (class_name) == uf->name ()) |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
110 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
111 uf->mark_as_class_constructor (); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
112 uf->mark_as_classdef_constructor (); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
113 } |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
114 else |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
115 uf->mark_as_class_method (); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
116 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
117 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
118 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
119 static void |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
120 make_function_of_class (const cdef_class& cls, const octave_value& fcn) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
121 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
122 make_function_of_class (cls.get_name (), fcn); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
123 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
124 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
125 static octave_value |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
126 make_fcn_handle (octave_builtin::fcn ff, const std::string& nm) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
127 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
128 octave_value fcn (new octave_builtin (ff, nm)); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
129 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
130 octave_value fcn_handle (new octave_fcn_handle (fcn, nm)); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
131 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
132 return fcn_handle; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
133 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
134 |
16698
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
135 static octave_value |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
136 make_fcn_handle (const octave_value& fcn, const std::string& nm) |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
137 { |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
138 octave_value retval; |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
139 |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
140 if (fcn.is_defined ()) |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
141 retval = octave_value (new octave_fcn_handle (fcn, nm)); |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
142 |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
143 return retval; |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
144 } |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
145 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
146 inline octave_value_list |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
147 execute_ov (octave_value val, const octave_value_list& args, int nargout) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
148 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
149 std::list<octave_value_list> idx (1, args); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
150 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
151 std::string type ("("); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
152 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
153 return val.subsref (type, idx, nargout); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
154 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
155 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
156 static cdef_class |
16048
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
157 lookup_class (const std::string& name, bool error_if_not_found = true, |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
158 bool load_if_not_found = true) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
159 { |
16048
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
160 return cdef_manager::find_class (name, error_if_not_found, |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
161 load_if_not_found); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
162 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
163 |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
164 static cdef_class |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
165 lookup_class (const cdef_class& cls) |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
166 { |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
167 // FIXME: placeholder for the time being, the purpose |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
168 // is to centralized any class update activity here. |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
169 |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
170 return cls; |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
171 } |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
172 |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
173 static cdef_class |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
174 lookup_class (const octave_value& ov) |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
175 { |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
176 if (ov.is_string()) |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
177 return lookup_class (ov.string_value ()); |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
178 else |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
179 { |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
180 cdef_class cls (to_cdef (ov)); |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
181 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
182 return lookup_class (cls); |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
183 } |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
184 |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
185 return cdef_class (); |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
186 } |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
187 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
188 static std::list<cdef_class> |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
189 lookup_classes (const Cell& cls_list) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
190 { |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
191 std::list<cdef_class> retval; |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
192 |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
193 for (int i = 0; i < cls_list.numel (); i++) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
194 { |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
195 cdef_class c = lookup_class (cls_list(i)); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
196 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
197 if (! error_state) |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
198 retval.push_back (c); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
199 else |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
200 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
201 retval.clear (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
202 break; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
203 } |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
204 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
205 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
206 return retval; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
207 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
208 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
209 static octave_value |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
210 to_ov (const std::list<cdef_class>& class_list) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
211 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
212 Cell cls (class_list.size (), 1); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
213 int i = 0; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
214 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
215 for (std::list<cdef_class>::const_iterator it = class_list.begin (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
216 it != class_list.end (); ++it, ++i) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
217 cls(i) = to_ov (*it); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
218 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
219 return octave_value (cls); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
220 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
221 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
222 static bool |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
223 is_superclass (const cdef_class& clsa, const cdef_class& clsb, |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
224 bool allow_equal = true, int max_depth = -1) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
225 { |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
226 bool retval = false; |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
227 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
228 if (allow_equal && clsa == clsb) |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
229 retval = true; |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
230 else if (max_depth != 0) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
231 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
232 Cell c = clsb.get ("SuperClasses").cell_value (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
233 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
234 for (int i = 0; ! retval && i < c.numel (); i++) |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
235 { |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
236 cdef_class cls = lookup_class (c(i)); |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
237 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
238 retval = is_superclass (clsa, cls, true, |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
239 max_depth < 0 ? max_depth : max_depth-1); |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
240 } |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
241 } |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
242 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
243 return retval; |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
244 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
245 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
246 inline bool |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
247 is_strict_superclass (const cdef_class& clsa, const cdef_class& clsb) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
248 { return is_superclass (clsa, clsb, false); } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
249 |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
250 inline bool |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
251 is_direct_superclass (const cdef_class& clsa, const cdef_class& clsb) |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
252 { return is_superclass (clsa, clsb, false, 1); } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
253 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
254 static octave_value_list |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
255 class_get_properties (const octave_value_list& args, int /* nargout */) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
256 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
257 octave_value_list retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
258 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
259 if (args.length () == 1 && args(0).type_name () == "object") |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
260 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
261 cdef_class cls (to_cdef (args(0))); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
262 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
263 retval(0) = cls.get_properties (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
264 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
265 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
266 return retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
267 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
268 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
269 static cdef_class |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
270 get_class_context (std::string& name, bool& in_constructor) |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
271 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
272 cdef_class cls; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
273 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
274 octave_function* fcn = octave_call_stack::current (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
275 |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
276 in_constructor = false; |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
277 |
19898
17d647821d61
maint: More cleanup of C++ code to follow Octave coding conventions.
John W. Eaton <jwe@octave.org>
parents:
19895
diff
changeset
|
278 if (fcn && (fcn->is_class_method () |
17d647821d61
maint: More cleanup of C++ code to follow Octave coding conventions.
John W. Eaton <jwe@octave.org>
parents:
19895
diff
changeset
|
279 || fcn->is_classdef_constructor () |
17d647821d61
maint: More cleanup of C++ code to follow Octave coding conventions.
John W. Eaton <jwe@octave.org>
parents:
19895
diff
changeset
|
280 || fcn->is_anonymous_function_of_class () |
17d647821d61
maint: More cleanup of C++ code to follow Octave coding conventions.
John W. Eaton <jwe@octave.org>
parents:
19895
diff
changeset
|
281 || (fcn->is_private_function () |
17d647821d61
maint: More cleanup of C++ code to follow Octave coding conventions.
John W. Eaton <jwe@octave.org>
parents:
19895
diff
changeset
|
282 && ! fcn->dispatch_class ().empty ()))) |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
283 { |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
284 cls = lookup_class (fcn->dispatch_class ()); |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
285 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
286 name = fcn->name (); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
287 in_constructor = fcn->is_classdef_constructor (); |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
288 } |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
289 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
290 return cls; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
291 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
292 |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
293 inline cdef_class |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
294 get_class_context (void) |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
295 { |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
296 std::string dummy_string; |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
297 bool dummy_bool; |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
298 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
299 return get_class_context (dummy_string, dummy_bool); |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
300 } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
301 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
302 static bool |
18314
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
303 in_class_method (const cdef_class& cls) |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
304 { |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
305 cdef_class ctx = get_class_context (); |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
306 |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
307 return (ctx.ok () && is_superclass (ctx, cls)); |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
308 } |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
309 |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
310 static bool |
18305
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
311 check_access (const cdef_class& cls, const octave_value& acc, |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
312 const std::string& meth_name = std::string (), |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
313 const std::string& prop_name = std::string (), |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
314 bool is_prop_set = false) |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
315 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
316 if (acc.is_string ()) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
317 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
318 std::string acc_s = acc.string_value (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
319 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
320 if (acc_s == "public") |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
321 return true; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
322 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
323 cdef_class ctx = get_class_context (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
324 |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
325 // The access is private or protected, this requires a |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
326 // valid class context. |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
327 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
328 if (ctx.ok ()) |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
329 { |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
330 if (acc_s == "private") |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
331 return (ctx == cls); |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
332 else if (acc_s == "protected") |
18305
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
333 { |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
334 if (is_superclass (cls, ctx)) |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
335 // Calling a protected method in a superclass. |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
336 return true; |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
337 else if (is_strict_superclass (ctx, cls)) |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
338 { |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
339 // Calling a protected method or property in a derived class. |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
340 // This is only allowed if the context class knows about it |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
341 // and has access to it. |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
342 |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
343 if (! meth_name.empty ()) |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
344 { |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
345 cdef_method m = ctx.find_method (meth_name); |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
346 |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
347 if (m.ok ()) |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
348 return check_access (ctx, m.get ("Access"), meth_name); |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
349 |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
350 return false; |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
351 } |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
352 else if (! prop_name.empty ()) |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
353 { |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
354 cdef_property p = ctx.find_property (prop_name); |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
355 |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
356 if (p.ok ()) |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
357 { |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
358 octave_value p_access = p.get (is_prop_set ? |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
359 "SetAccess" : |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
360 "GetAccess"); |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
361 |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
362 return check_access (ctx, p_access, meth_name, |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
363 prop_name, is_prop_set); |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
364 } |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
365 |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
366 return false; |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
367 } |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
368 else |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
369 panic_impossible (); |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
370 } |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
371 |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
372 return false; |
81c1edd70bfd
Allow base classes to access protected members of derived classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18263
diff
changeset
|
373 } |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
374 else |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
375 panic_impossible (); |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
376 } |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
377 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
378 else if (acc.is_cell ()) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
379 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
380 Cell acc_c = acc.cell_value (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
381 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
382 cdef_class ctx = get_class_context (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
383 |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
384 // At this point, a class context is always required. |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
385 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
386 if (ctx.ok ()) |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
387 { |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
388 if (ctx == cls) |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
389 return true; |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
390 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
391 for (int i = 0; i < acc.numel (); i++) |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
392 { |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
393 cdef_class acc_cls (to_cdef (acc_c(i))); |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
394 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
395 if (is_superclass (acc_cls, ctx)) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
396 return true; |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
397 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
398 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
399 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
400 else |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
401 error ("invalid property/method access in class `%s'", |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
402 cls.get_name ().c_str ()); |
19631
db92e7e28e1f
strip trailing whitespace from most source files
John W. Eaton <jwe@octave.org>
parents:
19377
diff
changeset
|
403 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
404 return false; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
405 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
406 |
18263
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
407 static bool |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
408 is_dummy_method (const octave_value& fcn) |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
409 { |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
410 bool retval = false; |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
411 |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
412 if (fcn.is_defined ()) |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
413 { |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
414 if (fcn.is_user_function ()) |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
415 { |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
416 octave_user_function *uf = fcn.user_function_value (true); |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
417 |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
418 if (! uf || ! uf->body ()) |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
419 retval = true; |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
420 } |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
421 } |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
422 else |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
423 retval = true; |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
424 |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
425 return retval; |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
426 } |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
427 |
16698
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
428 bool |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
429 is_method_executing (const octave_value& ov, const cdef_object& obj) |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
430 { |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
431 octave_function* stack_fcn = octave_call_stack::current (); |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
432 |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
433 octave_function* method_fcn = ov.function_value (true); |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
434 |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
435 // Does the top of the call stack match our target function? |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
436 |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
437 if (stack_fcn && stack_fcn == method_fcn) |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
438 { |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
439 octave_user_function* uf = method_fcn->user_function_value (true); |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
440 |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
441 // We can only check the context object for user-function (not builtin), |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
442 // where we have access to the parameters (arguments and return values). |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
443 // That's ok as there's no need to call this function for builtin |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
444 // methods. |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
445 |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
446 if (uf) |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
447 { |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
448 // At this point, the method is executing, but we still need to |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
449 // check the context object for which the method is executing. For |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
450 // methods, it's the first argument of the function; for ctors, it |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
451 // is the first return value. |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
452 |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
453 tree_parameter_list* pl = uf->is_classdef_constructor () |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
454 ? uf->return_list () : uf->parameter_list (); |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
455 |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
456 if (pl && pl->size () > 0) |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
457 { |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
458 octave_value arg0 = pl->front ()->lvalue ().value (); |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
459 |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
460 if (arg0.is_defined () && arg0.type_name () == "object") |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
461 { |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
462 cdef_object arg0_obj = to_cdef (arg0); |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
463 |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
464 return obj.is (arg0_obj); |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
465 } |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
466 } |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
467 } |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
468 } |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
469 |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
470 return false; |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
471 } |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
472 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
473 static octave_value_list |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
474 class_get_methods (const octave_value_list& args, int /* nargout */) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
475 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
476 octave_value_list retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
477 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
478 if (args.length () == 1 && args(0).type_name () == "object") |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
479 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
480 cdef_class cls (to_cdef (args(0))); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
481 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
482 retval(0) = cls.get_methods (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
483 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
484 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
485 return retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
486 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
487 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
488 static octave_value_list |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
489 class_get_superclasses (const octave_value_list& args, int /* nargout */) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
490 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
491 octave_value_list retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
492 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
493 if (args.length () == 1 && args(0).type_name () == "object" |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
494 && args(0).class_name () == "meta.class") |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
495 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
496 cdef_class cls (to_cdef (args(0))); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
497 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
498 Cell classes = cls.get ("SuperClasses").cell_value (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
499 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
500 retval(0) = to_ov (lookup_classes (classes)); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
501 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
502 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
503 return retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
504 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
505 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
506 static octave_value_list |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
507 class_get_inferiorclasses (const octave_value_list& args, int /* nargout */) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
508 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
509 octave_value_list retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
510 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
511 if (args.length () == 1 && args(0).type_name () == "object" |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
512 && args(0).class_name () == "meta.class") |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
513 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
514 cdef_class cls (to_cdef (args(0))); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
515 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
516 Cell classes = cls.get ("InferiorClasses").cell_value (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
517 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
518 retval(0) = to_ov (lookup_classes (classes)); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
519 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
520 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
521 return retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
522 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
523 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
524 static octave_value_list |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
525 class_fromName (const octave_value_list& args, int /* nargout */) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
526 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
527 octave_value_list retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
528 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
529 if (args.length () == 1) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
530 { |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
531 std::string name = args(0).string_value ("fromName: invalid class name, expected a string value"); |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
532 |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
533 retval(0) = to_ov (lookup_class (name)); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
534 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
535 else |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
536 error ("fromName: invalid number of parameters"); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
537 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
538 return retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
539 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
540 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
541 static octave_value_list |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
542 class_fevalStatic (const octave_value_list& args, int nargout) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
543 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
544 octave_value_list retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
545 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
546 if (args.length () > 1 && args(0).type_name () == "object") |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
547 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
548 cdef_class cls (to_cdef (args(0))); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
549 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
550 if (! error_state) |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
551 { |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
552 std::string meth_name = args(1).string_value ("fevalStatic: invalid method name, expected a string value"); |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
553 |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
554 cdef_method meth = cls.find_method (meth_name); |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
555 |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
556 if (meth.ok ()) |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
557 { |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
558 if (meth.is_static ()) |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
559 retval = meth.execute (args.splice (0, 2), nargout, |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
560 true, "fevalStatic"); |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
561 else |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
562 error ("fevalStatic: method `%s' is not static", |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
563 meth_name.c_str ()); |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
564 } |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
565 else |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
566 error ("fevalStatic: method not found: %s", meth_name.c_str ()); |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
567 } |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
568 else |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
569 error ("fevalStatic: invalid object, expected a meta.class object"); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
570 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
571 else |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
572 error ("fevalStatic: invalid arguments"); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
573 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
574 return retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
575 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
576 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
577 static octave_value_list |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
578 class_getConstant (const octave_value_list& args, int /* nargout */) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
579 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
580 octave_value_list retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
581 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
582 if (args.length () == 2 && args(0).type_name () == "object" |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
583 && args(0).class_name () == "meta.class") |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
584 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
585 cdef_class cls = to_cdef (args(0)); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
586 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
587 if (! error_state) |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
588 { |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
589 std::string prop_name = args(1).string_value ("getConstant: invalid property name, expected a string value"); |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
590 |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
591 cdef_property prop = cls.find_property (prop_name); |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
592 |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
593 if (prop.ok ()) |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
594 { |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
595 if (prop.is_constant ()) |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
596 retval(0) = prop.get_value (true, "getConstant"); |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
597 else |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
598 error ("getConstant: property `%s' is not constant", |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
599 prop_name.c_str ()); |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
600 } |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
601 else |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
602 error ("getConstant: property not found: %s", |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
603 prop_name.c_str ()); |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
604 } |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
605 else |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
606 error ("getConstant: invalid object, expected a meta.class object"); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
607 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
608 else |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
609 error ("getConstant: invalid arguments"); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
610 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
611 return retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
612 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
613 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
614 #define META_CLASS_CMP(OP, CLSA, CLSB, FUN) \ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
615 static octave_value_list \ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
616 class_ ## OP (const octave_value_list& args, int /* nargout */) \ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
617 { \ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
618 octave_value_list retval; \ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
619 \ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
620 if (args.length () == 2 \ |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
621 && args(0).type_name () == "object" \ |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
622 && args(1).type_name () == "object" \ |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
623 && args(0).class_name () == "meta.class" \ |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
624 && args(1).class_name () == "meta.class") \ |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
625 { \ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
626 cdef_class clsa = to_cdef (args(0)); \ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
627 \ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
628 cdef_class clsb = to_cdef (args(1)); \ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
629 \ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
630 if (! error_state) \ |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
631 retval(0) = FUN (CLSA, CLSB); \ |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
632 else \ |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
633 error (#OP ": invalid objects, expected meta.class objects"); \ |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
634 } \ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
635 else \ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
636 error (#OP ": invalid arguments"); \ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
637 \ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
638 return retval; \ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
639 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
640 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
641 META_CLASS_CMP (lt, clsb, clsa, is_strict_superclass) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
642 META_CLASS_CMP (le, clsb, clsa, is_superclass) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
643 META_CLASS_CMP (gt, clsa, clsb, is_strict_superclass) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
644 META_CLASS_CMP (ge, clsa, clsb, is_superclass) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
645 META_CLASS_CMP (eq, clsa, clsb, operator==) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
646 META_CLASS_CMP (ne, clsa, clsb, operator!=) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
647 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
648 octave_value_list |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
649 property_get_defaultvalue (const octave_value_list& args, int /* nargout */) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
650 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
651 octave_value_list retval; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
652 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
653 if (args.length () == 1 && args(0).type_name () == "object") |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
654 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
655 cdef_property prop (to_cdef (args(0))); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
656 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
657 retval(0) = prop.get ("DefaultValue"); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
658 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
659 if (! retval(0).is_defined ()) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
660 error_with_id ("Octave:class:NotDefaultDefined", |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
661 "no default value for property `%s'", |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
662 prop.get_name ().c_str ()); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
663 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
664 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
665 return retval; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
666 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
667 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
668 static octave_value_list |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
669 handle_delete (const octave_value_list& /* args */, int /* nargout */) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
670 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
671 octave_value_list retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
672 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
673 // FIXME: implement this |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
674 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
675 return retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
676 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
677 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
678 static cdef_class |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
679 make_class (const std::string& name, |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
680 const std::list<cdef_class>& super_list = std::list<cdef_class> ()) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
681 { |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
682 cdef_class cls (name, super_list); |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
683 |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
684 cls.set_class (cdef_class::meta_class ()); |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
685 cls.put ("Abstract", false); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
686 cls.put ("ConstructOnLoad", false); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
687 cls.put ("ContainingPackage", Matrix ()); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
688 cls.put ("Description", std::string ()); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
689 cls.put ("DetailedDescription", std::string ()); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
690 cls.put ("Events", Cell ()); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
691 cls.put ("Hidden", false); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
692 cls.put ("InferiorClasses", Cell ()); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
693 cls.put ("Methods", Cell ()); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
694 cls.put ("Properties", Cell ()); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
695 cls.put ("Sealed", false); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
696 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
697 if (name == "handle") |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
698 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
699 cls.put ("HandleCompatible", true); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
700 cls.mark_as_handle_class (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
701 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
702 else if (super_list.empty ()) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
703 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
704 cls.put ("HandleCompatible", false); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
705 } |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
706 else |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
707 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
708 bool all_handle_compatible = true; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
709 bool has_handle_class = false; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
710 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
711 for (std::list<cdef_class>::const_iterator it = super_list.begin (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
712 it != super_list.end (); ++it) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
713 { |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
714 all_handle_compatible = all_handle_compatible |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
715 && it->get ("HandleCompatible").bool_value (); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
716 has_handle_class = has_handle_class || it->is_handle_class (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
717 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
718 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
719 if (has_handle_class && ! all_handle_compatible) |
20463
7ac907da9fba
Use error() rather than ::error() unless explicitly required.
Rik <rik@octave.org>
parents:
20228
diff
changeset
|
720 error ("%s: cannot mix handle and non-HandleCompatible classes", |
7ac907da9fba
Use error() rather than ::error() unless explicitly required.
Rik <rik@octave.org>
parents:
20228
diff
changeset
|
721 name.c_str ()); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
722 else |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
723 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
724 cls.put ("HandleCompatible", all_handle_compatible); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
725 if (has_handle_class) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
726 cls.mark_as_handle_class (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
727 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
728 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
729 |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
730 if (! name.empty ()) |
16048
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
731 cdef_manager::register_class (cls); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
732 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
733 return cls; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
734 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
735 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
736 static cdef_class |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
737 make_class (const std::string& name, const cdef_class& super) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
738 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
739 return make_class (name, std::list<cdef_class> (1, super)); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
740 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
741 |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
742 static cdef_class |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
743 make_meta_class (const std::string& name, const cdef_class& super) |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
744 { |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
745 cdef_class cls = make_class (name, super); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
746 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
747 cls.put ("Sealed", true); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
748 cls.mark_as_meta_class (); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
749 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
750 return cls; |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
751 } |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
752 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
753 static cdef_property |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
754 make_property (const cdef_class& cls, const std::string& name, |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
755 const octave_value& get_method = Matrix (), |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
756 const std::string& get_access = "public", |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
757 const octave_value& set_method = Matrix (), |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
758 const std::string& set_access = "public") |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
759 { |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
760 cdef_property prop (name); |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
761 |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
762 prop.set_class (cdef_class::meta_property ()); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
763 prop.put ("Description", std::string ()); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
764 prop.put ("DetailedDescription", std::string ()); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
765 prop.put ("Abstract", false); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
766 prop.put ("Constant", false); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
767 prop.put ("GetAccess", get_access); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
768 prop.put ("SetAccess", set_access); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
769 prop.put ("Dependent", false); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
770 prop.put ("Transient", false); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
771 prop.put ("Hidden", false); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
772 prop.put ("GetObservable", false); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
773 prop.put ("SetObservable", false); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
774 prop.put ("GetMethod", get_method); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
775 prop.put ("SetMethod", set_method); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
776 prop.put ("DefiningClass", to_ov (cls)); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
777 prop.put ("DefaultValue", octave_value ()); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
778 prop.put ("HasDefault", false); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
779 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
780 std::string class_name = cls.get_name (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
781 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
782 if (! get_method.is_empty ()) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
783 make_function_of_class (class_name, get_method); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
784 if (! set_method.is_empty ()) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
785 make_function_of_class (class_name, set_method); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
786 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
787 return prop; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
788 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
789 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
790 inline cdef_property |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
791 make_attribute (const cdef_class& cls, const std::string& name) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
792 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
793 return make_property (cls, name, Matrix (), "public", Matrix (), "private"); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
794 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
795 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
796 static cdef_method |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
797 make_method (const cdef_class& cls, const std::string& name, |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
798 const octave_value& fcn,const std::string& m_access = "public", |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
799 bool is_static = false) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
800 { |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
801 cdef_method meth (name); |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
802 |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
803 meth.set_class (cdef_class::meta_method ()); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
804 meth.put ("Abstract", false); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
805 meth.put ("Access", m_access); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
806 meth.put ("DefiningClass", to_ov (cls)); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
807 meth.put ("Description", std::string ()); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
808 meth.put ("DetailedDescription", std::string ()); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
809 meth.put ("Hidden", false); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
810 meth.put ("Sealed", true); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
811 meth.put ("Static", is_static); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
812 |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
813 if (fcn.is_defined ()) |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
814 make_function_of_class (cls, fcn); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
815 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
816 meth.set_function (fcn); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
817 |
18263
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
818 if (is_dummy_method (fcn)) |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
819 meth.mark_as_external (cls.get_name ()); |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
820 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
821 return meth; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
822 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
823 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
824 inline cdef_method |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
825 make_method (const cdef_class& cls, const std::string& name, |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
826 octave_builtin::fcn ff, const std::string& m_access = "public", |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
827 bool is_static = false) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
828 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
829 octave_value fcn (new octave_builtin (ff, name)); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
830 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
831 return make_method (cls, name, fcn, m_access, is_static); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
832 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
833 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
834 static cdef_package |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
835 make_package (const std::string& nm, |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
836 const std::string& parent = std::string ()) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
837 { |
16676
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
838 cdef_package pack (nm); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
839 |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
840 pack.set_class (cdef_class::meta_package ()); |
16048
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
841 if (parent.empty ()) |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
842 pack.put ("ContainingPackage", Matrix ()); |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
843 else |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
844 pack.put ("ContainingPackage", to_ov (cdef_manager::find_package (parent))); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
845 |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
846 if (! nm.empty ()) |
16048
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
847 cdef_manager::register_package (pack); |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
848 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
849 return pack; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
850 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
851 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
852 //---------------------------------------------------------------------------- |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
853 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
854 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
855 int octave_classdef::t_id (-1); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
856 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
857 const std::string octave_classdef::t_name ("object"); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
858 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
859 void |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
860 octave_classdef::register_type (void) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
861 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
862 t_id = octave_value_typeinfo::register_type |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
863 (octave_classdef::t_name, "<unknown>", |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
864 octave_value (new octave_classdef ())); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
865 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
866 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
867 octave_value_list |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
868 octave_classdef::subsref (const std::string& type, |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
869 const std::list<octave_value_list>& idx, |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
870 int nargout) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
871 { |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
872 size_t skip = 0; |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
873 octave_value_list retval; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
874 |
18314
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
875 cdef_class cls = object.get_class (); |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
876 |
18316
ff311e5ff6d8
Don't call classdef-overloaded subsref from builtin calls.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18314
diff
changeset
|
877 if (! in_class_method (cls) && ! called_from_builtin ()) |
18314
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
878 { |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
879 cdef_method meth = cls.find_method ("subsref"); |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
880 |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
881 if (meth.ok ()) |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
882 { |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
883 octave_value_list args; |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
884 |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
885 args(1) = make_idx_args (type, idx, "subsref"); |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
886 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
887 count++; |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
888 args(0) = octave_value (this); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
889 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
890 retval = meth.execute (args, nargout, true, "subsref"); |
18314
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
891 |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
892 return retval; |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
893 } |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
894 } |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
895 |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
896 // At this point, the default subsref mechanism must be used. |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
897 |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
898 retval = object.subsref (type, idx, nargout, skip, cdef_class ()); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
899 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
900 if (type.length () > skip && idx.size () > skip) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
901 retval = retval(0).next_subsref (nargout, type, idx, skip); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
902 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
903 return retval; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
904 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
905 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
906 octave_value |
16696
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
907 octave_classdef::subsref (const std::string& type, |
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
908 const std::list<octave_value_list>& idx, |
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
909 bool auto_add) |
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
910 { |
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
911 size_t skip = 0; |
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
912 octave_value_list retval; |
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
913 |
18314
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
914 // This variant of subsref is used to create temporary values when doing |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
915 // assignment with multi-level indexing. AFAIK this is only used for internal |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
916 // purpose (not sure we should even implement this) and any overload subsref |
06eb893b9db6
Implement subsref overloading in classdef.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18305
diff
changeset
|
917 // should not be called. |
16696
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
918 |
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
919 retval = object.subsref (type, idx, 1, skip, cdef_class (), auto_add); |
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
920 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
921 if (type.length () > skip && idx.size () > skip) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
922 retval = retval(0).next_subsref (1, type, idx, skip); |
16696
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
923 |
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
924 return retval.length () > 0 ? retval(0) : octave_value (); |
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
925 } |
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
926 |
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
927 octave_value |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
928 octave_classdef::subsasgn (const std::string& type, |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
929 const std::list<octave_value_list>& idx, |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
930 const octave_value& rhs) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
931 { |
18382
6e3344111522
Implement subsasgn overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18355
diff
changeset
|
932 octave_value retval; |
6e3344111522
Implement subsasgn overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18355
diff
changeset
|
933 |
6e3344111522
Implement subsasgn overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18355
diff
changeset
|
934 cdef_class cls = object.get_class (); |
6e3344111522
Implement subsasgn overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18355
diff
changeset
|
935 |
6e3344111522
Implement subsasgn overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18355
diff
changeset
|
936 if (! in_class_method (cls) && ! called_from_builtin ()) |
6e3344111522
Implement subsasgn overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18355
diff
changeset
|
937 { |
6e3344111522
Implement subsasgn overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18355
diff
changeset
|
938 cdef_method meth = cls.find_method ("subsasgn"); |
6e3344111522
Implement subsasgn overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18355
diff
changeset
|
939 |
6e3344111522
Implement subsasgn overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18355
diff
changeset
|
940 if (meth.ok ()) |
6e3344111522
Implement subsasgn overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18355
diff
changeset
|
941 { |
6e3344111522
Implement subsasgn overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18355
diff
changeset
|
942 octave_value_list args; |
6e3344111522
Implement subsasgn overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18355
diff
changeset
|
943 |
6e3344111522
Implement subsasgn overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18355
diff
changeset
|
944 args(1) = make_idx_args (type, idx, "subsasgn"); |
6e3344111522
Implement subsasgn overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18355
diff
changeset
|
945 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
946 count++; |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
947 args(0) = octave_value (this); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
948 args(2) = rhs; |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
949 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
950 octave_value_list retlist; |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
951 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
952 retlist = meth.execute (args, 1, true, "subsasgn"); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
953 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
954 if (retlist.length () > 0) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
955 retval = retlist(0); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
956 else |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
957 error ("overloaded method `subsasgn' did not return any value"); |
18382
6e3344111522
Implement subsasgn overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18355
diff
changeset
|
958 } |
6e3344111522
Implement subsasgn overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18355
diff
changeset
|
959 } |
6e3344111522
Implement subsasgn overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18355
diff
changeset
|
960 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
961 if (! retval.is_defined ()) |
18382
6e3344111522
Implement subsasgn overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18355
diff
changeset
|
962 retval = object.subsasgn (type, idx, rhs); |
6e3344111522
Implement subsasgn overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18355
diff
changeset
|
963 |
6e3344111522
Implement subsasgn overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18355
diff
changeset
|
964 return retval; |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
965 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
966 |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
967 octave_value |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
968 octave_classdef::undef_subsasgn (const std::string& type, |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
969 const std::list<octave_value_list>& idx, |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
970 const octave_value& rhs) |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
971 { |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
972 if (type.length () == 1 && type[0] == '(') |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
973 { |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
974 object = object.make_array (); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
975 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
976 return subsasgn (type, idx, rhs); |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
977 } |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
978 else |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
979 return octave_base_value::undef_subsasgn (type, idx, rhs); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
980 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
981 return octave_value (); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
982 } |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
983 |
18416
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
984 void |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
985 octave_classdef::print (std::ostream& os, bool) |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
986 { |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
987 if (! called_from_builtin ()) |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
988 { |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
989 cdef_method meth = object.get_class ().find_method ("disp"); |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
990 |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
991 if (meth.ok ()) |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
992 { |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
993 octave_value_list args; |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
994 |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
995 count++; |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
996 args(0) = octave_value (this); |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
997 |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
998 indent (os); |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
999 meth.execute (args, 0, true, "disp"); |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1000 |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1001 return; |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1002 } |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1003 } |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1004 |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1005 print_raw (os); |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1006 } |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1007 |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1008 void |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1009 octave_classdef::print_raw (std::ostream& os, bool) const |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1010 { |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1011 indent (os); |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1012 os << "<object "; |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1013 if (object.is_array ()) |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1014 os << "array "; |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1015 os << class_name () << ">"; |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1016 newline (os); |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1017 } |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1018 |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1019 bool |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1020 octave_classdef::print_name_tag (std::ostream& os, |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1021 const std::string& name) const |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1022 { |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1023 return octave_base_value::print_name_tag (os, name); |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1024 } |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1025 |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1026 void |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1027 octave_classdef::print_with_name (std::ostream& os, const std::string& name, |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1028 bool print_padding) |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1029 { |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1030 cdef_method meth = object.get_class ().find_method ("display"); |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1031 |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1032 if (meth.ok ()) |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1033 { |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1034 octave_value_list args; |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1035 |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1036 count++; |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1037 args(0) = octave_value (this); |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1038 |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1039 string_vector arg_names (1); |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1040 |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1041 arg_names[0] = name; |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1042 args.stash_name_tags (arg_names); |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1043 |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1044 indent (os); |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1045 meth.execute (args, 0, true, "display"); |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1046 } |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1047 else |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1048 octave_base_value::print_with_name (os, name, print_padding); |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1049 } |
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18397
diff
changeset
|
1050 |
19137
56bc1464ec59
Implement "isa" for classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19065
diff
changeset
|
1051 bool |
56bc1464ec59
Implement "isa" for classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19065
diff
changeset
|
1052 octave_classdef::is_instance_of (const std::string& cls_name) const |
56bc1464ec59
Implement "isa" for classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19065
diff
changeset
|
1053 { |
56bc1464ec59
Implement "isa" for classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19065
diff
changeset
|
1054 cdef_class cls = lookup_class (cls_name, false, false); |
56bc1464ec59
Implement "isa" for classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19065
diff
changeset
|
1055 |
56bc1464ec59
Implement "isa" for classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19065
diff
changeset
|
1056 if (cls.ok ()) |
56bc1464ec59
Implement "isa" for classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19065
diff
changeset
|
1057 return is_superclass (cls, object.get_class ()); |
56bc1464ec59
Implement "isa" for classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19065
diff
changeset
|
1058 |
56bc1464ec59
Implement "isa" for classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19065
diff
changeset
|
1059 return false; |
56bc1464ec59
Implement "isa" for classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19065
diff
changeset
|
1060 } |
56bc1464ec59
Implement "isa" for classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19065
diff
changeset
|
1061 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1062 //---------------------------------------------------------------------------- |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1063 |
15986
14aa0b5a980c
Abstract the meta-protocol layer to use it for other meta objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15968
diff
changeset
|
1064 class octave_classdef_meta : public octave_function |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1065 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1066 public: |
15986
14aa0b5a980c
Abstract the meta-protocol layer to use it for other meta objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15968
diff
changeset
|
1067 octave_classdef_meta (const cdef_meta_object& obj) |
14aa0b5a980c
Abstract the meta-protocol layer to use it for other meta objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15968
diff
changeset
|
1068 : object (obj) { } |
14aa0b5a980c
Abstract the meta-protocol layer to use it for other meta objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15968
diff
changeset
|
1069 |
14aa0b5a980c
Abstract the meta-protocol layer to use it for other meta objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15968
diff
changeset
|
1070 ~octave_classdef_meta (void) |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1071 { object.meta_release (); } |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1072 |
15955
837a4a9b5049
Support constructor call with no indexing syntax.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15913
diff
changeset
|
1073 octave_function* function_value (bool = false) { return this; } |
837a4a9b5049
Support constructor call with no indexing syntax.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15913
diff
changeset
|
1074 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1075 octave_value_list |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1076 subsref (const std::string& type, |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1077 const std::list<octave_value_list>& idx, |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1078 int nargout) |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1079 { return object.meta_subsref (type, idx, nargout); } |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1080 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1081 octave_value |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1082 subsref (const std::string& type, |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1083 const std::list<octave_value_list>& idx) |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1084 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1085 octave_value_list retval; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1086 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1087 retval = subsref (type, idx, 1); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1088 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1089 return (retval.length () > 0 ? retval(0) : octave_value ()); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1090 } |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1091 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1092 octave_value_list |
15955
837a4a9b5049
Support constructor call with no indexing syntax.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15913
diff
changeset
|
1093 do_multi_index_op (int nargout, const octave_value_list& idx) |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1094 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1095 // Emulate ()-type meta subsref |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1096 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1097 std::list<octave_value_list> l (1, idx); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1098 std::string type ("("); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1099 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1100 return subsref (type, l, nargout); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1101 } |
15955
837a4a9b5049
Support constructor call with no indexing syntax.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15913
diff
changeset
|
1102 |
837a4a9b5049
Support constructor call with no indexing syntax.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15913
diff
changeset
|
1103 bool is_postfix_index_handled (char type) const |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1104 { return object.meta_is_postfix_index_handled (type); } |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1105 |
18441
b0aba84cf80f
Support handle to classdef constructor.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18439
diff
changeset
|
1106 bool |
b0aba84cf80f
Support handle to classdef constructor.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18439
diff
changeset
|
1107 is_classdef_constructor (const std::string& cname = std::string ()) const |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1108 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1109 bool retval = false; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1110 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1111 if (object.is_class ()) |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1112 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1113 if (cname.empty ()) |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1114 retval = true; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1115 else |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1116 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1117 cdef_class cls (object); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1118 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1119 if (cls.get_name () == cname) |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1120 retval = true; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1121 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1122 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1123 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1124 return retval; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1125 } |
18441
b0aba84cf80f
Support handle to classdef constructor.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18439
diff
changeset
|
1126 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1127 private: |
15986
14aa0b5a980c
Abstract the meta-protocol layer to use it for other meta objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15968
diff
changeset
|
1128 cdef_meta_object object; |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1129 }; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1130 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1131 //---------------------------------------------------------------------------- |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1132 |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1133 class octave_classdef_superclass_ref : public octave_function |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1134 { |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1135 public: |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1136 octave_classdef_superclass_ref (const octave_value_list& a) |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1137 : octave_function (), args (a) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1138 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1139 ~octave_classdef_superclass_ref (void) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1140 |
18355
9ca314e79956
Allow to call superclass constructor without arguments.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18316
diff
changeset
|
1141 octave_function* function_value (bool = false) { return this; } |
9ca314e79956
Allow to call superclass constructor without arguments.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18316
diff
changeset
|
1142 |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1143 octave_value_list |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1144 subsref (const std::string& type, |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1145 const std::list<octave_value_list>& idx, |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1146 int nargout) |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1147 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1148 size_t skip = 0; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1149 octave_value_list retval; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1150 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1151 switch (type[0]) |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1152 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1153 case '(': |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1154 skip = 1; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1155 retval = do_multi_index_op (type.length () > 1 ? 1 : nargout, |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1156 idx.front ()); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1157 break; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1158 default: |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1159 retval = do_multi_index_op (1, octave_value_list ()); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1160 break; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1161 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1162 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1163 if (type.length () > skip && idx.size () > skip |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1164 && retval.length () > 0) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1165 retval = retval(0).next_subsref (nargout, type, idx, skip); |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1166 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1167 return retval; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1168 } |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1169 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1170 octave_value |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1171 subsref (const std::string& type, |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1172 const std::list<octave_value_list>& idx) |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1173 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1174 octave_value_list retval; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1175 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1176 retval = subsref (type, idx, 1); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1177 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1178 return (retval.length () > 0 ? retval(0) : octave_value ()); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1179 } |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1180 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1181 octave_value_list |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1182 do_multi_index_op (int nargout, const octave_value_list& idx) |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1183 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1184 octave_value_list retval; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1185 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1186 std::string meth_name; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1187 bool in_constructor; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1188 cdef_class ctx; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1189 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1190 ctx = get_class_context (meth_name, in_constructor); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1191 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1192 if (! error_state && ctx.ok ()) |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1193 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1194 std::string mname = args(0).string_value (); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1195 std::string cname = args(1).string_value (); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1196 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1197 cdef_class cls = lookup_class (cname); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1198 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1199 if (in_constructor) |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1200 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1201 if (is_direct_superclass (cls, ctx)) |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1202 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1203 if (is_constructed_object (mname)) |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1204 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1205 octave_value sym = symbol_table::varval (mname); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1206 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1207 cls.run_constructor (to_cdef_ref (sym), idx); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1208 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1209 retval(0) = sym; |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1210 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1211 else |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1212 error ("cannot call superclass constructor with " |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1213 "variable `%s'", mname.c_str ()); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1214 } |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1215 else |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1216 error ("`%s' is not a direct superclass of `%s'", |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1217 cname.c_str (), ctx.get_name ().c_str ()); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1218 } |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1219 else |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1220 { |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1221 if (mname == meth_name) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1222 { |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1223 if (is_strict_superclass (cls, ctx)) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1224 { |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1225 // I see 2 possible implementations here: |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1226 // 1) use cdef_object::subsref with a different class |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1227 // context; this avoids duplicating code, but |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1228 // assumes the object is always the first argument |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1229 // 2) lookup the method manually and call |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1230 // cdef_method::execute; this duplicates part of |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1231 // logic in cdef_object::subsref, but avoid the |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1232 // assumption of 1) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1233 // Not being sure about the assumption of 1), I |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1234 // go with option 2) for the time being. |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1235 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1236 cdef_method meth = cls.find_method (meth_name, false); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1237 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1238 if (meth.ok ()) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1239 retval = meth.execute (idx, nargout, true, |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1240 meth_name); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1241 else |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1242 error ("no method `%s' found in superclass `%s'", |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1243 meth_name.c_str (), cname.c_str ()); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1244 } |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1245 else |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1246 error ("`%s' is not a superclass of `%s'", |
20463
7ac907da9fba
Use error() rather than ::error() unless explicitly required.
Rik <rik@octave.org>
parents:
20228
diff
changeset
|
1247 cname.c_str (), ctx.get_name ().c_str ()); |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1248 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1249 else |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1250 error ("method name mismatch (`%s' != `%s')", |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1251 mname.c_str (), meth_name.c_str ()); |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1252 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1253 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1254 else if (! error_state) |
20463
7ac907da9fba
Use error() rather than ::error() unless explicitly required.
Rik <rik@octave.org>
parents:
20228
diff
changeset
|
1255 error ("superclass calls can only occur in methods or constructors"); |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1256 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1257 return retval; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1258 } |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1259 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1260 private: |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1261 bool is_constructed_object (const std::string nm) |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1262 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1263 octave_function *of = octave_call_stack::current (); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1264 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1265 if (of->is_classdef_constructor ()) |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1266 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1267 octave_user_function *uf = of->user_function_value (true); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1268 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1269 if (uf) |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1270 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1271 tree_parameter_list *ret_list = uf->return_list (); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1272 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1273 if (ret_list && ret_list->length () == 1) |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1274 return (ret_list->front ()->name () == nm); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1275 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1276 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1277 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1278 return false; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1279 } |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1280 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1281 private: |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1282 octave_value_list args; |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1283 }; |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1284 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1285 //---------------------------------------------------------------------------- |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1286 |
19218
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1287 octave_map |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1288 cdef_object::map_value (void) const |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1289 { |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1290 octave_map retval; |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1291 |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1292 warning_with_id ("Octave:classdef-to-struct", |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1293 "struct: converting a classdef object into a struct " |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1294 "overrides the access restrictions defined for properties. " |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1295 "All properties are returned, including private and " |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1296 "protected ones."); |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1297 |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1298 cdef_class cls = get_class (); |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1299 |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1300 if (cls.ok ()) |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1301 { |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1302 std::map<std::string, cdef_property> props; |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1303 |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1304 props = cls.get_property_map (cdef_class::property_all); |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1305 |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1306 for (std::map<std::string, cdef_property>::iterator it = props.begin (); |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1307 it != props.end (); ++it) |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1308 { |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1309 octave_value pvalue; |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1310 |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1311 if (is_array ()) |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1312 { |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1313 Array<cdef_object> a_obj = array_value (); |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1314 |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1315 Cell cvalue (a_obj.dims ()); |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1316 |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1317 for (octave_idx_type i = 0; i < a_obj.numel (); i++) |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1318 cvalue (i) = it->second.get_value (a_obj(i), false); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1319 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1320 retval.setfield (it->first, cvalue); |
19218
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1321 } |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1322 else |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1323 { |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1324 Cell cvalue (dim_vector (1, 1), |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1325 it->second.get_value (*this, false)); |
19218
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1326 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1327 retval.setfield (it->first, cvalue); |
19218
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1328 } |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1329 } |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1330 } |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1331 |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1332 return retval; |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1333 } |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
1334 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1335 string_vector |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1336 cdef_object_rep::map_keys (void) const |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1337 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1338 cdef_class cls = get_class (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1339 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1340 if (cls.ok ()) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1341 return cls.get_names (); |
19631
db92e7e28e1f
strip trailing whitespace from most source files
John W. Eaton <jwe@octave.org>
parents:
19377
diff
changeset
|
1342 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1343 return string_vector (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1344 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1345 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1346 octave_value_list |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1347 cdef_object_scalar::subsref (const std::string& type, |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1348 const std::list<octave_value_list>& idx, |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1349 int nargout, size_t& skip, |
16696
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
1350 const cdef_class& context, bool auto_add) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1351 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1352 skip = 0; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1353 |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1354 cdef_class cls = (context.ok () ? context : get_class ()); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1355 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1356 octave_value_list retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1357 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1358 if (! cls.ok ()) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1359 return retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1360 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1361 switch (type[0]) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1362 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1363 case '.': |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1364 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1365 std::string name = (idx.front ())(0).string_value (); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1366 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1367 cdef_method meth = cls.find_method (name); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1368 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1369 if (meth.ok ()) |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1370 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1371 int _nargout = (type.length () > 2 ? 1 : nargout); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1372 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1373 octave_value_list args; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1374 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1375 skip = 1; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1376 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1377 if (type.length () > 1 && type[1] == '(') |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1378 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1379 std::list<octave_value_list>::const_iterator it = idx.begin (); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1380 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1381 args = *++it; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1382 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1383 skip++; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1384 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1385 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1386 if (meth.is_static ()) |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1387 retval = meth.execute (args, _nargout, true, "subsref"); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1388 else |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1389 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1390 refcount++; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1391 retval = meth.execute (cdef_object (this), args, _nargout, |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1392 true, "subsref"); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1393 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1394 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1395 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1396 if (skip == 0) |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1397 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1398 cdef_property prop = cls.find_property (name); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1399 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1400 if (prop.ok ()) |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1401 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1402 if (prop.is_constant ()) |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1403 retval(0) = prop.get_value (true, "subsref"); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1404 else |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1405 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1406 refcount++; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1407 retval(0) = prop.get_value (cdef_object (this), |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1408 true, "subsref"); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1409 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1410 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1411 skip = 1; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1412 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1413 else |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1414 error ("subsref: unknown method or property: %s", name.c_str ()); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1415 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1416 break; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1417 } |
16696
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
1418 |
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
1419 case '(': |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1420 { |
20224
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1421 const octave_value_list& ival = idx.front (); |
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1422 |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1423 refcount++; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1424 cdef_object this_obj (this); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1425 |
20224
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1426 if (ival.empty ()) |
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1427 { |
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1428 skip++; |
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1429 retval(0) = to_ov (this_obj); |
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1430 } |
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1431 else |
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1432 { |
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1433 Array<cdef_object> arr (dim_vector (1, 1), this_obj); |
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1434 |
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1435 cdef_object new_obj = cdef_object (new cdef_object_array (arr)); |
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1436 |
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1437 new_obj.set_class (get_class ()); |
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1438 |
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1439 retval = new_obj.subsref (type, idx, nargout, skip, cls, auto_add); |
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1440 } |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1441 } |
16696
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
1442 break; |
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
1443 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1444 default: |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1445 error ("object cannot be indexed with `%c'", type[0]); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1446 break; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1447 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1448 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1449 return retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1450 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1451 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1452 octave_value |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1453 cdef_object_scalar::subsasgn (const std::string& type, |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1454 const std::list<octave_value_list>& idx, |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1455 const octave_value& rhs) |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1456 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1457 octave_value retval; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1458 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1459 cdef_class cls = get_class (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1460 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1461 switch (type[0]) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1462 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1463 case '.': |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1464 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1465 std::string name = (idx.front ())(0).string_value (); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1466 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1467 cdef_property prop = cls.find_property (name); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1468 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1469 if (prop.ok ()) |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1470 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1471 if (prop.is_constant ()) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1472 error ("subsasgn: cannot assign constant property: %s", |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1473 name.c_str ()); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1474 else |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1475 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1476 refcount++; |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1477 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1478 cdef_object obj (this); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1479 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1480 if (type.length () == 1) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1481 { |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1482 prop.set_value (obj, rhs, true, "subsasgn"); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1483 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1484 retval = to_ov (obj); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1485 } |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1486 else |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1487 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1488 octave_value val = |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1489 prop.get_value (obj, true, "subsasgn"); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1490 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1491 std::list<octave_value_list> args (idx); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1492 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1493 args.erase (args.begin ()); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1494 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1495 val = val.assign (octave_value::op_asn_eq, |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1496 type.substr (1), args, rhs); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1497 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1498 if (val.class_name () != "object" |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1499 || ! to_cdef (val).is_handle_object ()) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1500 prop.set_value (obj, val, true, "subsasgn"); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1501 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1502 retval = to_ov (obj); |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1503 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1504 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1505 } |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1506 else |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1507 error ("subsasgn: unknown property: %s", name.c_str ()); |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1508 } |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1509 break; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1510 |
16694
50b37deadb66
Promote scalar object to array for '(' idnex assignment.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16692
diff
changeset
|
1511 case '(': |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1512 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1513 refcount++; |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1514 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1515 cdef_object this_obj (this); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1516 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1517 Array<cdef_object> arr (dim_vector (1, 1), this_obj); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1518 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1519 cdef_object new_obj = cdef_object (new cdef_object_array (arr)); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1520 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1521 new_obj.set_class (get_class ()); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1522 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1523 octave_value tmp = new_obj.subsasgn (type, idx, rhs); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1524 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1525 retval = tmp; |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1526 } |
16694
50b37deadb66
Promote scalar object to array for '(' idnex assignment.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16692
diff
changeset
|
1527 break; |
50b37deadb66
Promote scalar object to array for '(' idnex assignment.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16692
diff
changeset
|
1528 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1529 default: |
16694
50b37deadb66
Promote scalar object to array for '(' idnex assignment.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16692
diff
changeset
|
1530 error ("subsasgn: object cannot be index with `%c'", type[0]); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1531 break; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1532 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1533 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1534 return retval; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1535 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1536 |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1537 void |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1538 cdef_object_scalar::mark_for_construction (const cdef_class& cls) |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1539 { |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1540 std::string cls_name = cls.get_name (); |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1541 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1542 Cell supcls = cls.get ("SuperClasses").cell_value (); |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1543 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1544 std::list<cdef_class> supcls_list = lookup_classes (supcls); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1545 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1546 ctor_list[cls] = supcls_list; |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1547 } |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1548 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1549 octave_value_list |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1550 cdef_object_array::subsref (const std::string& type, |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1551 const std::list<octave_value_list>& idx, |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1552 int /* nargout */, size_t& skip, |
16696
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
1553 const cdef_class& /* context */, bool auto_add) |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1554 { |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1555 octave_value_list retval; |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1556 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1557 skip = 1; |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1558 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1559 switch (type[0]) |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1560 { |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1561 case '(': |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1562 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1563 const octave_value_list& ival = idx.front (); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1564 |
20160
274b52724931
Stop segfault when using empty indexing of a classdef object.
Rik <rik@octave.org>
parents:
20087
diff
changeset
|
1565 if (ival.empty ()) |
274b52724931
Stop segfault when using empty indexing of a classdef object.
Rik <rik@octave.org>
parents:
20087
diff
changeset
|
1566 { |
20224
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1567 refcount++; |
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1568 retval(0) = to_ov (cdef_object (this)); |
20160
274b52724931
Stop segfault when using empty indexing of a classdef object.
Rik <rik@octave.org>
parents:
20087
diff
changeset
|
1569 break; |
274b52724931
Stop segfault when using empty indexing of a classdef object.
Rik <rik@octave.org>
parents:
20087
diff
changeset
|
1570 } |
274b52724931
Stop segfault when using empty indexing of a classdef object.
Rik <rik@octave.org>
parents:
20087
diff
changeset
|
1571 |
20224
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1572 bool is_scalar = true; |
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1573 Array<idx_vector> iv (dim_vector (1, ival.length ())); |
b2532deba721
Return copy of class object when using null indexing (bug #44940).
John W. Eaton <jwe@octave.org>
parents:
20160
diff
changeset
|
1574 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1575 for (int i = 0; i < ival.length (); i++) |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1576 { |
20574
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20523
diff
changeset
|
1577 try |
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20523
diff
changeset
|
1578 { |
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20523
diff
changeset
|
1579 iv(i) = ival(i).index_vector (); |
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20523
diff
changeset
|
1580 } |
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20523
diff
changeset
|
1581 catch (index_exception& e) |
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20523
diff
changeset
|
1582 { |
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20523
diff
changeset
|
1583 // Rethrow to allow more info to be reported later. |
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20523
diff
changeset
|
1584 e.set_pos_if_unset (ival.length (), i+1); |
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20523
diff
changeset
|
1585 throw; |
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20523
diff
changeset
|
1586 } |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1587 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1588 is_scalar = is_scalar && iv(i).is_scalar (); |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1589 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1590 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1591 Array<cdef_object> ires = array.index (iv, auto_add); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1592 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1593 // If resizing is enabled (auto_add = true), it's possible |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1594 // indexing was out-of-bound and the result array contains |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1595 // invalid cdef_objects. |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1596 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1597 if (auto_add) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1598 fill_empty_values (ires); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1599 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1600 if (is_scalar) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1601 retval(0) = to_ov (ires(0)); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1602 else |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1603 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1604 cdef_object array_obj (new cdef_object_array (ires)); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1605 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1606 array_obj.set_class (get_class ()); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1607 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1608 retval(0) = to_ov (array_obj); |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1609 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1610 } |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1611 break; |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1612 |
16692
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1613 case '.': |
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1614 if (type.size () == 1 && idx.size () == 1) |
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1615 { |
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1616 Cell c (dims ()); |
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1617 |
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1618 octave_idx_type n = array.numel (); |
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1619 |
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1620 // dummy variables |
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1621 size_t dummy_skip; |
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1622 cdef_class dummy_cls; |
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1623 |
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1624 for (octave_idx_type i = 0; i < n; i++) |
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1625 { |
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1626 octave_value_list r = array(i).subsref (type, idx, 1, dummy_skip, |
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1627 dummy_cls); |
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1628 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1629 if (r.length () > 0) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1630 c(i) = r(0); |
16692
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1631 } |
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1632 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1633 retval(0) = octave_value (c, true); |
16692
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1634 |
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1635 break; |
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1636 } |
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1637 // fall through "default" |
b9833510355d
Add object array property indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16691
diff
changeset
|
1638 |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1639 default: |
20463
7ac907da9fba
Use error() rather than ::error() unless explicitly required.
Rik <rik@octave.org>
parents:
20228
diff
changeset
|
1640 error ("can't perform indexing operation on array of %s objects", |
7ac907da9fba
Use error() rather than ::error() unless explicitly required.
Rik <rik@octave.org>
parents:
20228
diff
changeset
|
1641 class_name ().c_str ()); |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1642 break; |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1643 } |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1644 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1645 return retval; |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1646 } |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1647 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1648 octave_value |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1649 cdef_object_array::subsasgn (const std::string& type, |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1650 const std::list<octave_value_list>& idx, |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1651 const octave_value& rhs) |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1652 { |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1653 octave_value retval; |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1654 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1655 switch (type[0]) |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1656 { |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1657 case '(': |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1658 if (type.length () == 1) |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1659 { |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1660 cdef_object rhs_obj = to_cdef (rhs); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1661 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1662 if (rhs_obj.get_class () == get_class ()) |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1663 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1664 const octave_value_list& ival = idx.front (); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1665 bool is_scalar = true; |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1666 Array<idx_vector> iv (dim_vector (1, ival.length ())); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1667 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1668 for (int i = 0; i < ival.length (); i++) |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1669 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1670 try |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1671 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1672 iv(i) = ival(i).index_vector (); |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1673 } |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1674 catch (index_exception& e) |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1675 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1676 e.set_pos_if_unset (ival.length (), i+1); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1677 throw; // var name set in pt-idx.cc / pt-assign.cc |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1678 } |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1679 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1680 is_scalar = is_scalar && iv(i).is_scalar (); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1681 } |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1682 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1683 Array<cdef_object> rhs_mat; |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1684 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1685 if (! rhs_obj.is_array ()) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1686 { |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1687 rhs_mat = Array<cdef_object> (dim_vector (1, 1)); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1688 rhs_mat(0) = rhs_obj; |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1689 } |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1690 else |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1691 rhs_mat = rhs_obj.array_value (); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1692 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1693 octave_idx_type n = array.numel (); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1694 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1695 array.assign (iv, rhs_mat, cdef_object ()); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1696 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1697 if (array.numel () > n) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1698 fill_empty_values (); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1699 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1700 refcount++; |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1701 retval = to_ov (cdef_object (this)); |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1702 } |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1703 else |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1704 error ("can't assign %s object into array of %s objects.", |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1705 rhs_obj.class_name ().c_str (), |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1706 class_name ().c_str ()); |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1707 } |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1708 else |
16695
2823f8e3da77
Add multi-level index assignment for object array.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16694
diff
changeset
|
1709 { |
2823f8e3da77
Add multi-level index assignment for object array.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16694
diff
changeset
|
1710 const octave_value_list& ival = idx.front (); |
2823f8e3da77
Add multi-level index assignment for object array.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16694
diff
changeset
|
1711 |
2823f8e3da77
Add multi-level index assignment for object array.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16694
diff
changeset
|
1712 bool is_scalar = true; |
2823f8e3da77
Add multi-level index assignment for object array.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16694
diff
changeset
|
1713 |
2823f8e3da77
Add multi-level index assignment for object array.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16694
diff
changeset
|
1714 Array<idx_vector> iv (dim_vector (1, ival.length ())); |
2823f8e3da77
Add multi-level index assignment for object array.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16694
diff
changeset
|
1715 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1716 for (int i = 0; i < ival.length (); i++) |
16695
2823f8e3da77
Add multi-level index assignment for object array.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16694
diff
changeset
|
1717 { |
20574
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20523
diff
changeset
|
1718 try |
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20523
diff
changeset
|
1719 { |
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20523
diff
changeset
|
1720 iv(i) = ival(i).index_vector (); |
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20523
diff
changeset
|
1721 } |
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20523
diff
changeset
|
1722 catch (index_exception& e) |
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20523
diff
changeset
|
1723 { |
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20523
diff
changeset
|
1724 // Rethrow to allow more info to be reported later. |
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20523
diff
changeset
|
1725 e.set_pos_if_unset (ival.length (), i+1); |
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20523
diff
changeset
|
1726 throw; |
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20523
diff
changeset
|
1727 } |
16695
2823f8e3da77
Add multi-level index assignment for object array.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16694
diff
changeset
|
1728 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1729 is_scalar = is_scalar && iv(i).is_scalar (); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1730 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1731 if (! is_scalar) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1732 error ("subsasgn: invalid indexing for object array " |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1733 "assignment, the index must reference a single " |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1734 "object in the array."); |
16695
2823f8e3da77
Add multi-level index assignment for object array.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16694
diff
changeset
|
1735 } |
2823f8e3da77
Add multi-level index assignment for object array.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16694
diff
changeset
|
1736 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1737 Array<cdef_object> a = array.index (iv, true); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1738 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1739 if (a.numel () != 1) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1740 error ("subsasgn: invalid indexing for object array " |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1741 "assignment"); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1742 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1743 cdef_object obj = a(0); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1744 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1745 int ignore_copies = 0; |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1746 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1747 // If the object in 'a' is not valid, this means the index |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1748 // was out-of-bound and we need to create a new object. |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1749 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1750 if (! obj.ok ()) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1751 obj = get_class ().construct_object (octave_value_list ()); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1752 else |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1753 // Optimize the subsasgn call to come. There are 2 copies |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1754 // that we can safely ignore: |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1755 // - 1 in "array" |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1756 // - 1 in "a" |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1757 ignore_copies = 2; |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1758 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1759 std::list<octave_value_list> next_idx (idx); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1760 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1761 next_idx.erase (next_idx.begin ()); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1762 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1763 octave_value tmp = obj.subsasgn (type.substr (1), next_idx, |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1764 rhs, ignore_copies); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1765 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1766 cdef_object robj = to_cdef (tmp); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1767 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1768 if (robj.ok () |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1769 && ! robj.is_array () |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1770 && robj.get_class () == get_class ()) |
16695
2823f8e3da77
Add multi-level index assignment for object array.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16694
diff
changeset
|
1771 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1772 // Small optimization, when dealing with handle |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1773 // objects, we don't need to re-assign the result |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1774 // of subsasgn back into the array. |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1775 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1776 if (! robj.is (a(0))) |
16695
2823f8e3da77
Add multi-level index assignment for object array.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16694
diff
changeset
|
1777 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1778 Array<cdef_object> rhs_a (dim_vector (1, 1), |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1779 robj); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1780 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1781 octave_idx_type n = array.numel (); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1782 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1783 array.assign (iv, rhs_a); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1784 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1785 if (array.numel () > n) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1786 fill_empty_values (); |
16695
2823f8e3da77
Add multi-level index assignment for object array.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16694
diff
changeset
|
1787 } |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1788 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1789 refcount++; |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1790 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1791 retval = to_ov (cdef_object (this)); |
16695
2823f8e3da77
Add multi-level index assignment for object array.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16694
diff
changeset
|
1792 } |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1793 else |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1794 error ("subasgn: invalid assignment into array of %s " |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1795 "objects", class_name ().c_str ()); |
16695
2823f8e3da77
Add multi-level index assignment for object array.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16694
diff
changeset
|
1796 } |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1797 break; |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1798 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1799 default: |
20463
7ac907da9fba
Use error() rather than ::error() unless explicitly required.
Rik <rik@octave.org>
parents:
20228
diff
changeset
|
1800 error ("can't perform indexing operation on array of %s objects", |
7ac907da9fba
Use error() rather than ::error() unless explicitly required.
Rik <rik@octave.org>
parents:
20228
diff
changeset
|
1801 class_name ().c_str ()); |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1802 break; |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1803 } |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1804 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1805 return retval; |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1806 } |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1807 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1808 void |
16696
665fa0f621cc
Support combination of object array extension and multi-level indexing.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16695
diff
changeset
|
1809 cdef_object_array::fill_empty_values (Array<cdef_object>& arr) |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1810 { |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1811 cdef_class cls = get_class (); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1812 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1813 cdef_object obj; |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1814 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1815 int n = arr.numel (); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1816 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1817 for (int i = 0; i < n; i++) |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1818 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1819 if (! arr.xelem (i).ok ()) |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1820 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1821 if (! obj.ok ()) |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1822 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1823 obj = cls.construct_object (octave_value_list ()); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1824 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1825 arr.xelem (i) = obj; |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1826 } |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1827 else |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1828 arr.xelem (i) = obj.copy (); |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1829 } |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1830 } |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
1831 } |
19631
db92e7e28e1f
strip trailing whitespace from most source files
John W. Eaton <jwe@octave.org>
parents:
19377
diff
changeset
|
1832 |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1833 bool |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1834 cdef_object_scalar::is_constructed_for (const cdef_class& cls) const |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1835 { |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1836 return (is_constructed () |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1837 || ctor_list.find (cls) == ctor_list.end ()); |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1838 } |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1839 |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1840 bool |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1841 cdef_object_scalar::is_partially_constructed_for (const cdef_class& cls) const |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1842 { |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1843 std::map< cdef_class, std::list<cdef_class> >::const_iterator it; |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1844 |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1845 if (is_constructed ()) |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1846 return true; |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1847 else if ((it = ctor_list.find (cls)) == ctor_list.end () |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1848 || it->second.empty ()) |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1849 return true; |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1850 |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1851 for (std::list<cdef_class>::const_iterator lit = it->second.begin (); |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1852 lit != it->second.end (); ++lit) |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1853 if (! is_constructed_for (*lit)) |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1854 return false; |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1855 |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1856 return true; |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1857 } |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1858 |
20523
a142b62527ef
Fix compilation of classdef with the clang compiler (bug #41178)
akira noda <you.akira.noda@gmail.com>
parents:
20463
diff
changeset
|
1859 void |
a142b62527ef
Fix compilation of classdef with the clang compiler (bug #41178)
akira noda <you.akira.noda@gmail.com>
parents:
20463
diff
changeset
|
1860 cdef_object_scalar::mark_as_constructed (const cdef_class& cls) |
a142b62527ef
Fix compilation of classdef with the clang compiler (bug #41178)
akira noda <you.akira.noda@gmail.com>
parents:
20463
diff
changeset
|
1861 { |
a142b62527ef
Fix compilation of classdef with the clang compiler (bug #41178)
akira noda <you.akira.noda@gmail.com>
parents:
20463
diff
changeset
|
1862 ctor_list.erase (cls); |
a142b62527ef
Fix compilation of classdef with the clang compiler (bug #41178)
akira noda <you.akira.noda@gmail.com>
parents:
20463
diff
changeset
|
1863 } |
a142b62527ef
Fix compilation of classdef with the clang compiler (bug #41178)
akira noda <you.akira.noda@gmail.com>
parents:
20463
diff
changeset
|
1864 |
15870
2b6fe094e615
Implement embryonic value-class semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15869
diff
changeset
|
1865 handle_cdef_object::~handle_cdef_object (void) |
2b6fe094e615
Implement embryonic value-class semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15869
diff
changeset
|
1866 { |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
1867 #if DEBUG_TRACE |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
1868 std::cerr << "deleting " << get_class ().get_name () |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
1869 << " object (handle)" << std::endl; |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
1870 #endif |
15870
2b6fe094e615
Implement embryonic value-class semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15869
diff
changeset
|
1871 } |
2b6fe094e615
Implement embryonic value-class semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15869
diff
changeset
|
1872 |
2b6fe094e615
Implement embryonic value-class semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15869
diff
changeset
|
1873 value_cdef_object::~value_cdef_object (void) |
2b6fe094e615
Implement embryonic value-class semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15869
diff
changeset
|
1874 { |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
1875 #if DEBUG_TRACE |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
1876 std::cerr << "deleting " << get_class ().get_name () |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
1877 << " object (value)" << std::endl; |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
1878 #endif |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1879 } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1880 |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1881 cdef_class::cdef_class_rep::cdef_class_rep (const std::list<cdef_class>& |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1882 superclasses) |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1883 : cdef_meta_object_rep (), member_count (0), handle_class (false), |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1884 object_count (0), meta (false) |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1885 { |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1886 put ("SuperClasses", to_ov (superclasses)); |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1887 implicit_ctor_list = superclasses; |
15870
2b6fe094e615
Implement embryonic value-class semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15869
diff
changeset
|
1888 } |
2b6fe094e615
Implement embryonic value-class semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15869
diff
changeset
|
1889 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1890 cdef_method |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1891 cdef_class::cdef_class_rep::find_method (const std::string& nm, bool local) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1892 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1893 method_iterator it = method_map.find (nm); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1894 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1895 if (it == method_map.end ()) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1896 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1897 // FIXME: look into class directory |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1898 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1899 else |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1900 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1901 cdef_method& meth = it->second; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1902 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1903 // FIXME: check if method reload needed |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1904 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1905 if (meth.ok ()) |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
1906 return meth; |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1907 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1908 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1909 if (! local) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1910 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1911 // Look into superclasses |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1912 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1913 Cell super_classes = get ("SuperClasses").cell_value (); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1914 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1915 for (int i = 0; i < super_classes.numel (); i++) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1916 { |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1917 cdef_class cls = lookup_class (super_classes(i)); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1918 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1919 cdef_method meth = cls.find_method (nm); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1920 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1921 if (meth.ok ()) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1922 return meth; |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
1923 } |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1924 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1925 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1926 return cdef_method (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1927 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
1928 |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1929 class ctor_analyzer : public tree_walker |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1930 { |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1931 public: |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1932 ctor_analyzer (const std::string& ctor, const std::string& obj) |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1933 : tree_walker (), who (ctor), obj_name (obj) { } |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1934 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1935 void visit_statement_list (tree_statement_list& t) |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1936 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1937 for (tree_statement_list::const_iterator it = t.begin (); |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
1938 it != t.end (); ++it) |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1939 (*it)->accept (*this); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1940 } |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1941 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1942 void visit_statement (tree_statement& t) |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1943 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1944 if (t.is_expression ()) |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1945 t.expression ()->accept (*this); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1946 } |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1947 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1948 void visit_simple_assignment (tree_simple_assignment& t) |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1949 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1950 t.right_hand_side ()->accept (*this); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1951 } |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1952 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1953 void visit_multi_assignment (tree_multi_assignment& t) |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1954 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1955 t.right_hand_side ()->accept (*this); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1956 } |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1957 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1958 void visit_index_expression (tree_index_expression& t) |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1959 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1960 t.expression ()->accept (*this); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1961 } |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1962 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1963 void visit_funcall (tree_funcall& t) |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1964 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1965 octave_value fcn = t.function (); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1966 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1967 if (fcn.is_function ()) |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1968 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1969 octave_function *of = fcn.function_value (true); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1970 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1971 if (of) |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1972 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1973 if (of->name () == "__superclass_reference__") |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1974 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1975 octave_value_list args = t.arguments (); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1976 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1977 if (args(0).string_value () == obj_name) |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1978 { |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1979 std::string class_name = args(1).string_value (); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1980 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1981 cdef_class cls = lookup_class (class_name, false); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1982 |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1983 if (cls.ok ()) |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1984 ctor_list.push_back (cls); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1985 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1986 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1987 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1988 } |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1989 } |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1990 |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
1991 std::list<cdef_class> get_constructor_list (void) const |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
1992 { return ctor_list; } |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1993 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1994 // NO-OP |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1995 void visit_anon_fcn_handle (tree_anon_fcn_handle&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1996 void visit_argument_list (tree_argument_list&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1997 void visit_binary_expression (tree_binary_expression&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1998 void visit_break_command (tree_break_command&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
1999 void visit_colon_expression (tree_colon_expression&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2000 void visit_continue_command (tree_continue_command&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2001 void visit_global_command (tree_global_command&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2002 void visit_persistent_command (tree_persistent_command&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2003 void visit_decl_elt (tree_decl_elt&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2004 void visit_decl_init_list (tree_decl_init_list&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2005 void visit_simple_for_command (tree_simple_for_command&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2006 void visit_complex_for_command (tree_complex_for_command&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2007 void visit_octave_user_script (octave_user_script&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2008 void visit_octave_user_function (octave_user_function&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2009 void visit_function_def (tree_function_def&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2010 void visit_identifier (tree_identifier&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2011 void visit_if_clause (tree_if_clause&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2012 void visit_if_command (tree_if_command&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2013 void visit_if_command_list (tree_if_command_list&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2014 void visit_switch_case (tree_switch_case&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2015 void visit_switch_case_list (tree_switch_case_list&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2016 void visit_switch_command (tree_switch_command&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2017 void visit_matrix (tree_matrix&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2018 void visit_cell (tree_cell&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2019 void visit_no_op_command (tree_no_op_command&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2020 void visit_constant (tree_constant&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2021 void visit_fcn_handle (tree_fcn_handle&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2022 void visit_parameter_list (tree_parameter_list&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2023 void visit_postfix_expression (tree_postfix_expression&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2024 void visit_prefix_expression (tree_prefix_expression&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2025 void visit_return_command (tree_return_command&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2026 void visit_return_list (tree_return_list&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2027 void visit_try_catch_command (tree_try_catch_command&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2028 void visit_unwind_protect_command (tree_unwind_protect_command&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2029 void visit_while_command (tree_while_command&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2030 void visit_do_until_command (tree_do_until_command&) { } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2031 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2032 private: |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2033 /* The name of the constructor being analyzed */ |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2034 std::string who; |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2035 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2036 /* The name of the first output argument of the constructor */ |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2037 std::string obj_name; |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2038 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2039 /* The list of superclass constructors that are explicitly called */ |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
2040 std::list<cdef_class> ctor_list; |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2041 }; |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2042 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2043 void |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2044 cdef_class::cdef_class_rep::install_method (const cdef_method& meth) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2045 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2046 method_map[meth.get_name ()] = meth; |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2047 |
15911
b18b7e560236
More flexible refcount to account for owned back-references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15910
diff
changeset
|
2048 member_count++; |
b18b7e560236
More flexible refcount to account for owned back-references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15910
diff
changeset
|
2049 |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2050 if (meth.is_constructor ()) |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2051 { |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2052 // Analyze the constructor code to determine what superclass |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2053 // constructors are called explicitly. |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2054 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2055 octave_function *of = meth.get_function ().function_value (true); |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2056 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2057 if (of) |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2058 { |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2059 octave_user_function *uf = of->user_function_value (true); |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2060 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2061 if (uf) |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2062 { |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2063 tree_parameter_list *ret_list = uf->return_list (); |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2064 tree_statement_list *body = uf->body (); |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2065 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2066 if (ret_list && ret_list->size () == 1) |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2067 { |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2068 std::string obj_name = ret_list->front ()->name (); |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
2069 ctor_analyzer a (meth.get_name (), obj_name); |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2070 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2071 body->accept (a); |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2072 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2073 std::list<cdef_class> explicit_ctor_list |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2074 = a.get_constructor_list (); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2075 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2076 for (std::list<cdef_class>::const_iterator |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2077 it = explicit_ctor_list.begin (); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2078 it != explicit_ctor_list.end (); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2079 ++it) |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2080 { |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2081 #if DEBUG_TRACE |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2082 std::cerr << "explicit superclass constructor: " |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2083 << it->get_name () << std::endl; |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2084 #endif |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2085 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2086 implicit_ctor_list.remove (*it); |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2087 } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2088 } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2089 else |
20463
7ac907da9fba
Use error() rather than ::error() unless explicitly required.
Rik <rik@octave.org>
parents:
20228
diff
changeset
|
2090 error ("%s: invalid constructor output arguments", |
7ac907da9fba
Use error() rather than ::error() unless explicitly required.
Rik <rik@octave.org>
parents:
20228
diff
changeset
|
2091 meth.get_name ().c_str ()); |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2092 } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2093 } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2094 } |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2095 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2096 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2097 void |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2098 cdef_class::cdef_class_rep::load_all_methods (void) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2099 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2100 // FIXME: re-scan class directory |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2101 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2102 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2103 Cell |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2104 cdef_class::cdef_class_rep::get_methods (void) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2105 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2106 std::map<std::string,cdef_method> meths; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2107 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2108 find_methods (meths, false); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2109 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2110 Cell c (meths.size (), 1); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2111 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2112 int idx = 0; |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2113 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2114 for (std::map<std::string,cdef_method>::const_iterator |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2115 it = meths.begin (); it != meths.end (); ++it, ++idx) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2116 c (idx, 0) = to_ov (it->second); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2117 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2118 return c; |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2119 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2120 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2121 void |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2122 cdef_class::cdef_class_rep::find_methods (std::map<std::string, |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2123 cdef_method>& meths, |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2124 bool only_inherited) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2125 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2126 load_all_methods (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2127 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2128 method_const_iterator it; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2129 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2130 for (it = method_map.begin (); it != method_map.end (); ++it) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2131 { |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2132 if (! it->second.is_constructor ()) |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2133 { |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2134 std::string nm = it->second.get_name (); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2135 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2136 if (meths.find (nm) == meths.end ()) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2137 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2138 if (only_inherited) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2139 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2140 octave_value acc = it->second.get ("Access"); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2141 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2142 if (! acc.is_string () |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2143 || acc.string_value () == "private") |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2144 continue; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2145 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2146 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2147 meths[nm] = it->second; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2148 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2149 } |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2150 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2151 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2152 // Look into superclasses |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2153 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2154 Cell super_classes = get ("SuperClasses").cell_value (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2155 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2156 for (int i = 0; i < super_classes.numel (); i++) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2157 { |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
2158 cdef_class cls = lookup_class (super_classes(i)); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2159 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2160 cls.get_rep ()->find_methods (meths, true); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2161 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2162 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2163 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2164 cdef_property |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2165 cdef_class::cdef_class_rep::find_property (const std::string& nm) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2166 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2167 property_iterator it = property_map.find (nm); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2168 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2169 if (it != property_map.end ()) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2170 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2171 cdef_property& prop = it->second; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2172 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2173 if (prop.ok ()) |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
2174 return prop; |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2175 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2176 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2177 // Look into superclasses |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2178 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2179 Cell super_classes = get ("SuperClasses").cell_value (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2180 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2181 for (int i = 0; i < super_classes.numel (); i++) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2182 { |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
2183 cdef_class cls = lookup_class (super_classes(i)); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2184 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2185 cdef_property prop = cls.find_property (nm); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2186 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2187 if (prop.ok ()) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2188 return prop; |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2189 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2190 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2191 return cdef_property (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2192 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2193 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2194 void |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2195 cdef_class::cdef_class_rep::install_property (const cdef_property& prop) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2196 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2197 property_map[prop.get_name ()] = prop; |
15911
b18b7e560236
More flexible refcount to account for owned back-references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15910
diff
changeset
|
2198 |
b18b7e560236
More flexible refcount to account for owned back-references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15910
diff
changeset
|
2199 member_count++; |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2200 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2201 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2202 Cell |
19218
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
2203 cdef_class::cdef_class_rep::get_properties (int mode) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2204 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2205 std::map<std::string,cdef_property> props; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2206 |
19218
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
2207 props = get_property_map (mode); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2208 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2209 Cell c (props.size (), 1); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2210 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2211 int idx = 0; |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2212 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2213 for (std::map<std::string,cdef_property>::const_iterator |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2214 it = props.begin (); it != props.end (); ++it, ++idx) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2215 c (idx, 0) = to_ov (it->second); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2216 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2217 return c; |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2218 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2219 |
19218
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
2220 std::map<std::string, cdef_property> |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
2221 cdef_class::cdef_class_rep::get_property_map (int mode) |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
2222 { |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
2223 std::map<std::string,cdef_property> props; |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
2224 |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
2225 find_properties (props, mode); |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
2226 |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
2227 return props; |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
2228 } |
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
2229 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2230 void |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2231 cdef_class::cdef_class_rep::find_properties (std::map<std::string, |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2232 cdef_property>& props, |
19218
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
2233 int mode) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2234 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2235 property_const_iterator it; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2236 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2237 for (it = property_map.begin (); it != property_map.end (); ++it) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2238 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2239 std::string nm = it->second.get_name (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2240 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2241 if (props.find (nm) == props.end ()) |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
2242 { |
19218
e0a7718ac085
Implement calling "struct" on classdef objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
19137
diff
changeset
|
2243 if (mode == property_inherited) |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2244 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2245 octave_value acc = it->second.get ("GetAccess"); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2246 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2247 if (! acc.is_string () |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2248 || acc.string_value () == "private") |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2249 continue; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2250 } |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2251 |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
2252 props[nm] = it->second; |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
2253 } |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2254 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2255 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2256 // Look into superclasses |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2257 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2258 Cell super_classes = get ("SuperClasses").cell_value (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2259 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2260 for (int i = 0; i < super_classes.numel (); i++) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2261 { |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
2262 cdef_class cls = lookup_class (super_classes(i)); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2263 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2264 cls.get_rep ()->find_properties (props, |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2265 (mode == property_all |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2266 ? property_all |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2267 : property_inherited)); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2268 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2269 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2270 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2271 void |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2272 cdef_class::cdef_class_rep::find_names (std::set<std::string>& names, |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2273 bool all) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2274 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2275 load_all_methods (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2276 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2277 for (method_const_iterator it = method_map.begin (); |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2278 it != method_map.end(); ++it) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2279 { |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2280 if (! it->second.is_constructor ()) |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2281 { |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2282 std::string nm = it->second.get_name (); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2283 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2284 if (! all) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2285 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2286 octave_value acc = it->second.get ("Access"); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2287 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2288 if (! acc.is_string() |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2289 || acc.string_value () != "public") |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2290 continue; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2291 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2292 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2293 names.insert (nm); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2294 } |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2295 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2296 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2297 for (property_const_iterator it = property_map.begin (); |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2298 it != property_map.end (); ++it) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2299 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2300 std::string nm = it->second.get_name (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2301 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2302 if (! all) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2303 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2304 octave_value acc = it->second.get ("GetAccess"); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2305 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2306 if (! acc.is_string() |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2307 || acc.string_value () != "public") |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2308 continue; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2309 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2310 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2311 names.insert (nm); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2312 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2313 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2314 // Look into superclasses |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2315 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2316 Cell super_classes = get ("SuperClasses").cell_value (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2317 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2318 for (int i = 0; i < super_classes.numel (); i++) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2319 { |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
2320 cdef_class cls = lookup_class (super_classes(i)); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2321 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2322 cls.get_rep ()->find_names (names, all); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2323 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2324 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2325 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2326 string_vector |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2327 cdef_class::cdef_class_rep::get_names (void) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2328 { |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2329 std::set<std::string> names; |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2330 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2331 find_names (names, false); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2332 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2333 string_vector v (names.size ()); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2334 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2335 int idx = 0; |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2336 for (std::set<std::string>::const_iterator it = names.begin (); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2337 it != names.end (); ++it, ++idx) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2338 v[idx] = *it; |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2339 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2340 return v.sort (true); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2341 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2342 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2343 void |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2344 cdef_class::cdef_class_rep::delete_object (cdef_object obj) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2345 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2346 method_iterator it = method_map.find ("delete"); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2347 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2348 if (it != method_map.end ()) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2349 { |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
2350 cdef_class cls = obj.get_class (); |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
2351 |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
2352 obj.set_class (wrap ()); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2353 |
15968
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
2354 it->second.execute (obj, octave_value_list (), 0, false); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2355 |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
2356 obj.set_class (cls); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2357 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2358 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2359 // FIXME: should we destroy corresponding properties here? |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2360 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2361 // Call "delete" in super classes |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2362 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2363 Cell super_classes = get ("SuperClasses").cell_value (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2364 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2365 for (int i = 0; i < super_classes.numel (); i++) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2366 { |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
2367 cdef_class cls = lookup_class (super_classes(i)); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2368 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2369 cls.delete_object (obj); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2370 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2371 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2372 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2373 octave_value_list |
15986
14aa0b5a980c
Abstract the meta-protocol layer to use it for other meta objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15968
diff
changeset
|
2374 cdef_class::cdef_class_rep::meta_subsref (const std::string& type, |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2375 const std::list<octave_value_list>& idx, |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2376 int nargout) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2377 { |
15956
d8553705f8f0
Support calling static methods and getting constant properties.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15955
diff
changeset
|
2378 size_t skip = 1; |
d8553705f8f0
Support calling static methods and getting constant properties.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15955
diff
changeset
|
2379 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2380 octave_value_list retval; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2381 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2382 switch (type[0]) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2383 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2384 case '(': |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2385 // Constructor call |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2386 |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2387 #if DEBUG_TRACE |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2388 std::cerr << "constructor" << std::endl; |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2389 #endif |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2390 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2391 retval(0) = construct (idx.front ()); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2392 break; |
15956
d8553705f8f0
Support calling static methods and getting constant properties.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15955
diff
changeset
|
2393 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2394 case '.': |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2395 // Static method, constant (or property?) |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2396 |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2397 #if DEBUG_TRACE |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2398 std::cerr << "static method/property" << std::endl; |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2399 #endif |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2400 |
15956
d8553705f8f0
Support calling static methods and getting constant properties.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15955
diff
changeset
|
2401 if (idx.front ().length () == 1) |
d8553705f8f0
Support calling static methods and getting constant properties.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15955
diff
changeset
|
2402 { |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2403 std::string nm = idx.front ()(0).string_value ("invalid meta.class indexing, expected a method or property name"); |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2404 |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2405 cdef_method meth = find_method (nm); |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2406 |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2407 if (meth.ok ()) |
15956
d8553705f8f0
Support calling static methods and getting constant properties.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15955
diff
changeset
|
2408 { |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2409 if (meth.is_static ()) |
15956
d8553705f8f0
Support calling static methods and getting constant properties.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15955
diff
changeset
|
2410 { |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2411 octave_value_list args; |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2412 |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2413 if (type.length () > 1 && idx.size () > 1 |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2414 && type[1] == '(') |
15956
d8553705f8f0
Support calling static methods and getting constant properties.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15955
diff
changeset
|
2415 { |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2416 args = *(++(idx.begin ())); |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2417 skip++; |
15956
d8553705f8f0
Support calling static methods and getting constant properties.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15955
diff
changeset
|
2418 } |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2419 |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2420 retval = meth.execute (args, (type.length () > skip |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2421 ? 1 : nargout), true, |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2422 "meta.class"); |
15956
d8553705f8f0
Support calling static methods and getting constant properties.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15955
diff
changeset
|
2423 } |
d8553705f8f0
Support calling static methods and getting constant properties.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15955
diff
changeset
|
2424 else |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2425 error ("method `%s' is not static", nm.c_str ()); |
15956
d8553705f8f0
Support calling static methods and getting constant properties.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15955
diff
changeset
|
2426 } |
d8553705f8f0
Support calling static methods and getting constant properties.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15955
diff
changeset
|
2427 else |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2428 { |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2429 cdef_property prop = find_property (nm); |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2430 |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2431 if (prop.ok ()) |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2432 { |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2433 if (prop.is_constant ()) |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2434 retval(0) = prop.get_value (true, "meta.class"); |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2435 else |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2436 error ("property `%s' is not constant", nm.c_str ()); |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2437 } |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2438 else |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2439 error ("no such method or property `%s'", nm.c_str ()); |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
2440 } |
15956
d8553705f8f0
Support calling static methods and getting constant properties.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15955
diff
changeset
|
2441 } |
d8553705f8f0
Support calling static methods and getting constant properties.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15955
diff
changeset
|
2442 else |
20463
7ac907da9fba
Use error() rather than ::error() unless explicitly required.
Rik <rik@octave.org>
parents:
20228
diff
changeset
|
2443 error ("invalid meta.class indexing"); |
15956
d8553705f8f0
Support calling static methods and getting constant properties.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15955
diff
changeset
|
2444 break; |
d8553705f8f0
Support calling static methods and getting constant properties.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15955
diff
changeset
|
2445 |
d8553705f8f0
Support calling static methods and getting constant properties.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15955
diff
changeset
|
2446 default: |
20463
7ac907da9fba
Use error() rather than ::error() unless explicitly required.
Rik <rik@octave.org>
parents:
20228
diff
changeset
|
2447 error ("invalid meta.class indexing"); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2448 break; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2449 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2450 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2451 if (type.length () > skip && idx.size () > skip && ! retval.empty ()) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2452 retval = retval(0).next_subsref (nargout, type, idx, skip); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2453 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2454 return retval; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2455 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2456 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2457 void |
15986
14aa0b5a980c
Abstract the meta-protocol layer to use it for other meta objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15968
diff
changeset
|
2458 cdef_class::cdef_class_rep::meta_release (void) |
14aa0b5a980c
Abstract the meta-protocol layer to use it for other meta objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15968
diff
changeset
|
2459 { |
16048
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
2460 cdef_manager::unregister_class (wrap ()); |
15986
14aa0b5a980c
Abstract the meta-protocol layer to use it for other meta objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15968
diff
changeset
|
2461 } |
14aa0b5a980c
Abstract the meta-protocol layer to use it for other meta objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15968
diff
changeset
|
2462 |
14aa0b5a980c
Abstract the meta-protocol layer to use it for other meta objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15968
diff
changeset
|
2463 void |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2464 cdef_class::cdef_class_rep::initialize_object (cdef_object& obj) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2465 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2466 // Populate the object with default property values |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2467 |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2468 std::list<cdef_class> super_classes = lookup_classes ( |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2469 get ("SuperClasses").cell_value ()); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2470 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2471 for (std::list<cdef_class>::iterator it = super_classes.begin (); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2472 it != super_classes.end (); ++it) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2473 it->initialize_object (obj); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2474 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2475 for (property_const_iterator it = property_map.begin (); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2476 it != property_map.end (); ++it) |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2477 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2478 if (! it->second.get ("Dependent").bool_value ()) |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2479 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2480 octave_value pvalue = it->second.get ("DefaultValue"); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2481 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2482 if (pvalue.is_defined ()) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2483 obj.put (it->first, pvalue); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2484 else |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2485 obj.put (it->first, octave_value (Matrix ())); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2486 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2487 } |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2488 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2489 refcount++; |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2490 obj.mark_for_construction (cdef_class (this)); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2491 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2492 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2493 void |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2494 cdef_class::cdef_class_rep::run_constructor (cdef_object& obj, |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2495 const octave_value_list& args) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2496 { |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2497 octave_value_list empty_args; |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2498 |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
2499 for (std::list<cdef_class>::const_iterator it = implicit_ctor_list.begin (); |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2500 it != implicit_ctor_list.end (); ++it) |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2501 { |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2502 cdef_class supcls = lookup_class (*it); |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2503 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2504 supcls.run_constructor (obj, empty_args); |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2505 } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2506 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2507 std::string cls_name = get_name (); |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2508 std::string ctor_name = get_base_name (cls_name); |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2509 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2510 cdef_method ctor = find_method (ctor_name); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2511 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2512 if (ctor.ok ()) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2513 { |
15968
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
2514 octave_value_list ctor_args (args); |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
2515 octave_value_list ctor_retval; |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
2516 |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
2517 ctor_args.prepend (to_ov (obj)); |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
2518 ctor_retval = ctor.execute (ctor_args, 1, true, "constructor"); |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
2519 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2520 if (ctor_retval.length () == 1) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2521 obj = to_cdef (ctor_retval(0)); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2522 else |
15870
2b6fe094e615
Implement embryonic value-class semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15869
diff
changeset
|
2523 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2524 error ("%s: invalid number of output arguments for classdef constructor", |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2525 ctor_name.c_str ()); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2526 return; |
15870
2b6fe094e615
Implement embryonic value-class semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15869
diff
changeset
|
2527 } |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2528 } |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2529 |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
2530 obj.mark_as_constructed (wrap ()); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2531 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2532 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2533 octave_value |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2534 cdef_class::cdef_class_rep::construct (const octave_value_list& args) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2535 { |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2536 cdef_object obj = construct_object (args); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2537 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2538 if (obj.ok ()) |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2539 return to_ov (obj); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2540 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2541 return octave_value (); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2542 } |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2543 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2544 cdef_object |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2545 cdef_class::cdef_class_rep::construct_object (const octave_value_list& args) |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2546 { |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2547 if (! is_abstract ()) |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2548 { |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2549 cdef_object obj; |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2550 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2551 if (is_meta_class ()) |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2552 { |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2553 // This code path is only used to create empty meta objects |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2554 // as filler for the empty values within a meta object array. |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2555 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2556 cdef_class this_cls = wrap (); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2557 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2558 static cdef_object empty_class; |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2559 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2560 if (this_cls == cdef_class::meta_class ()) |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2561 { |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2562 if (! empty_class.ok ()) |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2563 empty_class = make_class ("", std::list<cdef_class> ()); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2564 obj = empty_class; |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2565 } |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2566 else if (this_cls == cdef_class::meta_property ()) |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2567 { |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2568 static cdef_property empty_property; |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2569 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2570 if (! empty_class.ok ()) |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2571 empty_class = make_class ("", std::list<cdef_class> ()); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2572 if (! empty_property.ok ()) |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2573 empty_property = make_property (empty_class, ""); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2574 obj = empty_property; |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2575 } |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2576 else if (this_cls == cdef_class::meta_method ()) |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2577 { |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2578 static cdef_method empty_method; |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2579 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2580 if (! empty_class.ok ()) |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2581 empty_class = make_class ("", std::list<cdef_class> ()); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2582 if (! empty_method.ok ()) |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2583 empty_method = make_method (empty_class, "", octave_value ()); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2584 obj = empty_method; |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2585 } |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2586 else if (this_cls == cdef_class::meta_package ()) |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2587 { |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2588 static cdef_package empty_package; |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2589 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2590 if (! empty_package.ok ()) |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2591 empty_package = make_package (""); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2592 obj = empty_package; |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2593 } |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2594 else |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2595 panic_impossible (); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2596 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2597 return obj; |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2598 } |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2599 else |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2600 { |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2601 if (is_handle_class ()) |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2602 obj = cdef_object (new handle_cdef_object ()); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2603 else |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2604 obj = cdef_object (new value_cdef_object ()); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2605 obj.set_class (wrap ()); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2606 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2607 initialize_object (obj); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2608 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2609 run_constructor (obj, args); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2610 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2611 return obj; |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2612 } |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2613 } |
15870
2b6fe094e615
Implement embryonic value-class semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15869
diff
changeset
|
2614 else |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2615 error ("cannot instantiate object for abstract class `%s'", |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2616 get_name ().c_str ()); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2617 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
2618 return cdef_object (); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2619 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2620 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2621 static octave_value |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2622 compute_attribute_value (tree_classdef_attribute* t) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2623 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2624 if (t->expression ()) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2625 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2626 if (t->expression ()->is_identifier ()) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2627 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2628 std::string s = t->expression ()->name (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2629 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2630 if (s == "public") |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2631 return std::string ("public"); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2632 else if (s == "protected") |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2633 return std::string ("protected"); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2634 else if (s == "private") |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2635 return std::string ("private"); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2636 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2637 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2638 return t->expression ()->rvalue1 (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2639 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2640 else |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2641 return octave_value (true); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2642 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2643 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2644 template<class T> |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2645 static std::string |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2646 attribute_value_to_string (T* t, octave_value v) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2647 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2648 if (v.is_string ()) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2649 return v.string_value (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2650 else if (t->expression ()) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2651 return t->expression ()->original_text (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2652 else |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2653 return std::string ("true"); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2654 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2655 |
15037
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
2656 cdef_class |
18263
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2657 cdef_class::make_meta_class (tree_classdef* t, bool is_at_folder) |
15037
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
2658 { |
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
2659 cdef_class retval; |
16676
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
2660 std::string class_name, full_class_name; |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2661 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2662 // Class creation |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2663 |
16676
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
2664 class_name = full_class_name = t->ident ()->name (); |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
2665 if (! t->package_name ().empty ()) |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
2666 full_class_name = t->package_name () + "." + full_class_name; |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2667 |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2668 #if DEBUG_TRACE |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2669 std::cerr << "class: " << full_class_name << std::endl; |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2670 #endif |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2671 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2672 std::list<cdef_class> slist; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2673 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2674 if (t->superclass_list ()) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2675 { |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2676 for (tree_classdef_superclass_list::iterator it = |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2677 t->superclass_list ()->begin (); |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2678 it != t->superclass_list ()->end (); ++it) |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2679 { |
18520
932aca9a7c57
Allow multi-level classdef package.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18462
diff
changeset
|
2680 std::string sclass_name = (*it)->class_name (); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2681 |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2682 #if DEBUG_TRACE |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2683 std::cerr << "superclass: " << sclass_name << std::endl; |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2684 #endif |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2685 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2686 cdef_class sclass = lookup_class (sclass_name); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2687 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2688 if (! sclass.get ("Sealed").bool_value ()) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2689 slist.push_back (sclass); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2690 else |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2691 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2692 error ("`%s' cannot inherit from `%s', because it is sealed", |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2693 full_class_name.c_str (), sclass_name.c_str ()); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2694 return retval; |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2695 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2696 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2697 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2698 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2699 |
16676
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
2700 retval = ::make_class (full_class_name, slist); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2701 |
16676
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
2702 // Package owning this class |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
2703 |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
2704 if (! t->package_name ().empty ()) |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
2705 { |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
2706 cdef_package pack = cdef_manager::find_package (t->package_name ()); |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
2707 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
2708 if (pack.ok ()) |
16676
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
2709 retval.put ("ContainingPackage", to_ov (pack)); |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
2710 } |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
2711 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2712 // Class attributes |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2713 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2714 if (t->attribute_list ()) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2715 { |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2716 for (tree_classdef_attribute_list::iterator |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2717 it = t->attribute_list ()->begin (); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2718 it != t->attribute_list ()->end (); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2719 ++it) |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2720 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2721 std::string aname = (*it)->ident ()->name (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2722 octave_value avalue = compute_attribute_value (*it); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2723 |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2724 #if DEBUG_TRACE |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2725 std::cerr << "class attribute: " << aname << " = " |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2726 << attribute_value_to_string (*it, avalue) << std::endl; |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2727 #endif |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2728 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2729 retval.put (aname, avalue); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2730 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2731 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2732 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2733 tree_classdef_body* b = t->body (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2734 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2735 if (b) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2736 { |
16698
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2737 // Keep track of the get/set accessor methods. They will be used |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2738 // later on when creating properties. |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2739 |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2740 std::map<std::string, octave_value> get_methods; |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2741 std::map<std::string, octave_value> set_methods; |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2742 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2743 // Method blocks |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2744 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2745 std::list<tree_classdef_methods_block *> mb_list = b->methods_list (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2746 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2747 for (tree_classdef_body::methods_list_iterator it = mb_list.begin (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2748 it != mb_list.end (); ++it) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2749 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2750 std::map<std::string, octave_value> amap; |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2751 |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2752 #if DEBUG_TRACE |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2753 std::cerr << "method block" << std::endl; |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2754 #endif |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2755 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2756 // Method attributes |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2757 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2758 if ((*it)->attribute_list ()) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2759 { |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2760 for (tree_classdef_attribute_list::iterator ait = |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2761 (*it)->attribute_list ()->begin (); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2762 ait != (*it)->attribute_list ()->end (); ++ait) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2763 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2764 std::string aname = (*ait)->ident ()->name (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2765 octave_value avalue = compute_attribute_value (*ait); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2766 |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2767 #if DEBUG_TRACE |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2768 std::cerr << "method attribute: " << aname << " = " |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2769 << attribute_value_to_string (*ait, avalue) |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2770 << std::endl; |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2771 #endif |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2772 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2773 amap[aname] = avalue; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2774 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2775 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2776 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2777 // Methods |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2778 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2779 if ((*it)->element_list ()) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2780 { |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2781 for (tree_classdef_methods_list::iterator mit = |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2782 (*it)->element_list ()->begin (); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2783 mit != (*it)->element_list ()->end (); ++mit) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2784 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2785 std::string mname = mit->function_value ()->name (); |
16698
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2786 std::string mprefix = mname.substr (0, 4); |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2787 |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2788 if (mprefix == "get.") |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2789 get_methods[mname.substr (4)] = |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2790 make_fcn_handle (*mit, full_class_name + ">" + mname); |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2791 else if (mprefix == "set.") |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2792 set_methods[mname.substr (4)] = |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2793 make_fcn_handle (*mit, full_class_name + ">" + mname); |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2794 else |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2795 { |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2796 cdef_method meth = make_method (retval, mname, *mit); |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2797 |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2798 #if DEBUG_TRACE |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2799 std::cerr << (mname == class_name ? "constructor" |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2800 : "method") |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2801 << ": " << mname << std::endl; |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2802 #endif |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2803 |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2804 for (std::map<std::string, octave_value>::iterator |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2805 ait = amap.begin (); ait != amap.end (); ++ait) |
16698
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2806 meth.put (ait->first, ait->second); |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2807 |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2808 retval.install_method (meth); |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2809 } |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2810 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2811 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2812 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2813 |
18263
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2814 if (is_at_folder) |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2815 { |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2816 // Look for all external methods visible on octave path at the |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2817 // time of loading of the class. |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2818 // |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2819 // TODO: This is an "extension" to Matlab behavior, which only |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2820 // looks in the @-folder containing the original classdef |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2821 // file. However, this is easier to implement it that way at |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2822 // the moment. |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2823 |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2824 std::list<std::string> external_methods = |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2825 load_path::methods (full_class_name); |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2826 |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2827 for (std::list<std::string>::const_iterator |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2828 it = external_methods.begin (); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2829 it != external_methods.end (); |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2830 ++it) |
18263
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2831 { |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2832 // TODO: should we issue a warning if the method is already |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2833 // defined in the classdef file? |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2834 |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2835 if (*it != class_name |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2836 && ! retval.find_method (*it, true).ok ()) |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2837 { |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2838 // Create a dummy method that is used until the actual |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2839 // method is loaded. |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2840 |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2841 octave_user_function *fcn = new octave_user_function (); |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2842 |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2843 fcn->stash_function_name (*it); |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2844 |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2845 cdef_method meth = make_method (retval, *it, |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2846 octave_value (fcn)); |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2847 |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2848 retval.install_method (meth); |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2849 } |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2850 } |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2851 } |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
2852 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2853 // Property blocks |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2854 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2855 // FIXME: default property expression should be able to call static |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2856 // methods of the class being constructed. A restricted CLASSNAME |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2857 // symbol should be added to the scope before evaluating default |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2858 // value expressions. |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2859 |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2860 std::list<tree_classdef_properties_block *> pb_list |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2861 = b->properties_list (); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2862 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2863 for (tree_classdef_body::properties_list_iterator it = pb_list.begin (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2864 it != pb_list.end (); ++it) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2865 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2866 std::map<std::string, octave_value> amap; |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2867 |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2868 #if DEBUG_TRACE |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2869 std::cerr << "property block" << std::endl; |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2870 #endif |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2871 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2872 // Property attributes |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2873 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2874 if ((*it)->attribute_list ()) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2875 { |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2876 for (tree_classdef_attribute_list::iterator ait = |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2877 (*it)->attribute_list ()->begin (); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2878 ait != (*it)->attribute_list ()->end (); ++ait) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2879 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2880 std::string aname = (*ait)->ident ()->name (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2881 octave_value avalue = compute_attribute_value (*ait); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2882 |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2883 #if DEBUG_TRACE |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2884 std::cerr << "property attribute: " << aname << " = " |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2885 << attribute_value_to_string (*ait, avalue) |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2886 << std::endl; |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2887 #endif |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2888 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2889 if (aname == "Access") |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2890 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2891 amap["GetAccess"] = avalue; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2892 amap["SetAccess"] = avalue; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2893 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2894 else |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2895 amap[aname] = avalue; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2896 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2897 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2898 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2899 // Properties |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2900 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2901 if ((*it)->element_list ()) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2902 { |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2903 for (tree_classdef_property_list::iterator pit = |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2904 (*it)->element_list ()->begin (); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2905 pit != (*it)->element_list ()->end (); ++pit) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2906 { |
16698
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2907 std::string prop_name = (*pit)->ident ()->name (); |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2908 |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2909 cdef_property prop = ::make_property (retval, prop_name); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2910 |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2911 #if DEBUG_TRACE |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2912 std::cerr << "property: " << (*pit)->ident ()->name () |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2913 << std::endl; |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2914 #endif |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2915 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2916 if ((*pit)->expression ()) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2917 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2918 octave_value pvalue = (*pit)->expression ()->rvalue1 (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2919 |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2920 #if DEBUG_TRACE |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2921 std::cerr << "property default: " |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2922 << attribute_value_to_string (*pit, pvalue) |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2923 << std::endl; |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2924 #endif |
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
2925 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2926 prop.put ("DefaultValue", pvalue); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2927 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2928 |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2929 // Install property attributes. This is done before assigning |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2930 // the property accessors so we can do validationby using |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2931 // cdef_property methods. |
16698
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2932 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2933 for (std::map<std::string, octave_value>::iterator ait = amap.begin (); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2934 ait != amap.end (); ++ait) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2935 prop.put (ait->first, ait->second); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2936 |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2937 // Install property access methods, if any. Remove the |
20216
aa36fb998a4d
maint: Remove unnecessary whitespace at end of lines.
Rik <rik@octave.org>
parents:
20160
diff
changeset
|
2938 // accessor methods from the temporary storage map, so we can |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2939 // detect which ones are invalid and do not correspond to a |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
2940 // defined property. |
16698
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2941 |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2942 std::map<std::string, octave_value>::iterator git = |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2943 get_methods.find (prop_name); |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2944 |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2945 if (git != get_methods.end ()) |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2946 { |
18462
00ba456b9aa8
Fix dispatch class of property accessor methods.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18441
diff
changeset
|
2947 make_function_of_class (retval, git->second); |
16698
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2948 prop.put ("GetMethod", git->second); |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2949 get_methods.erase (git); |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2950 } |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2951 |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2952 std::map<std::string, octave_value>::iterator sit = |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2953 set_methods.find (prop_name); |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2954 |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2955 if (sit != set_methods.end ()) |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2956 { |
18462
00ba456b9aa8
Fix dispatch class of property accessor methods.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18441
diff
changeset
|
2957 make_function_of_class (retval, sit->second); |
16698
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2958 prop.put ("SetMethod", sit->second); |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2959 set_methods.erase (sit); |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2960 } |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
2961 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2962 retval.install_property (prop); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2963 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2964 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2965 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2966 } |
15037
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
2967 |
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
2968 return retval; |
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
2969 } |
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
2970 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2971 octave_function* |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2972 cdef_class::get_method_function (const std::string& /* nm */) |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2973 { |
15986
14aa0b5a980c
Abstract the meta-protocol layer to use it for other meta objects.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15968
diff
changeset
|
2974 octave_classdef_meta* p = new octave_classdef_meta (*this); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2975 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2976 return p; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2977 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
2978 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2979 octave_value |
15968
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
2980 cdef_property::cdef_property_rep::get_value (const cdef_object& obj, |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
2981 bool do_check_access, |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
2982 const std::string& who) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2983 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
2984 octave_value retval; |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2985 |
15968
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
2986 if (do_check_access && ! check_get_access ()) |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
2987 { |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
2988 gripe_property_access (who, wrap (), false); |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
2989 |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
2990 return retval; |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
2991 } |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
2992 |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2993 if (! obj.is_constructed ()) |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2994 { |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2995 cdef_class cls (to_cdef (get ("DefiningClass"))); |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2996 |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
2997 if (! obj.is_partially_constructed_for (cls)) |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
2998 { |
20463
7ac907da9fba
Use error() rather than ::error() unless explicitly required.
Rik <rik@octave.org>
parents:
20228
diff
changeset
|
2999 error ("cannot reference properties of class `%s' for non-constructed object", |
7ac907da9fba
Use error() rather than ::error() unless explicitly required.
Rik <rik@octave.org>
parents:
20228
diff
changeset
|
3000 cls.get_name ().c_str ()); |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3001 return retval; |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3002 } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3003 } |
19631
db92e7e28e1f
strip trailing whitespace from most source files
John W. Eaton <jwe@octave.org>
parents:
19377
diff
changeset
|
3004 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3005 octave_value get_fcn = get ("GetMethod"); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3006 |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3007 // FIXME: should check whether we're already in get accessor method |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3008 |
16698
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
3009 if (get_fcn.is_empty () || is_method_executing (get_fcn, obj)) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3010 retval = obj.get (get ("Name").string_value ()); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3011 else |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3012 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3013 octave_value_list args; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3014 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3015 args(0) = to_ov (obj); |
19631
db92e7e28e1f
strip trailing whitespace from most source files
John W. Eaton <jwe@octave.org>
parents:
19377
diff
changeset
|
3016 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3017 args = execute_ov (get_fcn, args, 1); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3018 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
3019 retval = args(0); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3020 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3021 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3022 return retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3023 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3024 |
15968
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3025 octave_value |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3026 cdef_property::cdef_property_rep::get_value (bool do_check_access, |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3027 const std::string& who) |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3028 { |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3029 if (do_check_access && ! check_get_access ()) |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3030 { |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3031 gripe_property_access (who, wrap (), false); |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3032 |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3033 return octave_value (); |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3034 } |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3035 |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3036 return get ("DefaultValue"); |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3037 } |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3038 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3039 bool |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3040 cdef_property::cdef_property_rep::is_recursive_set (const cdef_object& /* obj */) const |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3041 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3042 // FIXME: implement |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3043 return false; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3044 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3045 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3046 void |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3047 cdef_property::cdef_property_rep::set_value (cdef_object& obj, |
15968
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3048 const octave_value& val, |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3049 bool do_check_access, |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3050 const std::string& who) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3051 { |
15968
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3052 if (do_check_access && ! check_set_access ()) |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3053 { |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3054 gripe_property_access (who, wrap (), true); |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3055 |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3056 return; |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3057 } |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3058 |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3059 if (! obj.is_constructed ()) |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3060 { |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3061 cdef_class cls (to_cdef (get ("DefiningClass"))); |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3062 |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
3063 if (! obj.is_partially_constructed_for (cls)) |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3064 { |
20463
7ac907da9fba
Use error() rather than ::error() unless explicitly required.
Rik <rik@octave.org>
parents:
20228
diff
changeset
|
3065 error ("cannot reference properties of class `%s' for non-constructed object", |
7ac907da9fba
Use error() rather than ::error() unless explicitly required.
Rik <rik@octave.org>
parents:
20228
diff
changeset
|
3066 cls.get_name ().c_str ()); |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3067 return; |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3068 } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3069 } |
19631
db92e7e28e1f
strip trailing whitespace from most source files
John W. Eaton <jwe@octave.org>
parents:
19377
diff
changeset
|
3070 |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3071 octave_value set_fcn = get ("SetMethod"); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3072 |
16698
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
3073 if (set_fcn.is_empty () || is_method_executing (set_fcn, obj)) |
13b3b92ea99c
Implement property accessors.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16696
diff
changeset
|
3074 obj.put (get ("Name").string_value (), val); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3075 else |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3076 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3077 octave_value_list args; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3078 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3079 args(0) = to_ov (obj); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3080 args(1) = val; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3081 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3082 args = execute_ov (set_fcn, args, 1); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3083 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
3084 if (args.length () > 0 && args(0).is_defined ()) |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3085 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
3086 if (args (0).is_classdef_object ()) |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3087 { |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
3088 cdef_object new_obj = to_cdef (args(0)); |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
3089 |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
3090 obj = new_obj; |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3091 } |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
3092 else |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
3093 ::warning ("set-method of property `%s' returned a non-classdef object", |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
3094 get_name ().c_str ()); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3095 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3096 } |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3097 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3098 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3099 bool |
15968
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3100 cdef_property::cdef_property_rep::check_get_access (void) const |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3101 { |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3102 cdef_class cls (to_cdef (get ("DefiningClass"))); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3103 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
3104 return ::check_access (cls, get ("GetAccess"), std::string (), |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
3105 get_name (), false); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3106 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3107 return false; |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3108 } |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3109 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3110 bool |
15968
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3111 cdef_property::cdef_property_rep::check_set_access (void) const |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3112 { |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3113 cdef_class cls (to_cdef (get ("DefiningClass"))); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3114 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
3115 return ::check_access (cls, get ("SetAccess"), std::string (), |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
3116 get_name (), true); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3117 |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3118 return false; |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3119 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3120 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3121 void |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3122 cdef_method::cdef_method_rep::check_method (void) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3123 { |
18263
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3124 if (is_external ()) |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3125 { |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3126 if (is_dummy_method (function)) |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3127 { |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3128 std::string name = get_name (); |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3129 std::string cls_name = dispatch_type; |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3130 std::string pack_name; |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3131 |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3132 size_t pos = cls_name.rfind ('.'); |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3133 |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3134 if (pos != std::string::npos) |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3135 { |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3136 pack_name = cls_name.substr (0, pos); |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3137 cls_name = cls_name.substr (pos + 1); |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3138 } |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3139 |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3140 std::string dir_name; |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3141 std::string file_name = load_path::find_method (cls_name, name, |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3142 dir_name, pack_name); |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3143 |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3144 if (! file_name.empty ()) |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3145 { |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3146 octave_function *fcn = load_fcn_from_file (file_name, dir_name, |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3147 dispatch_type, |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3148 pack_name); |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3149 |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3150 if (fcn) |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3151 { |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3152 function = octave_value (fcn); |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3153 |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3154 make_function_of_class (dispatch_type, function); |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3155 } |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3156 } |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3157 } |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3158 else |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3159 { |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3160 // FIXME: check out-of-date status |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3161 } |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3162 |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3163 if (is_dummy_method (function)) |
20463
7ac907da9fba
Use error() rather than ::error() unless explicitly required.
Rik <rik@octave.org>
parents:
20228
diff
changeset
|
3164 error ("no definition found for method `%s' of class `%s'", |
7ac907da9fba
Use error() rather than ::error() unless explicitly required.
Rik <rik@octave.org>
parents:
20228
diff
changeset
|
3165 get_name ().c_str (), dispatch_type.c_str ()); |
18263
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3166 } |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3167 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3168 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3169 octave_value_list |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3170 cdef_method::cdef_method_rep::execute (const octave_value_list& args, |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3171 int nargout, bool do_check_access, |
15968
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3172 const std::string& who) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3173 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3174 octave_value_list retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3175 |
15968
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3176 if (do_check_access && ! check_access ()) |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3177 { |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3178 gripe_method_access (who, wrap ()); |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3179 |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3180 return retval; |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3181 } |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3182 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3183 if (! get ("Abstract").bool_value ()) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3184 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3185 check_method (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3186 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
3187 if (function.is_defined ()) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
3188 retval = execute_ov (function, args, nargout); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3189 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3190 else |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3191 error ("%s: cannot execute abstract method", |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3192 get ("Name").string_value ().c_str ()); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3193 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3194 return retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3195 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3196 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3197 octave_value_list |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3198 cdef_method::cdef_method_rep::execute (const cdef_object& obj, |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3199 const octave_value_list& args, |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3200 int nargout, bool do_check_access, |
15968
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3201 const std::string& who) |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3202 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3203 octave_value_list retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3204 |
15968
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3205 if (do_check_access && ! check_access ()) |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3206 { |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3207 gripe_method_access (who, wrap ()); |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3208 |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3209 return retval; |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3210 } |
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3211 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3212 if (! get ("Abstract").bool_value ()) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3213 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3214 check_method (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3215 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
3216 if (function.is_defined ()) |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3217 { |
18263
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3218 octave_value_list new_args; |
b5be1a2aa5ab
Initial implementation for classdef methods in separate files.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18262
diff
changeset
|
3219 |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3220 new_args.resize (args.length () + 1); |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3221 |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3222 new_args(0) = to_ov (obj); |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3223 for (int i = 0; i < args.length (); i++) |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3224 new_args(i+1) = args(i); |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3225 |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3226 retval = execute_ov (function, new_args, nargout); |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3227 } |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3228 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3229 else |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3230 error ("%s: cannot execute abstract method", |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3231 get ("Name").string_value ().c_str ()); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3232 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3233 return retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3234 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3235 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3236 bool |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3237 cdef_method::cdef_method_rep::is_constructor (void) const |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3238 { |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3239 if (function.is_function()) |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3240 return function.function_value ()->is_classdef_constructor (); |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3241 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3242 return false; |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3243 } |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3244 |
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3245 bool |
15968
cdeb6eb656be
Move property/method access check down to cdef_property/cdef_method classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15958
diff
changeset
|
3246 cdef_method::cdef_method_rep::check_access (void) const |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3247 { |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3248 cdef_class cls (to_cdef (get ("DefiningClass"))); |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3249 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
3250 return ::check_access (cls, get ("Access"), get_name ()); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3251 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3252 |
16048
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3253 octave_value_list |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3254 cdef_method::cdef_method_rep::meta_subsref |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3255 (const std::string& type, const std::list<octave_value_list>& idx, |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3256 int nargout) |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3257 { |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3258 octave_value_list retval; |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3259 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3260 switch (type[0]) |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3261 { |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3262 case '(': |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3263 retval = execute (idx.front (), type.length () > 1 ? 1 : nargout, true); |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3264 break; |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3265 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3266 default: |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3267 error ("invalid meta.method indexing"); |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3268 break; |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3269 } |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3270 |
20595
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
3271 if (type.length () > 1 && idx.size () > 1 && ! retval.empty ()) |
c1a6c31ac29a
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20574
diff
changeset
|
3272 retval = retval(0).next_subsref (nargout, type, idx, 1); |
16048
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3273 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3274 return retval; |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3275 } |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3276 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3277 static cdef_package |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3278 lookup_package (const std::string& name) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3279 { |
16048
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3280 return cdef_manager::find_package (name); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3281 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3282 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3283 static octave_value_list |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3284 package_fromName (const octave_value_list& args, int /* nargout */) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3285 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3286 octave_value_list retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3287 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3288 if (args.length () == 1) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3289 { |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3290 std::string name = args(0).string_value ("fromName: invalid package name, expected a string value"); |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3291 |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3292 retval(0) = to_ov (lookup_package (name)); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3293 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3294 else |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3295 error ("fromName: invalid number of parameters"); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3296 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3297 return retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3298 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3299 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3300 static octave_value_list |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3301 package_get_classes (const octave_value_list& args, int /* nargout */) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3302 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3303 octave_value_list retval (1, Matrix ()); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3304 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3305 if (args.length () == 1 && args(0).type_name () == "object" |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3306 && args(0).class_name () == "meta.package") |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3307 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3308 cdef_package pack (to_cdef (args(0))); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3309 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3310 retval(0) = pack.get_classes (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3311 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3312 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3313 return retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3314 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3315 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3316 static octave_value_list |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3317 package_get_functions (const octave_value_list& args, int /* nargout */) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3318 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3319 octave_value_list retval (1, Matrix ()); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3320 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3321 if (args.length () == 0 && args(0).type_name () == "object" |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3322 && args(0).class_name () == "meta.package") |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3323 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3324 cdef_package pack (to_cdef (args(0))); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3325 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3326 retval(0) = pack.get_functions (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3327 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3328 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3329 return retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3330 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3331 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3332 static octave_value_list |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3333 package_get_packages (const octave_value_list& args, int /* nargout */) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3334 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3335 octave_value_list retval (1, Matrix ()); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3336 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3337 if (args.length () == 0 && args(0).type_name () == "object" |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3338 && args(0).class_name () == "meta.package") |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3339 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3340 cdef_package pack (to_cdef (args(0))); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3341 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3342 retval(0) = pack.get_packages (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3343 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3344 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3345 return retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3346 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3347 |
16690
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3348 static octave_value_list |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
3349 package_getAllPackages (const octave_value_list& /* args */, int /* nargout */) |
16690
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3350 { |
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3351 std::map<std::string, cdef_package> toplevel_packages; |
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3352 |
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3353 std::list<std::string> names = load_path::get_all_package_names (); |
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3354 |
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3355 toplevel_packages["meta"] = cdef_manager::find_package ("meta", false, |
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3356 false); |
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3357 |
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3358 for (std::list<std::string>::const_iterator it = names.begin (); |
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3359 it != names.end (); ++it) |
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3360 toplevel_packages[*it] = cdef_manager::find_package (*it, false, true); |
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3361 |
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3362 Cell c (toplevel_packages.size (), 1); |
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3363 |
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3364 int i = 0; |
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3365 |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
3366 for (std::map<std::string, cdef_package>::const_iterator it = |
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
3367 toplevel_packages.begin (); |
16690
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3368 it != toplevel_packages.end (); ++it) |
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3369 c(i++,0) = to_ov (it->second); |
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3370 |
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3371 return octave_value_list (octave_value (c)); |
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3372 } |
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3373 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3374 void |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3375 cdef_package::cdef_package_rep::install_class (const cdef_class& cls, |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3376 const std::string& nm) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3377 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3378 class_map[nm] = cls; |
15911
b18b7e560236
More flexible refcount to account for owned back-references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15910
diff
changeset
|
3379 |
b18b7e560236
More flexible refcount to account for owned back-references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15910
diff
changeset
|
3380 member_count++; |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3381 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3382 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3383 void |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3384 cdef_package::cdef_package_rep::install_function (const octave_value& fcn, |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3385 const std::string& nm) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3386 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3387 function_map[nm] = fcn; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3388 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3389 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3390 void |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3391 cdef_package::cdef_package_rep::install_package (const cdef_package& pack, |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3392 const std::string& nm) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3393 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3394 package_map[nm] = pack; |
15911
b18b7e560236
More flexible refcount to account for owned back-references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15910
diff
changeset
|
3395 |
b18b7e560236
More flexible refcount to account for owned back-references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15910
diff
changeset
|
3396 member_count++; |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3397 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3398 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3399 template<class T1, class T2> |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3400 Cell |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3401 map2Cell (const std::map<T1, T2>& m) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3402 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3403 Cell retval (1, m.size ()); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3404 int i = 0; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3405 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3406 for (typename std::map<T1, T2>::const_iterator it = m.begin (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3407 it != m.end (); ++it, ++i) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3408 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3409 retval(i) = to_ov (it->second); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3410 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3411 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3412 return retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3413 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3414 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3415 Cell |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3416 cdef_package::cdef_package_rep::get_classes (void) const |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3417 { return map2Cell (class_map); } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3418 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3419 Cell |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3420 cdef_package::cdef_package_rep::get_functions (void) const |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3421 { return map2Cell (function_map); } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3422 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3423 Cell |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3424 cdef_package::cdef_package_rep::get_packages (void) const |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3425 { return map2Cell (package_map); } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3426 |
16676
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3427 octave_value |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3428 cdef_package::cdef_package_rep::find (const std::string& nm) |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3429 { |
16684
edbb123cbe3a
Correct handling of package context in symbol table.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16676
diff
changeset
|
3430 std::string symbol_name = get_name () + "." + nm; |
edbb123cbe3a
Correct handling of package context in symbol table.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16676
diff
changeset
|
3431 |
edbb123cbe3a
Correct handling of package context in symbol table.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16676
diff
changeset
|
3432 return symbol_table::find (symbol_name, octave_value_list (), true, false); |
16676
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3433 } |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3434 |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3435 octave_value_list |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3436 cdef_package::cdef_package_rep::meta_subsref |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3437 (const std::string& type, const std::list<octave_value_list>& idx, |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3438 int nargout) |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3439 { |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3440 octave_value_list retval; |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3441 |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3442 switch (type[0]) |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3443 { |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3444 case '.': |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3445 if (idx.front ().length () == 1) |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3446 { |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3447 std::string nm = idx.front ()(0).string_value ("invalid meta.package indexing, expected a symbol name"); |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3448 |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
3449 #if DEBUG_TRACE |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3450 std::cerr << "meta.package query: " << nm << std::endl; |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
3451 #endif |
16676
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3452 |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3453 octave_value o = find (nm); |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3454 |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3455 if (o.is_defined ()) |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3456 { |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3457 if (o.is_function ()) |
16676
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3458 { |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3459 octave_function* fcn = o.function_value (); |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3460 |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3461 // NOTE: the case where the package query is the last |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3462 // part of this subsref index is handled in the parse |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3463 // tree, because there is some logic to handle magic |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3464 // "end" that makes it impossible to execute the |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3465 // function call at this stage. |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3466 |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3467 if (type.size () > 1 |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3468 && ! fcn->is_postfix_index_handled (type[1])) |
16676
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3469 { |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3470 octave_value_list tmp_args; |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3471 |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3472 retval = o.do_multi_index_op (nargout, |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3473 tmp_args); |
16676
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3474 } |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3475 else |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3476 retval(0) = o; |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3477 |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3478 if (type.size () > 1 && idx.size () > 1) |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3479 retval = retval(0).next_subsref (nargout, type, |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3480 idx, 1); |
16676
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3481 } |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3482 else if (type.size () > 1 && idx.size () > 1) |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3483 retval = o.next_subsref (nargout, type, idx, 1); |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3484 else |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3485 retval(0) = o; |
16676
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3486 } |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3487 else if (! error_state) |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3488 error ("member `%s' in package `%s' does not exist", |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3489 nm.c_str (), get_name ().c_str ()); |
16676
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3490 } |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3491 else |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3492 error ("invalid meta.package indexing"); |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3493 break; |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3494 |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3495 default: |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3496 error ("invalid meta.package indexing"); |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3497 break; |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3498 } |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3499 |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3500 return retval; |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3501 } |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3502 |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3503 void |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3504 cdef_package::cdef_package_rep::meta_release (void) |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3505 { |
16689
04e110438873
Expose builtin meta.* classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16684
diff
changeset
|
3506 // FIXME: Do we really want to unregister the package, as it |
04e110438873
Expose builtin meta.* classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16684
diff
changeset
|
3507 // could still be referenced by classes or sub-packages? |
04e110438873
Expose builtin meta.* classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16684
diff
changeset
|
3508 // If the package object is recreated later on, it won't |
04e110438873
Expose builtin meta.* classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16684
diff
changeset
|
3509 // match the one already referenced by those classes or |
04e110438873
Expose builtin meta.* classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16684
diff
changeset
|
3510 // sub-packages. |
04e110438873
Expose builtin meta.* classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16684
diff
changeset
|
3511 |
04e110438873
Expose builtin meta.* classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16684
diff
changeset
|
3512 //cdef_manager::unregister_package (wrap ()); |
16676
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3513 } |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3514 |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
3515 cdef_class cdef_class::_meta_class = cdef_class (); |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
3516 cdef_class cdef_class::_meta_property = cdef_class (); |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
3517 cdef_class cdef_class::_meta_method = cdef_class (); |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
3518 cdef_class cdef_class::_meta_package = cdef_class (); |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
3519 |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
3520 cdef_package cdef_package::_meta = cdef_package (); |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
3521 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3522 void |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3523 install_classdef (void) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3524 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3525 octave_classdef::register_type (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3526 |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
3527 /* bootstrap */ |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3528 cdef_class handle = make_class ("handle"); |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
3529 cdef_class meta_class = cdef_class::_meta_class = make_meta_class ("meta.class", handle); |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
3530 handle.set_class (meta_class); |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
3531 meta_class.set_class (meta_class); |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
3532 |
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
3533 /* meta classes */ |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
3534 cdef_class meta_property = cdef_class::_meta_property = make_meta_class ("meta.property", handle); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
3535 cdef_class meta_method = cdef_class::_meta_method = make_meta_class ("meta.method", handle); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
3536 cdef_class meta_package = cdef_class::_meta_package = make_meta_class ("meta.package", handle); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
3537 |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
3538 cdef_class meta_event = make_meta_class ("meta.event", handle); |
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
3539 cdef_class meta_dynproperty = make_meta_class ("meta.dynamicproperty", handle); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3540 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3541 /* meta.class properties */ |
15913
8521321604df
Initial support for object array semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15911
diff
changeset
|
3542 meta_class.install_property (make_attribute (meta_class, "Abstract")); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3543 meta_class.install_property (make_attribute (meta_class, "ConstructOnLoad")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3544 meta_class.install_property (make_property (meta_class, "ContainingPackage")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3545 meta_class.install_property (make_property (meta_class, "Description")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3546 meta_class.install_property (make_property (meta_class, "DetailedDescription")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3547 meta_class.install_property (make_property (meta_class, "Events")); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3548 meta_class.install_property (make_attribute (meta_class, "HandleCompatible")); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3549 meta_class.install_property (make_attribute (meta_class, "Hidden")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3550 meta_class.install_property |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3551 (make_property (meta_class, "InferiorClasses", |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3552 make_fcn_handle (class_get_inferiorclasses, "meta.class>get.InferiorClasses"), |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3553 "public", Matrix (), "private")); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3554 meta_class.install_property |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3555 (make_property (meta_class, "Methods", |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3556 make_fcn_handle (class_get_methods, "meta.class>get.Methods"), |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3557 "public", Matrix (), "private")); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3558 meta_class.install_property |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3559 (make_property (meta_class, "MethodList", |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3560 make_fcn_handle (class_get_methods, "meta.class>get.MethodList"), |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3561 "public", Matrix (), "private")); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3562 meta_class.install_property (make_attribute (meta_class, "Name")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3563 meta_class.install_property |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3564 (make_property (meta_class, "Properties", |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3565 make_fcn_handle (class_get_properties, "meta.class>get.Properties"), |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3566 "public", Matrix (), "private")); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3567 meta_class.install_property |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3568 (make_property (meta_class, "PropertyList", |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3569 make_fcn_handle (class_get_properties, "meta.class>get.PropertyList"), |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3570 "public", Matrix (), "private")); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3571 meta_class.install_property (make_attribute (meta_class, "Sealed")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3572 meta_class.install_property |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3573 (make_property (meta_class, "SuperClasses", |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3574 make_fcn_handle (class_get_superclasses, "meta.class>get.SuperClasses"), |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3575 "public", Matrix (), "private")); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3576 meta_class.install_property |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3577 (make_property (meta_class, "SuperClassList", |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3578 make_fcn_handle (class_get_superclasses, "meta.class>get.SuperClassList"), |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3579 "public", Matrix (), "private")); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3580 /* meta.class methods */ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3581 meta_class.install_method (make_method (meta_class, "fromName", class_fromName, |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3582 "public", true)); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3583 meta_class.install_method (make_method (meta_class, "fevalStatic", class_fevalStatic, |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3584 "public", false)); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3585 meta_class.install_method (make_method (meta_class, "getConstant", class_getConstant, |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3586 "public", false)); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3587 meta_class.install_method (make_method (meta_class, "eq", class_eq)); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3588 meta_class.install_method (make_method (meta_class, "ne", class_ne)); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3589 meta_class.install_method (make_method (meta_class, "lt", class_lt)); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3590 meta_class.install_method (make_method (meta_class, "le", class_le)); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3591 meta_class.install_method (make_method (meta_class, "gt", class_gt)); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3592 meta_class.install_method (make_method (meta_class, "ge", class_ge)); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3593 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3594 /* meta.method properties */ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3595 meta_method.install_property (make_attribute (meta_method, "Abstract")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3596 meta_method.install_property (make_attribute (meta_method, "Access")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3597 meta_method.install_property (make_attribute (meta_method, "DefiningClass")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3598 meta_method.install_property (make_attribute (meta_method, "Description")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3599 meta_method.install_property (make_attribute (meta_method, "DetailedDescription")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3600 meta_method.install_property (make_attribute (meta_method, "Hidden")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3601 meta_method.install_property (make_attribute (meta_method, "Name")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3602 meta_method.install_property (make_attribute (meta_method, "Sealed")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3603 meta_method.install_property (make_attribute (meta_method, "Static")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3604 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3605 /* meta.property properties */ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3606 meta_property.install_property (make_attribute (meta_property, "Name")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3607 meta_property.install_property (make_attribute (meta_property, "Description")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3608 meta_property.install_property (make_attribute (meta_property, "DetailedDescription")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3609 meta_property.install_property (make_attribute (meta_property, "Abstract")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3610 meta_property.install_property (make_attribute (meta_property, "Constant")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3611 meta_property.install_property (make_attribute (meta_property, "GetAccess")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3612 meta_property.install_property (make_attribute (meta_property, "SetAccess")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3613 meta_property.install_property (make_attribute (meta_property, "Dependent")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3614 meta_property.install_property (make_attribute (meta_property, "Transient")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3615 meta_property.install_property (make_attribute (meta_property, "Hidden")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3616 meta_property.install_property (make_attribute (meta_property, "GetObservable")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3617 meta_property.install_property (make_attribute (meta_property, "SetObservable")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3618 meta_property.install_property (make_attribute (meta_property, "GetMethod")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3619 meta_property.install_property (make_attribute (meta_property, "SetMethod")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3620 meta_property.install_property (make_attribute (meta_property, "DefiningClass")); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3621 meta_property.install_property |
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3622 (make_property (meta_property, "DefaultValue", |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3623 make_fcn_handle (property_get_defaultvalue, "meta.property>get.DefaultValue"), |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3624 "public", Matrix (), "private")); |
15869
5e5705b3e505
Implement some embryonic handle-classdef semantic.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15841
diff
changeset
|
3625 meta_property.install_property (make_attribute (meta_property, "HasDefault")); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3626 /* meta.property events */ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3627 // FIXME: add events |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3628 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3629 /* handle methods */ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3630 handle.install_method (make_method (handle, "delete", handle_delete)); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3631 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3632 /* meta.package properties */ |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3633 meta_package.install_property (make_attribute (meta_package, "Name")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3634 meta_package.install_property (make_property (meta_package, "ContainingPackage")); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3635 meta_package.install_property |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3636 (make_property (meta_package, "ClassList", |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3637 make_fcn_handle (package_get_classes, "meta.package>get.ClassList"), |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3638 "public", Matrix (), "private")); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3639 meta_package.install_property |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3640 (make_property (meta_package, "Classes", |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3641 make_fcn_handle (package_get_classes, "meta.package>get.Classes"), |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3642 "public", Matrix (), "private")); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3643 meta_package.install_property |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3644 (make_property (meta_package, "FunctionList", |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3645 make_fcn_handle (package_get_functions, "meta.package>get.FunctionList"), |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3646 "public", Matrix (), "private")); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3647 meta_package.install_property |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3648 (make_property (meta_package, "Functions", |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3649 make_fcn_handle (package_get_functions, "meta.package>get.Functions"), |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3650 "public", Matrix (), "private")); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3651 meta_package.install_property |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3652 (make_property (meta_package, "PackageList", |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3653 make_fcn_handle (package_get_packages, "meta.package>get.PackageList"), |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3654 "public", Matrix (), "private")); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3655 meta_package.install_property |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3656 (make_property (meta_package, "Packages", |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3657 make_fcn_handle (package_get_packages, "meta.package>get.Packages"), |
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3658 "public", Matrix (), "private")); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3659 meta_package.install_method (make_method (meta_package, "fromName", package_fromName, |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3660 "public", true)); |
16690
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3661 meta_package.install_method (make_method (meta_package, "getAllPackages", package_getAllPackages, |
1c45e22fc444
Implement meta.package.getAllPackages() method.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16689
diff
changeset
|
3662 "public", true)); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3663 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3664 /* create "meta" package */ |
15909
b8bff84022d6
Use strong reference between objects and their class.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15897
diff
changeset
|
3665 cdef_package package_meta = cdef_package::_meta = make_package ("meta"); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3666 package_meta.install_class (meta_class, "class"); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3667 package_meta.install_class (meta_property, "property"); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3668 package_meta.install_class (meta_method, "method"); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3669 package_meta.install_class (meta_package, "package"); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3670 package_meta.install_class (meta_event, "event"); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3671 package_meta.install_class (meta_dynproperty, "dynproperty"); |
16689
04e110438873
Expose builtin meta.* classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16684
diff
changeset
|
3672 |
04e110438873
Expose builtin meta.* classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16684
diff
changeset
|
3673 /* install built-in classes into the symbol table */ |
04e110438873
Expose builtin meta.* classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16684
diff
changeset
|
3674 symbol_table::install_built_in_function |
04e110438873
Expose builtin meta.* classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16684
diff
changeset
|
3675 ("meta.class", octave_value (meta_class.get_constructor_function ())); |
04e110438873
Expose builtin meta.* classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16684
diff
changeset
|
3676 symbol_table::install_built_in_function |
04e110438873
Expose builtin meta.* classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16684
diff
changeset
|
3677 ("meta.method", octave_value (meta_method.get_constructor_function ())); |
04e110438873
Expose builtin meta.* classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16684
diff
changeset
|
3678 symbol_table::install_built_in_function |
04e110438873
Expose builtin meta.* classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16684
diff
changeset
|
3679 ("meta.property", octave_value (meta_property.get_constructor_function ())); |
04e110438873
Expose builtin meta.* classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16684
diff
changeset
|
3680 symbol_table::install_built_in_function |
04e110438873
Expose builtin meta.* classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16684
diff
changeset
|
3681 ("meta.package", octave_value (meta_package.get_constructor_function ())); |
04e110438873
Expose builtin meta.* classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16684
diff
changeset
|
3682 symbol_table::install_built_in_function |
04e110438873
Expose builtin meta.* classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16684
diff
changeset
|
3683 ("meta.event", octave_value (meta_event.get_constructor_function ())); |
04e110438873
Expose builtin meta.* classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16684
diff
changeset
|
3684 symbol_table::install_built_in_function |
04e110438873
Expose builtin meta.* classes.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16684
diff
changeset
|
3685 ("meta.dynproperty", octave_value (meta_dynproperty.get_constructor_function ())); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3686 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3687 |
16048
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3688 //---------------------------------------------------------------------------- |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3689 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3690 cdef_manager* cdef_manager::instance = 0; |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3691 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3692 void |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3693 cdef_manager::create_instance (void) |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3694 { |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3695 instance = new cdef_manager (); |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3696 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3697 if (instance) |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3698 singleton_cleanup_list::add (cleanup_instance); |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3699 } |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3700 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3701 cdef_class |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3702 cdef_manager::do_find_class (const std::string& name, |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3703 bool error_if_not_found, bool load_if_not_found) |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3704 { |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3705 std::map<std::string, cdef_class>::iterator it = all_classes.find (name); |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3706 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3707 if (it == all_classes.end ()) |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3708 { |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3709 if (load_if_not_found) |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3710 { |
16676
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3711 octave_value ov_cls; |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3712 |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3713 size_t pos = name.rfind ('.'); |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3714 |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3715 if (pos == std::string::npos) |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3716 ov_cls = symbol_table::find (name); |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3717 else |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3718 { |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3719 std::string pack_name = name.substr (0, pos); |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3720 |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3721 cdef_package pack = do_find_package (pack_name, false, true); |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3722 |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3723 if (pack.ok ()) |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3724 ov_cls = pack.find (name.substr (pos+1)); |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3725 } |
16048
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3726 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3727 if (ov_cls.is_defined ()) |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3728 it = all_classes.find (name); |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3729 } |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3730 } |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3731 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3732 if (it == all_classes.end ()) |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3733 { |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3734 if (error_if_not_found) |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3735 error ("class not found: %s", name.c_str ()); |
16048
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3736 } |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3737 else |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3738 { |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3739 cdef_class cls = it->second; |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3740 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3741 if (! cls.is_builtin ()) |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3742 cls = lookup_class (cls); |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3743 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3744 if (cls.ok ()) |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3745 return cls; |
16048
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3746 else |
18726
fe0e34be5576
maint: untabify recently added code files.
Rik <rik@octave.org>
parents:
18520
diff
changeset
|
3747 all_classes.erase (it); |
16048
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3748 } |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3749 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3750 return cdef_class (); |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3751 } |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3752 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3753 octave_function* |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3754 cdef_manager::do_find_method_symbol (const std::string& method_name, |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3755 const std::string& class_name) |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3756 { |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3757 octave_function *retval = 0; |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3758 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3759 cdef_class cls = find_class (class_name, false, false); |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3760 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3761 if (cls.ok ()) |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3762 { |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3763 cdef_method meth = cls.find_method (method_name); |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3764 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3765 if (meth.ok ()) |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3766 retval = new octave_classdef_meta (meth); |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3767 } |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3768 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3769 return retval; |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3770 } |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3771 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3772 cdef_package |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3773 cdef_manager::do_find_package (const std::string& name, |
16676
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3774 bool error_if_not_found, |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3775 bool load_if_not_found) |
16048
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3776 { |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3777 cdef_package retval; |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3778 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3779 std::map<std::string, cdef_package>::const_iterator it |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3780 = all_packages.find (name); |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3781 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3782 if (it != all_packages.end ()) |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3783 { |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3784 retval = it->second; |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3785 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3786 if (! retval.ok ()) |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3787 error ("invalid package `%s'", name.c_str ()); |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3788 } |
16676
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3789 else |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3790 { |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3791 if (load_if_not_found && load_path::find_package (name)) |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3792 { |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3793 size_t pos = name.find ('.'); |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3794 |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3795 if (pos == std::string::npos) |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3796 retval = make_package (name, std::string ()); |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3797 else |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3798 { |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3799 std::string parent_name = name.substr (0, pos); |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3800 |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3801 retval = make_package (name, parent_name); |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3802 } |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3803 } |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3804 else if (error_if_not_found) |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3805 error ("unknown package `%s'", name.c_str ()); |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3806 } |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3807 |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3808 return retval; |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3809 } |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3810 |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3811 octave_function* |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3812 cdef_manager::do_find_package_symbol (const std::string& pack_name) |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3813 { |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3814 octave_function* retval = 0; |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3815 |
20087
8b501a0db1e9
only insert package names into loader map if package dir exists (bug #43769)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
3816 cdef_package pack = find_package (pack_name, false); |
16676
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3817 |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3818 if (pack.ok ()) |
7368654f302f
Initial support for (classdef) packages.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
16048
diff
changeset
|
3819 retval = new octave_classdef_meta (pack); |
16048
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3820 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3821 return retval; |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3822 } |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3823 |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3824 //---------------------------------------------------------------------------- |
10142aad4b9f
Implement indirect method call: fun(obj, ...).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15986
diff
changeset
|
3825 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3826 DEFUN (__meta_get_package__, args, , "") |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3827 { |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3828 octave_value retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3829 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3830 if (args.length () == 1) |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3831 { |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3832 std::string cname = args(0).string_value ("invalid package name, expected a string value"); |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3833 |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3834 retval = to_ov (lookup_package (cname)); |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3835 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3836 else |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3837 print_usage (); |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3838 |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3839 return retval; |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3840 } |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3841 |
15037
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3842 DEFUN (__superclass_reference__, args, /* nargout */, |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
3843 "-*- texinfo -*-\n\ |
15037
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3844 @deftypefn {Built-in Function} {} __superclass_reference__ ()\n\ |
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3845 Undocumented internal function.\n\ |
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3846 @end deftypefn") |
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3847 { |
15896
57be060d7672
Implement full object construction and superclass references.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15870
diff
changeset
|
3848 return octave_value (new octave_classdef_superclass_ref (args)); |
15037
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3849 } |
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3850 |
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3851 DEFUN (__meta_class_query__, args, /* nargout */, |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
3852 "-*- texinfo -*-\n\ |
15037
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3853 @deftypefn {Built-in Function} {} __meta_class_query__ ()\n\ |
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3854 Undocumented internal function.\n\ |
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3855 @end deftypefn") |
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3856 { |
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3857 octave_value retval; |
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3858 |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
3859 #if DEBUG_TRACE |
15037
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3860 std::cerr << "__meta_class_query__ (" |
18520
932aca9a7c57
Allow multi-level classdef package.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18462
diff
changeset
|
3861 << args(0).string_value () << ")" |
15037
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3862 << std::endl; |
19065
1f36981ab323
allow debugging messages in classdef code to be disabled
John W. Eaton <jwe@octave.org>
parents:
18726
diff
changeset
|
3863 #endif |
15037
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3864 |
18520
932aca9a7c57
Allow multi-level classdef package.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
18462
diff
changeset
|
3865 if (args.length () == 1) |
15037
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3866 { |
20615
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3867 std::string cls = args(0).string_value ("invalid class name, expected a string value"); |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3868 |
729a85dafba8
use new string_value method to handle value extraction errors
John W. Eaton <jwe@octave.org>
parents:
20595
diff
changeset
|
3869 retval = to_ov (lookup_class (cls)); |
15037
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3870 } |
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3871 else |
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3872 print_usage (); |
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3873 |
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3874 return retval; |
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3875 } |
56b8eb7c9c04
improvements in parsing classdef
John W. Eaton <jwe@octave.org>
parents:
15036
diff
changeset
|
3876 |
15897
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3877 DEFUN (metaclass, args, /* nargout */, |
19895
19755f4fc851
maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19731
diff
changeset
|
3878 "-*- texinfo -*-\n\ |
15897
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3879 @deftypefn {Built-in Function} {} metaclass (obj)\n\ |
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3880 Returns the meta.class object corresponding to the class of @var{obj}.\n\ |
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3881 @end deftypefn") |
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3882 { |
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3883 octave_value retval; |
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3884 |
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3885 if (args.length () == 1) |
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3886 { |
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3887 cdef_object obj = to_cdef (args(0)); |
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3888 |
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3889 if (! error_state) |
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3890 retval = to_ov (obj.get_class ()); |
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3891 else |
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3892 print_usage (); |
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3893 } |
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3894 else |
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3895 print_usage (); |
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3896 |
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3897 return retval; |
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3898 } |
a413c6fe1726
Add metaclass function.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
15896
diff
changeset
|
3899 |
15036
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3900 /* |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3901 ;;; Local Variables: *** |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3902 ;;; mode: C++ *** |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3903 ;;; End: *** |
aa1f9e479c6e
octave_value classdef objects
Michael Goffioul <michael.goffioul@gmail.com>
parents:
diff
changeset
|
3904 */ |