ExtUtils::Constant::Base - base class for ExtUtils::Constant objects |
ExtUtils::Constant::Base - base class for ExtUtils::Constant objects
require ExtUtils::Constant::Base; @ISA = 'ExtUtils::Constant::Base';
ExtUtils::Constant::Base provides a base implementation of methods to
generate C code to give fast constant value lookup by named string. Currently
it's mostly used ExtUtils::Constant::XS, which generates the lookup code
for the constant()
subroutine found in many XS modules.
ExtUtils::Constant::Base exports no subroutines. The following methods are available
if
statement to check whether name
is equal to the C variable name
. If checked_at is defined, then it
is used to avoid memEQ
for short names, or to generate a comment to
highlight the position of the character in the switch
statement.
If i<checked_at> is a reference to a scalar, then instead it gives the characters pre-checked at the beginning, (and the number of chars by which the C variable name has been advanced. These need to be chopped from the front of name).
declare_types
is true a $types
is always declared in the perl
code generated, if defined and false never declared, and if undefined $types
is only declared if the values in types as passed in cannot be inferred from
default_types and the ITEMs.
#ifdef
clause. ITEM is a hashref
(as passed to C_constant
and match_clause
. indent is the number
of spaces to indent, defaulting to 6.
switch
clause, called by
C_constant
ITEMs are in the hash ref format as given in the description
of C_constant
, and must all have the names of the same length, given by
NAMELEN. ITEMHASH is a reference to a hash, keyed by name, values being
the hashrefs in the ITEM list. (No parameters are modified, and there can
be keys in the ITEMHASH that are not in the list of ITEMs without
causing problems - the hash is passed in to save generating it afresh for
each call).
*param*
calls. (Yes, having to read the source to make sense of this is
considered a known bug). WHAT is be a hashref of types the constant
function will return. In ExtUtils::Constant::XS this method is used to
returns a hashref keyed IV NV PV SV to show which combination of pointers will
be needed in the C argument list generated by
C_constant_other_params_definition and C_constant_other_params
Currently the base class does nothing and returns an empty string.
#ifdef
. This defaults to the
name, and is mainly used if value is an enum
. If a reference an
array is passed then the first element is used in place of the #ifdef
line, and the second element in place of the #endif
. This allows
pre-processor constructions such as
#if defined (foo) #if !defined (bar) ... #endif #endif
to be used to determine if a constant is to be defined.
A ``macro'' 1 signals that the constant is always defined, so the #if
/#endif
test is omitted.
croak
ing with ``your vendor has not
defined...'') to return if the macro isn't defined. Specify a reference to
an array with type followed by value(s).
struct
and return this as value. This C code is places at the start of a block,
so you can declare variables in it.
SvUTF8()
is false),
``yes'' if the name is utf8 encoded.
The internals automatically clone any name with characters 128-255 but none 256+ (ie one that could be either in bytes or utf8) into a second entry which is utf8 encoded.
In the argument hashref, package is the name of the package, and is only
used in comments inside the generated C code. subname defaults to
constant
if undefined.
default_type is the type returned by ITEM
s that don't specify their
type. It defaults to the value of default_type()
. types should be given
either as a comma separated list of types that the C subroutine subname
will generate or as a reference to a hash. default_type will be added to
the list if not present, as will any types given in the list of ITEMs. The
resultant list should be the same list of types that XS_constant
is
given. [Otherwise XS_constant
and C_constant
may differ in the number of
parameters to the constant function. indent is currently unused and
ignored. In future it may be used to pass in information used to change the C
indentation style used.] The best way to maintain consistency is to pass in a
hash reference and let this function update it.
breakout governs when child functions of subname are generated. If there
are breakout or more ITEMs with the same length of name, then the code
to switch between them is placed into a function named subname_len, for
example constant_5
for names 5 characters long. The default breakout is
3. A single ITEM
is always inlined.
Not everything is documented yet.
Probably others.
Nicholas Clark <nick@ccl4.org> based on the code in h2xs
by Larry Wall and
others
ExtUtils::Constant::Base - base class for ExtUtils::Constant objects |