Major refactoring of DOH List/Hash iterators. See CHANGES

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@5101 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Dave Beazley 2003-09-11 20:26:57 +00:00
commit 8ae4c60d39
35 changed files with 657 additions and 636 deletions

View file

@ -143,15 +143,17 @@ static const char *php_header =
void
SwigPHP_emit_resource_registrations() {
DOH *key;
Iterator ki;
String *destructor=0;
String *classname=0;
String *shadow_classname=0;
if (!zend_types) return;
key = Firstkey(zend_types);
if (key) Printf(s_oinit,"\n/* Register resource destructors for pointer types */\n");
while (key) if (1 /* is pointer type*/) {
ki = First(zend_types);
if (ki.key) Printf(s_oinit,"\n/* Register resource destructors for pointer types */\n");
while (ki.key) if (1 /* is pointer type*/) {
key = ki.key;
Node *class_node;
if ((class_node=Getattr(zend_types,key))) {
// Write out destructor function header
@ -187,7 +189,7 @@ SwigPHP_emit_resource_registrations() {
Printf(s_oinit,"SWIG_TypeClientData(SWIGTYPE%s,&le_swig_%s);\n",
key,key);
}
key = Nextkey(zend_types);
ki = Next(ki);
}
}
@ -1458,24 +1460,23 @@ public:
if(baselist) {
int class_count = 0;
Node *base = Firstitem(baselist);
Iterator base = First(baselist);
while(base.item && Getattr(base.item,"feature:ignore")) base = Next(base);
while(base && Getattr(base,"feature:ignore")) base = Nextitem(baselist);
if (base && is_shadow(Getattr(base, "name"))) {
if (base.item && is_shadow(Getattr(base.item, "name"))) {
class_count++;
Printf(this_shadow_baseclass, "%s", Getattr(base, "name"));
Printf(this_shadow_baseclass, "%s", Getattr(base.item, "name"));
}
if (base) for(base = Nextitem(baselist); base; base = Nextitem(baselist)) {
if (Getattr(base,"feature:ignore")) continue;
if(is_shadow(Getattr(base, "name"))) {
if (base.item) for(base = Next(base); base.item; base = Next(base)) {
if (Getattr(base.item,"feature:ignore")) continue;
if(is_shadow(Getattr(base.item, "name"))) {
class_count++;
Printf(this_shadow_multinherit, "%s ", Getattr(base, "name"));
Printf(this_shadow_multinherit, "%s ", Getattr(base.item, "name"));
}
}
if(class_count > 1) Printf(stderr, "Error: %s inherits from multiple base classes(%s %s). Multiple inheritance is not directly supported by PHP4, SWIG may support it at some point in the future.\n", shadow_classname, base, this_shadow_multinherit);
if(class_count > 1) Printf(stderr, "Error: %s inherits from multiple base classes(%s %s). Multiple inheritance is not directly supported by PHP4, SWIG may support it at some point in the future.\n", shadow_classname, base.item, this_shadow_multinherit);
}
/* Write out class init code */
@ -1493,7 +1494,8 @@ public:
String *s_propget=NewString("");
String *s_propset=NewString("");
List *baselist = Getattr(n, "bases");
Node *base = NULL;
Iterator ki, base;
// If no constructor was generated (abstract class) we had better
// generate a constructor that raises an error about instantiating
@ -1526,20 +1528,22 @@ public:
Printf(s_header,"static int _propset_%s(zend_property_reference *property_reference, pval *value);\n", shadow_classname);
Printf(s_propset,"static int _propset_%s(zend_property_reference *property_reference, pval *value) {\n", shadow_classname);
if (baselist) base=Firstitem(baselist);
else base=NULL;
while(base && Getattr(base,"feature:ignore")) base = Nextitem(baselist);
key = Firstkey(shadow_set_vars);
if (baselist) base=First(baselist);
else base.item = NULL;
while(base.item && Getattr(base.item,"feature:ignore")) base = Next(base);
ki = First(shadow_set_vars);
key = ki.key;
// Print function header; we only need to find property name if there
// are properties for this class to look up...
if (key || ! base) { // or if we are base class and set it ourselves
if (key || ! base.item) { // or if we are base class and set it ourselves
Printf(s_propset," /* get the property name */\n"
" zend_llist_element *element = property_reference->elements_list->head;\n"
" zend_overloaded_element *property=(zend_overloaded_element *)element->data;\n"
" char *propname=Z_STRVAL_P(&(property->element));\n");
} else {
if (base) {
if (base.item) {
Printf(s_propset," /* No extra properties for subclass %s */\n",shadow_classname);
} else {
Printf(s_propset," /* No properties for base class %s */\n",shadow_classname);
@ -1547,27 +1551,28 @@ public:
}
scount=0;
while (key) {
while (ki.key) {
key = ki.key;
if (scount++) Printf(s_propset," else");
Printf(s_propset," if (strcmp(propname,\"%s\")==0) {\n"
" return _wrap_%s(property_reference, value);\n"
" }",Getattr(shadow_set_vars,key),key);
key=Nextkey(shadow_set_vars);
ki=Next(ki);
}
if (scount) Printf(s_propset," else");
// If there is a base class then chain it's handler else set directly
// try each base class handler, else set directly...
if (base) {
if (base.item) {
Printf(s_propset, " {\n /* chain to base class */\n");
while(base) {
while(base.item) {
Printf(s_propset," if (_propset_%s(property_reference, value)==SUCCESS) return SUCCESS;\n",
GetChar(base, "sym:name"));
GetChar(base.item, "sym:name"));
base=Nextitem(baselist);
while (base && Getattr(base,"feature:ignore")) base=Nextitem(baselist);
base=Next(base);
while (base.item && Getattr(base.item,"feature:ignore")) base=Next(base);
}
Printf(s_propset," }\n");
}
@ -1597,20 +1602,22 @@ public:
Printf(s_header,"static int _propget_%s(zend_property_reference *property_reference, pval *value);\n", shadow_classname);
Printf(s_propget,"static int _propget_%s(zend_property_reference *property_reference, pval *value) {\n", shadow_classname);
if (baselist) base=Firstitem(baselist);
else base=NULL;
while(base && Getattr(base,"feature:ignore")) base = Nextitem(baselist);
key = Firstkey(shadow_get_vars);
if (baselist) base=First(baselist);
else base.item=NULL;
while(base.item && Getattr(base.item,"feature:ignore")) base = Next(base);
ki = First(shadow_get_vars);
key = ki.key;
// Print function header; we only need to find property name if there
// are properties for this class to look up...
if (key || !base ) { // or if we are base class...
if (key || !base.item ) { // or if we are base class...
Printf(s_propget," /* get the property name */\n"
" zend_llist_element *element = property_reference->elements_list->head;\n"
" zend_overloaded_element *property=(zend_overloaded_element *)element->data;\n"
" char *propname=Z_STRVAL_P(&(property->element));\n");
} else {
if (base) {
if (base.item) {
Printf(s_propget," /* No extra properties for subclass %s */\n",shadow_classname);
} else {
Printf(s_propget," /* No properties for base class %s */\n",shadow_classname);
@ -1618,27 +1625,28 @@ public:
}
gcount=0;
while (key) {
while (ki.key) {
key = ki.key;
if (gcount++) Printf(s_propget," else");
Printf(s_propget," if (strcmp(propname,\"%s\")==0) {\n"
" *value=_wrap_%s(property_reference);\n"
" return SUCCESS;\n"
" }",Getattr(shadow_get_vars,key),key);
key=Nextkey(shadow_get_vars);
ki=Next(ki);
}
if (gcount) Printf(s_propget," else");
// If there is a base class then chain it's handler else return null
if (base) {
if (base.item) {
Printf(s_propget, " {\n /* chain to base class */\n");
while(base) {
while(base.item) {
Printf(s_propget," if (_propget_%s(property_reference, value)==SUCCESS) return SUCCESS;\n",
GetChar(base, "sym:name"));
GetChar(base.item, "sym:name"));
base=Nextitem(baselist);
while (base && Getattr(base,"feature:ignore")) base=Nextitem(baselist);
base=Next(base);
while (base.item && Getattr(base.item,"feature:ignore")) base=Next(base);
}
Printf(s_propget," }\n");
}
@ -1651,13 +1659,13 @@ public:
Printv(s_wrappers,s_propget,s_propset,NIL);
// Save class in class table
if (baselist) base=Firstitem(baselist);
else base=NULL;
while(base && Getattr(base,"feature:ignore")) base = Nextitem(baselist);
if (baselist) base=First(baselist);
else base.item=NULL;
while(base.item && Getattr(base.item,"feature:ignore")) base = Next(base);
if (base) {
if (base.item) {
Printf(s_oinit,"if (! (ptr_ce_swig_%s=zend_register_internal_class_ex(&ce_swig_%s,&ce_swig_%s,NULL))) zend_error(E_ERROR,\"Error registering wrapper for class %s\");\n",
shadow_classname,shadow_classname,GetChar(base, "sym:name"), shadow_classname);
shadow_classname,shadow_classname,GetChar(base.item, "sym:name"), shadow_classname);
} else {
Printf(s_oinit,"if (! (ptr_ce_swig_%s=zend_register_internal_class_ex(&ce_swig_%s,NULL,NULL))) zend_error(E_ERROR,\"Error registering wrapper for class %s\");\n",
shadow_classname,shadow_classname, shadow_classname);