diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Slice/Grammer.y | 35 | ||||
-rw-r--r-- | cpp/src/Slice/Parser.cpp | 17 | ||||
-rw-r--r-- | cpp/src/Slice/Parser.h | 10 | ||||
-rw-r--r-- | cpp/src/Slice/Scanner.l | 4 | ||||
-rw-r--r-- | cpp/src/slice2cpp/Gen.cpp | 10 |
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; |