summaryrefslogtreecommitdiff
path: root/cpp/src/Slice/Parser.cpp
diff options
context:
space:
mode:
authorBrent Eagles <brent@zeroc.com>2005-04-05 11:27:37 +0000
committerBrent Eagles <brent@zeroc.com>2005-04-05 11:27:37 +0000
commit39c3a0f56b6dc3b4e9c43c2a08ec0e8bfb01015d (patch)
treebaa4226358702a82ca34cef2e19c3b8ab39512ea /cpp/src/Slice/Parser.cpp
parentfix for bug 178 (diff)
downloadice-39c3a0f56b6dc3b4e9c43c2a08ec0e8bfb01015d.tar.bz2
ice-39c3a0f56b6dc3b4e9c43c2a08ec0e8bfb01015d.tar.xz
ice-39c3a0f56b6dc3b4e9c43c2a08ec0e8bfb01015d.zip
Removing class support from slice2javae and slice2cppe translators.
removed generation of object marshalling code added validation code for parsers added feature set flag to slice parser library (defaults to Ice feature set)
Diffstat (limited to 'cpp/src/Slice/Parser.cpp')
-rw-r--r--cpp/src/Slice/Parser.cpp139
1 files changed, 138 insertions, 1 deletions
diff --git a/cpp/src/Slice/Parser.cpp b/cpp/src/Slice/Parser.cpp
index d9cfc8ba2e2..6460efcaad4 100644
--- a/cpp/src/Slice/Parser.cpp
+++ b/cpp/src/Slice/Parser.cpp
@@ -760,6 +760,17 @@ Slice::Container::createSequence(const string& name, const TypePtr& type, bool l
{
checkPrefix(name);
+ if(_unit->profile() == IceE && !local)
+ {
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast(type);
+ if((builtin && builtin->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast(type))
+ {
+ string msg = "Sequence `" + name + "' cannot contain object values.";
+ _unit->error(msg);
+ return 0;
+ }
+ }
+
ContainedList matches = _unit->findContents(thisScope() + name);
if(!matches.empty())
{
@@ -809,6 +820,17 @@ Slice::Container::createDictionary(const string& name, const TypePtr& keyType, c
{
checkPrefix(name);
+ if(_unit->profile() == IceE && !local)
+ {
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast(valueType);
+ if((builtin && builtin->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast(valueType))
+ {
+ string msg = "Dictionary `" + name + "' cannot contain object values.";
+ _unit->error(msg);
+ return 0;
+ }
+ }
+
ContainedList matches = _unit->findContents(thisScope() + name);
if(!matches.empty())
{
@@ -2526,6 +2548,28 @@ Slice::ClassDef::createDataMember(const string& name, const TypePtr& type)
{
checkPrefix(name);
+ if(_unit->profile() == IceE)
+ {
+ if(!isLocal())
+ {
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast(type);
+ if((builtin && builtin->kind() == Builtin::KindObject))
+ {
+ string msg = "Class data member `" + name + "' cannot be a value object.";
+ _unit->error(msg);
+ return 0;
+ }
+
+ ClassDeclPtr classDecl = ClassDeclPtr::dynamicCast(type);
+ if(classDecl != 0 && !classDecl->isLocal())
+ {
+ string msg = "Class data member `" + name + "' cannot be a value object.";
+ _unit->error(msg);
+ return 0;
+ }
+ }
+ }
+
assert(!isInterface());
ContainedList matches = _unit->findContents(thisScope() + name);
if(!matches.empty())
@@ -2970,6 +3014,28 @@ Slice::Exception::createDataMember(const string& name, const TypePtr& type)
{
checkPrefix(name);
+ if(_unit->profile() == IceE)
+ {
+ if(!isLocal())
+ {
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast(type);
+ if((builtin && builtin->kind() == Builtin::KindObject))
+ {
+ string msg = "Exception data member `" + name + "' cannot be a value object.";
+ _unit->error(msg);
+ return 0;
+ }
+
+ ClassDeclPtr classDecl = ClassDeclPtr::dynamicCast(type);
+ if(classDecl != 0 && !classDecl->isLocal())
+ {
+ string msg = "Exception data member `" + name + "' cannot be a value object.";
+ _unit->error(msg);
+ return 0;
+ }
+ }
+ }
+
ContainedList matches = _unit->findContents(thisScope() + name);
if(!matches.empty())
{
@@ -3241,6 +3307,27 @@ Slice::Struct::createDataMember(const string& name, const TypePtr& type)
{
checkPrefix(name);
+ if(_unit->profile() == IceE)
+ {
+ if(!isLocal())
+ {
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast(type);
+ if((builtin && builtin->kind() == Builtin::KindObject))
+ {
+ string msg = "Struct data member `" + name + "' cannot be a value object.";
+ _unit->error(msg);
+ return 0;
+ }
+ ClassDeclPtr classDecl = ClassDeclPtr::dynamicCast(type);
+ if(classDecl != 0 && !classDecl->isLocal())
+ {
+ string msg = "Struct data member `" + name + "' cannot be a value object.";
+ _unit->error(msg);
+ return 0;
+ }
+ }
+ }
+
ContainedList matches = _unit->findContents(thisScope() + name);
if(!matches.empty())
{
@@ -4086,6 +4173,29 @@ Slice::Operation::createParamDecl(const string& name, const TypePtr& type, bool
{
checkPrefix(name);
+ if(_unit->profile() == IceE)
+ {
+ ClassDefPtr cl = ClassDefPtr::dynamicCast(this->container());
+ assert(cl);
+ if(!cl->isLocal())
+ {
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast(type);
+ if((builtin && builtin->kind() == Builtin::KindObject))
+ {
+ string msg = "Object `" + name + "' cannot be passed by value.";
+ _unit->error(msg);
+ return 0;
+ }
+ ClassDeclPtr classDecl = ClassDeclPtr::dynamicCast(type);
+ if(classDecl != 0 && !classDecl->isLocal())
+ {
+ string msg = "Object `" + name + "' cannot be passed by value.";
+ _unit->error(msg);
+ return 0;
+ }
+ }
+ }
+
ContainedList matches = _unit->findContents(thisScope() + name);
if(!matches.empty())
{
@@ -4372,6 +4482,26 @@ Slice::Operation::Operation(const ContainerPtr& container,
_returnType(returnType),
_mode(mode)
{
+ if(_unit->profile() == IceE)
+ {
+ ClassDefPtr cl = ClassDefPtr::dynamicCast(this->container());
+ assert(cl);
+ if(!cl->isLocal())
+ {
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast(returnType);
+ if((builtin && builtin->kind() == Builtin::KindObject))
+ {
+ string msg = "Method `" + name + "' cannot return an object by value.";
+ _unit->error(msg);
+ }
+ ClassDeclPtr classDecl = ClassDeclPtr::dynamicCast(returnType);
+ if(classDecl != 0 && !classDecl->isLocal())
+ {
+ string msg = "Method `" + name + "' cannot return an object by value.";
+ _unit->error(msg);
+ }
+ }
+ }
}
// ----------------------------------------------------------------------
@@ -4970,6 +5100,12 @@ Slice::Unit::usesConsts() const
return false;
}
+FeatureProfile
+Slice::Unit::profile() const
+{
+ return _featureProfile;
+}
+
StringList
Slice::Unit::includeFiles() const
{
@@ -4977,7 +5113,7 @@ Slice::Unit::includeFiles() const
}
int
-Slice::Unit::parse(FILE* file, bool debug)
+Slice::Unit::parse(FILE* file, bool debug, Slice::FeatureProfile profile)
{
slice_debug = debug ? 1 : 0;
@@ -4987,6 +5123,7 @@ Slice::Unit::parse(FILE* file, bool debug)
_currentComment = "";
_currentLine = 1;
_currentIncludeLevel = 0;
+ _featureProfile = profile;
pushContainer(this);
pushDefinitionContext();