Cari di Perl 
    Perl User Manual
Daftar Isi
(Sebelumnya) Internal replacements for stan ...Perl calling conventions from C (Berikutnya)
Internals and C language interface

Introduction to the Perl API

Daftar Isi

NAME

perlguts - Introduction to the Perl API

DESCRIPTION

This document attempts to describe how to use the Perl API, as well asto provide some info on the basic workings of the Perl core. It is farfrom complete and probably contains many errors. Please refer anyquestions or comments to the author below.

Variables

Datatypes

Perl has three typedefs that handle Perl's three main data types:

  1. SV Scalar Value
  2. AV Array Value
  3. HV Hash Value

Each typedef has specific routines that manipulate the various data types.

What is an "IV"?

Perl uses a special typedef IV which is a simple signed integer type that isguaranteed to be large enough to hold a pointer (as well as an integer).Additionally, there is the UV, which is simply an unsigned IV.

Perl also uses two special typedefs, I32 and I16, which will always be atleast 32-bits and 16-bits long, respectively. (Again, there are U32 and U16,as well.) They will usually be exactly 32 and 16 bits long, but on Craysthey will both be 64 bits.

Working with SVs

An SV can be created and loaded with one command. There are five types ofvalues that can be loaded: an integer value (IV), an unsigned integervalue (UV), a double (NV), a string (PV), and another scalar (SV).

The seven routines are:

  1. SV* newSViv(IV);
  2. SV* newSVuv(UV);
  3. SV* newSVnv(double);
  4. SV* newSVpv(const char*, STRLEN);
  5. SV* newSVpvn(const char*, STRLEN);
  6. SV* newSVpvf(const char*, ...);
  7. SV* newSVsv(SV*);

STRLEN is an integer type (Size_t, usually defined as size_t inconfig.h) guaranteed to be large enough to represent the size ofany string that perl can handle.

In the unlikely case of a SV requiring more complex initialisation, youcan create an empty SV with newSV(len). If len is 0 an empty SV oftype NULL is returned, else an SV of type PV is returned with len + 1 (forthe NUL) bytes of storage allocated, accessible via SvPVX. In both casesthe SV has the undef value.

  1. SV *sv = newSV(0); /* no storage allocated */
  2. SV *sv = newSV(10); /* 10 (+1) bytes of uninitialised storage
  3. * allocated */

To change the value of an already-existing SV, there are eight routines:

  1. void sv_setiv(SV*, IV);
  2. void sv_setuv(SV*, UV);
  3. void sv_setnv(SV*, double);
  4. void sv_setpv(SV*, const char*);
  5. void sv_setpvn(SV*, const char*, STRLEN)
  6. void sv_setpvf(SV*, const char*, ...);
  7. void sv_vsetpvfn(SV*, const char*, STRLEN, va_list *,
  8. SV **, I32, bool *);
  9. void sv_setsv(SV*, SV*);

Notice that you can choose to specify the length of the string to beassigned by using sv_setpvn, newSVpvn, or newSVpv, or you mayallow Perl to calculate the length by using sv_setpv or by specifying0 as the second argument to newSVpv. Be warned, though, that Perl willdetermine the string's length by using strlen, which depends on thestring terminating with a NUL character, and not otherwise containingNULs.

The arguments of sv_setpvf are processed like sprintf, and theformatted output becomes the value.

sv_vsetpvfn is an analogue of vsprintf, but it allows you to specifyeither a pointer to a variable argument list or the address and length ofan array of SVs. The last argument points to a boolean; on return, if thatboolean is true, then locale-specific information has been used to formatthe string, and the string's contents are therefore untrustworthy (seeperlsec). This pointer may be NULL if that information is notimportant. Note that this function requires you to specify the length ofthe format.

The sv_set*() functions are not generic enough to operate on valuesthat have "magic". See Magic Virtual Tables later in this document.

All SVs that contain strings should be terminated with a NUL character.If it is not NUL-terminated there is a risk ofcore dumps and corruptions from code which passes the string to Cfunctions or system calls which expect a NUL-terminated string.Perl's own functions typically add a trailing NUL for this reason.Nevertheless, you should be very careful when you pass a string storedin an SV to a C function or system call.

To access the actual value that an SV points to, you can use the macros:

  1. SvIV(SV*)
  2. SvUV(SV*)
  3. SvNV(SV*)
  4. SvPV(SV*, STRLEN len)
  5. SvPV_nolen(SV*)

which will automatically coerce the actual scalar type into an IV, UV, double,or string.

In the SvPV macro, the length of the string returned is placed into thevariable len (this is a macro, so you do not use &len). If you donot care what the length of the data is, use the SvPV_nolen macro.Historically the SvPV macro with the global variable PL_na has beenused in this case. But that can be quite inefficient because PL_na mustbe accessed in thread-local storage in threaded Perl. In any case, rememberthat Perl allows arbitrary strings of data that may both contain NULs andmight not be terminated by a NUL.

Also remember that C doesn't allow you to safely say foo(SvPV(s, len),len);. It might work with your compiler, but it won't work for everyone.Break this sort of statement up into separate assignments:

  1. SV *s;
  2. STRLEN len;
  3. char *ptr;
  4. ptr = SvPV(s, len);
  5. foo(ptr, len);

If you want to know if the scalar value is TRUE, you can use:

  1. SvTRUE(SV*)

Although Perl will automatically grow strings for you, if you need to forcePerl to allocate more memory for your SV, you can use the macro

  1. SvGROW(SV*, STRLEN newlen)

which will determine if more memory needs to be allocated. If so, it willcall the function sv_grow. Note that SvGROW can only increase, notdecrease, the allocated memory of an SV and that it does not automaticallyadd space for the trailing NUL byte (perl's own string functions typically doSvGROW(sv, len + 1)).

If you have an SV and want to know what kind of data Perl thinks is storedin it, you can use the following macros to check the type of SV you have.

  1. SvIOK(SV*)
  2. SvNOK(SV*)
  3. SvPOK(SV*)

You can get and set the current length of the string stored in an SV withthe following macros:

  1. SvCUR(SV*)
  2. SvCUR_set(SV*, I32 val)

You can also get a pointer to the end of the string stored in the SVwith the macro:

  1. SvEND(SV*)

But note that these last three macros are valid only if SvPOK() is true.

If you want to append something to the end of string stored in an SV*,you can use the following functions:

  1. void sv_catpv(SV*, const char*);
  2. void sv_catpvn(SV*, const char*, STRLEN);
  3. void sv_catpvf(SV*, const char*, ...);
  4. void sv_vcatpvfn(SV*, const char*, STRLEN, va_list *, SV **,
  5. I32, bool);
  6. void sv_catsv(SV*, SV*);

The first function calculates the length of the string to be appended byusing strlen. In the second, you specify the length of the stringyourself. The third function processes its arguments like sprintf andappends the formatted output. The fourth function works like vsprintf.You can specify the address and length of an array of SVs instead of theva_list argument. The fifth function extends the string stored in the firstSV with the string stored in the second SV. It also forces the second SVto be interpreted as a string.

The sv_cat*() functions are not generic enough to operate on values thathave "magic". See Magic Virtual Tables later in this document.

If you know the name of a scalar variable, you can get a pointer to its SVby using the following:

  1. SV* get_sv("package::varname", 0);

This returns NULL if the variable does not exist.

If you want to know if this variable (or any other SV) is actually defined,you can call:

  1. SvOK(SV*)

The scalar undef value is stored in an SV instance called PL_sv_undef.

Its address can be used whenever an SV* is needed. Make sure thatyou don't try to compare a random sv with &PL_sv_undef. For examplewhen interfacing Perl code, it'll work correctly for:

  1. foo(undef);

But won't work when called as:

  1. $x = undef;
  2. foo($x);

So to repeat always use SvOK() to check whether an sv is defined.

Also you have to be careful when using &PL_sv_undef as a value inAVs or HVs (see AVs, HVs and undefined values).

There are also the two values PL_sv_yes and PL_sv_no, which containboolean TRUE and FALSE values, respectively. Like PL_sv_undef, theiraddresses can be used whenever an SV* is needed.

Do not be fooled into thinking that (SV *) 0 is the same as &PL_sv_undef.Take this code:

  1. SV* sv = (SV*) 0;
  2. if (I-am-to-return-a-real-value) {
  3. sv = sv_2mortal(newSViv(42));
  4. }
  5. sv_setsv(ST(0), sv);

This code tries to return a new SV (which contains the value 42) if it shouldreturn a real value, or undef otherwise. Instead it has returned a NULLpointer which, somewhere down the line, will cause a segmentation violation,bus error, or just weird results. Change the zero to &PL_sv_undef in thefirst line and all will be well.

To free an SV that you've created, call SvREFCNT_dec(SV*). Normally thiscall is not necessary (see Reference Counts and Mortality).

Offsets

Perl provides the function sv_chop to efficiently remove charactersfrom the beginning of a string; you give it an SV and a pointer tosomewhere inside the PV, and it discards everything before thepointer. The efficiency comes by means of a little hack: instead ofactually removing the characters, sv_chop sets the flag OOK(offset OK) to signal to other functions that the offset hack is ineffect, and it puts the number of bytes chopped off into the IV fieldof the SV. It then moves the PV pointer (called SvPVX) forward thatmany bytes, and adjusts SvCUR and SvLEN.

Hence, at this point, the start of the buffer that we allocated livesat SvPVX(sv) - SvIV(sv) in memory and the PV pointer is pointinginto the middle of this allocated storage.

This is best demonstrated by example:

  1. % ./perl -Ilib -MDevel::Peek -le '$a="12345"; $a=~s/.//; Dump($a)'
  2. SV = PVIV(0x8128450) at 0x81340f0
  3. REFCNT = 1
  4. FLAGS = (POK,OOK,pPOK)
  5. IV = 1 (OFFSET)
  6. PV = 0x8135781 ( "1" . ) "2345"\0
  7. CUR = 4
  8. LEN = 5

Here the number of bytes chopped off (1) is put into IV, andDevel::Peek::Dump helpfully reminds us that this is an offset. Theportion of the string between the "real" and the "fake" beginnings isshown in parentheses, and the values of SvCUR and SvLEN reflectthe fake beginning, not the real one.

Something similar to the offset hack is performed on AVs to enableefficient shifting and splicing off the beginning of the array; whileAvARRAY points to the first element in the array that is visible fromPerl, AvALLOC points to the real start of the C array. These areusually the same, but a shift operation can be carried out byincreasing AvARRAY by one and decreasing AvFILL and AvMAX.Again, the location of the real start of the C array only comes intoplay when freeing the array. See av_shift in av.c.

What's Really Stored in an SV?

Recall that the usual method of determining the type of scalar you have isto use Sv*OK macros. Because a scalar can be both a number and a string,usually these macros will always return TRUE and calling the Sv*Vmacros will do the appropriate conversion of string to integer/double orinteger/double to string.

If you really need to know if you have an integer, double, or stringpointer in an SV, you can use the following three macros instead:

  1. SvIOKp(SV*)
  2. SvNOKp(SV*)
  3. SvPOKp(SV*)

These will tell you if you truly have an integer, double, or string pointerstored in your SV. The "p" stands for private.

There are various ways in which the private and public flags may differ.For example, a tied SV may have a valid underlying value in the IV slot(so SvIOKp is true), but the data should be accessed via the FETCHroutine rather than directly, so SvIOK is false. Another is whennumeric conversion has occurred and precision has been lost: only theprivate flag is set on 'lossy' values. So when an NV is converted to anIV with loss, SvIOKp, SvNOKp and SvNOK will be set, while SvIOK wont be.

In general, though, it's best to use the Sv*V macros.

Working with AVs

There are two ways to create and load an AV. The first method creates anempty AV:

  1. AV* newAV();

The second method both creates the AV and initially populates it with SVs:

  1. AV* av_make(I32 num, SV **ptr);

The second argument points to an array containing num SV*'s. Once theAV has been created, the SVs can be destroyed, if so desired.

Once the AV has been created, the following operations are possible on it:

  1. void av_push(AV*, SV*);
  2. SV* av_pop(AV*);
  3. SV* av_shift(AV*);
  4. void av_unshift(AV*, I32 num);

These should be familiar operations, with the exception of av_unshift.This routine adds num elements at the front of the array with the undefvalue. You must then use av_store (described below) to assign valuesto these new elements.

Here are some other functions:

  1. I32 av_len(AV*);
  2. SV** av_fetch(AV*, I32 key, I32 lval);
  3. SV** av_store(AV*, I32 key, SV* val);

The av_len function returns the highest index value in an array (justlike $#array in Perl). If the array is empty, -1 is returned. Theav_fetch function returns the value at index key, but if lvalis non-zero, then av_fetch will store an undef value at that index.The av_store function stores the value val at index key, and doesnot increment the reference count of val. Thus the caller is responsiblefor taking care of that, and if av_store returns NULL, the caller willhave to decrement the reference count to avoid a memory leak. Note thatav_fetch and av_store both return SV**'s, not SV*'s as theirreturn value.

A few more:

  1. void av_clear(AV*);
  2. void av_undef(AV*);
  3. void av_extend(AV*, I32 key);

The av_clear function deletes all the elements in the AV* array, butdoes not actually delete the array itself. The av_undef function willdelete all the elements in the array plus the array itself. Theav_extend function extends the array so that it contains at least key+1elements. If key+1 is less than the currently allocated length of the array,then nothing is done.

If you know the name of an array variable, you can get a pointer to its AVby using the following:

  1. AV* get_av("package::varname", 0);

This returns NULL if the variable does not exist.

See Understanding the Magic of Tied Hashes and Arrays for moreinformation on how to use the array access functions on tied arrays.

Working with HVs

To create an HV, you use the following routine:

  1. HV* newHV();

Once the HV has been created, the following operations are possible on it:

  1. SV** hv_store(HV*, const char* key, U32 klen, SV* val, U32 hash);
  2. SV** hv_fetch(HV*, const char* key, U32 klen, I32 lval);

The klen parameter is the length of the key being passed in (Note thatyou cannot pass 0 in as a value of klen to tell Perl to measure thelength of the key). The val argument contains the SV pointer to thescalar being stored, and hash is the precomputed hash value (zero ifyou want hv_store to calculate it for you). The lval parameterindicates whether this fetch is actually a part of a store operation, inwhich case a new undefined value will be added to the HV with the suppliedkey and hv_fetch will return as if the value had already existed.

Remember that hv_store and hv_fetch return SV**'s and not justSV*. To access the scalar value, you must first dereference the returnvalue. However, you should check to make sure that the return value isnot NULL before dereferencing it.

The first of these two functions checks if a hash table entry exists, and the second deletes it.

  1. bool hv_exists(HV*, const char* key, U32 klen);
  2. SV* hv_delete(HV*, const char* key, U32 klen, I32 flags);

If flags does not include the G_DISCARD flag then hv_delete willcreate and return a mortal copy of the deleted value.

And more miscellaneous functions:

  1. void hv_clear(HV*);
  2. void hv_undef(HV*);

Like their AV counterparts, hv_clear deletes all the entries in the hashtable but does not actually delete the hash table. The hv_undef deletesboth the entries and the hash table itself.

Perl keeps the actual data in a linked list of structures with a typedef of HE.These contain the actual key and value pointers (plus extra administrativeoverhead). The key is a string pointer; the value is an SV*. However,once you have an HE*, to get the actual key and value, use the routinesspecified below.

  1. I32 hv_iterinit(HV*);
  2. /* Prepares starting point to traverse hash table */
  3. HE* hv_iternext(HV*);
  4. /* Get the next entry, and return a pointer to a
  5. structure that has both the key and value */
  6. char* hv_iterkey(HE* entry, I32* retlen);
  7. /* Get the key from an HE structure and also return
  8. the length of the key string */
  9. SV* hv_iterval(HV*, HE* entry);
  10. /* Return an SV pointer to the value of the HE
  11. structure */
  12. SV* hv_iternextsv(HV*, char** key, I32* retlen);
  13. /* This convenience routine combines hv_iternext,
  14. hv_iterkey, and hv_iterval. The key and retlen
  15. arguments are return values for the key and its
  16. length. The value is returned in the SV* argument */

If you know the name of a hash variable, you can get a pointer to its HVby using the following:

  1. HV* get_hv("package::varname", 0);

This returns NULL if the variable does not exist.

The hash algorithm is defined in the PERL_HASH(hash, key, klen) macro:

  1. hash = 0;
  2. while (klen--)
  3. hash = (hash * 33) + *key++;
  4. hash = hash + (hash >> 5);/* after 5.6 */

The last step was added in version 5.6 to improve distribution oflower bits in the resulting hash value.

See Understanding the Magic of Tied Hashes and Arrays for moreinformation on how to use the hash access functions on tied hashes.

Hash API Extensions

Beginning with version 5.004, the following functions are also supported:

  1. HE* hv_fetch_ent (HV* tb, SV* key, I32 lval, U32 hash);
  2. HE* hv_store_ent (HV* tb, SV* key, SV* val, U32 hash);
  3. bool hv_exists_ent (HV* tb, SV* key, U32 hash);
  4. SV* hv_delete_ent (HV* tb, SV* key, I32 flags, U32 hash);
  5. SV* hv_iterkeysv (HE* entry);

Note that these functions take SV* keys, which simplifies writingof extension code that deals with hash structures. These functionsalso allow passing of SV* keys to tie functions without forcingyou to stringify the keys (unlike the previous set of functions).

They also return and accept whole hash entries (HE*), making theiruse more efficient (since the hash number for a particular stringdoesn't have to be recomputed every time). See perlapi for detaileddescriptions.

The following macros must always be used to access the contents of hashentries. Note that the arguments to these macros must be simplevariables, since they may get evaluated more than once. Seeperlapi for detailed descriptions of these macros.

  1. HePV(HE* he, STRLEN len)
  2. HeVAL(HE* he)
  3. HeHASH(HE* he)
  4. HeSVKEY(HE* he)
  5. HeSVKEY_force(HE* he)
  6. HeSVKEY_set(HE* he, SV* sv)

These two lower level macros are defined, but must only be used whendealing with keys that are not SV*s:

  1. HeKEY(HE* he)
  2. HeKLEN(HE* he)

Note that both hv_store and hv_store_ent do not increment thereference count of the stored val, which is the caller's responsibility.If these functions return a NULL value, the caller will usually have todecrement the reference count of val to avoid a memory leak.

AVs, HVs and undefined values

Sometimes you have to store undefined values in AVs or HVs. Althoughthis may be a rare case, it can be tricky. That's because you'reused to using &PL_sv_undef if you need an undefined SV.

For example, intuition tells you that this XS code:

  1. AV *av = newAV();
  2. av_store( av, 0, &PL_sv_undef );

is equivalent to this Perl code:

  1. my @av;
  2. $av[0] = undef;

Unfortunately, this isn't true. AVs use &PL_sv_undef as a markerfor indicating that an array element has not yet been initialized.Thus, exists $av[0] would be true for the above Perl code, butfalse for the array generated by the XS code.

Other problems can occur when storing &PL_sv_undef in HVs:

  1. hv_store( hv, "key", 3, &PL_sv_undef, 0 );

This will indeed make the value undef, but if you try to modifythe value of key, you'll get the following error:

  1. Modification of non-creatable hash value attempted

In perl 5.8.0, &PL_sv_undef was also used to mark placeholdersin restricted hashes. This caused such hash entries not to appearwhen iterating over the hash or when checking for the keyswith the hv_exists function.

You can run into similar problems when you store &PL_sv_yes or&PL_sv_no into AVs or HVs. Trying to modify such elementswill give you the following error:

  1. Modification of a read-only value attempted

To make a long story short, you can use the special variables&PL_sv_undef, &PL_sv_yes and &PL_sv_no with AVs andHVs, but you have to make sure you know what you're doing.

Generally, if you want to store an undefined value in an AVor HV, you should not use &PL_sv_undef, but rather create anew undefined value using the newSV function, for example:

  1. av_store( av, 42, newSV(0) );
  2. hv_store( hv, "foo", 3, newSV(0), 0 );

References

References are a special type of scalar that point to other data types(including other references).

To create a reference, use either of the following functions:

  1. SV* newRV_inc((SV*) thing);
  2. SV* newRV_noinc((SV*) thing);

The thing argument can be any of an SV*, AV*, or HV*. Thefunctions are identical except that newRV_inc increments the referencecount of the thing, while newRV_noinc does not. For historicalreasons, newRV is a synonym for newRV_inc.

Once you have a reference, you can use the following macro to dereferencethe reference:

  1. SvRV(SV*)

then call the appropriate routines, casting the returned SV* to either anAV* or HV*, if required.

To determine if an SV is a reference, you can use the following macro:

  1. SvROK(SV*)

To discover what type of value the reference refers to, use the followingmacro and then check the return value.

  1. SvTYPE(SvRV(SV*))

The most useful types that will be returned are:

  1. SVt_IV Scalar
  2. SVt_NV Scalar
  3. SVt_PV Scalar
  4. SVt_RV Scalar
  5. SVt_PVAV Array
  6. SVt_PVHV Hash
  7. SVt_PVCV Code
  8. SVt_PVGV Glob (possibly a file handle)
  9. SVt_PVMG Blessed or Magical Scalar

See the sv.h header file for more details.

Blessed References and Class Objects

References are also used to support object-oriented programming. In perl'sOO lexicon, an object is simply a reference that has been blessed into apackage (or class). Once blessed, the programmer may now use the referenceto access the various methods in the class.

A reference can be blessed into a package with the following function:

  1. SV* sv_bless(SV* sv, HV* stash);

The sv argument must be a reference value. The stash argumentspecifies which class the reference will belong to. SeeStashes and Globs for information on converting class names into stashes.

/* Still under construction */

The following function upgrades rv to reference if not already one.Creates a new SV for rv to point to. If classname is non-null, the SVis blessed into the specified class. SV is returned.

  1. SV* newSVrv(SV* rv, const char* classname);

The following three functions copy integer, unsigned integer or doubleinto an SV whose reference is rv. SV is blessed if classname isnon-null.

  1. SV* sv_setref_iv(SV* rv, const char* classname, IV iv);
  2. SV* sv_setref_uv(SV* rv, const char* classname, UV uv);
  3. SV* sv_setref_nv(SV* rv, const char* classname, NV iv);

The following function copies the pointer value (the address, not thestring!) into an SV whose reference is rv. SV is blessed if classnameis non-null.

  1. SV* sv_setref_pv(SV* rv, const char* classname, void* pv);

The following function copies a string into an SV whose reference is rv.Set length to 0 to let Perl calculate the string length. SV is blessed ifclassname is non-null.

  1. SV* sv_setref_pvn(SV* rv, const char* classname, char* pv,
  2. STRLEN length);

The following function tests whether the SV is blessed into the specifiedclass. It does not check inheritance relationships.

  1. int sv_isa(SV* sv, const char* name);

The following function tests whether the SV is a reference to a blessed object.

  1. int sv_isobject(SV* sv);

The following function tests whether the SV is derived from the specifiedclass. SV can be either a reference to a blessed object or a stringcontaining a class name. This is the function implementing theUNIVERSAL::isa functionality.

  1. bool sv_derived_from(SV* sv, const char* name);

To check if you've got an object derived from a specific class you haveto write:

  1. if (sv_isobject(sv) && sv_derived_from(sv, class)) { ... }

Creating New Variables

To create a new Perl variable with an undef value which can be accessed fromyour Perl script, use the following routines, depending on the variable type.

  1. SV* get_sv("package::varname", GV_ADD);
  2. AV* get_av("package::varname", GV_ADD);
  3. HV* get_hv("package::varname", GV_ADD);

Notice the use of GV_ADD as the second parameter. The new variable can nowbe set, using the routines appropriate to the data type.

There are additional macros whose values may be bitwise OR'ed with theGV_ADD argument to enable certain extra features. Those bits are:

  • GV_ADDMULTI

    Marks the variable as multiply defined, thus preventing the:

    1. Name <varname> used only once: possible typo

    warning.

  • GV_ADDWARN

    Issues the warning:

    1. Had to create <varname> unexpectedly

    if the variable did not exist before the function was called.

If you do not specify a package name, the variable is created in the currentpackage.

Reference Counts and Mortality

Perl uses a reference count-driven garbage collection mechanism. SVs,AVs, or HVs (xV for short in the following) start their life with areference count of 1. If the reference count of an xV ever drops to 0,then it will be destroyed and its memory made available for reuse.

This normally doesn't happen at the Perl level unless a variable isundef'ed or the last variable holding a reference to it is changed oroverwritten. At the internal level, however, reference counts can bemanipulated with the following macros:

  1. int SvREFCNT(SV* sv);
  2. SV* SvREFCNT_inc(SV* sv);
  3. void SvREFCNT_dec(SV* sv);

However, there is one other function which manipulates the referencecount of its argument. The newRV_inc function, you will recall,creates a reference to the specified argument. As a side effect,it increments the argument's reference count. If this is not whatyou want, use newRV_noinc instead.

For example, imagine you want to return a reference from an XSUB function.Inside the XSUB routine, you create an SV which initially has a referencecount of one. Then you call newRV_inc, passing it the just-created SV.This returns the reference as a new SV, but the reference count of theSV you passed to newRV_inc has been incremented to two. Now youreturn the reference from the XSUB routine and forget about the SV.But Perl hasn't! Whenever the returned reference is destroyed, thereference count of the original SV is decreased to one and nothing happens.The SV will hang around without any way to access it until Perl itselfterminates. This is a memory leak.

The correct procedure, then, is to use newRV_noinc instead ofnewRV_inc. Then, if and when the last reference is destroyed,the reference count of the SV will go to zero and it will be destroyed,stopping any memory leak.

There are some convenience functions available that can help with thedestruction of xVs. These functions introduce the concept of "mortality".An xV that is mortal has had its reference count marked to be decremented,but not actually decremented, until "a short time later". Generally theterm "short time later" means a single Perl statement, such as a call toan XSUB function. The actual determinant for when mortal xVs have theirreference count decremented depends on two macros, SAVETMPS and FREETMPS.See perlcall and perlxs for more details on these macros.

"Mortalization" then is at its simplest a deferred SvREFCNT_dec.However, if you mortalize a variable twice, the reference count willlater be decremented twice.

"Mortal" SVs are mainly used for SVs that are placed on perl's stack.For example an SV which is created just to pass a number to a called subis made mortal to have it cleaned up automatically when it's popped offthe stack. Similarly, results returned by XSUBs (which are pushed on thestack) are often made mortal.

To create a mortal variable, use the functions:

  1. SV* sv_newmortal()
  2. SV* sv_2mortal(SV*)
  3. SV* sv_mortalcopy(SV*)

The first call creates a mortal SV (with no value), the second converts an existingSV to a mortal SV (and thus defers a call to SvREFCNT_dec), and thethird creates a mortal copy of an existing SV.Because sv_newmortal gives the new SV no value, it must normally be given onevia sv_setpv, sv_setiv, etc. :

  1. SV *tmp = sv_newmortal();
  2. sv_setiv(tmp, an_integer);

As that is multiple C statements it is quite common so see this idiom instead:

  1. SV *tmp = sv_2mortal(newSViv(an_integer));

You should be careful about creating mortal variables. Strange thingscan happen if you make the same value mortal within multiple contexts,or if you make a variable mortal multiple times. Thinking of "Mortalization"as deferred SvREFCNT_dec should help to minimize such problems.For example if you are passing an SV which you know has a high enough REFCNTto survive its use on the stack you need not do any mortalization.If you are not sure then doing an SvREFCNT_inc and sv_2mortal, ormaking a sv_mortalcopy is safer.

The mortal routines are not just for SVs; AVs and HVs can bemade mortal by passing their address (type-casted to SV*) to thesv_2mortal or sv_mortalcopy routines.

Stashes and Globs

A stash is a hash that contains all variables that are definedwithin a package. Each key of the stash is a symbolname (shared by all the different types of objects that have the samename), and each value in the hash table is a GV (Glob Value). This GVin turn contains references to the various objects of that name,including (but not limited to) the following:

  1. Scalar Value
  2. Array Value
  3. Hash Value
  4. I/O Handle
  5. Format
  6. Subroutine

There is a single stash called PL_defstash that holds the items that existin the main package. To get at the items in other packages, append thestring "::" to the package name. The items in the Foo package are inthe stash Foo:: in PL_defstash. The items in the Bar::Baz package arein the stash Baz:: in Bar::'s stash.

To get the stash pointer for a particular package, use the function:

  1. HV* gv_stashpv(const char* name, I32 flags)
  2. HV* gv_stashsv(SV*, I32 flags)

The first function takes a literal string, the second uses the string storedin the SV. Remember that a stash is just a hash table, so you get back anHV*. The flags flag will create a new package if it is set to GV_ADD.

The name that gv_stash*v wants is the name of the package whose symbol tableyou want. The default package is called main. If you have multiply nestedpackages, pass their names to gv_stash*v, separated by :: as in the Perllanguage itself.

Alternately, if you have an SV that is a blessed reference, you can findout the stash pointer by using:

  1. HV* SvSTASH(SvRV(SV*));

then use the following to get the package name itself:

  1. char* HvNAME(HV* stash);

If you need to bless or re-bless an object you can use the followingfunction:

  1. SV* sv_bless(SV*, HV* stash)

where the first argument, an SV*, must be a reference, and the secondargument is a stash. The returned SV* can now be used in the same wayas any other SV.

For more information on references and blessings, consult perlref.

Double-Typed SVs

Scalar variables normally contain only one type of value, an integer,double, pointer, or reference. Perl will automatically convert theactual scalar data from the stored type into the requested type.

Some scalar variables contain more than one type of scalar data. Forexample, the variable $! contains either the numeric value of errnoor its string equivalent from either strerror or sys_errlist[].

To force multiple data values into an SV, you must do two things: use thesv_set*v routines to add the additional scalar type, then set a flagso that Perl will believe it contains more than one type of data. Thefour macros to set the flags are:

  1. SvIOK_on
  2. SvNOK_on
  3. SvPOK_on
  4. SvROK_on

The particular macro you must use depends on which sv_set*v routineyou called first. This is because every sv_set*v routine turns ononly the bit for the particular type of data being set, and turns offall the rest.

For example, to create a new Perl variable called "dberror" that containsboth the numeric and descriptive string error values, you could use thefollowing code:

  1. extern int dberror;
  2. extern char *dberror_list;
  3. SV* sv = get_sv("dberror", GV_ADD);
  4. sv_setiv(sv, (IV) dberror);
  5. sv_setpv(sv, dberror_list[dberror]);
  6. SvIOK_on(sv);

If the order of sv_setiv and sv_setpv had been reversed, then themacro SvPOK_on would need to be called instead of SvIOK_on.

Magic Variables

[This section still under construction. Ignore everything here. Post nobills. Everything not permitted is forbidden.]

Any SV may be magical, that is, it has special features that a normalSV does not have. These features are stored in the SV structure in alinked list of struct magic's, typedef'ed to MAGIC.

  1. struct magic {
  2. MAGIC* mg_moremagic;
  3. MGVTBL* mg_virtual;
  4. U16 mg_private;
  5. char mg_type;
  6. U8 mg_flags;
  7. I32 mg_len;
  8. SV* mg_obj;
  9. char* mg_ptr;
  10. };

Note this is current as of patchlevel 0, and could change at any time.

Assigning Magic

Perl adds magic to an SV using the sv_magic function:

  1. void sv_magic(SV* sv, SV* obj, int how, const char* name, I32 namlen);

The sv argument is a pointer to the SV that is to acquire a new magicalfeature.

If sv is not already magical, Perl uses the SvUPGRADE macro toconvert sv to type SVt_PVMG. Perl then continues by adding new magicto the beginning of the linked list of magical features. Any prior entryof the same type of magic is deleted. Note that this can be overridden,and multiple instances of the same type of magic can be associated with anSV.

The name and namlen arguments are used to associate a string withthe magic, typically the name of a variable. namlen is stored in themg_len field and if name is non-null then either a savepvn copy ofname or name itself is stored in the mg_ptr field, depending onwhether namlen is greater than zero or equal to zero respectively. As aspecial case, if (name && namlen == HEf_SVKEY) then name is assumedto contain an SV* and is stored as-is with its REFCNT incremented.

The sv_magic function uses how to determine which, if any, predefined"Magic Virtual Table" should be assigned to the mg_virtual field.See the Magic Virtual Tables section below. The how argument is alsostored in the mg_type field. The value of how should be chosenfrom the set of macros PERL_MAGIC_foo found in perl.h. Note that beforethese macros were added, Perl internals used to directly use characterliterals, so you may occasionally come across old code or documentationreferring to 'U' magic rather than PERL_MAGIC_uvar for example.

The obj argument is stored in the mg_obj field of the MAGICstructure. If it is not the same as the sv argument, the referencecount of the obj object is incremented. If it is the same, or ifthe how argument is PERL_MAGIC_arylen, or if it is a NULL pointer,then obj is merely stored, without the reference count being incremented.

See also sv_magicext in perlapi for a more flexible way to add magicto an SV.

There is also a function to add magic to an HV:

  1. void hv_magic(HV *hv, GV *gv, int how);

This simply calls sv_magic and coerces the gv argument into an SV.

To remove the magic from an SV, call the function sv_unmagic:

  1. int sv_unmagic(SV *sv, int type);

The type argument should be equal to the how value when the SVwas initially made magical.

However, note that sv_unmagic removes all magic of a certain type from theSV. If you want to remove only certain magic of a type based on the magicvirtual table, use sv_unmagicext instead:

  1. int sv_unmagicext(SV *sv, int type, MGVTBL *vtbl);

Magic Virtual Tables

The mg_virtual field in the MAGIC structure is a pointer to anMGVTBL, which is a structure of function pointers and stands for"Magic Virtual Table" to handle the various operations that might beapplied to that variable.

The MGVTBL has five (or sometimes eight) pointers to the followingroutine types:

  1. int (*svt_get)(SV* sv, MAGIC* mg);
  2. int (*svt_set)(SV* sv, MAGIC* mg);
  3. U32 (*svt_len)(SV* sv, MAGIC* mg);
  4. int (*svt_clear)(SV* sv, MAGIC* mg);
  5. int (*svt_free)(SV* sv, MAGIC* mg);
  6. int (*svt_copy)(SV *sv, MAGIC* mg, SV *nsv,
  7. const char *name, I32 namlen);
  8. int (*svt_dup)(MAGIC *mg, CLONE_PARAMS *param);
  9. int (*svt_local)(SV *nsv, MAGIC *mg);

This MGVTBL structure is set at compile-time in perl.h and there arecurrently 32 types. These different structures contain pointers to variousroutines that perform additional actions depending on which function isbeing called.

  1. Function pointer Action taken
  2. ---------------- ------------
  3. svt_get Do something before the value of the SV is
  4. retrieved.
  5. svt_set Do something after the SV is assigned a value.
  6. svt_len Report on the SV's length.
  7. svt_clear Clear something the SV represents.
  8. svt_free Free any extra storage associated with the SV.
  9. svt_copy copy tied variable magic to a tied element
  10. svt_dup duplicate a magic structure during thread cloning
  11. svt_local copy magic to local value during 'local'

For instance, the MGVTBL structure called vtbl_sv (which correspondsto an mg_type of PERL_MAGIC_sv) contains:

  1. { magic_get, magic_set, magic_len, 0, 0 }

Thus, when an SV is determined to be magical and of type PERL_MAGIC_sv,if a get operation is being performed, the routine magic_get iscalled. All the various routines for the various magical types beginwith magic_. NOTE: the magic routines are not considered part ofthe Perl API, and may not be exported by the Perl library.

The last three slots are a recent addition, and for source codecompatibility they are only checked for if one of the three flagsMGf_COPY, MGf_DUP or MGf_LOCAL is set in mg_flags. This means that mostcode can continue declaring a vtable as a 5-element value. These three arecurrently used exclusively by the threading code, and are highly subjectto change.

The current kinds of Magic Virtual Tables are:

  1. mg_type
  2. (old-style char and macro) MGVTBL Type of magic
  3. -------------------------- ------ -------------
  4. \0 PERL_MAGIC_sv vtbl_sv Special scalar variable
  5. # PERL_MAGIC_arylen vtbl_arylen Array length ($#ary)
  6. % PERL_MAGIC_rhash (none) extra data for restricted
  7. hashes
  8. . PERL_MAGIC_pos vtbl_pos pos() lvalue
  9. : PERL_MAGIC_symtab (none) extra data for symbol
  10. tables
  11. < PERL_MAGIC_backref vtbl_backref for weak ref data
  12. @ PERL_MAGIC_arylen_p (none) to move arylen out of
  13. XPVAV
  14. A PERL_MAGIC_overload vtbl_amagic %OVERLOAD hash
  15. a PERL_MAGIC_overload_elem vtbl_amagicelem %OVERLOAD hash element
  16. B PERL_MAGIC_bm vtbl_regexp Boyer-Moore
  17. (fast string search)
  18. c PERL_MAGIC_overload_table vtbl_ovrld Holds overload table
  19. (AMT) on stash
  20. D PERL_MAGIC_regdata vtbl_regdata Regex match position data
  21. (@+ and @- vars)
  22. d PERL_MAGIC_regdatum vtbl_regdatum Regex match position data
  23. element
  24. E PERL_MAGIC_env vtbl_env %ENV hash
  25. e PERL_MAGIC_envelem vtbl_envelem %ENV hash element
  26. f PERL_MAGIC_fm vtbl_regdata Formline
  27. ('compiled' format)
  28. G PERL_MAGIC_study vtbl_regexp study()ed string
  29. g PERL_MAGIC_regex_global vtbl_mglob m//g target
  30. H PERL_MAGIC_hints vtbl_hints %^H hash
  31. h PERL_MAGIC_hintselem vtbl_hintselem %^H hash element
  32. I PERL_MAGIC_isa vtbl_isa @ISA array
  33. i PERL_MAGIC_isaelem vtbl_isaelem @ISA array element
  34. k PERL_MAGIC_nkeys vtbl_nkeys scalar(keys()) lvalue
  35. L PERL_MAGIC_dbfile (none) Debugger %_<filename
  36. l PERL_MAGIC_dbline vtbl_dbline Debugger %_<filename
  37. element
  38. N PERL_MAGIC_shared (none) Shared between threads
  39. n PERL_MAGIC_shared_scalar (none) Shared between threads
  40. o PERL_MAGIC_collxfrm vtbl_collxfrm Locale transformation
  41. P PERL_MAGIC_tied vtbl_pack Tied array or hash
  42. p PERL_MAGIC_tiedelem vtbl_packelem Tied array or hash element
  43. q PERL_MAGIC_tiedscalar vtbl_packelem Tied scalar or handle
  44. r PERL_MAGIC_qr vtbl_regexp precompiled qr// regex
  45. S PERL_MAGIC_sig (none) %SIG hash
  46. s PERL_MAGIC_sigelem vtbl_sigelem %SIG hash element
  47. t PERL_MAGIC_taint vtbl_taint Taintedness
  48. U PERL_MAGIC_uvar vtbl_uvar Available for use by
  49. extensions
  50. u PERL_MAGIC_uvar_elem (none) Reserved for use by
  51. extensions
  52. V PERL_MAGIC_vstring vtbl_vstring SV was vstring literal
  53. v PERL_MAGIC_vec vtbl_vec vec() lvalue
  54. w PERL_MAGIC_utf8 vtbl_utf8 Cached UTF-8 information
  55. x PERL_MAGIC_substr vtbl_substr substr() lvalue
  56. y PERL_MAGIC_defelem vtbl_defelem Shadow "foreach" iterator
  57. variable / smart parameter
  58. vivification
  59. ] PERL_MAGIC_checkcall (none) inlining/mutation of call
  60. to this CV
  61. ~ PERL_MAGIC_ext (none) Available for use by
  62. extensions

When an uppercase and lowercase letter both exist in the table, then theuppercase letter is typically used to represent some kind of composite type(a list or a hash), and the lowercase letter is used to represent an elementof that composite type. Some internals code makes use of this caserelationship. However, 'v' and 'V' (vec and v-string) are in no way related.

The PERL_MAGIC_ext and PERL_MAGIC_uvar magic types are definedspecifically for use by extensions and will not be used by perl itself.Extensions can use PERL_MAGIC_ext magic to 'attach' private informationto variables (typically objects). This is especially useful becausethere is no way for normal perl code to corrupt this private information(unlike using extra elements of a hash object).

Similarly, PERL_MAGIC_uvar magic can be used much like tie() to call aC function any time a scalar's value is used or changed. The MAGIC'smg_ptr field points to a ufuncs structure:

  1. struct ufuncs {
  2. I32 (*uf_val)(pTHX_ IV, SV*);
  3. I32 (*uf_set)(pTHX_ IV, SV*);
  4. IV uf_index;
  5. };

When the SV is read from or written to, the uf_val or uf_setfunction will be called with uf_index as the first arg and a pointer tothe SV as the second. A simple example of how to add PERL_MAGIC_uvarmagic is shown below. Note that the ufuncs structure is copied bysv_magic, so you can safely allocate it on the stack.

  1. void
  2. Umagic(sv)
  3. SV *sv;
  4. PREINIT:
  5. struct ufuncs uf;
  6. CODE:
  7. uf.uf_val = &my_get_fn;
  8. uf.uf_set = &my_set_fn;
  9. uf.uf_index = 0;
  10. sv_magic(sv, 0, PERL_MAGIC_uvar, (char*)&uf, sizeof(uf));

Attaching PERL_MAGIC_uvar to arrays is permissible but has no effect.

For hashes there is a specialized hook that gives control over hashkeys (but not values). This hook calls PERL_MAGIC_uvar 'get' magicif the "set" function in the ufuncs structure is NULL. The hookis activated whenever the hash is accessed with a key specified asan SV through the functions hv_store_ent, hv_fetch_ent,hv_delete_ent, and hv_exists_ent. Accessing the key as a stringthrough the functions without the ..._ent suffix circumvents thehook. See GUTS in Hash::Util::FieldHash for a detailed description.

Note that because multiple extensions may be using PERL_MAGIC_extor PERL_MAGIC_uvar magic, it is important for extensions to takeextra care to avoid conflict. Typically only using the magic onobjects blessed into the same class as the extension is sufficient.For PERL_MAGIC_ext magic, it is usually a good idea to define anMGVTBL, even if all its fields will be 0, so that individualMAGIC pointers can be identified as a particular kind of magicusing their magic virtual table. mg_findext provides an easy wayto do that:

  1. STATIC MGVTBL my_vtbl = { 0, 0, 0, 0, 0, 0, 0, 0 };
  2. MAGIC *mg;
  3. if ((mg = mg_findext(sv, PERL_MAGIC_ext, &my_vtbl))) {
  4. /* this is really ours, not another module's PERL_MAGIC_ext */
  5. my_priv_data_t *priv = (my_priv_data_t *)mg->mg_ptr;
  6. ...
  7. }

Also note that the sv_set*() and sv_cat*() functions describedearlier do not invoke 'set' magic on their targets. This mustbe done by the user either by calling the SvSETMAGIC() macro aftercalling these functions, or by using one of the sv_set*_mg() orsv_cat*_mg() functions. Similarly, generic C code must call theSvGETMAGIC() macro to invoke any 'get' magic if they use an SVobtained from external sources in functions that don't handle magic.See perlapi for a description of these functions.For example, calls to the sv_cat*() functions typically need to befollowed by SvSETMAGIC(), but they don't need a prior SvGETMAGIC()since their implementation handles 'get' magic.

Finding Magic

  1. MAGIC *mg_find(SV *sv, int type); /* Finds the magic pointer of that
  2. * type */

This routine returns a pointer to a MAGIC structure stored in the SV.If the SV does not have that magical feature, NULL is returned. If theSV has multiple instances of that magical feature, the first one will bereturned. mg_findext can be used to find a MAGIC structure of an SVbased on both its magic type and its magic virtual table:

  1. MAGIC *mg_findext(SV *sv, int type, MGVTBL *vtbl);

Also, if the SV passed to mg_find or mg_findext is not of typeSVt_PVMG, Perl may core dump.

  1. int mg_copy(SV* sv, SV* nsv, const char* key, STRLEN klen);

This routine checks to see what types of magic sv has. If the mg_typefield is an uppercase letter, then the mg_obj is copied to nsv, butthe mg_type field is changed to be the lowercase letter.

Understanding the Magic of Tied Hashes and Arrays

Tied hashes and arrays are magical beasts of the PERL_MAGIC_tiedmagic type.

WARNING: As of the 5.004 release, proper usage of the array and hashaccess functions requires understanding a few caveats. Someof these caveats are actually considered bugs in the API, to be fixedin later releases, and are bracketed with [MAYCHANGE] below. Ifyou find yourself actually applying such information in this section, beaware that the behavior may change in the future, umm, without warning.

The perl tie function associates a variable with an object that implementsthe various GET, SET, etc methods. To perform the equivalent of the perltie function from an XSUB, you must mimic this behaviour. The code belowcarries out the necessary steps - firstly it creates a new hash, and thencreates a second hash which it blesses into the class which will implementthe tie methods. Lastly it ties the two hashes together, and returns areference to the new tied hash. Note that the code below does NOT call theTIEHASH method in the MyTie class -see Calling Perl Routines from within C Programs for details on howto do this.

  1. SV*
  2. mytie()
  3. PREINIT:
  4. HV *hash;
  5. HV *stash;
  6. SV *tie;
  7. CODE:
  8. hash = newHV();
  9. tie = newRV_noinc((SV*)newHV());
  10. stash = gv_stashpv("MyTie", GV_ADD);
  11. sv_bless(tie, stash);
  12. hv_magic(hash, (GV*)tie, PERL_MAGIC_tied);
  13. RETVAL = newRV_noinc(hash);
  14. OUTPUT:
  15. RETVAL

The av_store function, when given a tied array argument, merelycopies the magic of the array onto the value to be "stored", usingmg_copy. It may also return NULL, indicating that the value did notactually need to be stored in the array. [MAYCHANGE] After a call toav_store on a tied array, the caller will usually need to callmg_set(val) to actually invoke the perl level "STORE" method on theTIEARRAY object. If av_store did return NULL, a call toSvREFCNT_dec(val) will also be usually necessary to avoid a memoryleak. [/MAYCHANGE]

The previous paragraph is applicable verbatim to tied hash access using thehv_store and hv_store_ent functions as well.

av_fetch and the corresponding hash functions hv_fetch andhv_fetch_ent actually return an undefined mortal value whose magichas been initialized using mg_copy. Note the value so returned does notneed to be deallocated, as it is already mortal. [MAYCHANGE] But you willneed to call mg_get() on the returned value in order to actually invokethe perl level "FETCH" method on the underlying TIE object. Similarly,you may also call mg_set() on the return value after possibly assigninga suitable value to it using sv_setsv, which will invoke the "STORE"method on the TIE object. [/MAYCHANGE]

[MAYCHANGE]In other words, the array or hash fetch/store functions don't reallyfetch and store actual values in the case of tied arrays and hashes. Theymerely call mg_copy to attach magic to the values that were meant to be"stored" or "fetched". Later calls to mg_get and mg_set actuallydo the job of invoking the TIE methods on the underlying objects. Thusthe magic mechanism currently implements a kind of lazy access to arraysand hashes.

Currently (as of perl version 5.004), use of the hash and array accessfunctions requires the user to be aware of whether they are operating on"normal" hashes and arrays, or on their tied variants. The API may bechanged to provide more transparent access to both tied and normal datatypes in future versions.[/MAYCHANGE]

You would do well to understand that the TIEARRAY and TIEHASH interfacesare mere sugar to invoke some perl method calls while using the uniform hashand array syntax. The use of this sugar imposes some overhead (typicallyabout two to four extra opcodes per FETCH/STORE operation, in addition tothe creation of all the mortal variables required to invoke the methods).This overhead will be comparatively small if the TIE methods are themselvessubstantial, but if they are only a few statements long, the overheadwill not be insignificant.

Localizing changes

Perl has a very handy construction

  1. {
  2. local $var = 2;
  3. ...
  4. }

This construction is approximately equivalent to

  1. {
  2. my $oldvar = $var;
  3. $var = 2;
  4. ...
  5. $var = $oldvar;
  6. }

The biggest difference is that the first construction wouldreinstate the initial value of $var, irrespective of how control exitsthe block: goto, return, die/eval, etc. It is a little bitmore efficient as well.

There is a way to achieve a similar task from C via Perl API: create apseudo-block, and arrange for some changes to be automaticallyundone at the end of it, either explicit, or via a non-local exit (viadie()). A block-like construct is created by a pair ofENTER/LEAVE macros (see Returning a Scalar in perlcall).Such a construct may be created specially for some important localizedtask, or an existing one (like boundaries of enclosing Perlsubroutine/block, or an existing pair for freeing TMPs) may beused. (In the second case the overhead of additional localization mustbe almost negligible.) Note that any XSUB is automatically enclosed inan ENTER/LEAVE pair.

Inside such a pseudo-block the following service is available:

  • SAVEINT(int i)
  • SAVEIV(IV i)
  • SAVEI32(I32 i)
  • SAVELONG(long i)

    These macros arrange things to restore the value of integer variablei at the end of enclosing pseudo-block.

  • SAVESPTR(s)
  • SAVEPPTR(p)

    These macros arrange things to restore the value of pointers s andp. s must be a pointer of a type which survives conversion toSV* and back, p should be able to survive conversion to char*and back.

  • SAVEFREESV(SV *sv)

    The refcount of sv would be decremented at the end ofpseudo-block. This is similar to sv_2mortal in that it is also amechanism for doing a delayed SvREFCNT_dec. However, while sv_2mortalextends the lifetime of sv until the beginning of the next statement,SAVEFREESV extends it until the end of the enclosing scope. Theselifetimes can be wildly different.

    Also compare SAVEMORTALIZESV.

  • SAVEMORTALIZESV(SV *sv)

    Just like SAVEFREESV, but mortalizes sv at the end of the currentscope instead of decrementing its reference count. This usually has theeffect of keeping sv alive until the statement that called the currentlylive scope has finished executing.

  • SAVEFREEOP(OP *op)

    The OP * is op_free()ed at the end of pseudo-block.

  • SAVEFREEPV(p)

    The chunk of memory which is pointed to by p is Safefree()ed at theend of pseudo-block.

  • SAVECLEARSV(SV *sv)

    Clears a slot in the current scratchpad which corresponds to sv atthe end of pseudo-block.

  • SAVEDELETE(HV *hv, char *key, I32 length)

    The key key of hv is deleted at the end of pseudo-block. Thestring pointed to by key is Safefree()ed. If one has a key inshort-lived storage, the corresponding string may be reallocated likethis:

    1. SAVEDELETE(PL_defstash, savepv(tmpbuf), strlen(tmpbuf));
  • SAVEDESTRUCTOR(DESTRUCTORFUNC_NOCONTEXT_t f, void *p)

    At the end of pseudo-block the function f is called with theonly argument p.

  • SAVEDESTRUCTOR_X(DESTRUCTORFUNC_t f, void *p)

    At the end of pseudo-block the function f is called with theimplicit context argument (if any), and p.

  • SAVESTACK_POS()

    The current offset on the Perl internal stack (cf. SP) is restoredat the end of pseudo-block.

The following API list contains functions, thus one needs toprovide pointers to the modifiable data explicitly (either C pointers,or Perlish GV *s). Where the above macros take int, a similarfunction takes int *.

  • SV* save_scalar(GV *gv)

    Equivalent to Perl code local $gv.

  • AV* save_ary(GV *gv)
  • HV* save_hash(GV *gv)

    Similar to save_scalar, but localize @gv and %gv.

  • void save_item(SV *item)

    Duplicates the current value of SV, on the exit from the currentENTER/LEAVE pseudo-block will restore the value of SVusing the stored value. It doesn't handle magic. Use save_scalar ifmagic is affected.

  • void save_list(SV **sarg, I32 maxsarg)

    A variant of save_item which takes multiple arguments via an arraysarg of SV* of length maxsarg.

  • SV* save_svref(SV **sptr)

    Similar to save_scalar, but will reinstate an SV *.

  • void save_aptr(AV **aptr)
  • void save_hptr(HV **hptr)

    Similar to save_svref, but localize AV * and HV *.

The Alias module implements localization of the basic types within thecaller's scope. People who are interested in how to localize things inthe containing scope should take a look there too.

Subroutines

XSUBs and the Argument Stack

The XSUB mechanism is a simple way for Perl programs to access C subroutines.An XSUB routine will have a stack that contains the arguments from the Perlprogram, and a way to map from the Perl data structures to a C equivalent.

The stack arguments are accessible through the ST(n) macro, which returnsthe n'th stack argument. Argument 0 is the first argument passed in thePerl subroutine call. These arguments are SV*, and can be used anywherean SV* is used.

Most of the time, output from the C routine can be handled through use ofthe RETVAL and OUTPUT directives. However, there are some cases where theargument stack is not already long enough to handle all the return values.An example is the POSIX tzname() call, which takes no arguments, but returnstwo, the local time zone's standard and summer time abbreviations.

To handle this situation, the PPCODE directive is used and the stack isextended using the macro:

  1. EXTEND(SP, num);

where SP is the macro that represents the local copy of the stack pointer,and num is the number of elements the stack should be extended by.

Now that there is room on the stack, values can be pushed on it using PUSHsmacro. The pushed values will often need to be "mortal" (SeeReference Counts and Mortality):

  1. PUSHs(sv_2mortal(newSViv(an_integer)))
  2. PUSHs(sv_2mortal(newSVuv(an_unsigned_integer)))
  3. PUSHs(sv_2mortal(newSVnv(a_double)))
  4. PUSHs(sv_2mortal(newSVpv("Some String",0)))
  5. /* Although the last example is better written as the more
  6. * efficient: */
  7. PUSHs(newSVpvs_flags("Some String", SVs_TEMP))

And now the Perl program calling tzname, the two values will be assignedas in:

  1. ($standard_abbrev, $summer_abbrev) = POSIX::tzname;

An alternate (and possibly simpler) method to pushing values on the stack isto use the macro:

  1. XPUSHs(SV*)

This macro automatically adjusts the stack for you, if needed. Thus, youdo not need to call EXTEND to extend the stack.

Despite their suggestions in earlier versions of this document the macros(X)PUSH[iunp] are not suited to XSUBs which return multiple results.For that, either stick to the (X)PUSHs macros shown above, or use the newm(X)PUSH[iunp] macros instead; see Putting a C value on Perl stack.

For more information, consult perlxs and perlxstut.

Autoloading with XSUBs

If an AUTOLOAD routine is an XSUB, as with Perl subroutines, Perl puts thefully-qualified name of the autoloaded subroutine in the $AUTOLOAD variableof the XSUB's package.

But it also puts the same information in certain fields of the XSUB itself:

  1. HV *stash = CvSTASH(cv);
  2. const char *subname = SvPVX(cv);
  3. STRLEN name_length = SvCUR(cv); /* in bytes */
  4. U32 is_utf8 = SvUTF8(cv);

SvPVX(cv) contains just the sub name itself, not including the package.For an AUTOLOAD routine in UNIVERSAL or one of its superclasses,CvSTASH(cv) returns NULL during a method call on a nonexistent package.

Note: Setting $AUTOLOAD stopped working in 5.6.1, which did not supportXS AUTOLOAD subs at all. Perl 5.8.0 introduced the use of fields in theXSUB itself. Perl 5.16.0 restored the setting of $AUTOLOAD. If you needto support 5.8-5.14, use the XSUB's fields.

Calling Perl Routines from within C Programs

There are four routines that can be used to call a Perl subroutine fromwithin a C program. These four are:

  1. I32 call_sv(SV*, I32);
  2. I32 call_pv(const char*, I32);
  3. I32 call_method(const char*, I32);
  4. I32 call_argv(const char*, I32, register char**);

The routine most often used is call_sv. The SV* argumentcontains either the name of the Perl subroutine to be called, or areference to the subroutine. The second argument consists of flagsthat control the context in which the subroutine is called, whetheror not the subroutine is being passed arguments, how errors should betrapped, and how to treat return values.

All four routines return the number of arguments that the subroutine returnedon the Perl stack.

These routines used to be called perl_call_sv, etc., before Perl v5.6.0,but those names are now deprecated; macros of the same name are provided forcompatibility.

When using any of these routines (except call_argv), the programmermust manipulate the Perl stack. These include the following macros andfunctions:

  1. dSP
  2. SP
  3. PUSHMARK()
  4. PUTBACK
  5. SPAGAIN
  6. ENTER
  7. SAVETMPS
  8. FREETMPS
  9. LEAVE
  10. XPUSH*()
  11. POP*()

For a detailed description of calling conventions from C to Perl,consult perlcall.

Memory Allocation

Allocation

All memory meant to be used with the Perl API functions should be manipulatedusing the macros described in this section. The macros provide the necessarytransparency between differences in the actual malloc implementation that isused within perl.

It is suggested that you enable the version of malloc that is distributedwith Perl. It keeps pools of various sizes of unallocated memory inorder to satisfy allocation requests more quickly. However, on someplatforms, it may cause spurious malloc or free errors.

The following three macros are used to initially allocate memory :

  1. Newx(pointer, number, type);
  2. Newxc(pointer, number, type, cast);
  3. Newxz(pointer, number, type);

The first argument pointer should be the name of a variable that willpoint to the newly allocated memory.

The second and third arguments number and type specify how many ofthe specified type of data structure should be allocated. The argumenttype is passed to sizeof. The final argument to Newxc, cast,should be used if the pointer argument is different from the typeargument.

Unlike the Newx and Newxc macros, the Newxz macro calls memzeroto zero out all the newly allocated memory.

Reallocation

  1. Renew(pointer, number, type);
  2. Renewc(pointer, number, type, cast);
  3. Safefree(pointer)

These three macros are used to change a memory buffer size or to free apiece of memory no longer needed. The arguments to Renew and Renewcmatch those of New and Newc with the exception of not needing the"magic cookie" argument.

Moving

  1. Move(source, dest, number, type);
  2. Copy(source, dest, number, type);
  3. Zero(dest, number, type);

These three macros are used to move, copy, or zero out previously allocatedmemory. The source and dest arguments point to the source anddestination starting points. Perl will move, copy, or zero out numberinstances of the size of the type data structure (using the sizeoffunction).

PerlIO

The most recent development releases of Perl have been experimenting withremoving Perl's dependency on the "normal" standard I/O suite and allowingother stdio implementations to be used. This involves creating a newabstraction layer that then calls whichever implementation of stdio Perlwas compiled with. All XSUBs should now use the functions in the PerlIOabstraction layer and not make any assumptions about what kind of stdiois being used.

For a complete description of the PerlIO abstraction, consult perlapio.

Putting a C value on Perl stack

A lot of opcodes (this is an elementary operation in the internal perlstack machine) put an SV* on the stack. However, as an optimizationthe corresponding SV is (usually) not recreated each time. The opcodesreuse specially assigned SVs (targets) which are (as a corollary)not constantly freed/created.

Each of the targets is created only once (but seeScratchpads and recursion below), and when an opcode needs to putan integer, a double, or a string on stack, it just sets thecorresponding parts of its target and puts the target on stack.

The macro to put this target on stack is PUSHTARG, and it isdirectly used in some opcodes, as well as indirectly in zillions ofothers, which use it via (X)PUSH[iunp].

Because the target is reused, you must be careful when pushing multiplevalues on the stack. The following code will not do what you think:

  1. XPUSHi(10);
  2. XPUSHi(20);

This translates as "set TARG to 10, push a pointer to TARG ontothe stack; set TARG to 20, push a pointer to TARG onto the stack".At the end of the operation, the stack does not contain the values 10and 20, but actually contains two pointers to TARG, which we have setto 20.

If you need to push multiple different values then you should either usethe (X)PUSHs macros, or else use the new m(X)PUSH[iunp] macros,none of which make use of TARG. The (X)PUSHs macros simply push anSV* on the stack, which, as noted under XSUBs and the Argument Stack,will often need to be "mortal". The new m(X)PUSH[iunp] macros makethis a little easier to achieve by creating a new mortal for you (via(X)PUSHmortal), pushing that onto the stack (extending it if necessaryin the case of the mXPUSH[iunp] macros), and then setting its value.Thus, instead of writing this to "fix" the example above:

  1. XPUSHs(sv_2mortal(newSViv(10)))
  2. XPUSHs(sv_2mortal(newSViv(20)))

you can simply write:

  1. mXPUSHi(10)
  2. mXPUSHi(20)

On a related note, if you do use (X)PUSH[iunp], then you're going toneed a dTARG in your variable declarations so that the *PUSH*macros can make use of the local variable TARG. See also dTARGETand dXSTARG.

Scratchpads

The question remains on when the SVs which are targets for opcodesare created. The answer is that they are created when the currentunit--a subroutine or a file (for opcodes for statements outside ofsubroutines)--is compiled. During this time a special anonymous Perlarray is created, which is called a scratchpad for the current unit.

A scratchpad keeps SVs which are lexicals for the current unit and aretargets for opcodes. One can deduce that an SV lives on a scratchpadby looking on its flags: lexicals have SVs_PADMY set, andtargets have SVs_PADTMP set.

The correspondence between OPs and targets is not 1-to-1. DifferentOPs in the compile tree of the unit can use the same target, if thiswould not conflict with the expected life of the temporary.

Scratchpads and recursion

In fact it is not 100% true that a compiled unit contains a pointer tothe scratchpad AV. In fact it contains a pointer to an AV of(initially) one element, and this element is the scratchpad AV. Why dowe need an extra level of indirection?

The answer is recursion, and maybe threads. Boththese can create several execution pointers going into the samesubroutine. For the subroutine-child not write over the temporariesfor the subroutine-parent (lifespan of which covers the call to thechild), the parent and the child should have differentscratchpads. (And the lexicals should be separate anyway!)

So each subroutine is born with an array of scratchpads (of length 1).On each entry to the subroutine it is checked that the currentdepth of the recursion is not more than the length of this array, andif it is, new scratchpad is created and pushed into the array.

The targets on this scratchpad are undefs, but they are alreadymarked with correct flags.

Compiled code

Code tree

Here we describe the internal form your code is converted to byPerl. Start with a simple example:

  1. $a = $b + $c;

This is converted to a tree similar to this one:

  1. assign-to
  2. / \
  3. + $a
  4. / \
  5. $b $c

(but slightly more complicated). This tree reflects the way Perlparsed your code, but has nothing to do with the execution order.There is an additional "thread" going through the nodes of the treewhich shows the order of execution of the nodes. In our simplifiedexample above it looks like:

  1. $b ---> $c ---> + ---> $a ---> assign-to

But with the actual compile tree for $a = $b + $c it is different:some nodes optimized away. As a corollary, though the actual treecontains more nodes than our simplified example, the execution orderis the same as in our example.

Examining the tree

If you have your perl compiled for debugging (usually done with-DDEBUGGING on the Configure command line), you may examine thecompiled tree by specifying -Dx on the Perl command line. Theoutput takes several lines per node, and for $b+$c it looks likethis:

  1. 5 TYPE = add ===> 6
  2. TARG = 1
  3. FLAGS = (SCALAR,KIDS)
  4. {
  5. TYPE = null ===> (4)
  6. (was rv2sv)
  7. FLAGS = (SCALAR,KIDS)
  8. {
  9. 3 TYPE = gvsv ===> 4
  10. FLAGS = (SCALAR)
  11. GV = main::b
  12. }
  13. }
  14. {
  15. TYPE = null ===> (5)
  16. (was rv2sv)
  17. FLAGS = (SCALAR,KIDS)
  18. {
  19. 4 TYPE = gvsv ===> 5
  20. FLAGS = (SCALAR)
  21. GV = main::c
  22. }
  23. }

This tree has 5 nodes (one per TYPE specifier), only 3 of them arenot optimized away (one per number in the left column). The immediatechildren of the given node correspond to {} pairs on the same levelof indentation, thus this listing corresponds to the tree:

  1. add
  2. / \
  3. null null
  4. | |
  5. gvsv gvsv

The execution order is indicated by ===> marks, thus it is 34 5 6 (node 6 is not included into above listing), i.e.,gvsv gvsv add whatever.

Each of these nodes represents an op, a fundamental operation inside thePerl core. The code which implements each operation can be found in thepp*.c files; the function which implements the op with type gvsvis pp_gvsv, and so on. As the tree above shows, different ops havedifferent numbers of children: add is a binary operator, as one wouldexpect, and so has two children. To accommodate the various differentnumbers of children, there are various types of op data structure, andthey link together in different ways.

The simplest type of op structure is OP: this has no children. Unaryoperators, UNOPs, have one child, and this is pointed to by theop_first field. Binary operators (BINOPs) have not only anop_first field but also an op_last field. The most complex type ofop is a LISTOP, which has any number of children. In this case, thefirst child is pointed to by op_first and the last child byop_last. The children in between can be found by iterativelyfollowing the op_sibling pointer from the first child to the last.

There are also two other op types: a PMOP holds a regular expression,and has no children, and a LOOP may or may not have children. If theop_children field is non-zero, it behaves like a LISTOP. Tocomplicate matters, if a UNOP is actually a null op afteroptimization (see Compile pass 2: context propagation) it will stillhave children in accordance with its former type.

Another way to examine the tree is to use a compiler back-end module, suchas B::Concise.

Compile pass 1: check routines

The tree is created by the compiler while yacc code feeds itthe constructions it recognizes. Since yacc works bottom-up, so doesthe first pass of perl compilation.

What makes this pass interesting for perl developers is that someoptimization may be performed on this pass. This is optimization byso-called "check routines". The correspondence between node namesand corresponding check routines is described in opcode.pl (do notforget to run make regen_headers if you modify this file).

A check routine is called when the node is fully constructed exceptfor the execution-order thread. Since at this time there are noback-links to the currently constructed node, one can do most anyoperation to the top-level node, including freeing it and/or creatingnew nodes above/below it.

The check routine returns the node which should be inserted into thetree (if the top-level node was not modified, check routine returnsits argument).

By convention, check routines have names ck_*. They are usuallycalled from new*OP subroutines (or convert) (which in turn arecalled from perly.y).

Compile pass 1a: constant folding

Immediately after the check routine is called the returned node ischecked for being compile-time executable. If it is (the value isjudged to be constant) it is immediately executed, and a constantnode with the "return value" of the corresponding subtree issubstituted instead. The subtree is deleted.

If constant folding was not performed, the execution-order thread iscreated.

Compile pass 2: context propagation

When a context for a part of compile tree is known, it is propagateddown through the tree. At this time the context can have 5 values(instead of 2 for runtime context): void, boolean, scalar, list, andlvalue. In contrast with the pass 1 this pass is processed from topto bottom: a node's context determines the context for its children.

Additional context-dependent optimizations are performed at this time.Since at this moment the compile tree contains back-references (via"thread" pointers), nodes cannot be free()d now. To allowoptimized-away nodes at this stage, such nodes are null()ified insteadof free()ing (i.e. their type is changed to OP_NULL).

Compile pass 3: peephole optimization

After the compile tree for a subroutine (or for an eval or a file)is created, an additional pass over the code is performed. This passis neither top-down or bottom-up, but in the execution order (withadditional complications for conditionals). Optimizations performedat this stage are subject to the same restrictions as in the pass 2.

Peephole optimizations are done by calling the function pointed toby the global variable PL_peepp. By default, PL_peepp justcalls the function pointed to by the global variable PL_rpeepp.By default, that performs some basic op fixups and optimisations alongthe execution-order op chain, and recursively calls PL_rpeepp foreach side chain of ops (resulting from conditionals). Extensions mayprovide additional optimisations or fixups, hooking into either theper-subroutine or recursive stage, like this:

  1. static peep_t prev_peepp;
  2. static void my_peep(pTHX_ OP *o)
  3. {
  4. /* custom per-subroutine optimisation goes here */
  5. prev_peepp(o);
  6. /* custom per-subroutine optimisation may also go here */
  7. }
  8. BOOT:
  9. prev_peepp = PL_peepp;
  10. PL_peepp = my_peep;
  11. static peep_t prev_rpeepp;
  12. static void my_rpeep(pTHX_ OP *o)
  13. {
  14. OP *orig_o = o;
  15. for(; o; o = o->op_next) {
  16. /* custom per-op optimisation goes here */
  17. }
  18. prev_rpeepp(orig_o);
  19. }
  20. BOOT:
  21. prev_rpeepp = PL_rpeepp;
  22. PL_rpeepp = my_rpeep;

Pluggable runops

The compile tree is executed in a runops function. There are two runopsfunctions, in run.c and in dump.c. Perl_runops_debug is usedwith DEBUGGING and Perl_runops_standard is used otherwise. For finecontrol over the execution of the compile tree it is possible to provideyour own runops function.

It's probably best to copy one of the existing runops functions andchange it to suit your needs. Then, in the BOOT section of your XSfile, add the line:

  1. PL_runops = my_runops;

This function should be as efficient as possible to keep your programsrunning as fast as possible.

Compile-time scope hooks

As of perl 5.14 it is possible to hook into the compile-time lexicalscope mechanism using Perl_blockhook_register. This is used likethis:

  1. STATIC void my_start_hook(pTHX_ int full);
  2. STATIC BHK my_hooks;
  3. BOOT:
  4. BhkENTRY_set(&my_hooks, bhk_start, my_start_hook);
  5. Perl_blockhook_register(aTHX_ &my_hooks);

This will arrange to have my_start_hook called at the start ofcompiling every lexical scope. The available hooks are:

  • void bhk_start(pTHX_ int full)

    This is called just after starting a new lexical scope. Note that Perlcode like

    1. if ($x) { ... }

    creates two scopes: the first starts at the ( and has full == 1,the second starts at the { and has full == 0. Both end at the}, so calls to start and pre/post_end will match. Anythingpushed onto the save stack by this hook will be popped just before thescope ends (between the pre_ and post_end hooks, in fact).

  • void bhk_pre_end(pTHX_ OP **o)

    This is called at the end of a lexical scope, just before unwinding thestack. o is the root of the optree representing the scope; it is adouble pointer so you can replace the OP if you need to.

  • void bhk_post_end(pTHX_ OP **o)

    This is called at the end of a lexical scope, just after unwinding thestack. o is as above. Note that it is possible for calls to pre_and post_end to nest, if there is something on the save stack thatcalls string eval.

  • void bhk_eval(pTHX_ OP *const o)

    This is called just before starting to compile an eval STRING, doFILE, require or use, after the eval has been set up. o is theOP that requested the eval, and will normally be an OP_ENTEREVAL,OP_DOFILE or OP_REQUIRE.

Once you have your hook functions, you need a BHK structure to putthem in. It's best to allocate it statically, since there is no way tofree it once it's registered. The function pointers should be insertedinto this structure using the BhkENTRY_set macro, which will also setflags indicating which entries are valid. If you do need to allocateyour BHK dynamically for some reason, be sure to zero it before youstart.

Once registered, there is no mechanism to switch these hooks off, so ifthat is necessary you will need to do this yourself. An entry in %^His probably the best way, so the effect is lexically scoped; however itis also possible to use the BhkDISABLE and BhkENABLE macros totemporarily switch entries on and off. You should also be aware thatgenerally speaking at least one scope will have opened before yourextension is loaded, so you will see some pre/post_end pairs thatdidn't have a matching start.

Examining internal data structures with the dump functions

To aid debugging, the source file dump.c contains a number offunctions which produce formatted output of internal data structures.

The most commonly used of these functions is Perl_sv_dump; it's usedfor dumping SVs, AVs, HVs, and CVs. The Devel::Peek module callssv_dump to produce debugging output from Perl-space, so users of thatmodule should already be familiar with its format.

Perl_op_dump can be used to dump an OP structure or any of itsderivatives, and produces output similar to perl -Dx; in fact,Perl_dump_eval will dump the main root of the code being evaluated,exactly like -Dx.

Other useful functions are Perl_dump_sub, which turns a GV into anop tree, Perl_dump_packsubs which calls Perl_dump_sub on all thesubroutines in a package like so: (Thankfully, these are all xsubs, sothere is no op tree)

  1. (gdb) print Perl_dump_packsubs(PL_defstash)
  2. SUB attributes::bootstrap = (xsub 0x811fedc 0)
  3. SUB UNIVERSAL::can = (xsub 0x811f50c 0)
  4. SUB UNIVERSAL::isa = (xsub 0x811f304 0)
  5. SUB UNIVERSAL::VERSION = (xsub 0x811f7ac 0)
  6. SUB DynaLoader::boot_DynaLoader = (xsub 0x805b188 0)

and Perl_dump_all, which dumps all the subroutines in the stash andthe op tree of the main root.

How multiple interpreters and concurrency are supported

Background and PERL_IMPLICIT_CONTEXT

The Perl interpreter can be regarded as a closed box: it has an APIfor feeding it code or otherwise making it do things, but it also hasfunctions for its own use. This smells a lot like an object, andthere are ways for you to build Perl so that you can have multipleinterpreters, with one interpreter represented either as a C structure,or inside a thread-specific structure. These structures contain allthe context, the state of that interpreter.

One macro controls the major Perl build flavor: MULTIPLICITY. TheMULTIPLICITY build has a C structure that packages all the interpreterstate. With multiplicity-enabled perls, PERL_IMPLICIT_CONTEXT is alsonormally defined, and enables the support for passing in a "hidden" firstargument that represents all three data structures. MULTIPLICITY makesmulti-threaded perls possible (with the ithreads threading model, relatedto the macro USE_ITHREADS.)

Two other "encapsulation" macros are the PERL_GLOBAL_STRUCT andPERL_GLOBAL_STRUCT_PRIVATE (the latter turns on the former, and theformer turns on MULTIPLICITY.) The PERL_GLOBAL_STRUCT causes all theinternal variables of Perl to be wrapped inside a single global struct,struct perl_vars, accessible as (globals) &PL_Vars or PL_VarsPtr orthe function Perl_GetVars(). The PERL_GLOBAL_STRUCT_PRIVATE goesone step further, there is still a single struct (allocated in main()either from heap or from stack) but there are no global data symbolspointing to it. In either case the global struct should be initialisedas the very first thing in main() using Perl_init_global_struct() andcorrespondingly tear it down after perl_free() using Perl_free_global_struct(),please see miniperlmain.c for usage details. You may also needto use dVAR in your coding to "declare the global variables"when you are using them. dTHX does this for you automatically.

To see whether you have non-const data you can use a BSD-compatible nm:

  1. nm libperl.a | grep -v ' [TURtr] '

If this displays any D or d symbols, you have non-const data.

For backward compatibility reasons defining just PERL_GLOBAL_STRUCTdoesn't actually hide all symbols inside a big global struct: somePerlIO_xxx vtables are left visible. The PERL_GLOBAL_STRUCT_PRIVATEthen hides everything (see how the PERLIO_FUNCS_DECL is used).

All this obviously requires a way for the Perl internal functions to beeither subroutines taking some kind of structure as the firstargument, or subroutines taking nothing as the first argument. Toenable these two very different ways of building the interpreter,the Perl source (as it does in so many other situations) makes heavyuse of macros and subroutine naming conventions.

First problem: deciding which functions will be public API functions andwhich will be private. All functions whose names begin S_ are private(think "S" for "secret" or "static"). All other functions begin with"Perl_", but just because a function begins with "Perl_" does not mean it ispart of the API. (See Internal Functions.) The easiest way to be sure afunction is part of the API is to find its entry in perlapi.If it exists in perlapi, it's part of the API. If it doesn't, and youthink it should be (i.e., you need it for your extension), send mail viaperlbug explaining why you think it should be.

Second problem: there must be a syntax so that the same subroutinedeclarations and calls can pass a structure as their first argument,or pass nothing. To solve this, the subroutines are named anddeclared in a particular way. Here's a typical start of a staticfunction used within the Perl guts:

  1. STATIC void
  2. S_incline(pTHX_ char *s)

STATIC becomes "static" in C, and may be #define'd to nothing in someconfigurations in the future.

A public function (i.e. part of the internal API, but not necessarilysanctioned for use in extensions) begins like this:

  1. void
  2. Perl_sv_setiv(pTHX_ SV* dsv, IV num)

pTHX_ is one of a number of macros (in perl.h) that hide thedetails of the interpreter's context. THX stands for "thread", "this",or "thingy", as the case may be. (And no, George Lucas is not involved. :-)The first character could be 'p' for a prototype, 'a' for argument,or 'd' for declaration, so we have pTHX, aTHX and dTHX, andtheir variants.

When Perl is built without options that set PERL_IMPLICIT_CONTEXT, there is nofirst argument containing the interpreter's context. The trailing underscorein the pTHX_ macro indicates that the macro expansion needs a commaafter the context argument because other arguments follow it. IfPERL_IMPLICIT_CONTEXT is not defined, pTHX_ will be ignored, and thesubroutine is not prototyped to take the extra argument. The form of themacro without the trailing underscore is used when there are no additionalexplicit arguments.

When a core function calls another, it must pass the context. Thisis normally hidden via macros. Consider sv_setiv. It expands intosomething like this:

  1. #ifdef PERL_IMPLICIT_CONTEXT
  2. #define sv_setiv(a,b) Perl_sv_setiv(aTHX_ a, b)
  3. /* can't do this for vararg functions, see below */
  4. #else
  5. #define sv_setiv Perl_sv_setiv
  6. #endif

This works well, and means that XS authors can gleefully write:

  1. sv_setiv(foo, bar);

and still have it work under all the modes Perl could have beencompiled with.

This doesn't work so cleanly for varargs functions, though, as macrosimply that the number of arguments is known in advance. Instead weeither need to spell them out fully, passing aTHX_ as the firstargument (the Perl core tends to do this with functions likePerl_warner), or use a context-free version.

The context-free version of Perl_warner is calledPerl_warner_nocontext, and does not take the extra argument. Insteadit does dTHX; to get the context from thread-local storage. We#define warner Perl_warner_nocontext so that extensions get sourcecompatibility at the expense of performance. (Passing an arg ischeaper than grabbing it from thread-local storage.)

You can ignore [pad]THXx when browsing the Perl headers/sources.Those are strictly for use within the core. Extensions and embeddersneed only be aware of [pad]THX.

So what happened to dTHR?

dTHR was introduced in perl 5.005 to support the older thread model.The older thread model now uses the THX mechanism to pass contextpointers around, so dTHR is not useful any more. Perl 5.6.0 andlater still have it for backward source compatibility, but it is definedto be a no-op.

How do I use all this in extensions?

When Perl is built with PERL_IMPLICIT_CONTEXT, extensions that callany functions in the Perl API will need to pass the initial contextargument somehow. The kicker is that you will need to write it insuch a way that the extension still compiles when Perl hasn't beenbuilt with PERL_IMPLICIT_CONTEXT enabled.

There are three ways to do this. First, the easy but inefficient way,which is also the default, in order to maintain source compatibilitywith extensions: whenever XSUB.h is #included, it redefines the aTHXand aTHX_ macros to call a function that will return the context.Thus, something like:

  1. sv_setiv(sv, num);

in your extension will translate to this when PERL_IMPLICIT_CONTEXT isin effect:

  1. Perl_sv_setiv(Perl_get_context(), sv, num);

or to this otherwise:

  1. Perl_sv_setiv(sv, num);

You don't have to do anything new in your extension to get this; sincethe Perl library provides Perl_get_context(), it will all justwork.

The second, more efficient way is to use the following template foryour Foo.xs:

  1. #define PERL_NO_GET_CONTEXT /* we want efficiency */
  2. #include "EXTERN.h"
  3. #include "perl.h"
  4. #include "XSUB.h"
  5. STATIC void my_private_function(int arg1, int arg2);
  6. STATIC void
  7. my_private_function(int arg1, int arg2)
  8. {
  9. dTHX; /* fetch context */
  10. ... call many Perl API functions ...
  11. }
  12. [... etc ...]
  13. MODULE = Foo PACKAGE = Foo
  14. /* typical XSUB */
  15. void
  16. my_xsub(arg)
  17. int arg
  18. CODE:
  19. my_private_function(arg, 10);

Note that the only two changes from the normal way of writing anextension is the addition of a #define PERL_NO_GET_CONTEXT beforeincluding the Perl headers, followed by a dTHX; declaration atthe start of every function that will call the Perl API. (You'llknow which functions need this, because the C compiler will complainthat there's an undeclared identifier in those functions.) No changesare needed for the XSUBs themselves, because the XS() macro iscorrectly defined to pass in the implicit context if needed.

The third, even more efficient way is to ape how it is done withinthe Perl guts:

  1. #define PERL_NO_GET_CONTEXT /* we want efficiency */
  2. #include "EXTERN.h"
  3. #include "perl.h"
  4. #include "XSUB.h"
  5. /* pTHX_ only needed for functions that call Perl API */
  6. STATIC void my_private_function(pTHX_ int arg1, int arg2);
  7. STATIC void
  8. my_private_function(pTHX_ int arg1, int arg2)
  9. {
  10. /* dTHX; not needed here, because THX is an argument */
  11. ... call Perl API functions ...
  12. }
  13. [... etc ...]
  14. MODULE = Foo PACKAGE = Foo
  15. /* typical XSUB */
  16. void
  17. my_xsub(arg)
  18. int arg
  19. CODE:
  20. my_private_function(aTHX_ arg, 10);

This implementation never has to fetch the context using a functioncall, since it is always passed as an extra argument. Depending onyour needs for simplicity or efficiency, you may mix the previoustwo approaches freely.

Never add a comma after pTHX yourself--always use the form of themacro with the underscore for functions that take explicit arguments,or the form without the argument for functions with no explicit arguments.

If one is compiling Perl with the -DPERL_GLOBAL_STRUCT the dVARdefinition is needed if the Perl global variables (see perlvars.hor globvar.sym) are accessed in the function and dTHX is notused (the dTHX includes the dVAR if necessary). One noticesthe need for dVAR only with the said compile-time define, becauseotherwise the Perl global variables are visible as-is.

Should I do anything special if I call perl from multiple threads?

If you create interpreters in one thread and then proceed to call them inanother, you need to make sure perl's own Thread Local Storage (TLS) slot isinitialized correctly in each of those threads.

The perl_alloc and perl_clone API functions will automatically setthe TLS slot to the interpreter they created, so that there is no need to doanything special if the interpreter is always accessed in the same thread thatcreated it, and that thread did not create or call any other interpretersafterwards. If that is not the case, you have to set the TLS slot of thethread before calling any functions in the Perl API on that particularinterpreter. This is done by calling the PERL_SET_CONTEXT macro in thatthread as the first thing you do:

  1. /* do this before doing anything else with some_perl */
  2. PERL_SET_CONTEXT(some_perl);
  3. ... other Perl API calls on some_perl go here ...

Future Plans and PERL_IMPLICIT_SYS

Just as PERL_IMPLICIT_CONTEXT provides a way to bundle up everythingthat the interpreter knows about itself and pass it around, so too arethere plans to allow the interpreter to bundle up everything it knowsabout the environment it's running on. This is enabled with thePERL_IMPLICIT_SYS macro. Currently it only works with USE_ITHREADS onWindows.

This allows the ability to provide an extra pointer (called the "host"environment) for all the system calls. This makes it possible forall the system stuff to maintain their own state, broken down intoseven C structures. These are thin wrappers around the usual systemcalls (see win32/perllib.c) for the default perl executable, but for amore ambitious host (like the one that would do fork() emulation) allthe extra work needed to pretend that different interpreters areactually different "processes", would be done here.

The Perl engine/interpreter and the host are orthogonal entities.There could be one or more interpreters in a process, and one ormore "hosts", with free association between them.

Internal Functions

All of Perl's internal functions which will be exposed to the outsideworld are prefixed by Perl_ so that they will not conflict with XSfunctions or functions used in a program in which Perl is embedded.Similarly, all global variables begin with PL_. (By convention,static functions start with S_.)

Inside the Perl core (PERL_CORE defined), you can get at the functionseither with or without the Perl_ prefix, thanks to a bunch of definesthat live in embed.h. Note that extension code should not setPERL_CORE; this exposes the full perl internals, and is likely to causebreakage of the XS in each new perl release.

The file embed.h is generated automatically fromembed.pl and embed.fnc. embed.pl also creates the prototypingheader files for the internal functions, generates the documentationand a lot of other bits and pieces. It's important that when you adda new function to the core or change an existing one, you change thedata in the table in embed.fnc as well. Here's a sample entry fromthat table:

  1. Apd |SV** |av_fetch |AV* ar|I32 key|I32 lval

The second column is the return type, the third column the name. Columnsafter that are the arguments. The first column is a set of flags:

  • A

    This function is a part of the public API. All such functions should alsohave 'd', very few do not.

  • p

    This function has a Perl_ prefix; i.e. it is defined asPerl_av_fetch.

  • d

    This function has documentation using the apidoc feature which we'lllook at in a second. Some functions have 'd' but not 'A'; docs are good.

Other available flags are:

  • s

    This is a static function and is defined as STATIC S_whatever, andusually called within the sources as whatever(...).

  • n

    This does not need an interpreter context, so the definition has nopTHX, and it follows that callers don't use aTHX. (SeeBackground and PERL_IMPLICIT_CONTEXT.)

  • r

    This function never returns; croak, exit and friends.

  • f

    This function takes a variable number of arguments, printf style.The argument list should end with ..., like this:

    1. Afprd |void |croak |const char* pat|...
  • M

    This function is part of the experimental development API, and may changeor disappear without notice.

  • o

    This function should not have a compatibility macro to define, say,Perl_parse to parse. It must be called as Perl_parse.

  • x

    This function isn't exported out of the Perl core.

  • m

    This is implemented as a macro.

  • X

    This function is explicitly exported.

  • E

    This function is visible to extensions included in the Perl core.

  • b

    Binary backward compatibility; this function is a macro but also hasa Perl_ implementation (which is exported).

  • others

    See the comments at the top of embed.fnc for others.

If you edit embed.pl or embed.fnc, you will need to runmake regen_headers to force a rebuild of embed.h and otherauto-generated files.

Formatted Printing of IVs, UVs, and NVs

If you are printing IVs, UVs, or NVS instead of the stdio(3) styleformatting codes like %d, %ld, %f, you should use thefollowing macros for portability

  1. IVdf IV in decimal
  2. UVuf UV in decimal
  3. UVof UV in octal
  4. UVxf UV in hexadecimal
  5. NVef NV %e-like
  6. NVff NV %f-like
  7. NVgf NV %g-like

These will take care of 64-bit integers and long doubles.For example:

  1. printf("IV is %"IVdf"\n", iv);

The IVdf will expand to whatever is the correct format for the IVs.

If you are printing addresses of pointers, use UVxf combinedwith PTR2UV(), do not use %lx or %p.

Pointer-To-Integer and Integer-To-Pointer

Because pointer size does not necessarily equal integer size,use the follow macros to do it right.

  1. PTR2UV(pointer)
  2. PTR2IV(pointer)
  3. PTR2NV(pointer)
  4. INT2PTR(pointertotype, integer)

For example:

  1. IV iv = ...;
  2. SV *sv = INT2PTR(SV*, iv);

and

  1. AV *av = ...;
  2. UV uv = PTR2UV(av);

Exception Handling

There are a couple of macros to do very basic exception handling in XSmodules. You have to define NO_XSLOCKS before including XSUB.h tobe able to use these macros:

  1. #define NO_XSLOCKS
  2. #include "XSUB.h"

You can use these macros if you call code that may croak, but you needto do some cleanup before giving control back to Perl. For example:

  1. dXCPT; /* set up necessary variables */
  2. XCPT_TRY_START {
  3. code_that_may_croak();
  4. } XCPT_TRY_END
  5. XCPT_CATCH
  6. {
  7. /* do cleanup here */
  8. XCPT_RETHROW;
  9. }

Note that you always have to rethrow an exception that has beencaught. Using these macros, it is not possible to just catch theexception and ignore it. If you have to ignore the exception, youhave to use the call_* function.

The advantage of using the above macros is that you don't haveto setup an extra function for call_*, and that using thesemacros is faster than using call_*.

Source Documentation

There's an effort going on to document the internal functions andautomatically produce reference manuals from them - perlapi is onesuch manual which details all the functions which are available to XSwriters. perlintern is the autogenerated manual for the functionswhich are not part of the API and are supposedly for internal use only.

Source documentation is created by putting POD comments into the Csource, like this:

  1. /*
  2. =for apidoc sv_setiv
  3. Copies an integer into the given SV. Does not handle 'set' magic. See
  4. C<sv_setiv_mg>.
  5. =cut
  6. */

Please try and supply some documentation if you add functions to thePerl core.

Backwards compatibility

The Perl API changes over time. New functions are added or the interfacesof existing functions are changed. The Devel::PPPort module tries toprovide compatibility code for some of these changes, so XS writers don'thave to code it themselves when supporting multiple versions of Perl.

Devel::PPPort generates a C header file ppport.h that can alsobe run as a Perl script. To generate ppport.h, run:

  1. perl -MDevel::PPPort -eDevel::PPPort::WriteFile

Besides checking existing XS code, the script can also be used to retrievecompatibility information for various API calls using the --api-infocommand line switch. For example:

  1. % perl ppport.h --api-info=sv_magicext

For details, see perldoc ppport.h.

Unicode Support

Perl 5.6.0 introduced Unicode support. It's important for porters and XSwriters to understand this support and make sure that the code theywrite does not corrupt Unicode data.

What is Unicode, anyway?

In the olden, less enlightened times, we all used to use ASCII. Most ofus did, anyway. The big problem with ASCII is that it's American. Well,no, that's not actually the problem; the problem is that it's notparticularly useful for people who don't use the Roman alphabet. Whatused to happen was that particular languages would stick their ownalphabet in the upper range of the sequence, between 128 and 255. Ofcourse, we then ended up with plenty of variants that weren't quiteASCII, and the whole point of it being a standard was lost.

Worse still, if you've got a language like Chinese orJapanese that has hundreds or thousands of characters, then you reallycan't fit them into a mere 256, so they had to forget about ASCIIaltogether, and build their own systems using pairs of numbers to referto one character.

To fix this, some people formed Unicode, Inc. andproduced a new character set containing all the characters you canpossibly think of and more. There are several ways of representing thesecharacters, and the one Perl uses is called UTF-8. UTF-8 usesa variable number of bytes to represent a character. You can learn moreabout Unicode and Perl's Unicode model in perlunicode.

How can I recognise a UTF-8 string?

You can't. This is because UTF-8 data is stored in bytes just likenon-UTF-8 data. The Unicode character 200, (0xC8 for you hex types)capital E with a grave accent, is represented by the two bytesv196.172. Unfortunately, the non-Unicode string chr(196).chr(172)has that byte sequence as well. So you can't tell just by looking - thisis what makes Unicode input an interesting problem.

In general, you either have to know what you're dealing with, or youhave to guess. The API function is_utf8_string can help; it'll tellyou if a string contains only valid UTF-8 characters. However, it can'tdo the work for you. On a character-by-character basis, is_utf8_charwill tell you whether the current character in a string is valid UTF-8.

How does UTF-8 represent Unicode characters?

As mentioned above, UTF-8 uses a variable number of bytes to store acharacter. Characters with values 0...127 are stored in one byte, justlike good ol' ASCII. Character 128 is stored as v194.128; thiscontinues up to character 191, which is v194.191. Now we've run out ofbits (191 is binary 10111111) so we move on; 192 is v195.128. Andso it goes on, moving to three bytes at character 2048.

Assuming you know you're dealing with a UTF-8 string, you can find outhow long the first character in it is with the UTF8SKIP macro:

  1. char *utf = "\305\233\340\240\201";
  2. I32 len;
  3. len = UTF8SKIP(utf); /* len is 2 here */
  4. utf += len;
  5. len = UTF8SKIP(utf); /* len is 3 here */

Another way to skip over characters in a UTF-8 string is to useutf8_hop, which takes a string and a number of characters to skipover. You're on your own about bounds checking, though, so don't use itlightly.

All bytes in a multi-byte UTF-8 character will have the high bit set,so you can test if you need to do something special with thischaracter like this (the UTF8_IS_INVARIANT() is a macro that testswhether the byte can be encoded as a single byte even in UTF-8):

  1. U8 *utf;
  2. U8 *utf_end; /* 1 beyond buffer pointed to by utf */
  3. UV uv;/* Note: a UV, not a U8, not a char */
  4. STRLEN len; /* length of character in bytes */
  5. if (!UTF8_IS_INVARIANT(*utf))
  6. /* Must treat this as UTF-8 */
  7. uv = utf8_to_uvchr_buf(utf, utf_end, &len);
  8. else
  9. /* OK to treat this character as a byte */
  10. uv = *utf;

You can also see in that example that we use utf8_to_uvchr_buf to get thevalue of the character; the inverse function uvchr_to_utf8 is availablefor putting a UV into UTF-8:

  1. if (!UTF8_IS_INVARIANT(uv))
  2. /* Must treat this as UTF8 */
  3. utf8 = uvchr_to_utf8(utf8, uv);
  4. else
  5. /* OK to treat this character as a byte */
  6. *utf8++ = uv;

You must convert characters to UVs using the above functions ifyou're ever in a situation where you have to match UTF-8 and non-UTF-8characters. You may not skip over UTF-8 characters in this case. If youdo this, you'll lose the ability to match hi-bit non-UTF-8 characters;for instance, if your UTF-8 string contains v196.172, and you skipthat character, you can never match a chr(200) in a non-UTF-8 string.So don't do that!

How does Perl store UTF-8 strings?

Currently, Perl deals with Unicode strings and non-Unicode stringsslightly differently. A flag in the SV, SVf_UTF8, indicates that thestring is internally encoded as UTF-8. Without it, the byte value is thecodepoint number and vice versa (in other words, the string is encodedas iso-8859-1, but use feature 'unicode_strings' is needed to get iso-8859-1semantics). You can check and manipulate this flag with thefollowing macros:

  1. SvUTF8(sv)
  2. SvUTF8_on(sv)
  3. SvUTF8_off(sv)

This flag has an important effect on Perl's treatment of the string: ifUnicode data is not properly distinguished, regular expressions,length, substr and other string handling operations will haveundesirable results.

The problem comes when you have, for instance, a string that isn'tflagged as UTF-8, and contains a byte sequence that could be UTF-8 -especially when combining non-UTF-8 and UTF-8 strings.

Never forget that the SVf_UTF8 flag is separate to the PV value; youneed be sure you don't accidentally knock it off while you'remanipulating SVs. More specifically, you cannot expect to do this:

  1. SV *sv;
  2. SV *nsv;
  3. STRLEN len;
  4. char *p;
  5. p = SvPV(sv, len);
  6. frobnicate(p);
  7. nsv = newSVpvn(p, len);

The char* string does not tell you the whole story, and you can'tcopy or reconstruct an SV just by copying the string value. Check if theold SV has the UTF8 flag set, and act accordingly:

  1. p = SvPV(sv, len);
  2. frobnicate(p);
  3. nsv = newSVpvn(p, len);
  4. if (SvUTF8(sv))
  5. SvUTF8_on(nsv);

In fact, your frobnicate function should be made aware of whether ornot it's dealing with UTF-8 data, so that it can handle the stringappropriately.

Since just passing an SV to an XS function and copying the data ofthe SV is not enough to copy the UTF8 flags, even less right is justpassing a char * to an XS function.

How do I convert a string to UTF-8?

If you're mixing UTF-8 and non-UTF-8 strings, it is necessary to upgradeone of the strings to UTF-8. If you've got an SV, the easiest way to dothis is:

  1. sv_utf8_upgrade(sv);

However, you must not do this, for example:

  1. if (!SvUTF8(left))
  2. sv_utf8_upgrade(left);

If you do this in a binary operator, you will actually change one of thestrings that came into the operator, and, while it shouldn't be noticeableby the end user, it can cause problems in deficient code.

Instead, bytes_to_utf8 will give you a UTF-8-encoded copy of itsstring argument. This is useful for having the data available forcomparisons and so on, without harming the original SV. There's alsoutf8_to_bytes to go the other way, but naturally, this will fail ifthe string contains any characters above 255 that can't be representedin a single byte.

Is there anything else I need to know?

Not really. Just remember these things:

  • There's no way to tell if a string is UTF-8 or not. You can tell if an SVis UTF-8 by looking at its SvUTF8 flag. Don't forget to set the flag ifsomething should be UTF-8. Treat the flag as part of the PV, even thoughit's not - if you pass on the PV to somewhere, pass on the flag too.

  • If a string is UTF-8, always use utf8_to_uvchr_buf to get at the value,unless UTF8_IS_INVARIANT(*s) in which case you can use *s.

  • When writing a character uv to a UTF-8 string, always useuvchr_to_utf8, unless UTF8_IS_INVARIANT(uv)) in which caseyou can use *s = uv.

  • Mixing UTF-8 and non-UTF-8 strings is tricky. Use bytes_to_utf8 to geta new string which is UTF-8 encoded, and then combine them.

Custom Operators

Custom operator support is a new experimental feature that allows you todefine your own ops. This is primarily to allow the building ofinterpreters for other languages in the Perl core, but it also allowsoptimizations through the creation of "macro-ops" (ops which perform thefunctions of multiple ops which are usually executed together, such asgvsv, gvsv, add.)

This feature is implemented as a new op type, OP_CUSTOM. The Perlcore does not "know" anything special about this op type, and so it willnot be involved in any optimizations. This also means that you candefine your custom ops to be any op structure - unary, binary, list andso on - you like.

It's important to know what custom operators won't do for you. Theywon't let you add new syntax to Perl, directly. They won't even let youadd new keywords, directly. In fact, they won't change the way Perlcompiles a program at all. You have to do those changes yourself, afterPerl has compiled the program. You do this either by manipulating the optree using a CHECK block and the B::Generate module, or by addinga custom peephole optimizer with the optimize module.

When you do this, you replace ordinary Perl ops with custom ops bycreating ops with the type OP_CUSTOM and the pp_addr of your ownPP function. This should be defined in XS code, and should look likethe PP ops in pp_*.c. You are responsible for ensuring that your optakes the appropriate number of values from the stack, and you areresponsible for adding stack marks if necessary.

You should also "register" your op with the Perl interpreter so that itcan produce sensible error and warning messages. Since it is possible tohave multiple custom ops within the one "logical" op type OP_CUSTOM,Perl uses the value of o->op_ppaddr to determine which custom opit is dealing with. You should create an XOP structure for eachppaddr you use, set the properties of the custom op withXopENTRY_set, and register the structure against the ppaddr usingPerl_custom_op_register. A trivial example might look like:

  1. static XOP my_xop;
  2. static OP *my_pp(pTHX);
  3. BOOT:
  4. XopENTRY_set(&my_xop, xop_name, "myxop");
  5. XopENTRY_set(&my_xop, xop_desc, "Useless custom op");
  6. Perl_custom_op_register(aTHX_ my_pp, &my_xop);

The available fields in the structure are:

  • xop_name

    A short name for your op. This will be included in some error messages,and will also be returned as $op->name by the B module, soit will appear in the output of module like B::Concise.

  • xop_desc

    A short description of the function of the op.

  • xop_class

    Which of the various *OP structures this op uses. This should be one ofthe OA_* constants from op.h, namely

    • OA_BASEOP
    • OA_UNOP
    • OA_BINOP
    • OA_LOGOP
    • OA_LISTOP
    • OA_PMOP
    • OA_SVOP
    • OA_PADOP
    • OA_PVOP_OR_SVOP

      This should be interpreted as 'PVOP' only. The _OR_SVOP is becausethe only core PVOP, OP_TRANS, can sometimes be a SVOP instead.

    • OA_LOOP
    • OA_COP

    The other OA_* constants should not be used.

  • xop_peep

    This member is of type Perl_cpeep_t, which expands to void(*Perl_cpeep_t)(aTHX_ OP *o, OP *oldop). If it is set, this functionwill be called from Perl_rpeep when ops of this type are encounteredby the peephole optimizer. o is the OP that needs optimizing;oldop is the previous OP optimized, whose op_next points to o.

B::Generate directly supports the creation of custom ops by name.

AUTHORS

Until May 1997, this document was maintained by Jeff Okamoto<[email protected]>. It is now maintained as part of Perlitself by the Perl 5 Porters <[email protected]>.

With lots of help and suggestions from Dean Roehrich, Malcolm Beattie,Andreas Koenig, Paul Hudson, Ilya Zakharevich, Paul Marquess, NeilBowers, Matthew Green, Tim Bunce, Spider Boardman, Ulrich Pfeifer,Stephen McCamant, and Gurusamy Sarathy.

SEE ALSO

perlapi, perlintern, perlxs, perlembed

Page index
 
Source : perldoc.perl.org - Official documentation for the Perl programming language
Site maintained by Jon Allen (JJ)     See the project page for more details
Documentation maintained by the Perl 5 Porters
(Sebelumnya) Internal replacements for stan ...Perl calling conventions from C (Berikutnya)