summaryrefslogtreecommitdiff
path: root/cpp/src/Slice/CsUtil.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2009-03-24 11:45:18 +0100
committerBenoit Foucher <benoit@zeroc.com>2009-03-24 11:45:18 +0100
commit06a08ecf28e205277336a97a6173db7ccbed1adc (patch)
treea369a5044a63f8cdba9e7c0a461e24ae344486b4 /cpp/src/Slice/CsUtil.cpp
parentMerge branch 'R3_3_branch' (diff)
parentBug 3924: slice2py missing from VC60 installer (diff)
downloadice-06a08ecf28e205277336a97a6173db7ccbed1adc.tar.bz2
ice-06a08ecf28e205277336a97a6173db7ccbed1adc.tar.xz
ice-06a08ecf28e205277336a97a6173db7ccbed1adc.zip
Merge commit 'origin/R3_3_branch'
Conflicts: CHANGES cpp/demo/Freeze/backup/.depend cpp/demo/Freeze/bench/.depend cpp/demo/Freeze/casino/.depend cpp/demo/Freeze/customEvictor/.depend cpp/demo/Freeze/library/.depend cpp/demo/Freeze/phonebook/.depend cpp/demo/Freeze/transform/.depend cpp/demo/Glacier2/callback/.depend cpp/demo/Glacier2/chat/.depend cpp/demo/Ice/async/.depend cpp/demo/Ice/bidir/.depend cpp/demo/Ice/callback/.depend cpp/demo/Ice/converter/.depend cpp/demo/Ice/hello/.depend cpp/demo/Ice/invoke/.depend cpp/demo/Ice/latency/.depend cpp/demo/Ice/minimal/.depend cpp/demo/Ice/multicast/.depend cpp/demo/Ice/nested/.depend cpp/demo/Ice/nrvo/.depend cpp/demo/Ice/session/.depend cpp/demo/Ice/throughput/.depend cpp/demo/Ice/value/.depend cpp/demo/IceBox/hello/.depend cpp/demo/IceGrid/allocate/.depend cpp/demo/IceGrid/icebox/.depend cpp/demo/IceGrid/replication/.depend cpp/demo/IceGrid/sessionActivation/.depend cpp/demo/IceGrid/simple/.depend cpp/demo/IceStorm/clock/.depend cpp/demo/IceStorm/counter/.depend cpp/demo/IceStorm/replicated/.depend cpp/demo/IceStorm/replicated2/.depend cpp/demo/book/freeze_filesystem/.depend cpp/demo/book/lifecycle/.depend cpp/demo/book/printer/.depend cpp/demo/book/simple_filesystem/.depend cpp/src/Freeze/.depend cpp/src/FreezeScript/.depend cpp/src/Ice/.depend cpp/src/Ice/UdpTransceiver.cpp cpp/src/Ice/UdpTransceiver.h cpp/src/IceBox/.depend cpp/src/IceGrid/.depend cpp/src/IceGridLib/.depend cpp/src/IcePatch2/.depend cpp/src/IceStorm/.depend cpp/src/slice2freeze/.depend cpp/test/Freeze/complex/.depend cpp/test/Freeze/dbmap/.depend cpp/test/Freeze/evictor/.depend cpp/test/Freeze/oldevictor/.depend cpp/test/FreezeScript/dbmap/.depend cpp/test/FreezeScript/evictor/.depend cpp/test/Glacier2/attack/.depend cpp/test/Glacier2/dynamicFiltering/.depend cpp/test/Glacier2/router/.depend cpp/test/Glacier2/sessionControl/.depend cpp/test/Glacier2/ssl/.depend cpp/test/Glacier2/staticFiltering/.depend cpp/test/Ice/adapterDeactivation/.depend cpp/test/Ice/background/.depend cpp/test/Ice/binding/.depend cpp/test/Ice/checksum/.depend cpp/test/Ice/checksum/server/.depend cpp/test/Ice/custom/.depend cpp/test/Ice/exceptions/.depend cpp/test/Ice/facets/.depend cpp/test/Ice/faultTolerance/.depend cpp/test/Ice/gc/.depend cpp/test/Ice/hold/.depend cpp/test/Ice/inheritance/.depend cpp/test/Ice/interceptor/.depend cpp/test/Ice/location/.depend cpp/test/Ice/objects/.depend cpp/test/Ice/operations/.depend cpp/test/Ice/proxy/.depend cpp/test/Ice/retry/.depend cpp/test/Ice/servantLocator/.depend cpp/test/Ice/slicing/exceptions/.depend cpp/test/Ice/slicing/objects/.depend cpp/test/Ice/stream/.depend cpp/test/Ice/stringConverter/.depend cpp/test/Ice/timeout/.depend cpp/test/Ice/udp/.depend cpp/test/IceBox/configuration/.depend cpp/test/IceGrid/activation/.depend cpp/test/IceGrid/allocation/.depend cpp/test/IceGrid/deployer/.depend cpp/test/IceGrid/distribution/.depend cpp/test/IceGrid/replicaGroup/.depend cpp/test/IceGrid/replication/.depend cpp/test/IceGrid/session/.depend cpp/test/IceGrid/simple/.depend cpp/test/IceGrid/update/.depend cpp/test/IceSSL/configuration/.depend cpp/test/IceStorm/federation/.depend cpp/test/IceStorm/federation2/.depend cpp/test/IceStorm/rep1/.depend cpp/test/IceStorm/repgrid/.depend cpp/test/IceStorm/repstress/.depend cpp/test/IceStorm/single/.depend cpp/test/IceStorm/stress/.depend cpp/test/Slice/keyword/.depend cs/src/Ice/Instance.cs cs/src/IceSSL/ConnectorI.cs java/demo/book/simple_filesystem/Filesystem/DirectoryI.java java/demo/book/simple_filesystem/Filesystem/FileI.java java/src/IceInternal/TcpConnector.java java/src/IceSSL/ConnectorI.java py/modules/IcePy/.depend rb/src/IceRuby/.depend
Diffstat (limited to 'cpp/src/Slice/CsUtil.cpp')
-rw-r--r--cpp/src/Slice/CsUtil.cpp136
1 files changed, 95 insertions, 41 deletions
diff --git a/cpp/src/Slice/CsUtil.cpp b/cpp/src/Slice/CsUtil.cpp
index ae8c6e667cc..2f656872638 100644
--- a/cpp/src/Slice/CsUtil.cpp
+++ b/cpp/src/Slice/CsUtil.cpp
@@ -9,6 +9,7 @@
#include <Slice/CsUtil.h>
#include <Slice/DotNetNames.h>
+#include <Slice/Util.h>
#include <IceUtil/Functional.h>
#include <sys/types.h>
@@ -213,6 +214,13 @@ Slice::CsGenerator::typeToString(const TypePtr& type)
}
}
+ prefix = "clr:serializable:";
+ if(seq->findMetaData(prefix, meta))
+ {
+ string type = meta.substr(prefix.size());
+ return global() + type;
+ }
+
return typeToString(seq->type()) + "[]";
}
@@ -887,6 +895,21 @@ Slice::CsGenerator::writeSequenceMarshalUnmarshalCode(Output& out,
}
default:
{
+ string prefix = "clr:serializable:";
+ string meta;
+ if(seq->findMetaData(prefix, meta))
+ {
+ if(marshal)
+ {
+ out << nl << stream << ".writeSerializable(" << param << ");";
+ }
+ else
+ {
+ out << nl << param << " = (" << typeToString(seq) << ")" << stream << ".readSerializable();";
+ }
+ break;
+ }
+
typeS[0] = toupper(static_cast<unsigned char>(typeS[0]));
if(marshal)
{
@@ -1500,42 +1523,52 @@ Slice::CsGenerator::validateMetaData(const UnitPtr& u)
u->visit(&visitor, true);
}
-Slice::CsGenerator::MetaDataVisitor::MetaDataVisitor()
- : _globalMetaDataDone(false)
-{
-}
-
bool
-Slice::CsGenerator::MetaDataVisitor::visitModuleStart(const ModulePtr& p)
+Slice::CsGenerator::MetaDataVisitor::visitUnitStart(const UnitPtr& p)
{
- if(!_globalMetaDataDone)
+ //
+ // Validate global metadata in the top-level file and all included files.
+ //
+ StringList files = p->allFiles();
+
+ for(StringList::iterator q = files.begin(); q != files.end(); ++q)
{
- //
- // Validate global metadata.
- //
- DefinitionContextPtr dc = p->definitionContext();
+ string file = *q;
+ DefinitionContextPtr dc = p->findDefinitionContext(file);
assert(dc);
StringList globalMetaData = dc->getMetaData();
- string file = dc->filename();
- static const string prefix = "cs:";
- for(StringList::const_iterator q = globalMetaData.begin(); q != globalMetaData.end(); ++q)
+
+ static const string csPrefix = "cs:";
+ static const string clrPrefix = "clr:";
+ for(StringList::const_iterator r = globalMetaData.begin(); r != globalMetaData.end(); ++r)
{
- string s = *q;
+ string s = *r;
if(_history.count(s) == 0)
{
- if(s.find(prefix) == 0)
+ if(s.find(csPrefix) == 0)
{
- static const string attributePrefix = "cs:attribute:";
- if(s.find(attributePrefix) != 0 || s.size() == attributePrefix.size())
+ static const string csAttributePrefix = csPrefix + "attribute:";
+ if(s.find(csAttributePrefix) == 0 && s.size() > csAttributePrefix.size())
{
- cerr << file << ": warning: ignoring invalid global metadata `" << s << "'" << endl;
+ continue;
}
+ emitWarning(file, -1, "ignoring invalid global metadata `" + s + "'");
+ _history.insert(s);
+ }
+ else if(s.find(clrPrefix) == 0)
+ {
+ emitWarning(file, -1, "ignoring invalid global metadata `" + s + "'");
+ _history.insert(s);
}
- _history.insert(s);
}
}
- _globalMetaDataDone = true;
}
+ return true;
+}
+
+bool
+Slice::CsGenerator::MetaDataVisitor::visitModuleStart(const ModulePtr& p)
+{
validate(p);
return true;
}
@@ -1595,13 +1628,20 @@ Slice::CsGenerator::MetaDataVisitor::visitOperation(const OperationPtr& p)
ClassDefPtr cl = ClassDefPtr::dynamicCast(p->container());
if(!cl->isLocal())
{
- cerr << p->definitionContext()->filename() << ":" << p->line()
- << ": warning: metdata directive `UserException' applies only to local operations "
- << "but enclosing " << (cl->isInterface() ? "interface" : "class") << "`" << cl->name()
- << "' is not local" << endl;
+ ostringstream os;
+ os << "ignoring invalid metadata `UserException': directive applies only to local operations "
+ << "but enclosing " << (cl->isInterface() ? "interface" : "class") << "`" << cl->name()
+ << "' is not local";
+ emitWarning(p->file(), p->line(), os.str());
}
}
validate(p);
+
+ ParamDeclList params = p->parameters();
+ for(ParamDeclList::const_iterator i = params.begin(); i != params.end(); ++i)
+ {
+ visitParamDecl(*i);
+ }
}
void
@@ -1645,15 +1685,9 @@ Slice::CsGenerator::MetaDataVisitor::validate(const ContainedPtr& cont)
{
const string msg = "ignoring invalid metadata";
- DefinitionContextPtr dc = cont->definitionContext();
- assert(dc);
- string file = dc->filename();
-
StringList localMetaData = cont->getMetaData();
- StringList::const_iterator p;
-
- for(p = localMetaData.begin(); p != localMetaData.end(); ++p)
+ for(StringList::const_iterator p = localMetaData.begin(); p != localMetaData.end(); ++p)
{
string s = *p;
@@ -1669,9 +1703,10 @@ Slice::CsGenerator::MetaDataVisitor::validate(const ContainedPtr& cont)
{
continue;
}
- if(s.substr(prefix.size(), 8) == "generic:")
+ static const string clrGenericPrefix = prefix + "generic:";
+ if(s.find(clrGenericPrefix) == 0)
{
- string type = s.substr(prefix.size() + 8);
+ string type = s.substr(clrGenericPrefix.size());
if(type == "LinkedList" || type == "Queue" || type == "Stack")
{
ClassDeclPtr cd = ClassDeclPtr::dynamicCast(seq->type());
@@ -1686,6 +1721,23 @@ Slice::CsGenerator::MetaDataVisitor::validate(const ContainedPtr& cont)
continue; // Custom type or List<T>
}
}
+ static const string clrSerializablePrefix = prefix + "serializable:";
+ if(s.find(clrSerializablePrefix) == 0)
+ {
+ string meta;
+ if(cont->findMetaData(prefix + "collection", meta)
+ || cont->findMetaData(prefix + "generic:", meta))
+ {
+ emitWarning(cont->file(), cont->line(), msg + " `" + meta + "':\n" +
+ "serialization can only be used with the array mapping for byte sequences");
+ }
+ string type = s.substr(clrSerializablePrefix.size());
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast(seq->type());
+ if(!type.empty() && builtin && builtin->kind() == Builtin::KindByte)
+ {
+ continue;
+ }
+ }
}
else if(StructPtr::dynamicCast(cont))
{
@@ -1711,18 +1763,19 @@ Slice::CsGenerator::MetaDataVisitor::validate(const ContainedPtr& cont)
{
continue;
}
- if(s.substr(prefix.size(), 8) == "generic:")
+ static const string clrGenericPrefix = prefix + "generic:";
+ if(s.find(clrGenericPrefix) == 0)
{
- string type = s.substr(prefix.size() + 8);
+ string type = s.substr(clrGenericPrefix.size());
if(type == "SortedDictionary" || type == "SortedList")
{
continue;
}
}
}
- cerr << file << ":" << cont->line() << ": warning: " << msg << " `" << s << "'" << endl;
+ emitWarning(cont->file(), cont->line(), msg + " `" + s + "'");
+ _history.insert(s);
}
- _history.insert(s);
}
prefix = "cs:";
@@ -1730,13 +1783,14 @@ Slice::CsGenerator::MetaDataVisitor::validate(const ContainedPtr& cont)
{
if(s.find(prefix) == 0)
{
- if(s.substr(prefix.size()) == "attribute:")
+ static const string csAttributePrefix = prefix + "attribute:";
+ if(s.find(csAttributePrefix) == 0 && s.size() > csAttributePrefix.size())
{
continue;
}
- cerr << file << ":" << cont->line() << ": warning: " << msg << " `" << s << "'" << endl;
+ emitWarning(cont->file(), cont->line(), msg + " `" + s + "'");
+ _history.insert(s);
}
- _history.insert(s);
}
}
}