THRIFT-1840 Thrift Generated Code Causes Global Variable Leaksk
Client: Node.js
Patch: Jan Brauer <jan@jimdo.com> & Tim Sebastian <tim.sebastian@gmail.com>
This closes #707
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 @@
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 @@
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 @@
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 @@
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 @@
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_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_