/trunk/Source/Modules/utils.cxx
C++ | 220 lines | 116 code | 34 blank | 70 comment | 34 complexity | 8634e4321230fb0c6cd722668b4ba507 MD5 | raw file
Possible License(s): LGPL-2.1, Cube, GPL-3.0, 0BSD, GPL-2.0
- /* -----------------------------------------------------------------------------
- * This file is part of SWIG, which is licensed as a whole under version 3
- * (or any later version) of the GNU General Public License. Some additional
- * terms also apply to certain portions of SWIG. The full details of the SWIG
- * license and copyrights can be found in the LICENSE and COPYRIGHT files
- * included with the SWIG source code as distributed by the SWIG developers
- * and at http://www.swig.org/legal.html.
- *
- * utils.cxx
- *
- * Various utility functions.
- * ----------------------------------------------------------------------------- */
- char cvsroot_utils_cxx[] = "$Id: utils.cxx 12654 2011-05-05 06:09:55Z wsfulton $";
- #include <swigmod.h>
- int is_public(Node *n) {
- String *access = Getattr(n, "access");
- return !access || !Cmp(access, "public");
- }
- int is_private(Node *n) {
- String *access = Getattr(n, "access");
- return access && !Cmp(access, "private");
- }
- int is_protected(Node *n) {
- String *access = Getattr(n, "access");
- return access && !Cmp(access, "protected");
- }
- static int is_member_director_helper(Node *parentnode, Node *member) {
- int parent_nodirector = GetFlag(parentnode, "feature:nodirector");
- if (parent_nodirector)
- return 0;
- int parent_director = Swig_director_mode() && GetFlag(parentnode, "feature:director");
- int cdecl_director = parent_director || GetFlag(member, "feature:director");
- int cdecl_nodirector = GetFlag(member, "feature:nodirector");
- return cdecl_director && !cdecl_nodirector && !GetFlag(member, "feature:extend");
- }
- int is_member_director(Node *parentnode, Node *member) {
- if (parentnode && checkAttribute(member, "storage", "virtual")) {
- return is_member_director_helper(parentnode, member);
- } else {
- return 0;
- }
- }
- int is_member_director(Node *member) {
- return is_member_director(Getattr(member, "parentNode"), member);
- }
- // Identifies the additional protected members that are generated when the allprotected option is used.
- // This does not include protected virtual methods as they are turned on with the dirprot option.
- int is_non_virtual_protected_access(Node *n) {
- int result = 0;
- if (Swig_director_mode() && Swig_director_protected_mode() && Swig_all_protected_mode() && is_protected(n) && !checkAttribute(n, "storage", "virtual")) {
- Node *parentNode = Getattr(n, "parentNode");
- // When vtable is empty, the director class does not get emitted, so a check for an empty vtable should be done.
- // However, vtable is set in Language and so is not yet set when methods in Typepass call clean_overloaded()
- // which calls is_non_virtual_protected_access. So commented out below.
- // Moving the director vtable creation into into Typepass should solve this problem.
- if (is_member_director_helper(parentNode, n) /* && Getattr(parentNode, "vtable")*/)
- result = 1;
- }
- return result;
- }
- /* Clean overloaded list. Removes templates, ignored, and errors */
- void clean_overloaded(Node *n) {
- Node *nn = Getattr(n, "sym:overloaded");
- Node *first = 0;
- while (nn) {
- String *ntype = nodeType(nn);
- if ((GetFlag(nn, "feature:ignore")) ||
- (Getattr(nn, "error")) ||
- (Strcmp(ntype, "template") == 0) ||
- ((Strcmp(ntype, "cdecl") == 0) && is_protected(nn) && !is_member_director(nn) && !is_non_virtual_protected_access(n))) {
- /* Remove from overloaded list */
- Node *ps = Getattr(nn, "sym:previousSibling");
- Node *ns = Getattr(nn, "sym:nextSibling");
- if (ps) {
- Setattr(ps, "sym:nextSibling", ns);
- }
- if (ns) {
- Setattr(ns, "sym:previousSibling", ps);
- }
- Delattr(nn, "sym:previousSibling");
- Delattr(nn, "sym:nextSibling");
- Delattr(nn, "sym:overloaded");
- nn = ns;
- continue;
- } else {
- if (!first)
- first = nn;
- Setattr(nn, "sym:overloaded", first);
- }
- nn = Getattr(nn, "sym:nextSibling");
- }
- if (!first || (first && !Getattr(first, "sym:nextSibling"))) {
- if (Getattr(n, "sym:overloaded"))
- Delattr(n, "sym:overloaded");
- }
- }
- /* -----------------------------------------------------------------------------
- * Swig_set_max_hash_expand()
- *
- * Controls how many Hash objects are displayed when displaying nested Hash objects.
- * Makes DohSetMaxHashExpand an externally callable function (for debugger).
- * ----------------------------------------------------------------------------- */
- void Swig_set_max_hash_expand(int count) {
- SetMaxHashExpand(count);
- }
- extern "C" {
- /* -----------------------------------------------------------------------------
- * Swig_get_max_hash_expand()
- *
- * Returns how many Hash objects are displayed when displaying nested Hash objects.
- * Makes DohGetMaxHashExpand an externally callable function (for debugger).
- * ----------------------------------------------------------------------------- */
- int Swig_get_max_hash_expand() {
- return GetMaxHashExpand();
- }
- /* -----------------------------------------------------------------------------
- * Swig_to_doh_string()
- *
- * DOH version of Swig_to_string()
- * ----------------------------------------------------------------------------- */
- static String *Swig_to_doh_string(DOH *object, int count) {
- int old_count = Swig_get_max_hash_expand();
- if (count >= 0)
- Swig_set_max_hash_expand(count);
- String *debug_string = object ? NewStringf("%s", object) : NewString("NULL");
- Swig_set_max_hash_expand(old_count);
- return debug_string;
- }
- /* -----------------------------------------------------------------------------
- * Swig_to_doh_string_with_location()
- *
- * DOH version of Swig_to_string_with_location()
- * ----------------------------------------------------------------------------- */
- static String *Swig_to_doh_string_with_location(DOH *object, int count) {
- int old_count = Swig_get_max_hash_expand();
- if (count >= 0)
- Swig_set_max_hash_expand(count);
- String *debug_string = Swig_stringify_with_location(object);
- Swig_set_max_hash_expand(old_count);
- return debug_string;
- }
- /* -----------------------------------------------------------------------------
- * Swig_to_string()
- *
- * Swig debug - return C string representation of any DOH type.
- * Nested Hash types expand count is value of Swig_get_max_hash_expand when count<0
- * Note: leaks memory.
- * ----------------------------------------------------------------------------- */
- const char *Swig_to_string(DOH *object, int count) {
- return Char(Swig_to_doh_string(object, count));
- }
- /* -----------------------------------------------------------------------------
- * Swig_to_string_with_location()
- *
- * Swig debug - return C string representation of any DOH type, within [] brackets
- * for Hash and List types, prefixed by line and file information.
- * Nested Hash types expand count is value of Swig_get_max_hash_expand when count<0
- * Note: leaks memory.
- * ----------------------------------------------------------------------------- */
- const char *Swig_to_string_with_location(DOH *object, int count) {
- return Char(Swig_to_doh_string_with_location(object, count));
- }
- /* -----------------------------------------------------------------------------
- * Swig_print()
- *
- * Swig debug - display string representation of any DOH type.
- * Nested Hash types expand count is value of Swig_get_max_hash_expand when count<0
- * ----------------------------------------------------------------------------- */
- void Swig_print(DOH *object, int count) {
- String *output = Swig_to_doh_string(object, count);
- Printf(stdout, "%s\n", output);
- Delete(output);
- }
- /* -----------------------------------------------------------------------------
- * Swig_to_string_with_location()
- *
- * Swig debug - display string representation of any DOH type, within [] brackets
- * for Hash and List types, prefixed by line and file information.
- * Nested Hash types expand count is value of Swig_get_max_hash_expand when count<0
- * ----------------------------------------------------------------------------- */
- void Swig_print_with_location(DOH *object, int count) {
- String *output = Swig_to_doh_string_with_location(object, count);
- Printf(stdout, "%s\n", output);
- Delete(output);
- }
- } // extern "C"