Home | History | Annotate | Download | only in perl5
      1 /* -----------------------------------------------------------------------------
      2  * perlrun.swg
      3  *
      4  * This file contains the runtime support for Perl modules
      5  * and includes code for managing global variables and pointer
      6  * type checking.
      7  * ----------------------------------------------------------------------------- */
      8 
      9 #ifdef PERL_OBJECT
     10 #define SWIG_PERL_OBJECT_DECL CPerlObj *SWIGUNUSEDPARM(pPerl),
     11 #define SWIG_PERL_OBJECT_CALL pPerl,
     12 #else
     13 #define SWIG_PERL_OBJECT_DECL
     14 #define SWIG_PERL_OBJECT_CALL
     15 #endif
     16 
     17 /* Common SWIG API */
     18 
     19 /* for raw pointers */
     20 #define SWIG_ConvertPtr(obj, pp, type, flags)           SWIG_Perl_ConvertPtr(SWIG_PERL_OBJECT_CALL obj, pp, type, flags)
     21 #define SWIG_ConvertPtrAndOwn(obj, pp, type, flags,own) SWIG_Perl_ConvertPtrAndOwn(SWIG_PERL_OBJECT_CALL obj, pp, type, flags, own)
     22 #define SWIG_NewPointerObj(p, type, flags)              SWIG_Perl_NewPointerObj(SWIG_PERL_OBJECT_CALL p, type, flags)
     23 
     24 /* for raw packed data */
     25 #define SWIG_ConvertPacked(obj, p, s, type)             SWIG_Perl_ConvertPacked(SWIG_PERL_OBJECT_CALL obj, p, s, type)
     26 #define SWIG_NewPackedObj(p, s, type)	                SWIG_Perl_NewPackedObj(SWIG_PERL_OBJECT_CALL p, s, type)
     27 
     28 /* for class or struct pointers */
     29 #define SWIG_ConvertInstance(obj, pptr, type, flags)    SWIG_ConvertPtr(obj, pptr, type, flags)
     30 #define SWIG_NewInstanceObj(ptr, type, flags)           SWIG_NewPointerObj(ptr, type, flags)
     31 
     32 /* for C or C++ function pointers */
     33 #define SWIG_ConvertFunctionPtr(obj, pptr, type)        SWIG_ConvertPtr(obj, pptr, type, 0)
     34 #define SWIG_NewFunctionPtrObj(ptr, type)               SWIG_NewPointerObj(ptr, type, 0)
     35 
     36 /* for C++ member pointers, ie, member methods */
     37 #define SWIG_ConvertMember(obj, ptr, sz, ty)            SWIG_ConvertPacked(obj, ptr, sz, ty)
     38 #define SWIG_NewMemberObj(ptr, sz, type)                SWIG_NewPackedObj(ptr, sz, type)
     39 
     40 
     41 /* Runtime API */
     42 
     43 #define SWIG_GetModule(clientdata)                      SWIG_Perl_GetModule(clientdata)
     44 #define SWIG_SetModule(clientdata, pointer)             SWIG_Perl_SetModule(pointer)
     45 
     46 
     47 /* Error manipulation */
     48 
     49 #define SWIG_ErrorType(code)                            SWIG_Perl_ErrorType(code)
     50 #define SWIG_Error(code, msg)            		sv_setpvf(get_sv("@", GV_ADD), "%s %s", SWIG_ErrorType(code), msg)
     51 #define SWIG_fail                        		goto fail
     52 
     53 /* Perl-specific SWIG API */
     54 
     55 #define SWIG_MakePtr(sv, ptr, type, flags)              SWIG_Perl_MakePtr(SWIG_PERL_OBJECT_CALL sv, ptr, type, flags)
     56 #define SWIG_MakePackedObj(sv, p, s, type)	        SWIG_Perl_MakePackedObj(SWIG_PERL_OBJECT_CALL sv, p, s, type)
     57 #define SWIG_SetError(str)                              SWIG_Error(SWIG_RuntimeError, str)
     58 
     59 
     60 #define SWIG_PERL_DECL_ARGS_1(arg1)                     (SWIG_PERL_OBJECT_DECL arg1)
     61 #define SWIG_PERL_CALL_ARGS_1(arg1)                     (SWIG_PERL_OBJECT_CALL arg1)
     62 #define SWIG_PERL_DECL_ARGS_2(arg1, arg2)               (SWIG_PERL_OBJECT_DECL arg1, arg2)
     63 #define SWIG_PERL_CALL_ARGS_2(arg1, arg2)               (SWIG_PERL_OBJECT_CALL arg1, arg2)
     64 
     65 /* -----------------------------------------------------------------------------
     66  * pointers/data manipulation
     67  * ----------------------------------------------------------------------------- */
     68 
     69 /* For backward compatibility only */
     70 #define SWIG_POINTER_EXCEPTION  0
     71 
     72 #ifdef __cplusplus
     73 extern "C" {
     74 #endif
     75 
     76 #define SWIG_OWNER   SWIG_POINTER_OWN
     77 #define SWIG_SHADOW  SWIG_OWNER << 1
     78 
     79 #define SWIG_MAYBE_PERL_OBJECT SWIG_PERL_OBJECT_DECL
     80 
     81 /* SWIG Perl macros */
     82 
     83 /* Macro to declare an XS function */
     84 #ifndef XSPROTO
     85 #   define XSPROTO(name) void name(pTHX_ CV* cv)
     86 #endif
     87 
     88 /* Macro to call an XS function */
     89 #ifdef PERL_OBJECT
     90 #  define SWIG_CALLXS(_name) _name(cv,pPerl)
     91 #else
     92 #  ifndef MULTIPLICITY
     93 #    define SWIG_CALLXS(_name) _name(cv)
     94 #  else
     95 #    define SWIG_CALLXS(_name) _name(PERL_GET_THX, cv)
     96 #  endif
     97 #endif
     98 
     99 #ifdef PERL_OBJECT
    100 #define MAGIC_PPERL  CPerlObj *pPerl = (CPerlObj *) this;
    101 
    102 #ifdef __cplusplus
    103 extern "C" {
    104 #endif
    105 typedef int (CPerlObj::*SwigMagicFunc)(SV *, MAGIC *);
    106 #ifdef __cplusplus
    107 }
    108 #endif
    109 
    110 #define SWIG_MAGIC(a,b) (SV *a, MAGIC *b)
    111 #define SWIGCLASS_STATIC
    112 
    113 #else /* PERL_OBJECT */
    114 
    115 #define MAGIC_PPERL
    116 #define SWIGCLASS_STATIC static SWIGUNUSED
    117 
    118 #ifndef MULTIPLICITY
    119 #define SWIG_MAGIC(a,b) (SV *a, MAGIC *b)
    120 
    121 #ifdef __cplusplus
    122 extern "C" {
    123 #endif
    124 typedef int (*SwigMagicFunc)(SV *, MAGIC *);
    125 #ifdef __cplusplus
    126 }
    127 #endif
    128 
    129 #else /* MULTIPLICITY */
    130 
    131 #define SWIG_MAGIC(a,b) (struct interpreter *interp, SV *a, MAGIC *b)
    132 
    133 #ifdef __cplusplus
    134 extern "C" {
    135 #endif
    136 typedef int (*SwigMagicFunc)(struct interpreter *, SV *, MAGIC *);
    137 #ifdef __cplusplus
    138 }
    139 #endif
    140 
    141 #endif /* MULTIPLICITY */
    142 #endif /* PERL_OBJECT */
    143 
    144 #  ifdef PERL_OBJECT
    145 #    define SWIG_croak_null() SWIG_Perl_croak_null(pPerl)
    146 static void SWIG_Perl_croak_null(CPerlObj *pPerl)
    147 #  else
    148 static void SWIG_croak_null()
    149 #  endif
    150 {
    151   SV *err = get_sv("@", GV_ADD);
    152 #  if (PERL_VERSION < 6)
    153   croak("%_", err);
    154 #  else
    155   if (sv_isobject(err))
    156     croak(0);
    157   else
    158     croak("%s", SvPV_nolen(err));
    159 #  endif
    160 }
    161 
    162 
    163 /*
    164    Define how strict is the cast between strings and integers/doubles
    165    when overloading between these types occurs.
    166 
    167    The default is making it as strict as possible by using SWIG_AddCast
    168    when needed.
    169 
    170    You can use -DSWIG_PERL_NO_STRICT_STR2NUM at compilation time to
    171    disable the SWIG_AddCast, making the casting between string and
    172    numbers less strict.
    173 
    174    In the end, we try to solve the overloading between strings and
    175    numerical types in the more natural way, but if you can avoid it,
    176    well, avoid it using %rename, for example.
    177 */
    178 #ifndef SWIG_PERL_NO_STRICT_STR2NUM
    179 # ifndef SWIG_PERL_STRICT_STR2NUM
    180 #  define SWIG_PERL_STRICT_STR2NUM
    181 # endif
    182 #endif
    183 #ifdef SWIG_PERL_STRICT_STR2NUM
    184 /* string takes precedence */
    185 #define SWIG_Str2NumCast(x) SWIG_AddCast(x)
    186 #else
    187 /* number takes precedence */
    188 #define SWIG_Str2NumCast(x) x
    189 #endif
    190 
    191 
    192 
    193 #include <stdlib.h>
    194 
    195 SWIGRUNTIME const char *
    196 SWIG_Perl_TypeProxyName(const swig_type_info *type) {
    197   if (!type) return NULL;
    198   if (type->clientdata != NULL) {
    199     return (const char*) type->clientdata;
    200   }
    201   else {
    202     return type->name;
    203   }
    204 }
    205 
    206 /* Identical to SWIG_TypeCheck, except for strcmp comparison */
    207 SWIGRUNTIME swig_cast_info *
    208 SWIG_TypeProxyCheck(const char *c, swig_type_info *ty) {
    209   if (ty) {
    210     swig_cast_info *iter = ty->cast;
    211     while (iter) {
    212       if (strcmp(SWIG_Perl_TypeProxyName(iter->type), c) == 0) {
    213         if (iter == ty->cast)
    214           return iter;
    215         /* Move iter to the top of the linked list */
    216         iter->prev->next = iter->next;
    217         if (iter->next)
    218           iter->next->prev = iter->prev;
    219         iter->next = ty->cast;
    220         iter->prev = 0;
    221         if (ty->cast) ty->cast->prev = iter;
    222         ty->cast = iter;
    223         return iter;
    224       }
    225       iter = iter->next;
    226     }
    227   }
    228   return 0;
    229 }
    230 
    231 /* Function for getting a pointer value */
    232 
    233 SWIGRUNTIME int
    234 SWIG_Perl_ConvertPtrAndOwn(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags, int *own) {
    235   swig_cast_info *tc;
    236   void *voidptr = (void *)0;
    237   SV *tsv = 0;
    238 
    239   if (own)
    240     *own = 0;
    241 
    242   /* If magical, apply more magic */
    243   if (SvGMAGICAL(sv))
    244     mg_get(sv);
    245 
    246   /* Check to see if this is an object */
    247   if (sv_isobject(sv)) {
    248     IV tmp = 0;
    249     tsv = (SV*) SvRV(sv);
    250     if ((SvTYPE(tsv) == SVt_PVHV)) {
    251       MAGIC *mg;
    252       if (SvMAGICAL(tsv)) {
    253         mg = mg_find(tsv,'P');
    254         if (mg) {
    255           sv = mg->mg_obj;
    256           if (sv_isobject(sv)) {
    257 	    tsv = (SV*)SvRV(sv);
    258             tmp = SvIV(tsv);
    259           }
    260         }
    261       } else {
    262         return SWIG_ERROR;
    263       }
    264     } else {
    265       tmp = SvIV(tsv);
    266     }
    267     voidptr = INT2PTR(void *,tmp);
    268   } else if (! SvOK(sv)) {            /* Check for undef */
    269     *(ptr) = (void *) 0;
    270     return SWIG_OK;
    271   } else if (SvTYPE(sv) == SVt_RV) {  /* Check for NULL pointer */
    272     if (!SvROK(sv)) {
    273       /* In Perl 5.12 and later, SVt_RV == SVt_IV, so sv could be a valid integer value.  */
    274       if (SvIOK(sv)) {
    275         return SWIG_ERROR;
    276       } else {
    277         /* NULL pointer (reference to undef). */
    278         *(ptr) = (void *) 0;
    279         return SWIG_OK;
    280       }
    281     } else {
    282       return SWIG_ERROR;
    283     }
    284   } else {                            /* Don't know what it is */
    285     return SWIG_ERROR;
    286   }
    287   if (_t) {
    288     /* Now see if the types match */
    289     char *_c = HvNAME(SvSTASH(SvRV(sv)));
    290     tc = SWIG_TypeProxyCheck(_c,_t);
    291     if (!tc) {
    292       return SWIG_ERROR;
    293     }
    294     {
    295       int newmemory = 0;
    296       *ptr = SWIG_TypeCast(tc,voidptr,&newmemory);
    297       if (newmemory == SWIG_CAST_NEW_MEMORY) {
    298         assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */
    299         if (own)
    300           *own = *own | SWIG_CAST_NEW_MEMORY;
    301       }
    302     }
    303   } else {
    304     *ptr = voidptr;
    305   }
    306 
    307   /*
    308    *  DISOWN implementation: we need a perl guru to check this one.
    309    */
    310   if (tsv && (flags & SWIG_POINTER_DISOWN)) {
    311     /*
    312      *  almost copy paste code from below SWIG_POINTER_OWN setting
    313      */
    314     SV *obj = sv;
    315     HV *stash = SvSTASH(SvRV(obj));
    316     GV *gv = *(GV**)hv_fetch(stash, "OWNER", 5, TRUE);
    317     if (isGV(gv)) {
    318       HV *hv = GvHVn(gv);
    319       /*
    320        * To set ownership (see below), a newSViv(1) entry is added.
    321        * Hence, to remove ownership, we delete the entry.
    322        */
    323       if (hv_exists_ent(hv, obj, 0)) {
    324 	hv_delete_ent(hv, obj, 0, 0);
    325       }
    326     }
    327   }
    328   return SWIG_OK;
    329 }
    330 
    331 SWIGRUNTIME int
    332 SWIG_Perl_ConvertPtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags) {
    333   return SWIG_Perl_ConvertPtrAndOwn(sv, ptr, _t, flags, 0);
    334 }
    335 
    336 SWIGRUNTIME void
    337 SWIG_Perl_MakePtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, swig_type_info *t, int flags) {
    338   if (ptr && (flags & (SWIG_SHADOW | SWIG_POINTER_OWN))) {
    339     SV *self;
    340     SV *obj=newSV(0);
    341     HV *hash=newHV();
    342     HV *stash;
    343     sv_setref_pv(obj, SWIG_Perl_TypeProxyName(t), ptr);
    344     stash=SvSTASH(SvRV(obj));
    345     if (flags & SWIG_POINTER_OWN) {
    346       HV *hv;
    347       GV *gv = *(GV**)hv_fetch(stash, "OWNER", 5, TRUE);
    348       if (!isGV(gv))
    349         gv_init(gv, stash, "OWNER", 5, FALSE);
    350       hv=GvHVn(gv);
    351       hv_store_ent(hv, obj, newSViv(1), 0);
    352     }
    353     sv_magic((SV *)hash, (SV *)obj, 'P', Nullch, 0);
    354     SvREFCNT_dec(obj);
    355     self=newRV_noinc((SV *)hash);
    356     sv_setsv(sv, self);
    357     SvREFCNT_dec((SV *)self);
    358     sv_bless(sv, stash);
    359   }
    360   else {
    361     sv_setref_pv(sv, SWIG_Perl_TypeProxyName(t), ptr);
    362   }
    363 }
    364 
    365 SWIGRUNTIMEINLINE SV *
    366 SWIG_Perl_NewPointerObj(SWIG_MAYBE_PERL_OBJECT void *ptr, swig_type_info *t, int flags) {
    367   SV *result = sv_newmortal();
    368   SWIG_MakePtr(result, ptr, t, flags);
    369   return result;
    370 }
    371 
    372 SWIGRUNTIME void
    373 SWIG_Perl_MakePackedObj(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, int sz, swig_type_info *type) {
    374   char result[1024];
    375   char *r = result;
    376   if ((2*sz + 1 + strlen(SWIG_Perl_TypeProxyName(type))) > 1000) return;
    377   *(r++) = '_';
    378   r = SWIG_PackData(r,ptr,sz);
    379   strcpy(r,SWIG_Perl_TypeProxyName(type));
    380   sv_setpv(sv, result);
    381 }
    382 
    383 SWIGRUNTIME SV *
    384 SWIG_Perl_NewPackedObj(SWIG_MAYBE_PERL_OBJECT void *ptr, int sz, swig_type_info *type) {
    385   SV *result = sv_newmortal();
    386   SWIG_Perl_MakePackedObj(result, ptr, sz, type);
    387   return result;
    388 }
    389 
    390 /* Convert a packed value value */
    391 SWIGRUNTIME int
    392 SWIG_Perl_ConvertPacked(SWIG_MAYBE_PERL_OBJECT SV *obj, void *ptr, int sz, swig_type_info *ty) {
    393   swig_cast_info *tc;
    394   const char  *c = 0;
    395 
    396   if ((!obj) || (!SvOK(obj))) return SWIG_ERROR;
    397   c = SvPV_nolen(obj);
    398   /* Pointer values must start with leading underscore */
    399   if (*c != '_') return SWIG_ERROR;
    400   c++;
    401   c = SWIG_UnpackData(c,ptr,sz);
    402   if (ty) {
    403     tc = SWIG_TypeCheck(c,ty);
    404     if (!tc) return SWIG_ERROR;
    405   }
    406   return SWIG_OK;
    407 }
    408 
    409 
    410 /* Macros for low-level exception handling */
    411 #define SWIG_croak(x)    { SWIG_Error(SWIG_RuntimeError, x); SWIG_fail; }
    412 
    413 
    414 typedef XSPROTO(SwigPerlWrapper);
    415 typedef SwigPerlWrapper *SwigPerlWrapperPtr;
    416 
    417 /* Structure for command table */
    418 typedef struct {
    419   const char         *name;
    420   SwigPerlWrapperPtr  wrapper;
    421 } swig_command_info;
    422 
    423 /* Information for constant table */
    424 
    425 #define SWIG_INT     1
    426 #define SWIG_FLOAT   2
    427 #define SWIG_STRING  3
    428 #define SWIG_POINTER 4
    429 #define SWIG_BINARY  5
    430 
    431 /* Constant information structure */
    432 typedef struct swig_constant_info {
    433     int              type;
    434     const char      *name;
    435     long             lvalue;
    436     double           dvalue;
    437     void            *pvalue;
    438     swig_type_info **ptype;
    439 } swig_constant_info;
    440 
    441 
    442 /* Structure for variable table */
    443 typedef struct {
    444   const char   *name;
    445   SwigMagicFunc   set;
    446   SwigMagicFunc   get;
    447   swig_type_info  **type;
    448 } swig_variable_info;
    449 
    450 /* Magic variable code */
    451 #ifndef PERL_OBJECT
    452 # ifdef __cplusplus
    453 #  define swig_create_magic(s,a,b,c) _swig_create_magic(s,const_cast<char*>(a),b,c)
    454 # else
    455 #  define swig_create_magic(s,a,b,c) _swig_create_magic(s,(char*)(a),b,c)
    456 # endif
    457 # ifndef MULTIPLICITY
    458 SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(SV *, MAGIC *), int (*get)(SV *,MAGIC *))
    459 # else
    460 SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(struct interpreter*, SV *, MAGIC *), int (*get)(struct interpreter*, SV *,MAGIC *))
    461 # endif
    462 #else
    463 #  define swig_create_magic(s,a,b,c) _swig_create_magic(pPerl,s,a,b,c)
    464 SWIGRUNTIME void _swig_create_magic(CPerlObj *pPerl, SV *sv, const char *name, int (CPerlObj::*set)(SV *, MAGIC *), int (CPerlObj::*get)(SV *, MAGIC *))
    465 #endif
    466 {
    467   MAGIC *mg;
    468   sv_magic(sv,sv,'U',name,strlen(name));
    469   mg = mg_find(sv,'U');
    470   mg->mg_virtual = (MGVTBL *) malloc(sizeof(MGVTBL));
    471   mg->mg_virtual->svt_get = (SwigMagicFunc) get;
    472   mg->mg_virtual->svt_set = (SwigMagicFunc) set;
    473   mg->mg_virtual->svt_len = 0;
    474   mg->mg_virtual->svt_clear = 0;
    475   mg->mg_virtual->svt_free = 0;
    476 }
    477 
    478 
    479 SWIGRUNTIME swig_module_info *
    480 SWIG_Perl_GetModule(void *SWIGUNUSEDPARM(clientdata)) {
    481   static void *type_pointer = (void *)0;
    482   SV *pointer;
    483 
    484   /* first check if pointer already created */
    485   if (!type_pointer) {
    486     pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, FALSE | GV_ADDMULTI);
    487     if (pointer && SvOK(pointer)) {
    488       type_pointer = INT2PTR(swig_type_info **, SvIV(pointer));
    489     }
    490   }
    491 
    492   return (swig_module_info *) type_pointer;
    493 }
    494 
    495 SWIGRUNTIME void
    496 SWIG_Perl_SetModule(swig_module_info *module) {
    497   SV *pointer;
    498 
    499   /* create a new pointer */
    500   pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, TRUE | GV_ADDMULTI);
    501   sv_setiv(pointer, PTR2IV(module));
    502 }
    503 
    504 #ifdef __cplusplus
    505 }
    506 #endif
    507