Hi internals ! I came into a problem when writing an IDL to PHP5 language mapping specification and an IDL to PHP5 language compiler. I'm using the community OpenORB IDL-to-Java compiler as a base for writing the IDL-to-PHP5 compiler, in fact, it is a translation from Java to PHP5. Everything is ok except the "finally" clause wich doesn't exists in Zend Engine 2. I know that many of you think that "finally" is useless but consider this case, and if anyone have a simple and elegant solution without implementing "finally" I'll be glad to listen. The code would be like this if we had finally: <? ... $_input = null; try { $_output = $this->_request('bind',true); org__omg__CosNaming__NameHelper::write($_output,$n); $_output->write_Object($obj); $_input = $this->_invoke($_output); return; } catch(org__omg__CORBA__portable__RemarshalException $_exception) { continue; } catch(org__omg__CORBA__portable__ApplicationException $_exception) { $_exception_id = $_exception->getId(); if ($_exception_id == org__omg__CosNaming__NamingContextPackage__NotFoundHelper::id()) { throw org__omg__CosNaming__NamingContextPackage__NotFoundHelper::read($_exception- >getInputStream()); } if ($_exception_id == org__omg__CosNaming__NamingContextPackage__CannotProceedHelper::id()) { throw org__omg__CosNaming__NamingContextPackage__CannotProceedHelper::read($_excep tion->getInputStream()); } if ($_exception_id == org__omg__CosNaming__NamingContextPackage__InvalidNameHelper::id()) { throw org__omg__CosNaming__NamingContextPackage__InvalidNameHelper::read($_excepti on->getInputStream()); } if ($_exception_id == org__omg__CosNaming__NamingContextPackage__AlreadyBoundHelper::id()) { throw org__omg__CosNaming__NamingContextPackage__AlreadyBoundHelper::read($_except ion->getInputStream()); } throw new org__omg__CORBA__UNKNOWN("Unexpected User Exception: $_exception_id"); } catch(Exception $_exception) { throw $_exception; } finally { $this->_releaseReply($_input); } ... ?>
Since we don't have finally, the current code is: <? ... $_input = null; try { $_output = $this->_request('bind',true); org__omg__CosNaming__NameHelper::write($_output,$n); $_output->write_Object($obj); $_input = $this->_invoke($_output); $this->_releaseReply($_input); //PHP still does not have FINALLY !!! return; } catch(org__omg__CORBA__portable__RemarshalException $_exception) { $this->_releaseReply($_input); //PHP still does not have FINALLY !!! continue; } catch(org__omg__CORBA__portable__ApplicationException $_exception) { $_exception_id = $_exception->getId(); if ($_exception_id == org__omg__CosNaming__NamingContextPackage__NotFoundHelper::id()) { $this->_releaseReply($_input); //PHP still does not have FINALLY !!! throw org__omg__CosNaming__NamingContextPackage__NotFoundHelper::read($_exception- >getInputStream()); } if ($_exception_id == org__omg__CosNaming__NamingContextPackage__CannotProceedHelper::id()) { $this->_releaseReply($_input); //PHP still does not have FINALLY !!! throw org__omg__CosNaming__NamingContextPackage__CannotProceedHelper::read($_excep tion->getInputStream()); } if ($_exception_id == org__omg__CosNaming__NamingContextPackage__InvalidNameHelper::id()) { $this->_releaseReply($_input); //PHP still does not have FINALLY !!! throw org__omg__CosNaming__NamingContextPackage__InvalidNameHelper::read($_excepti on->getInputStream()); } if ($_exception_id == org__omg__CosNaming__NamingContextPackage__AlreadyBoundHelper::id()) { $this->_releaseReply($_input); //PHP still does not have FINALLY !!! throw org__omg__CosNaming__NamingContextPackage__AlreadyBoundHelper::read($_except ion->getInputStream()); } $this->_releaseReply($_input); //PHP still does not have FINALLY !!! throw new org__omg__CORBA__UNKNOWN("Unexpected User Exception: $_exception_id"); } catch(Exception $_exception) { $this->_releaseReply($_input); //PHP still does not have FINALLY !!! throw $_exception; } $this->_releaseReply($_input); //PHP still does not have FINALLY !!! ... ?> IMHO, I think that replicating the finally code at the end of every catch block, before every throw/return statement and at the end of the try/catch statement justify the need of "finally". If there is another aproach without "finally" and without code redundancy, I really need it. Best Regards, Cristiano Duarte -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php