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
- A method returning a scalar containing definitions needed, typically for a
C header file.
- memEQ_clause
args_hashref
- A method to return a suitable C "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).
- dump_names
arg_hashref, ITEM...
- An internal function to generate the embedded perl code that will
regenerate the constant subroutines. default_type, types and
ITEMs are the same as for C_constant. indent is treated as
number of spaces to indent by. If
"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.
- assign arg_hashref,
VALUE...
- A method to return a suitable assignment clause. If type is
aggregate (eg PVN expects both pointer and length) then there
should be multiple VALUEs for the components. pre and
post if defined give snippets of C code to proceed and follow the
assignment. pre will be at the start of a block, so variables may
be defined in it.
- return_clause
arg_hashref, ITEM
- A method to return a suitable "#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
arg_hashref, NAMELEN, ITEMHASH, ITEM...
- An internal method to generate a suitable
"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).
- params WHAT
- An "internal" method, subject to change, currently called to
allow an overriding class to cache information that will then be passed
into all the "*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
- dogfood arg_hashref,
ITEM...
- An internal function to generate the embedded perl code that will
regenerate the constant subroutines. Parameters are the same as for
C_constant.
Currently the base class does nothing and returns an empty
string.
- normalise_items
args, default_type, seen_types, seen_items, ITEM...
- Convert the items to a normalised form. For 8 bit and Unicode values
converts the item to an array of 1 or 2 items, both 8 bit and UTF-8
encoded.
- C_constant
arg_hashref, ITEM...
- A function that returns a list of C subroutine definitions that
return the value and type of constants when passed the name by the XS
wrapper. ITEM... gives a list of constant names. Each can either be
a string, which is taken as a C macro name, or a reference to a hash with
the following keys
- name
- The name of the constant, as seen by the perl code.
- type
- The type of the constant (IV, NV etc)
- value
- A C expression for the value of the constant, or a list of C expressions
if the type is aggregate. This defaults to the name if not
given.
- macro
- The C pre-processor macro to use in the
"#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.
- default
- Default value to use (instead of
"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).
- pre
- C code to use before the assignment of the value of the constant. This
allows you to use temporary variables to extract a value from part of a
"struct" and return this as
value. This C code is places at the start of a block, so you can
declare variables in it.
- post
- C code to place between the assignment of value (to a temporary) and the
return from the function. This allows you to clear up anything in
pre. Rarely needed.
- def_pre
- def_post
- Equivalents of pre and post for the default value.
- utf8
- Generated internally. Is zero or undefined if name is 7 bit ASCII,
"no" if the name is 8 bit (and so should only match if
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.
- weight
- Optional sorting weight for names, to determine the order of linear
testing when multiple names fall in the same case of a switch clause.
Higher comes earlier, undefined defaults to zero.
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