You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by je...@apache.org on 2016/01/14 22:40:46 UTC

[1/2] thrift git commit: THRIFT-3554 Constant decls may lead to "Error: internal error: prepare_member_name_mapping() already active for different struct" Client: C# Patch: Jens Geyer

Repository: thrift
Updated Branches:
  refs/heads/master 0c0649de7 -> 933516728


THRIFT-3554 Constant decls may lead to "Error: internal error: prepare_member_name_mapping() already active for different struct"
Client: C#
Patch: Jens Geyer


Project: http://git-wip-us.apache.org/repos/asf/thrift/repo
Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/ba01d6b2
Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/ba01d6b2
Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/ba01d6b2

Branch: refs/heads/master
Commit: ba01d6b2c11968e3de1bb2fb15cc1c3658e6374e
Parents: 0c0649d
Author: Jens Geyer <je...@apache.org>
Authored: Thu Jan 14 21:21:03 2016 +0100
Committer: Jens Geyer <je...@apache.org>
Committed: Thu Jan 14 22:39:28 2016 +0100

----------------------------------------------------------------------
 compiler/cpp/src/generate/t_csharp_generator.cc | 62 +++++++++++---------
 1 file changed, 33 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/thrift/blob/ba01d6b2/compiler/cpp/src/generate/t_csharp_generator.cc
----------------------------------------------------------------------
diff --git a/compiler/cpp/src/generate/t_csharp_generator.cc b/compiler/cpp/src/generate/t_csharp_generator.cc
index aae595d..d9d2f79 100644
--- a/compiler/cpp/src/generate/t_csharp_generator.cc
+++ b/compiler/cpp/src/generate/t_csharp_generator.cc
@@ -45,6 +45,11 @@ using std::vector;
 
 static const string endl = "\n"; // avoid ostream << std::endl flushes
 
+struct member_mapping_scope {
+  void* scope_member;
+  std::map<std::string, std::string> mapping_table;
+};
+
 class t_csharp_generator : public t_oop_generator {
 public:
   t_csharp_generator(t_program* program,
@@ -233,9 +238,7 @@ private:
   std::string wcf_namespace_;
 
   std::map<std::string, int> csharp_keywords;
-
-  void* member_mapping_scope;
-  std::map<std::string, std::string> member_name_mapping;
+  std::vector<member_mapping_scope>  member_mapping_scopes;
 
   void init_keywords();
   std::string normalize_name(std::string name);
@@ -268,7 +271,10 @@ void t_csharp_generator::init_generator() {
 
   namespace_dir_ = subdir;
   init_keywords();
-  member_mapping_scope = NULL;
+  
+  while( ! member_mapping_scopes.empty()) {
+    cleanup_member_name_mapping( member_mapping_scopes.back().scope_member);
+  }
 
   pverbose("C# options:\n");
   pverbose("- async ...... %s\n", (async_ ? "ON" : "off"));
@@ -2856,23 +2862,27 @@ std::string t_csharp_generator::make_valid_csharp_identifier(std::string const&
 }
 
 void t_csharp_generator::cleanup_member_name_mapping(void* scope) {
-  if (member_mapping_scope != scope) {
-    if (member_mapping_scope == NULL) {
-      throw "internal error: cleanup_member_name_mapping() not active";
-    } else {
-      throw "internal error: cleanup_member_name_mapping() called for wrong struct";
-    }
+  if( member_mapping_scopes.empty()) {
+    throw "internal error: cleanup_member_name_mapping() no scope active";
+  }
+  
+  member_mapping_scope& active = member_mapping_scopes.back();
+  if (active.scope_member != scope) {
+    throw "internal error: cleanup_member_name_mapping() called for wrong struct";
   }
 
-  member_mapping_scope = NULL;
-  member_name_mapping.clear();
+  member_mapping_scopes.pop_back();
 }
 
 string t_csharp_generator::get_mapped_member_name(string name) {
-  map<string, string>::iterator iter = member_name_mapping.find(name);
-  if (member_name_mapping.end() != iter) {
-    return iter->second;
+  if( ! member_mapping_scopes.empty()) {
+    member_mapping_scope& active = member_mapping_scopes.back();
+    map<string, string>::iterator iter = active.mapping_table.find(name);
+    if (active.mapping_table.end() != iter) {
+      return iter->second;
+    }
   }
+  
   pverbose("no mapping for member %s\n", name.c_str());
   return name;
 }
@@ -2884,23 +2894,16 @@ void t_csharp_generator::prepare_member_name_mapping(t_struct* tstruct) {
 void t_csharp_generator::prepare_member_name_mapping(void* scope,
                                                      const vector<t_field*>& members,
                                                      const string& structname) {
-  if (member_mapping_scope != NULL) {
-    if (member_mapping_scope != scope) {
-      throw "internal error: prepare_member_name_mapping() already active for different struct";
-    } else {
-      throw "internal error: prepare_member_name_mapping() already active for this struct";
-    }
-  }
-
-  member_mapping_scope = scope;
-  member_name_mapping.clear();
-
-  std::set<std::string> used_member_names;
-  vector<t_field*>::const_iterator iter;
+  // begin new scope
+  member_mapping_scopes.push_back({});
+  member_mapping_scope& active = member_mapping_scopes.back();
+  active.scope_member = scope;
 
   // current C# generator policy:
   // - prop names are always rendered with an Uppercase first letter
   // - struct names are used as given
+  std::set<std::string> used_member_names;
+  vector<t_field*>::const_iterator iter;
 
   // prevent name conflicts with struct (CS0542 error)
   used_member_names.insert(structname);
@@ -2929,7 +2932,7 @@ void t_csharp_generator::prepare_member_name_mapping(void* scope,
                structname.c_str(),
                oldname.c_str(),
                newname.c_str());
-      member_name_mapping[oldname] = newname;
+      active.mapping_table[oldname] = newname;
       used_member_names.insert(newname);
       break;
     }
@@ -3193,6 +3196,7 @@ std::string t_csharp_generator::get_enum_class_name(t_type* type) {
   return package + type->get_name();
 }
 
+
 THRIFT_REGISTER_GENERATOR(
     csharp,
     "C#",


[2/2] thrift git commit: THRIFT-3537 Remove the (now obsolete) csharp:asyncctp flag Client: C# Patch: Jens Geyer

Posted by je...@apache.org.
THRIFT-3537 Remove the (now obsolete) csharp:asyncctp flag
Client: C#
Patch: Jens Geyer


Project: http://git-wip-us.apache.org/repos/asf/thrift/repo
Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/93351672
Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/93351672
Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/93351672

Branch: refs/heads/master
Commit: 9335167280ac2c8fbdb94a25465b38aa455f9d0c
Parents: ba01d6b
Author: Jens Geyer <je...@apache.org>
Authored: Thu Jan 14 22:37:45 2016 +0100
Committer: Jens Geyer <je...@apache.org>
Committed: Thu Jan 14 22:39:30 2016 +0100

----------------------------------------------------------------------
 compiler/cpp/src/generate/t_csharp_generator.cc | 22 +++++---------------
 1 file changed, 5 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/thrift/blob/93351672/compiler/cpp/src/generate/t_csharp_generator.cc
----------------------------------------------------------------------
diff --git a/compiler/cpp/src/generate/t_csharp_generator.cc b/compiler/cpp/src/generate/t_csharp_generator.cc
index d9d2f79..d293e18 100644
--- a/compiler/cpp/src/generate/t_csharp_generator.cc
+++ b/compiler/cpp/src/generate/t_csharp_generator.cc
@@ -62,11 +62,6 @@ public:
 
     iter = parsed_options.find("async");
     async_ = (iter != parsed_options.end());
-    iter = parsed_options.find("asyncctp");
-    async_ctp_ = (iter != parsed_options.end());
-    if (async_ && async_ctp_) {
-      throw "argument error: Cannot specify both async and asyncctp; they are incompatible.";
-    }
 
     iter = parsed_options.find("nullable");
     nullable_ = (iter != parsed_options.end());
@@ -229,7 +224,6 @@ private:
   std::ofstream f_service_;
   std::string namespace_dir_;
   bool async_;
-  bool async_ctp_;
   bool nullable_;
   bool union_;
   bool hashcode_;
@@ -278,7 +272,6 @@ void t_csharp_generator::init_generator() {
 
   pverbose("C# options:\n");
   pverbose("- async ...... %s\n", (async_ ? "ON" : "off"));
-  pverbose("- async_ctp .. %s\n", (async_ctp_ ? "ON" : "off"));
   pverbose("- nullable ... %s\n", (nullable_ ? "ON" : "off"));
   pverbose("- union ...... %s\n", (union_ ? "ON" : "off"));
   pverbose("- hashcode ... %s\n", (hashcode_ ? "ON" : "off"));
@@ -423,7 +416,7 @@ void t_csharp_generator::end_csharp_namespace(ofstream& out) {
 string t_csharp_generator::csharp_type_usings() {
   return string() + "using System;\n" + "using System.Collections;\n"
          + "using System.Collections.Generic;\n" + "using System.Text;\n" + "using System.IO;\n"
-         + ((async_ || async_ctp_) ? "using System.Threading.Tasks;\n" : "") + "using Thrift;\n"
+         + ((async_) ? "using System.Threading.Tasks;\n" : "") + "using Thrift;\n"
          + "using Thrift.Collections;\n" + ((serialize_ || wcf_) ? "#if !SILVERLIGHT\n" : "")
          + ((serialize_ || wcf_) ? "using System.Xml.Serialization;\n" : "")
          + ((serialize_ || wcf_) ? "#endif\n" : "") + (wcf_ ? "//using System.ServiceModel;\n" : "")
@@ -1442,7 +1435,7 @@ void t_csharp_generator::generate_service_interface(t_service* tservice) {
 void t_csharp_generator::generate_separate_service_interfaces(t_service* tservice) {
   generate_sync_service_interface(tservice);
 
-  if (async_ || async_ctp_) {
+  if (async_) {
     generate_async_service_interface(tservice);
   }
 
@@ -1530,7 +1523,7 @@ void t_csharp_generator::generate_async_service_interface(t_service* tservice) {
 void t_csharp_generator::generate_combined_service_interface(t_service* tservice) {
   string extends_iface = " : ISync";
 
-  if (async_ || async_ctp_) {
+  if (async_) {
     extends_iface += ", IAsync";
   }
 
@@ -1711,7 +1704,7 @@ void t_csharp_generator::generate_service_client(t_service* tservice) {
 
     // async
     bool first;
-    if (async_ || async_ctp_) {
+    if (async_) {
       indent(f_service_) << "public async " << function_signature_async(*f_iter, "") << endl;
       scope_up(f_service_);
 
@@ -1721,11 +1714,7 @@ void t_csharp_generator::generate_service_client(t_service* tservice) {
       } else {
         indent(f_service_);
       }
-      if (async_) {
-        f_service_ << "await Task.Run(() =>" << endl;
-      } else {
-        f_service_ << "await TaskEx.Run(() =>" << endl;
-      }
+      f_service_ << "await Task.Run(() =>" << endl;
       scope_up(f_service_);
       indent(f_service_);
       if (!(*f_iter)->get_returntype()->is_void()) {
@@ -3201,7 +3190,6 @@ THRIFT_REGISTER_GENERATOR(
     csharp,
     "C#",
     "    async:           Adds Async support using Task.Run.\n"
-    "    asyncctp:        Adds Async CTP support using TaskEx.Run.\n"
     "    wcf:             Adds bindings for WCF to generated classes.\n"
     "    serial:          Add serialization support to generated classes.\n"
     "    nullable:        Use nullable types for properties.\n"