You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by dc...@apache.org on 2019/12/10 22:13:42 UTC

[thrift] 01/02: Revert "THRIFT-4002: Make generated exception classes immutable by default"

This is an automated email from the ASF dual-hosted git repository.

dcelasun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/thrift.git

commit 1234ddf8a5c98d5d700c82e087f04725170ad581
Author: D. Can Celasun <ca...@dcc.im>
AuthorDate: Tue Dec 10 22:13:06 2019 +0000

    Revert "THRIFT-4002: Make generated exception classes immutable by default"
    
    This reverts commit b40f5c227f8db61be523f23ca017519167589d97.
---
 compiler/cpp/src/thrift/generate/t_py_generator.cc | 27 +++-------------------
 lib/py/src/protocol/TBase.py                       |  4 ----
 lib/py/src/protocol/TProtocol.py                   | 10 ++------
 test/DebugProtoTest.thrift                         |  4 ----
 test/py/TestFrozen.py                              | 17 --------------
 5 files changed, 5 insertions(+), 57 deletions(-)

diff --git a/compiler/cpp/src/thrift/generate/t_py_generator.cc b/compiler/cpp/src/thrift/generate/t_py_generator.cc
index e93bbe1..982bca1 100644
--- a/compiler/cpp/src/thrift/generate/t_py_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_py_generator.cc
@@ -65,7 +65,6 @@ public:
     coding_ = "";
     gen_dynbaseclass_ = "";
     gen_dynbaseclass_exc_ = "";
-    gen_dynbaseclass_frozen_exc_ = "";
     gen_dynbaseclass_frozen_ = "";
     import_dynbase_ = "";
     package_prefix_ = "";
@@ -95,11 +94,8 @@ public:
         if( gen_dynbaseclass_exc_.empty()) {
           gen_dynbaseclass_exc_ = "TExceptionBase";
         }
-        if( gen_dynbaseclass_frozen_exc_.empty()) {
-          gen_dynbaseclass_frozen_exc_ = "TFrozenExceptionBase";
-        }
         if( import_dynbase_.empty()) {
-          import_dynbase_ = "from thrift.protocol.TBase import TBase, TFrozenBase, TExceptionBase, TFrozenExceptionBase, TTransport\n";
+          import_dynbase_ = "from thrift.protocol.TBase import TBase, TFrozenBase, TExceptionBase, TTransport\n";
         }
       } else if( iter->first.compare("dynbase") == 0) {
         gen_dynbase_ = true;
@@ -108,8 +104,6 @@ public:
         gen_dynbaseclass_frozen_ = (iter->second);
       } else if( iter->first.compare("dynexc") == 0) {
         gen_dynbaseclass_exc_ = (iter->second);
-      } else if( iter->first.compare("dynfrozenexc") == 0) {
-        gen_dynbaseclass_frozen_exc_ = (iter->second);
       } else if( iter->first.compare("dynimport") == 0) {
         gen_dynbase_ = true;
         import_dynbase_ = (iter->second);
@@ -275,16 +269,7 @@ public:
   }
 
   static bool is_immutable(t_type* ttype) {
-    std::map<std::string, std::string>::iterator it = ttype->annotations_.find("python.immutable");
-
-    if (it == ttype->annotations_.end()) {
-      // Exceptions are immutable by default.
-      return ttype->is_xception();
-    } else if (it->second == "false") {
-      return false;
-    } else {
-      return true;
-    }
+    return ttype->annotations_.find("python.immutable") != ttype->annotations_.end();
   }
 
 private:
@@ -303,7 +288,6 @@ private:
   std::string gen_dynbaseclass_;
   std::string gen_dynbaseclass_frozen_;
   std::string gen_dynbaseclass_exc_;
-  std::string gen_dynbaseclass_frozen_exc_;
 
   std::string import_dynbase_;
 
@@ -758,11 +742,7 @@ void t_py_generator::generate_py_struct_definition(ostream& out,
   out << endl << endl << "class " << tstruct->get_name();
   if (is_exception) {
     if (gen_dynamic_) {
-      if (is_immutable(tstruct)) {
-        out << "(" << gen_dynbaseclass_frozen_exc_ << ")";
-      } else {
-        out << "(" << gen_dynbaseclass_exc_ << ")";
-      }
+      out << "(" << gen_dynbaseclass_exc_ << ")";
     } else {
       out << "(TException)";
     }
@@ -2794,7 +2774,6 @@ THRIFT_REGISTER_GENERATOR(
     "    dynbase=CLS      Derive generated classes from class CLS instead of TBase.\n"
     "    dynfrozen=CLS    Derive generated immutable classes from class CLS instead of TFrozenBase.\n"
     "    dynexc=CLS       Derive generated exceptions from CLS instead of TExceptionBase.\n"
-    "    dynfrozenexc=CLS Derive generated immutable exceptions from CLS instead of TFrozenExceptionBase.\n"
     "    dynimport='from foo.bar import CLS'\n"
     "                     Add an import line to generated code to find the dynbase class.\n"
     "    package_prefix='top.package.'\n"
diff --git a/lib/py/src/protocol/TBase.py b/lib/py/src/protocol/TBase.py
index 6c6ef18..9ae1b11 100644
--- a/lib/py/src/protocol/TBase.py
+++ b/lib/py/src/protocol/TBase.py
@@ -80,7 +80,3 @@ class TFrozenBase(TBase):
                                       [self.__class__, self.thrift_spec])
         else:
             return iprot.readStruct(cls, cls.thrift_spec, True)
-
-
-class TFrozenExceptionBase(TFrozenBase, TExceptionBase):
-    pass
diff --git a/lib/py/src/protocol/TProtocol.py b/lib/py/src/protocol/TProtocol.py
index 339a283..3456e8f 100644
--- a/lib/py/src/protocol/TProtocol.py
+++ b/lib/py/src/protocol/TProtocol.py
@@ -303,14 +303,8 @@ class TProtocolBase(object):
 
     def readContainerStruct(self, spec):
         (obj_class, obj_spec) = spec
-
-        # If obj_class.read is a classmethod (e.g. in frozen structs),
-        # call it as such.
-        if getattr(obj_class.read, '__self__', None) is obj_class:
-            obj = obj_class.read(self)
-        else:
-            obj = obj_class()
-            obj.read(self)
+        obj = obj_class()
+        obj.read(self)
         return obj
 
     def readContainerMap(self, spec):
diff --git a/test/DebugProtoTest.thrift b/test/DebugProtoTest.thrift
index 1ab0f6a..de47ea7 100644
--- a/test/DebugProtoTest.thrift
+++ b/test/DebugProtoTest.thrift
@@ -241,10 +241,6 @@ exception ExceptionWithAMap {
   2: map<string, string> map_field;
 }
 
-exception MutableException {
-  1: string msg;
-} (python.immutable = "false")
-
 service ServiceForExceptionWithAMap {
   void methodThatThrowsAnException() throws (1: ExceptionWithAMap xwamap);
 }
diff --git a/test/py/TestFrozen.py b/test/py/TestFrozen.py
index ce7425f..6d2595c 100755
--- a/test/py/TestFrozen.py
+++ b/test/py/TestFrozen.py
@@ -19,9 +19,7 @@
 # under the License.
 #
 
-from DebugProtoTest import Srv
 from DebugProtoTest.ttypes import CompactProtoTestStruct, Empty, Wrapper
-from DebugProtoTest.ttypes import ExceptionWithAMap, MutableException
 from thrift.Thrift import TFrozenDict
 from thrift.transport import TTransport
 from thrift.protocol import TBinaryProtocol, TCompactProtocol
@@ -96,21 +94,6 @@ class TestFrozenBase(unittest.TestCase):
         x2 = self._roundtrip(x, Wrapper)
         self.assertEqual(x2.foo, Empty())
 
-    def test_frozen_exception(self):
-        exc = ExceptionWithAMap(blah='foo')
-        with self.assertRaises(TypeError):
-            exc.blah = 'bar'
-        mutexc = MutableException(msg='foo')
-        mutexc.msg = 'bar'
-        self.assertEqual(mutexc.msg, 'bar')
-
-    def test_frozen_exception_serialization(self):
-        result = Srv.declaredExceptionMethod_result(
-            xwamap=ExceptionWithAMap(blah="error"))
-        deserialized = self._roundtrip(
-            result, Srv.declaredExceptionMethod_result())
-        self.assertEqual(result, deserialized)
-
 
 class TestFrozen(TestFrozenBase):
     def protocol(self, trans):