diff options
author | Michi Henning <michi@zeroc.com> | 2003-05-23 08:07:40 +0000 |
---|---|---|
committer | Michi Henning <michi@zeroc.com> | 2003-05-23 08:07:40 +0000 |
commit | 5c89803b442f059bd7444b286adb3e0a1c4afeca (patch) | |
tree | e79bae21964782dc9a89df7ae2d0985caa822c26 /cpp/src/slice2cpp | |
parent | VC70 install improvements (diff) | |
download | ice-5c89803b442f059bd7444b286adb3e0a1c4afeca.tar.bz2 ice-5c89803b442f059bd7444b286adb3e0a1c4afeca.tar.xz ice-5c89803b442f059bd7444b286adb3e0a1c4afeca.zip |
Fixed the bug that Benoit found yesterday in both ice and icej.
(Zero-length sequence containing class elements caused an crash.)
:Ice::Object). Obviously, this would cause an assertion failure or a
{{{ClassCastException}}}. The solution is simply to force the down-cast
in the generated patch function and to check whether the cast failed:
if so, the class was sliced too much and we throw a
{{{NoObjectFactoryException}}} as we should. (For Java, the exception
is thrown from {{{BasicStream.readObject}}}, after catching a
{{{ClassCastException}}}. For C++, the exception is thrown directly
from the generated patch function.)
:Ice::Object}}} and {{{::Printer}}}.
Updated the code generator to correctly initialize the {{{type}}} member of
a {{{NoObjectFactoryException}}} with the type ID of the type that
wasn't found. (Unfortunately, this involved modifying {{{Parser.h}}},
so you will have to rebuild both ice and icej.)
Added code generation for custom sequence types for icej. Generated code
compiles and looks OK, but I haven't written tests yet, so there may
still be a latent bug in this.
Diffstat (limited to 'cpp/src/slice2cpp')
-rw-r--r-- | cpp/src/slice2cpp/Gen.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp index 6a5de35ff21..97aebb857a4 100644 --- a/cpp/src/slice2cpp/Gen.cpp +++ b/cpp/src/slice2cpp/Gen.cpp @@ -2446,7 +2446,12 @@ Slice::Gen::ObjectVisitor::visitClassDefEnd(const ClassDefPtr& p) C << nl << scope << name << "Ptr* p = static_cast< " << scope << name << "Ptr*>(__addr);"; C << nl << "assert(p);"; C << nl << "*p = " << scope << name << "Ptr::dynamicCast(v);"; - C << nl << "assert(!v || *p);"; + C << nl << "if(v && !*p)"; + C << sb; + C << nl << "::Ice::NoObjectFactoryException e(__FILE__, __LINE__);"; + C << nl << "e.type = " << scope << name << "::ice_staticId();"; + C << nl << "throw e;"; + C << eb; C << eb; C << sp; |