summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2012-05-10 16:45:22 -0700
committerMark Spruiell <mes@zeroc.com>2012-05-10 16:45:22 -0700
commit485691562a75595eda00af35f5235f6fc22fa36c (patch)
tree4eaf48ac7512239a47d97e533cd3da1a75084f29 /cpp/src
parent* C++ implementation for compact/sliced formats (diff)
downloadice-485691562a75595eda00af35f5235f6fc22fa36c.tar.bz2
ice-485691562a75595eda00af35f5235f6fc22fa36c.tar.xz
ice-485691562a75595eda00af35f5235f6fc22fa36c.zip
C++ bug fixes; adding more Python tests
Diffstat (limited to 'cpp/src')
-rwxr-xr-xcpp/src/Slice/Parser.cpp25
-rwxr-xr-xcpp/src/Slice/PythonUtil.cpp7
-rw-r--r--cpp/src/slice2cpp/Gen.cpp20
3 files changed, 39 insertions, 13 deletions
diff --git a/cpp/src/Slice/Parser.cpp b/cpp/src/Slice/Parser.cpp
index 93cbb799fc6..96260809ef8 100755
--- a/cpp/src/Slice/Parser.cpp
+++ b/cpp/src/Slice/Parser.cpp
@@ -3433,6 +3433,20 @@ Slice::ClassDef::hasDefaultValues() const
return false;
}
+bool
+Slice::ClassDef::inheritsMetaData(const string& meta) const
+{
+ for(ClassList::const_iterator p = _bases.begin(); p != _bases.end(); ++p)
+ {
+ if((*p)->hasMetaData(meta) || (*p)->inheritsMetaData(meta))
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
Contained::ContainedType
Slice::ClassDef::containedType() const
{
@@ -3862,6 +3876,17 @@ Slice::Exception::hasDefaultValues() const
return false;
}
+bool
+Slice::Exception::inheritsMetaData(const string& meta) const
+{
+ if(_base && (_base->hasMetaData(meta) || _base->inheritsMetaData(meta)))
+ {
+ return true;
+ }
+
+ return false;
+}
+
string
Slice::Exception::kindOf() const
{
diff --git a/cpp/src/Slice/PythonUtil.cpp b/cpp/src/Slice/PythonUtil.cpp
index fada4154502..4e363c17d18 100755
--- a/cpp/src/Slice/PythonUtil.cpp
+++ b/cpp/src/Slice/PythonUtil.cpp
@@ -796,8 +796,8 @@ Slice::Python::CodeVisitor::visitClassDefStart(const ClassDefPtr& p)
DataMemberList members = p->dataMembers();
_out << sp << nl << "_M_" << type << " = IcePy.defineClass('" << scoped << "', " << name << ", ";
writeMetaData(p->getMetaData());
- _out << ", " << (isAbstract ? "True" : "False") << ", " << (p->hasMetaData("preserve-slice") ? "True" : "False")
- << ", ";
+ const bool preserved = p->hasMetaData("preserve-slice") || p->inheritsMetaData("preserve-slice");
+ _out << ", " << (isAbstract ? "True" : "False") << ", " << (preserved ? "True" : "False") << ", ";
if(!base)
{
_out << "None";
@@ -1106,7 +1106,8 @@ Slice::Python::CodeVisitor::visitExceptionStart(const ExceptionPtr& p)
string type = getAbsolute(p, "_t_");
_out << sp << nl << "_M_" << type << " = IcePy.defineException('" << scoped << "', " << name << ", ";
writeMetaData(p->getMetaData());
- _out << ", " << (p->hasMetaData("preserve-slice") ? "True" : "False") << ", ";
+ const bool preserved = p->hasMetaData("preserve-slice") || p->inheritsMetaData("preserve-slice");
+ _out << ", " << (preserved ? "True" : "False") << ", ";
if(!base)
{
_out << "None";
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp
index 6062804d5db..ecbc5b215be 100644
--- a/cpp/src/slice2cpp/Gen.cpp
+++ b/cpp/src/slice2cpp/Gen.cpp
@@ -635,8 +635,8 @@ Slice::Gen::TypesVisitor::visitExceptionStart(const ExceptionPtr& p)
ExceptionPtr base = p->base();
DataMemberList dataMembers = p->dataMembers();
DataMemberList allDataMembers = p->allDataMembers();
- bool preserved = p->hasMetaData("preserve-slice");
- bool basePreserved = base ? base->hasMetaData("preserve-slice") : false;
+ bool basePreserved = p->inheritsMetaData("preserve-slice");
+ bool preserved = basePreserved || p->hasMetaData("preserve-slice");
bool hasDefaultValues = p->hasDefaultValues();
DataMemberList::const_iterator q;
@@ -881,8 +881,8 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p)
if(!p->isLocal())
{
ExceptionPtr base = p->base();
- bool preserved = p->hasMetaData("preserve-slice");
- bool basePreserved = base ? base->hasMetaData("preserve-slice") : false;
+ bool basePreserved = p->inheritsMetaData("preserve-slice");
+ bool preserved = basePreserved || p->hasMetaData("preserve-slice");
H << sp << nl << "virtual void __write(::IceInternal::BasicStream*) const;";
H << nl << "virtual void __writeImpl(::IceInternal::BasicStream*) const;";
@@ -3827,8 +3827,8 @@ Slice::Gen::ObjectVisitor::visitClassDefStart(const ClassDefPtr& p)
}
DataMemberList dataMembers = p->dataMembers();
DataMemberList allDataMembers = p->allDataMembers();
- bool preserved = p->hasMetaData("preserve-slice");
- bool basePreserved = base ? base->hasMetaData("preserve-slice") : false;
+ bool basePreserved = p->inheritsMetaData("preserve-slice");
+ bool preserved = basePreserved || p->hasMetaData("preserve-slice");
H << sp << nl << "class " << _dllExport << name << " : ";
H.useCurrentPosAsIndent();
@@ -4165,8 +4165,8 @@ Slice::Gen::ObjectVisitor::visitClassDefEnd(const ClassDefPtr& p)
{
base = bases.front();
}
- bool preserved = p->hasMetaData("preserve-slice");
- bool basePreserved = base ? base->hasMetaData("preserve-slice") : false;
+ bool basePreserved = p->inheritsMetaData("preserve-slice");
+ bool preserved = basePreserved || p->hasMetaData("preserve-slice");
if(!p->isLocal())
{
@@ -5018,8 +5018,8 @@ Slice::Gen::ObjectVisitor::emitGCFunctions(const ClassDefPtr& p)
//
bool canBeCyclic = p->canBeCyclic();
bool override = canBeCyclic && (!base || !base->canBeCyclic());
- bool preserved = p->hasMetaData("preserve-slice");
- bool basePreserved = base ? base->hasMetaData("preserve-slice") : false;
+ bool basePreserved = p->inheritsMetaData("preserve-slice");
+ bool preserved = basePreserved || p->hasMetaData("preserve-slice");
//
// We also override __addObject and __usesGC if this is the initial preserved