| Index: swig/Lib/swiginit.swg
|
| ===================================================================
|
| --- swig/Lib/swiginit.swg (revision 0)
|
| +++ swig/Lib/swiginit.swg (revision 0)
|
| @@ -0,0 +1,236 @@
|
| +/* -----------------------------------------------------------------------------
|
| + * Type initialization:
|
| + * This problem is tough by the requirement that no dynamic
|
| + * memory is used. Also, since swig_type_info structures store pointers to
|
| + * swig_cast_info structures and swig_cast_info structures store pointers back
|
| + * to swig_type_info structures, we need some lookup code at initialization.
|
| + * The idea is that swig generates all the structures that are needed.
|
| + * The runtime then collects these partially filled structures.
|
| + * The SWIG_InitializeModule function takes these initial arrays out of
|
| + * swig_module, and does all the lookup, filling in the swig_module.types
|
| + * array with the correct data and linking the correct swig_cast_info
|
| + * structures together.
|
| + *
|
| + * The generated swig_type_info structures are assigned staticly to an initial
|
| + * array. We just loop through that array, and handle each type individually.
|
| + * First we lookup if this type has been already loaded, and if so, use the
|
| + * loaded structure instead of the generated one. Then we have to fill in the
|
| + * cast linked list. The cast data is initially stored in something like a
|
| + * two-dimensional array. Each row corresponds to a type (there are the same
|
| + * number of rows as there are in the swig_type_initial array). Each entry in
|
| + * a column is one of the swig_cast_info structures for that type.
|
| + * The cast_initial array is actually an array of arrays, because each row has
|
| + * a variable number of columns. So to actually build the cast linked list,
|
| + * we find the array of casts associated with the type, and loop through it
|
| + * adding the casts to the list. The one last trick we need to do is making
|
| + * sure the type pointer in the swig_cast_info struct is correct.
|
| + *
|
| + * First off, we lookup the cast->type name to see if it is already loaded.
|
| + * There are three cases to handle:
|
| + * 1) If the cast->type has already been loaded AND the type we are adding
|
| + * casting info to has not been loaded (it is in this module), THEN we
|
| + * replace the cast->type pointer with the type pointer that has already
|
| + * been loaded.
|
| + * 2) If BOTH types (the one we are adding casting info to, and the
|
| + * cast->type) are loaded, THEN the cast info has already been loaded by
|
| + * the previous module so we just ignore it.
|
| + * 3) Finally, if cast->type has not already been loaded, then we add that
|
| + * swig_cast_info to the linked list (because the cast->type) pointer will
|
| + * be correct.
|
| + * ----------------------------------------------------------------------------- */
|
| +
|
| +#ifdef __cplusplus
|
| +extern "C" {
|
| +#if 0
|
| +} /* c-mode */
|
| +#endif
|
| +#endif
|
| +
|
| +#if 0
|
| +#define SWIGRUNTIME_DEBUG
|
| +#endif
|
| +
|
| +
|
| +SWIGRUNTIME void
|
| +SWIG_InitializeModule(void *clientdata) {
|
| + size_t i;
|
| + swig_module_info *module_head, *iter;
|
| + int found, init;
|
| +
|
| + clientdata = clientdata;
|
| +
|
| + /* check to see if the circular list has been setup, if not, set it up */
|
| + if (swig_module.next==0) {
|
| + /* Initialize the swig_module */
|
| + swig_module.type_initial = swig_type_initial;
|
| + swig_module.cast_initial = swig_cast_initial;
|
| + swig_module.next = &swig_module;
|
| + init = 1;
|
| + } else {
|
| + init = 0;
|
| + }
|
| +
|
| + /* Try and load any already created modules */
|
| + module_head = SWIG_GetModule(clientdata);
|
| + if (!module_head) {
|
| + /* This is the first module loaded for this interpreter */
|
| + /* so set the swig module into the interpreter */
|
| + SWIG_SetModule(clientdata, &swig_module);
|
| + module_head = &swig_module;
|
| + } else {
|
| + /* the interpreter has loaded a SWIG module, but has it loaded this one? */
|
| + found=0;
|
| + iter=module_head;
|
| + do {
|
| + if (iter==&swig_module) {
|
| + found=1;
|
| + break;
|
| + }
|
| + iter=iter->next;
|
| + } while (iter!= module_head);
|
| +
|
| + /* if the is found in the list, then all is done and we may leave */
|
| + if (found) return;
|
| + /* otherwise we must add out module into the list */
|
| + swig_module.next = module_head->next;
|
| + module_head->next = &swig_module;
|
| + }
|
| +
|
| + /* When multiple interpeters are used, a module could have already been initialized in
|
| + a different interpreter, but not yet have a pointer in this interpreter.
|
| + In this case, we do not want to continue adding types... everything should be
|
| + set up already */
|
| + if (init == 0) return;
|
| +
|
| + /* Now work on filling in swig_module.types */
|
| +#ifdef SWIGRUNTIME_DEBUG
|
| + printf("SWIG_InitializeModule: size %d\n", swig_module.size);
|
| +#endif
|
| + for (i = 0; i < swig_module.size; ++i) {
|
| + swig_type_info *type = 0;
|
| + swig_type_info *ret;
|
| + swig_cast_info *cast;
|
| +
|
| +#ifdef SWIGRUNTIME_DEBUG
|
| + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
|
| +#endif
|
| +
|
| + /* if there is another module already loaded */
|
| + if (swig_module.next != &swig_module) {
|
| + type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name);
|
| + }
|
| + if (type) {
|
| + /* Overwrite clientdata field */
|
| +#ifdef SWIGRUNTIME_DEBUG
|
| + printf("SWIG_InitializeModule: found type %s\n", type->name);
|
| +#endif
|
| + if (swig_module.type_initial[i]->clientdata) {
|
| + type->clientdata = swig_module.type_initial[i]->clientdata;
|
| +#ifdef SWIGRUNTIME_DEBUG
|
| + printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name);
|
| +#endif
|
| + }
|
| + } else {
|
| + type = swig_module.type_initial[i];
|
| + }
|
| +
|
| + /* Insert casting types */
|
| + cast = swig_module.cast_initial[i];
|
| + while (cast->type) {
|
| +
|
| + /* Don't need to add information already in the list */
|
| + ret = 0;
|
| +#ifdef SWIGRUNTIME_DEBUG
|
| + printf("SWIG_InitializeModule: look cast %s\n", cast->type->name);
|
| +#endif
|
| + if (swig_module.next != &swig_module) {
|
| + ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name);
|
| +#ifdef SWIGRUNTIME_DEBUG
|
| + if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name);
|
| +#endif
|
| + }
|
| + if (ret) {
|
| + if (type == swig_module.type_initial[i]) {
|
| +#ifdef SWIGRUNTIME_DEBUG
|
| + printf("SWIG_InitializeModule: skip old type %s\n", ret->name);
|
| +#endif
|
| + cast->type = ret;
|
| + ret = 0;
|
| + } else {
|
| + /* Check for casting already in the list */
|
| + swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type);
|
| +#ifdef SWIGRUNTIME_DEBUG
|
| + if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name);
|
| +#endif
|
| + if (!ocast) ret = 0;
|
| + }
|
| + }
|
| +
|
| + if (!ret) {
|
| +#ifdef SWIGRUNTIME_DEBUG
|
| + printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name);
|
| +#endif
|
| + if (type->cast) {
|
| + type->cast->prev = cast;
|
| + cast->next = type->cast;
|
| + }
|
| + type->cast = cast;
|
| + }
|
| + cast++;
|
| + }
|
| + /* Set entry in modules->types array equal to the type */
|
| + swig_module.types[i] = type;
|
| + }
|
| + swig_module.types[i] = 0;
|
| +
|
| +#ifdef SWIGRUNTIME_DEBUG
|
| + printf("**** SWIG_InitializeModule: Cast List ******\n");
|
| + for (i = 0; i < swig_module.size; ++i) {
|
| + int j = 0;
|
| + swig_cast_info *cast = swig_module.cast_initial[i];
|
| + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
|
| + while (cast->type) {
|
| + printf("SWIG_InitializeModule: cast type %s\n", cast->type->name);
|
| + cast++;
|
| + ++j;
|
| + }
|
| + printf("---- Total casts: %d\n",j);
|
| + }
|
| + printf("**** SWIG_InitializeModule: Cast List ******\n");
|
| +#endif
|
| +}
|
| +
|
| +/* This function will propagate the clientdata field of type to
|
| +* any new swig_type_info structures that have been added into the list
|
| +* of equivalent types. It is like calling
|
| +* SWIG_TypeClientData(type, clientdata) a second time.
|
| +*/
|
| +SWIGRUNTIME void
|
| +SWIG_PropagateClientData(void) {
|
| + size_t i;
|
| + swig_cast_info *equiv;
|
| + static int init_run = 0;
|
| +
|
| + if (init_run) return;
|
| + init_run = 1;
|
| +
|
| + for (i = 0; i < swig_module.size; i++) {
|
| + if (swig_module.types[i]->clientdata) {
|
| + equiv = swig_module.types[i]->cast;
|
| + while (equiv) {
|
| + if (!equiv->converter) {
|
| + if (equiv->type && !equiv->type->clientdata)
|
| + SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata);
|
| + }
|
| + equiv = equiv->next;
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| +#ifdef __cplusplus
|
| +#if 0
|
| +{ /* c-mode */
|
| +#endif
|
| +}
|
| +#endif
|
|
|