summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorMarc Laukien <marc@zeroc.com>2001-08-10 20:59:22 +0000
committerMarc Laukien <marc@zeroc.com>2001-08-10 20:59:22 +0000
commit7377a861663e60c6e0155edbdf6b544d1dba0502 (patch)
tree80a44155233c491841c0036d48346f4850e875d9 /cpp/src
parentfixes (diff)
downloadice-7377a861663e60c6e0155edbdf6b544d1dba0502.tar.bz2
ice-7377a861663e60c6e0155edbdf6b544d1dba0502.tar.xz
ice-7377a861663e60c6e0155edbdf6b544d1dba0502.zip
nonmutating
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Slice/Grammer.y35
-rw-r--r--cpp/src/Slice/Parser.cpp17
-rw-r--r--cpp/src/Slice/Parser.h10
-rw-r--r--cpp/src/Slice/Scanner.l4
-rw-r--r--cpp/src/slice2cpp/Gen.cpp10
5 files changed, 58 insertions, 18 deletions
diff --git a/cpp/src/Slice/Grammer.y b/cpp/src/Slice/Grammer.y
index 8fe207bace5..a176a0a155c 100644
--- a/cpp/src/Slice/Grammer.y
+++ b/cpp/src/Slice/Grammer.y
@@ -46,6 +46,7 @@ yyerror(const char* s)
%token ICE_NATIVE
%token ICE_VECTOR
%token ICE_ENUM
+%token ICE_NONMUTATING
%token ICE_IDENTIFIER
%token ICE_OP_IDENTIFIER
@@ -414,19 +415,37 @@ interface_extends
;
// ----------------------------------------------------------------------
+nonmutating
+// ----------------------------------------------------------------------
+: ICE_NONMUTATING
+{
+ BoolTokPtr nonmutating = new BoolTok;
+ nonmutating->v = true;
+ $$ = nonmutating;
+}
+|
+{
+ BoolTokPtr nonmutating = new BoolTok;
+ nonmutating->v = false;
+ $$ = nonmutating;
+}
+;
+
+// ----------------------------------------------------------------------
operation
// ----------------------------------------------------------------------
-: return_type ICE_OP_IDENTIFIER parameters output_parameters ')' throws
+: nonmutating return_type ICE_OP_IDENTIFIER parameters output_parameters ')' throws
{
- TypePtr returnType = TypePtr::dynamicCast($1);
- StringTokPtr name = StringTokPtr::dynamicCast($2);
- TypeStringListTokPtr inParms = TypeStringListTokPtr::dynamicCast($3);
- TypeStringListTokPtr outParms = TypeStringListTokPtr::dynamicCast($4);
- TypeListTokPtr throws = TypeListTokPtr::dynamicCast($6);
+ BoolTokPtr nonmutating = BoolTokPtr::dynamicCast($1);
+ TypePtr returnType = TypePtr::dynamicCast($2);
+ StringTokPtr name = StringTokPtr::dynamicCast($3);
+ TypeStringListTokPtr inParms = TypeStringListTokPtr::dynamicCast($4);
+ TypeStringListTokPtr outParms = TypeStringListTokPtr::dynamicCast($5);
+ TypeListTokPtr throws = TypeListTokPtr::dynamicCast($7);
ClassDefPtr cl = ClassDefPtr::dynamicCast(unit->currentContainer());
- cl->createOperation(name->v, returnType, inParms->v, outParms->v, throws->v);
+ cl->createOperation(name->v, returnType, inParms->v, outParms->v, throws->v, nonmutating->v);
}
-
+
// ----------------------------------------------------------------------
parameters
// ----------------------------------------------------------------------
diff --git a/cpp/src/Slice/Parser.cpp b/cpp/src/Slice/Parser.cpp
index 73754ae3147..97ce13547b2 100644
--- a/cpp/src/Slice/Parser.cpp
+++ b/cpp/src/Slice/Parser.cpp
@@ -1050,7 +1050,8 @@ Slice::ClassDef::createOperation(const string& name,
const TypePtr& returnType,
const TypeStringList& inParams,
const TypeStringList& outParams,
- const TypeList& throws)
+ const TypeList& throws,
+ bool nonmutating)
{
ContainedList matches = _unit->findContents(thisScope() + name);
if (!matches.empty())
@@ -1119,7 +1120,7 @@ Slice::ClassDef::createOperation(const string& name,
return 0;
}
- OperationPtr p = new Operation(this, name, returnType, inParams, outParams, throws);
+ OperationPtr p = new Operation(this, name, returnType, inParams, outParams, throws, nonmutating);
_contents.push_back(p);
return p;
}
@@ -1363,6 +1364,12 @@ Slice::Operation::throws()
return _throws;
}
+bool
+Slice::Operation::nonmutating()
+{
+ return _nonmutating;
+}
+
Slice::Contained::ContainedType
Slice::Operation::containedType()
{
@@ -1376,13 +1383,15 @@ Slice::Operation::visit(ParserVisitor* visitor)
}
Slice::Operation::Operation(const ContainerPtr& container, const string& name, const TypePtr& returnType,
- const TypeStringList& inParams, const TypeStringList& outParams, const TypeList& throws) :
+ const TypeStringList& inParams, const TypeStringList& outParams, const TypeList& throws,
+ bool nonmutating) :
Contained(container, name),
SyntaxTreeBase(container->unit()),
_returnType(returnType),
_inParams(inParams),
_outParams(outParams),
- _throws(throws)
+ _throws(throws),
+ _nonmutating(nonmutating)
{
}
diff --git a/cpp/src/Slice/Parser.h b/cpp/src/Slice/Parser.h
index dea9a391676..d3cc35b2a47 100644
--- a/cpp/src/Slice/Parser.h
+++ b/cpp/src/Slice/Parser.h
@@ -383,9 +383,8 @@ class ICE_API ClassDef : virtual public Container, virtual public Contained
public:
virtual void destroy();
- OperationPtr createOperation(const std::string&, const TypePtr&,
- const TypeStringList&, const TypeStringList&,
- const TypeList&);
+ OperationPtr createOperation(const std::string&, const TypePtr&, const TypeStringList&, const TypeStringList&,
+ const TypeList&, bool);
DataMemberPtr createDataMember(const std::string&, const TypePtr&);
ClassList bases();
ClassList allBases();
@@ -441,6 +440,7 @@ public:
TypeStringList inputParameters();
TypeStringList outputParameters();
TypeList throws();
+ bool nonmutating();
virtual ContainedType containedType();
virtual void visit(ParserVisitor*);
@@ -451,13 +451,15 @@ protected:
const TypePtr&,
const TypeStringList&,
const TypeStringList&,
- const TypeList&);
+ const TypeList&,
+ bool);
friend class ICE_API ClassDef;
TypePtr _returnType;
TypeStringList _inParams;
TypeStringList _outParams;
TypeList _throws;
+ bool _nonmutating;
};
// ----------------------------------------------------------------------
diff --git a/cpp/src/Slice/Scanner.l b/cpp/src/Slice/Scanner.l
index 3573030d7d9..2474a5d9260 100644
--- a/cpp/src/Slice/Scanner.l
+++ b/cpp/src/Slice/Scanner.l
@@ -187,6 +187,10 @@ L [a-zA-Z_]
return ICE_ENUM;
}
+"nonmutating" {
+ return ICE_NONMUTATING;
+}
+
"\\"?{L}({L}|{D})* {
char* s = yytext;
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp
index f33a3e97844..161714d44a3 100644
--- a/cpp/src/slice2cpp/Gen.cpp
+++ b/cpp/src/slice2cpp/Gen.cpp
@@ -704,8 +704,14 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p)
C << eb;
C << nl << "catch (const ::IceInternal::NonRepeatable& __ex)";
C << sb;
-// C << nl << "__handleException(*__ex.get(), __cnt);";
- C << nl << "__ex.raise();";
+ if (p->nonmutating())
+ {
+ C << nl << "__handleException(*__ex.get(), __cnt);";
+ }
+ else
+ {
+ C << nl << "__ex.raise();";
+ }
C << eb;
C << nl << "catch (const ::Ice::LocalException& __ex)";
C << sb;