Commit graph

23,810 commits

Author SHA1 Message Date
Vadim Zeitlin
f4ecc3c06a Move type-resolving code to cxx_wrappers
This is also not specific to class wrappers, but can, and will be, used
for the global functions, so move it to a place where it can be reused.

No changes yet.
2021-12-07 20:54:28 +01:00
Vadim Zeitlin
9f80bc8113 Move void check and error reporting to lookup_cxx_ret_type()
This code doesn't belong to emit_member_function() as it's relevant for
all functions, not just the member ones.

No real changes.
2021-12-07 20:54:28 +01:00
Vadim Zeitlin
45feb91551 Move cxx_wrappers definition after cxx_{r,p}type_desc
No changes, just prepare for starting to use the "desc" classes in
cxx_wrappers.
2021-12-07 20:54:28 +01:00
Vadim Zeitlin
b072b2dc87 Represent empty shared pointers by null pointers at C level
This is much more convenient and allows checking if the shared pointer
is empty easily, unlike before, when it couldn't be done and adding
support for it would have required adding extra functions.

Also add a way to check whether an object is null in C++ wrappers of the
classes handled via shared pointers and static null() method for
creating null objects of such classes.
2021-12-07 20:54:28 +01:00
Vadim Zeitlin
8d9f3e88b2 Expand special variables in cxxcode typemap
This makes the typemap much more useful, as it can now reference the
name of the class it is being expanded for and the type of the C pointer
used by it (in principle, the latter could be recovered by using
decltype(), but this results in rather verbose code inside static
methods where a dummy pointer to the type must be constructed first, so
using another special variable seems like a simpler solution).
2021-12-07 20:54:28 +01:00
Vadim Zeitlin
f9b4ea2841 Define a local variable for sym:name attribute
No changes, this is just a tiny simplification.
2021-12-07 20:54:28 +01:00
Vadim Zeitlin
e2d32f33b2 Add support for "cxxcode" typemap
This allows injecting arbitrary code into the generated C++ classes and
can be useful for defining extra constructors or operators, for example.
2021-12-07 20:54:28 +01:00
Vadim Zeitlin
fd11a591a3 Add cxx{in,out}type typemaps and use them for std::string
This makes using returning strings much simpler to use from C++ code as
the returned pointers don't have to be deleted manually -- although, of
course, this does require an extra allocation and copy and so should be
avoided for the very long strings.

Add a new runtime test showing how simple and convenient it is to use
the functions working with string using the C++ wrappers now.
2021-12-07 20:54:28 +01:00
Vadim Zeitlin
8b871b10fe Replace type_desc with cxx_ptype_desc
This is similar to the last two commits for cxx_rtype_desc and uses a
more appropriate and more specific class for holding parameter type
description.

This is just a refactoring, no real changes yet.
2021-12-07 20:54:28 +01:00
Vadim Zeitlin
e3a1301698 Rename cxx_rtype_desc::set_return_xxx() to apply_out_typemap()
Instead of using ad hoc terminology, just call the string used here a
typemap because this is what it actually is.

Also keep just a single function and prepend "$result =" to it
automatically if necessary, as this is more convenient.

Still no real changes, but this will make it simpler to add support for
user-specified cxxout typemap.
2021-12-07 20:54:28 +01:00
Victor Stinner
e902ab5160 Add Python 3.11 support: use Py_SET_TYPE()
On Python 3.9 and newer, SwigPyBuiltin_SetMetaType() now calls
Py_SET_TYPE(). Py_TYPE() can no longer be usd as an l-value on
Python 3.11:

* https://docs.python.org/dev/c-api/structures.html#c.Py_SET_TYPE
* https://docs.python.org/dev/whatsnew/3.11.html#c-api-changes
2021-12-06 23:17:33 +01:00
Vadim Zeitlin
4ab28437a7 Separate cxx_rtype_desc from type_desc class
Maintaining just wrapper start/end fragments is too limiting, at least
for the return type, so allow making the "return action" a formatted
string in which the return value can be inserted at any place.

This will allow making return types more customizable in the upcoming
commits, but there are no changes yet, this is just a refactoring.
2021-12-06 16:50:17 +01:00
Vadim Zeitlin
7c46ff1b6e Add "cxxheader" section to allow injecting extra C++ declarations
This can also be used to include extra C++ headers.

Document this section as well as the already existing "cheader" one.
2021-12-06 16:50:17 +01:00
William S Fulton
e0935404a8 Add Octave 6 to changes file 2021-12-05 22:31:05 +00:00
William S Fulton
5ada46bcce Whitespace consistency fix in CI-linux-install.sh 2021-12-05 22:26:25 +00:00
William S Fulton
3947df87a2 GHA: Test Octave 6.4 2021-12-05 22:24:51 +00:00
Robert Fries
983b91694f Additional changes due to name changes in octave-6 * is_map to isstruct, is_object to isobject 2021-12-05 22:19:46 +00:00
Robert Fries
81f9e6600f Octave module lets examples and tests work with Octave-6 * Try-catch replacement for check of error_state * Add execute method in addition to call * Replace oct_mach_info with octave::mach_info * Call from interpreter: global_varval global_assign * Assign a global name requires locating the stack which requires interpreter to tree evaluator to callStack * Do not use discard_error_messages or discard_warning_messages 2021-12-05 22:19:46 +00:00
Robert Fries
852eab7db3 Allow swig wrapped modules to compile with -Bsymbolic 2021-12-05 22:19:40 +00:00
Vadim Zeitlin
a335fff2ec Avoid errors due to generating identical overloads
Add typecheck typemaps for primitive types and string and call
Swig_overload_check() to ensure that we don't generate two wrappers
functions taking the same "const char*" type if we have overloads taking
it and "std::string" (or a reference) in the original code.
2021-12-05 20:49:20 +01:00
Vadim Zeitlin
4a3ae6f8d3 Don't generate C++ wrappers for overridden virtual functions
This is harmless, but also useless, as the implementation is the same as
the existing one in the base class anyhow.
2021-12-05 20:24:38 +01:00
Vadim Zeitlin
aacc930023 Streamline and improve std::string typemaps
Avoid unnecessary heap allocations, just use temporary variables.

Actually update the string parameters passed by pointer/non-const
reference. This requires the pointers passed to actually be non-const,
so update the C-specific unit test runme to use a char buffer instead of
a literal string.

Also simplify the code copying the string contents to just use strdup()
(if there are ever any platforms where this POSIX functions is not
available, we could just define it ourselves once instead of using
strlen() + malloc() + memcpy() manually twice).
2021-12-05 03:31:35 +01:00
Olly Betts
883b42dc70 [php] Ensure _runme.php calls check::done()
This function doesn't do anything currently so these missing calls are a
latent issue.  It could be used for e.g. memory leak checking in the
future though, and it's potentially a useful place to add code when
debugging.
2021-12-05 12:40:44 +13:00
Olly Betts
ee3c9bd697 [php] Check fooCount() in newobject1_runme.php 2021-12-05 12:40:44 +13:00
Vadim Zeitlin
628e2cf6d2 Make std::{set,map} has() and has_key() methods const
They don't modify the object, so should be callable on const objects.
2021-12-04 17:47:27 +01:00
William S Fulton
8432d3f89b GHA: Test currently supported php versions 7.0-8.1 2021-12-04 09:35:51 +00:00
Vadim Zeitlin
c4187f495f Fix definition of move assignment operator for wrapper classes
Classes not deriving from another class in the hierarchy must take care
of freeing their current pointer before reassigning it.

This should have been part of 3f3438093 (Define move ctor and assignment
operator for C++ wrappers, 2021-11-24).
2021-12-03 03:53:36 +01:00
Vadim Zeitlin
bfc6623bbd Make SWIG_CException dtor public to fix memory leak
The actual dtor was never called when the wrapper object was destroyed
before, due to dtor being private.
2021-12-03 03:38:33 +01:00
Vadim Zeitlin
19e0ecbb9d Don't leak the pointer returned by SWIG_CException::get_pending()
This pointer is always new (if non-null) and so must be deleted.
2021-12-03 03:38:04 +01:00
Vadim Zeitlin
d33e76e045 Fix bug with deleting even non-owned pointers in C++ wrappers
Only take ownership of the objects returned from functions that are
explicitly annotated with %newobject or from functions returning objects
by value -- as in this case nothing else can own the returned object
anyhow.

This required changing the code slightly to let do_resolve_type() access
the function node pointer, as the information we need is only available
in it and not in the dummy node passed to us when we're called from
inside Swig_typemap_lookup() due to $typemap() expansion.
2021-12-03 03:00:17 +01:00
William S Fulton
5bdc20781b Remove bom in Windows.html 2021-12-02 11:53:13 +00:00
William S Fulton
a5f85beb2d HTML doc fixes 2021-12-02 11:38:41 +00:00
William S Fulton
e2384796f0 Add Python embedded interpreters fix to changes file 2021-12-02 09:01:31 +00:00
William S Fulton
be51cb6a6e Merge branch 'fix-crash-2101'
* fix-crash-2101:
  Added extern "C" block that was removed in previous commit.
  Fixed crashes when using embedded Python interpreters.
2021-12-02 09:01:18 +00:00
Olly Betts
c25df74807 [php7] Use destructor action if present
If there's a destructor, use its action instead of free(ptr)
(for C)/delete ptr (for C++).

Fixes #2108
2021-12-02 19:15:34 +13:00
Olly Betts
51f586bc4c
Merge pull request #2111 from swig/remove-obsolete-js-support
Remove obsolete js support
2021-12-02 18:09:30 +13:00
Olly Betts
bebb3d4c21 [ci] Remove CI build for unsupported v8 3.14
We only support v8 5.0 and later now.

libv8-dev is no longer packaged in newer Ubuntu releases, so it
seems there isn't an easy way to update this to test a supported
v8 version, but really v8 via node is the configuration people will
actually use anyway.
2021-12-02 14:31:28 +13:00
Olly Betts
7c97bd5ab3 [js] Remove code to handle v8 < 5.0
We require at least node v6 which means v8 5.0, so code to handle
older v8 is no longer useful.
2021-12-02 14:04:25 +13:00
Olly Betts
e30dfeaab9 [js] Update docs re v8 support
We require at least node v6 (which means v8 v5.0) since
7ba19e7586 so updated the manual to
reflect this.
2021-12-02 14:01:27 +13:00
Vadim Zeitlin
efdfad6565 Avoid redundant casts for function result in generated code
No real changes, just avoid somewhat ridiculously looking consecutive
casts to the same type in the generated code.
2021-12-02 00:31:33 +01:00
John Senneker
160b8c5da3 Added extern "C" block that was removed in previous commit. 2021-12-01 15:15:24 -05:00
William S Fulton
f17b6bda93 Merge branch 'fix_SWIG_V8_VERSION'
* fix_SWIG_V8_VERSION:
  [javascript][v8] SWIG_V8_VERSION generation method corrected.
2021-12-01 18:22:29 +00:00
William S Fulton
26d693105a GHA: Test node versions 6,8,10
Test the documented minimum version 6 and some later versions
as was done on Travis.

Using ubuntu-18.04 as I couldn't get these versions to work on newer
ubuntu-20.04 (some horrid c++ compilation errors)
2021-12-01 18:21:07 +00:00
John Senneker
ebe14e6e2a Fixed crashes when using embedded Python interpreters.
Fixes #2101. There are 3 related changes made here:
1. Move the SWIG_globals() singleton into pyrun from pyint so it
   is visible to SWIG_Python_DestroyModule(). The static globals
   varlink has been extracted out of the function so that it can
   be set to NULL in SWIG_Python_DestroyModule(), which fixes the
   issue described in #2101. (Now when the second interpreter
   starts up, the Swig_Globals_global pointer will be NULL, so it
   knows it has to create a new one.)
2. Remove a Py_DECREF on the globals varlink. The decrement is now
   performed by DestroyModule(), so there's no need to do it in
   SWIG_init().
3. Fixed similar issue with SWIG_Python_TypeCache().
2021-11-30 16:13:17 -05:00
Vadim Zeitlin
e4bb84f3bd Represent scoped enums as scoped enums in C++ wrappers
This is better than turning them into unscoped enums with a prefix for
the elements.
2021-11-30 02:30:46 +01:00
Vadim Zeitlin
a031ec3474 Enable two previously failing tests that pass now
This is just the result of rerunning "make check-failing".
2021-11-30 02:29:31 +01:00
Vadim Zeitlin
579c343d5f Represent enums as enums, not int, if possible
Use enum types instead of int for the enum-valued parameters and
function return values, this is more type-safe and clear for the users
of the library.

Change cpp_enum unit test to use C++ to check that C++ enum wrappers
can at least be compiled, but still use C API in it.

Note that enum whose underlying type is bigger than int still don't
work, but this is no different from what it was before, so just document
this limitation but don't do anything else about it for now.

This commit is best viewed ignoring whitespace-only changes.
2021-11-30 02:22:25 +01:00
Vadim Zeitlin
815c7c0361 Don't call getEnumName() with NULL node
No real changes, just a tiny refactoring in preparation for the upcoming
changes.

This commit is best viewed ignoring whitespace-only changes.
2021-11-30 01:57:59 +01:00
Vadim Zeitlin
06c651431c Fix enum names for renamed typedefs
Also use sym:name even for typedefs for enums themselves, as they can
%renamed as well.

Note that this means that "tdname" itself should probably be never used
at all at this level, but it's still used for structs in C mode, which
is almost certainly wrong.
2021-11-30 01:43:22 +01:00
Vadim Zeitlin
1c06a43e35 Do use sym:name for the enum names themselves
Ever since fb4d70027 (Represent enums as themselves in generated code,
2016-04-14) the code used "name" attribute for the enums themselves
instead of "sym:name". The reason for this was documented in the comment
added in f4ee8e536 (Fix names of enums and their elements, 2021-11-04),
but this explanation was only half-correct: although we indeed shouldn't
use sym:name for typedefs, we should use it for the enums themselves, as
otherwise renaming them didn't work and enums were generated in the
wrappers with the wrong names.

Fix this by using sym:name for non typedef'd enums.
2021-11-30 00:17:27 +01:00