[PHP] When wrapping a returned resource as an object, check if all
cases wrap it in the same class, and if so eliminate the pointless switch statement wrapper we previously generated.
This commit is contained in:
parent
63927da3cb
commit
b3003f1f9f
2 changed files with 37 additions and 10 deletions
|
|
@ -5,6 +5,11 @@ See the RELEASENOTES file for a summary of changes in each release.
|
|||
Version 3.0.5 (in progress)
|
||||
===========================
|
||||
|
||||
2015-01-23: olly
|
||||
[PHP] When wrapping a returned resource as an object, check if all
|
||||
cases wrap it in the same class, and if so eliminate the pointless
|
||||
switch statement wrapper we previously generated.
|
||||
|
||||
2015-01-22: wsfulton
|
||||
[Octave] Merge patch #297 for SF bug #1277 - Octave shared_ptr support
|
||||
|
||||
|
|
|
|||
|
|
@ -1731,7 +1731,8 @@ public:
|
|||
}
|
||||
} else {
|
||||
Printf(output, "\t\tif (!is_resource($r)) return $r;\n");
|
||||
Printf(output, "\t\tswitch (get_resource_type($r)) {\n");
|
||||
String *wrapobj = NULL;
|
||||
String *common = NULL;
|
||||
Iterator i = First(ret_types);
|
||||
while (i.item) {
|
||||
SwigType *ret_type = i.item;
|
||||
|
|
@ -1751,22 +1752,43 @@ public:
|
|||
continue;
|
||||
}
|
||||
}
|
||||
Printf(output, "\t\t");
|
||||
if (i.item) {
|
||||
Printf(output, "case '%s': ", mangled);
|
||||
} else {
|
||||
Printf(output, "default: ");
|
||||
}
|
||||
const char *classname = GetChar(class_node, "sym:name");
|
||||
if (!classname)
|
||||
classname = GetChar(class_node, "name");
|
||||
String * action = NewStringEmpty();
|
||||
if (classname)
|
||||
Printf(output, "return new %s%s($r);\n", prefix, classname);
|
||||
Printf(action, "return new %s%s($r);\n", prefix, classname);
|
||||
else
|
||||
Printf(output, "return $r;\n");
|
||||
Printf(action, "return $r;\n");
|
||||
if (!wrapobj) {
|
||||
wrapobj = NewString("\t\tswitch (get_resource_type($r)) {\n");
|
||||
common = action;
|
||||
} else {
|
||||
if (common && Cmp(common, action) != 0) {
|
||||
Delete(common);
|
||||
common = NULL;
|
||||
}
|
||||
}
|
||||
Printf(wrapobj, "\t\t");
|
||||
if (i.item) {
|
||||
Printf(wrapobj, "case '%s': ", mangled);
|
||||
} else {
|
||||
Printf(wrapobj, "default: ");
|
||||
}
|
||||
Printv(wrapobj, action, NIL);
|
||||
if (action != common) Delete(action);
|
||||
Delete(mangled);
|
||||
}
|
||||
Printf(output, "\t\t}\n");
|
||||
Printf(wrapobj, "\t\t}\n");
|
||||
if (common) {
|
||||
// All cases have the same action, so eliminate the switch
|
||||
// wrapper.
|
||||
Printf(output, "\t\t%s", common);
|
||||
Delete(common);
|
||||
} else {
|
||||
Printv(output, wrapobj, NIL);
|
||||
}
|
||||
Delete(wrapobj);
|
||||
}
|
||||
} else {
|
||||
if (non_void_return) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue