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

Reply via email to