What is the relationship between the Perl API macros MULTIPLICITY
and PERL_IMPLICIT_CONTEXT
?
According to perlguts
:
One macro controls the major Perl build flavor:
MULTIPLICITY
. TheMULTIPLICITY
build has a C structure that packages all the interpreter state. With multiplicity-enabled perls,PERL_IMPLICIT_CONTEXT
is also normally defined, and enables the support for passing in a "hidden" first argument that represents all three data structures.
(by the way, which "three data structures" are referred to here?)
I have noticed that when I build perl with usethreads
:
./Configure -des -Dusethreads
the macros PERL_IMPLICIT_CONTEXT
and MULTIPLICITY
will both be set (defined).
Also, in embedvar.h
there is a comment that may be relevant:
The following combinations of
MULTIPLICITY
andPERL_IMPLICIT_CONTEXT
are supported:
1) none
2) MULTIPLICITY # supported for compatibility
3) MULTIPLICITY && PERL_IMPLICIT_CONTEXTAll other combinations of these flags are errors.
only #3 is supported directly, while #2 is a special case of #3 (supported by redefining vTHX appropriately).
So, when writing XS code is there any difference in writing
#ifdef MULTIPLICITY
versus writing#ifdef PERL_IMPLICIT_CONTEXT
?What is the history behind the two variables? It seems like they today could be reduced to a single. For example, what would happen if all occurences of
MULTIPLICITY
was replaced withPERL_IMPLICIT_CONTEXT
in the perl source? What would it break?
Here is what I have found so far. Running
sh Configure -des
creates the headerconfig.h
. This header file will:define
USE_ITHREADS
if and only ifConfigure
was given the flag-Dusethreads
, e.g.:define
MULTIPLICITY
if and only ifConfigure
was given the flag-Dusemultiplicity
:Setting
MULTIPLICITY
throughccflags
will not setMULTIPLICITY
inconfig.h
, e.g.:Configure
has no-D
flag forPERL_IMPLICIT_CONTEXT
, and defining it throughccflags
will not define it inconfig.h
.The generated
config.h
header is#include
d byperl.h
. Note, that the latter header is also usually included by Perl XS extension files (.xs
-files). At line 59 inperl.h
we have:This means that:
if
-Dusethreads
is given,USE_ITHREADS
,MULTIPLICITY
, andPERL_IMPLICIT_CONTEXT
will all be defined.if
-Dusemultiplicity
is given,MULTIPLICITY
andPERL_IMPLICIT_CONTEXT
will be defined, whereasUSE_ITHREADS
will be undefined.if none of
-Dusethreads
or-Dusemultiplicity
is givenUSE_ITHREADS
,MULTIPLICITY
, andPERL_IMPLICIT_CONTEXT
will all be undefined.it is not possible to have
MULTIPLICITY
defined andPERL_IMPLICIT_CONTEXT
undefined (unless one usesccflags
, but then this will only be during the perl build. XS extension modules that includeperl.h
will not see this)So extension modules can usually assume that either:
MULTIPLICITY
andPERL_IMPLICIT_CONTEXT
are both defined, orMULTIPLICITY
andPERL_IMPLICIT_CONTEXT
are both undefined.