Repository: thrift
Updated Branches:
  refs/heads/master dd89dce84 -> 362a5eda2


THRIFT-1840 Thrift Generated Code Causes Global Variable Leaksk
Client: Node.js
Patch: Jan Brauer <[email protected]> & Tim Sebastian <[email protected]>

This closes #707


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

Branch: refs/heads/master
Commit: 70e6c29e3a0cce7e40a23c6646147ce312e7ab24
Parents: dd89dce
Author: Jan Brauer <[email protected]>
Authored: Wed Nov 18 21:40:58 2015 +0100
Committer: Nobuaki Sukegawa <[email protected]>
Committed: Fri Dec 4 00:37:31 2015 +0900

----------------------------------------------------------------------
 compiler/cpp/src/generate/t_js_generator.cc | 28 +++++++++++++++++-------
 1 file changed, 20 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/thrift/blob/70e6c29e/compiler/cpp/src/generate/t_js_generator.cc
----------------------------------------------------------------------
diff --git a/compiler/cpp/src/generate/t_js_generator.cc 
b/compiler/cpp/src/generate/t_js_generator.cc
index 3b3cc35..7c73add 100644
--- a/compiler/cpp/src/generate/t_js_generator.cc
+++ b/compiler/cpp/src/generate/t_js_generator.cc
@@ -221,6 +221,11 @@ public:
     return js_namespace(p);
   }
 
+  bool has_js_namespace(t_program* p) {
+    std::string ns = p->get_namespace("js");
+    return (ns.size() > 0);
+  }
+
   std::string js_namespace(t_program* p) {
     std::string ns = p->get_namespace("js");
     if (ns.size() > 0) {
@@ -383,7 +388,7 @@ string t_js_generator::render_includes() {
     const vector<t_program*>& includes = program_->get_includes();
     for (size_t i = 0; i < includes.size(); ++i) {
       result += "var " + includes[i]->get_name() + "_ttypes = require('./" + 
includes[i]->get_name()
-                + "_types')\n";
+                + "_types');\n";
     }
     if (includes.size() > 0) {
       result += "\n";
@@ -634,11 +639,12 @@ void 
t_js_generator::generate_js_struct_definition(ofstream& out,
   vector<t_field*>::const_iterator m_iter;
 
   if (gen_node_) {
+    string prefix = has_js_namespace(tstruct->get_program()) ? 
js_namespace(tstruct->get_program()) : "var ";
     if (is_exported) {
-      out << js_namespace(tstruct->get_program()) << tstruct->get_name() << " 
= "
+      out << prefix << tstruct->get_name() << " = "
           << "module.exports." << tstruct->get_name() << " = function(args) {" 
<< endl;
     } else {
-      out << js_namespace(tstruct->get_program()) << tstruct->get_name() << " 
= function(args) {"
+      out << prefix << tstruct->get_name() << " = function(args) {"
           << endl;
     }
   } else {
@@ -935,11 +941,11 @@ void t_js_generator::generate_service(t_service* 
tservice) {
   if (gen_node_) {
     if (tservice->get_extends() != NULL) {
       f_service_ << "var " << tservice->get_extends()->get_name() << " = 
require('./"
-                 << tservice->get_extends()->get_name() << "')" << endl << 
"var "
+                 << tservice->get_extends()->get_name() << "');" << endl << 
"var "
                  << tservice->get_extends()->get_name()
-                 << "Client = " << tservice->get_extends()->get_name() << 
".Client" << endl
+                 << "Client = " << tservice->get_extends()->get_name() << 
".Client;" << endl
                  << "var " << tservice->get_extends()->get_name()
-                 << "Processor = " << tservice->get_extends()->get_name() << 
".Processor" << endl;
+                 << "Processor = " << tservice->get_extends()->get_name() << 
".Processor;" << endl;
     }
 
     f_service_ << "var ttypes = require('./" + program_->get_name() + 
"_types');" << endl;
@@ -971,8 +977,13 @@ void t_js_generator::generate_service_processor(t_service* 
tservice) {
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator f_iter;
 
-  f_service_ << js_namespace(tservice->get_program()) << service_name_ << 
"Processor = "
+  if (gen_node_) {
+    string prefix = has_js_namespace(tservice->get_program()) ? 
js_namespace(tservice->get_program()) : "var ";
+    f_service_ << prefix << service_name_ << "Processor = " << 
"exports.Processor = function(handler) ";
+  } else {
+    f_service_ << js_namespace(tservice->get_program()) << service_name_ << 
"Processor = "
              << "exports.Processor = function(handler) ";
+  }
 
   scope_up(f_service_);
 
@@ -1245,7 +1256,8 @@ void t_js_generator::generate_service_rest(t_service* 
tservice) {
  */
 void t_js_generator::generate_service_client(t_service* tservice) {
   if (gen_node_) {
-    f_service_ << js_namespace(tservice->get_program()) << service_name_ << 
"Client = "
+    string prefix = has_js_namespace(tservice->get_program()) ? 
js_namespace(tservice->get_program()) : "var ";
+    f_service_ << prefix << service_name_ << "Client = "
                << "exports.Client = function(output, pClass) {" << endl;
   } else {
     f_service_ << js_namespace(tservice->get_program()) << service_name_

Reply via email to