From 54753d8ff3a17f38fdef52c442060a3175974e40 Mon Sep 17 00:00:00 2001 From: Devansh Gupta Date: Sat, 10 Jan 2015 16:37:31 -0800 Subject: [PATCH 1/7] before_call and on_exception --- compiler/cpp/src/generate/t_rb_generator.cc | 34 +++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/compiler/cpp/src/generate/t_rb_generator.cc b/compiler/cpp/src/generate/t_rb_generator.cc index 49708c750e4..a6e08edcc84 100644 --- a/compiler/cpp/src/generate/t_rb_generator.cc +++ b/compiler/cpp/src/generate/t_rb_generator.cc @@ -966,6 +966,26 @@ void t_rb_generator::generate_service_server(t_service* tservice) { f_service_.indent() << "end" << endl << endl; } +void t_rb_generator::generate_before_call() { + f_service_.indent() << "if self.respond_to? :before_call"; + f_service_.indent_up(); + f_service_.indent() << "self.before_call"; + f_service_.indent_down(); + f_service_.indent() << "end"; +} + +void t_rb_generator::generate_on_exception() { + f_service_.indent() << "if self.respond_to? :on_exception"; + f_service_.indent_up(); + f_service_.indent() << "self." << function_name; + f_service_.indent_down(); + f_service_.indent() << "else" + f_service_.indent_up(); + f_service_.indent() << "raise e" + f_service_.indent_down(); + f_service_.indent() << "end"; +} + /** * Generates a process function definition. * @@ -991,12 +1011,18 @@ void t_rb_generator::generate_process_function(t_service* tservice, t_function* f_service_.indent() << "result = " << resultname << ".new()" << endl; } + f_service_.indent() << "begin"; + f_service_.indent_up(); + generate_before_call(); + + // Try block for a function with exceptions if (xceptions.size() > 0) { f_service_.indent() << "begin" << endl; f_service_.indent_up(); } + // Generate the function call t_struct* arg_struct = tfunction->get_arglist(); const std::vector& fields = arg_struct->get_members(); @@ -1018,6 +1044,14 @@ void t_rb_generator::generate_process_function(t_service* tservice, t_function* } f_service_ << ")" << endl; + f_service_.indent_down(); + f_service_.indent() << "rescue Exception => e"; + f_service_.indent_up(); + generate_on_exception(); + f_service_.indent_down(); + f_service_.indent() << "end"; + + if (!tfunction->is_oneway() && xceptions.size() > 0) { f_service_.indent_down(); for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { From 0c8771cc2635a8eaef7b1cba1304260a2411d5fd Mon Sep 17 00:00:00 2001 From: Devansh Gupta Date: Sat, 10 Jan 2015 16:44:48 -0800 Subject: [PATCH 2/7] generate_hooks_ --- compiler/cpp/src/generate/t_rb_generator.cc | 38 ++++++++++++++------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/compiler/cpp/src/generate/t_rb_generator.cc b/compiler/cpp/src/generate/t_rb_generator.cc index a6e08edcc84..1545d38ba0a 100644 --- a/compiler/cpp/src/generate/t_rb_generator.cc +++ b/compiler/cpp/src/generate/t_rb_generator.cc @@ -84,6 +84,7 @@ class t_rb_generator : public t_oop_generator { out_dir_base_ = "gen-rb"; require_rubygems_ = (parsed_options.find("rubygems") != parsed_options.end()); + generate_hooks_ = (parsed_options.find("generate_hooks") != parsed_options.end()); namespaced_ = (parsed_options.find("namespaced") != parsed_options.end()); } @@ -138,6 +139,12 @@ class t_rb_generator : public t_oop_generator { void generate_service_server(t_service* tservice); void generate_process_function(t_service* tservice, t_function* tfunction); + /** + * Generate Hooks functions + */ + void generate_before_call(); + void generate_on_exception(); + /** * Serialization constructs */ @@ -230,6 +237,9 @@ class t_rb_generator : public t_oop_generator { /** If true, add a "require 'rubygems'" line to the top of each gen-rb file. */ bool require_rubygems_; + /** If true generate before_call and on_exception hooks */ + bool generate_hooks_; + /** If true, generate files in idiomatic namespaced directories. */ bool namespaced_; }; @@ -977,11 +987,11 @@ void t_rb_generator::generate_before_call() { void t_rb_generator::generate_on_exception() { f_service_.indent() << "if self.respond_to? :on_exception"; f_service_.indent_up(); - f_service_.indent() << "self." << function_name; + f_service_.indent() << "self.on_exception"; f_service_.indent_down(); - f_service_.indent() << "else" + f_service_.indent() << "else"; f_service_.indent_up(); - f_service_.indent() << "raise e" + f_service_.indent() << "raise e"; f_service_.indent_down(); f_service_.indent() << "end"; } @@ -1011,9 +1021,11 @@ void t_rb_generator::generate_process_function(t_service* tservice, t_function* f_service_.indent() << "result = " << resultname << ".new()" << endl; } - f_service_.indent() << "begin"; - f_service_.indent_up(); - generate_before_call(); + if (generate_hooks_) { + f_service_.indent() << "begin"; + f_service_.indent_up(); + generate_before_call(); + } // Try block for a function with exceptions @@ -1044,12 +1056,14 @@ void t_rb_generator::generate_process_function(t_service* tservice, t_function* } f_service_ << ")" << endl; - f_service_.indent_down(); - f_service_.indent() << "rescue Exception => e"; - f_service_.indent_up(); - generate_on_exception(); - f_service_.indent_down(); - f_service_.indent() << "end"; + if (generate_hooks_) { + f_service_.indent_down(); + f_service_.indent() << "rescue Exception => e"; + f_service_.indent_up(); + generate_on_exception(); + f_service_.indent_down(); + f_service_.indent() << "end"; + } if (!tfunction->is_oneway() && xceptions.size() > 0) { From 22d500d191f909fb48255033793ac59bbc972354 Mon Sep 17 00:00:00 2001 From: Devansh Gupta Date: Sat, 10 Jan 2015 16:56:08 -0800 Subject: [PATCH 3/7] endl --- compiler/cpp/src/generate/t_rb_generator.cc | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/compiler/cpp/src/generate/t_rb_generator.cc b/compiler/cpp/src/generate/t_rb_generator.cc index 1545d38ba0a..1caf033343b 100644 --- a/compiler/cpp/src/generate/t_rb_generator.cc +++ b/compiler/cpp/src/generate/t_rb_generator.cc @@ -985,15 +985,15 @@ void t_rb_generator::generate_before_call() { } void t_rb_generator::generate_on_exception() { - f_service_.indent() << "if self.respond_to? :on_exception"; + f_service_.indent() << "if self.respond_to? :on_exception" << endl; f_service_.indent_up(); - f_service_.indent() << "self.on_exception"; + f_service_.indent() << "self.on_exception" << endl; f_service_.indent_down(); - f_service_.indent() << "else"; + f_service_.indent() << "else" << endl; f_service_.indent_up(); - f_service_.indent() << "raise e"; + f_service_.indent() << "raise e" << endl; f_service_.indent_down(); - f_service_.indent() << "end"; + f_service_.indent() << "end" << endl; } /** @@ -1022,7 +1022,7 @@ void t_rb_generator::generate_process_function(t_service* tservice, t_function* } if (generate_hooks_) { - f_service_.indent() << "begin"; + f_service_.indent() << "begin" << endl; f_service_.indent_up(); generate_before_call(); } @@ -1034,7 +1034,6 @@ void t_rb_generator::generate_process_function(t_service* tservice, t_function* f_service_.indent_up(); } - // Generate the function call t_struct* arg_struct = tfunction->get_arglist(); const std::vector& fields = arg_struct->get_members(); @@ -1058,11 +1057,11 @@ void t_rb_generator::generate_process_function(t_service* tservice, t_function* if (generate_hooks_) { f_service_.indent_down(); - f_service_.indent() << "rescue Exception => e"; + f_service_.indent() << "rescue Exception => e" << endl; f_service_.indent_up(); generate_on_exception(); f_service_.indent_down(); - f_service_.indent() << "end"; + f_service_.indent() << "end" << endl; } From d18f02d882bb8aafb098f1f84b602b229818cf10 Mon Sep 17 00:00:00 2001 From: Devansh Gupta Date: Sat, 10 Jan 2015 17:36:30 -0800 Subject: [PATCH 4/7] endl --- compiler/cpp/src/generate/t_rb_generator.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/compiler/cpp/src/generate/t_rb_generator.cc b/compiler/cpp/src/generate/t_rb_generator.cc index 1caf033343b..5347e4e3323 100644 --- a/compiler/cpp/src/generate/t_rb_generator.cc +++ b/compiler/cpp/src/generate/t_rb_generator.cc @@ -977,17 +977,17 @@ void t_rb_generator::generate_service_server(t_service* tservice) { } void t_rb_generator::generate_before_call() { - f_service_.indent() << "if self.respond_to? :before_call"; + f_service_.indent() << "if self.respond_to? :before_call" << endl; f_service_.indent_up(); - f_service_.indent() << "self.before_call"; + f_service_.indent() << "self.before_call" << endl; f_service_.indent_down(); - f_service_.indent() << "end"; + f_service_.indent() << "end" << endl; } void t_rb_generator::generate_on_exception() { f_service_.indent() << "if self.respond_to? :on_exception" << endl; f_service_.indent_up(); - f_service_.indent() << "self.on_exception" << endl; + f_service_.indent() << "self.on_exception(e)" << endl; f_service_.indent_down(); f_service_.indent() << "else" << endl; f_service_.indent_up(); From 5d18c29e6200481f44a4a5a0de943a3a5acbf486 Mon Sep 17 00:00:00 2001 From: Devansh Gupta Date: Sat, 10 Jan 2015 17:53:42 -0800 Subject: [PATCH 5/7] send method name and exception --- compiler/cpp/src/generate/t_rb_generator.cc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/compiler/cpp/src/generate/t_rb_generator.cc b/compiler/cpp/src/generate/t_rb_generator.cc index 5347e4e3323..5066e75d599 100644 --- a/compiler/cpp/src/generate/t_rb_generator.cc +++ b/compiler/cpp/src/generate/t_rb_generator.cc @@ -142,7 +142,7 @@ class t_rb_generator : public t_oop_generator { /** * Generate Hooks functions */ - void generate_before_call(); + void generate_before_call(const std::string& function_name); void generate_on_exception(); /** @@ -976,18 +976,18 @@ void t_rb_generator::generate_service_server(t_service* tservice) { f_service_.indent() << "end" << endl << endl; } -void t_rb_generator::generate_before_call() { - f_service_.indent() << "if self.respond_to? :before_call" << endl; +void t_rb_generator::generate_before_call(const std::string& function_name) { + f_service_.indent() << "if @handler.respond_to? :before_call" << endl; f_service_.indent_up(); - f_service_.indent() << "self.before_call" << endl; + f_service_.indent() << "@handler.before_call(:" << function_name << ")" << endl; f_service_.indent_down(); f_service_.indent() << "end" << endl; } void t_rb_generator::generate_on_exception() { - f_service_.indent() << "if self.respond_to? :on_exception" << endl; + f_service_.indent() << "if @handler.respond_to? :on_exception" << endl; f_service_.indent_up(); - f_service_.indent() << "self.on_exception(e)" << endl; + f_service_.indent() << "@handler.on_exception(e)" << endl; f_service_.indent_down(); f_service_.indent() << "else" << endl; f_service_.indent_up(); @@ -1024,7 +1024,7 @@ void t_rb_generator::generate_process_function(t_service* tservice, t_function* if (generate_hooks_) { f_service_.indent() << "begin" << endl; f_service_.indent_up(); - generate_before_call(); + generate_before_call(tfunction->get_name()); } From ebab8bb629aacc58e95a71b1b6ce678033121437 Mon Sep 17 00:00:00 2001 From: Devansh Gupta Date: Sat, 10 Jan 2015 18:05:53 -0800 Subject: [PATCH 6/7] Dont use respond_to --- compiler/cpp/src/generate/t_rb_generator.cc | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/compiler/cpp/src/generate/t_rb_generator.cc b/compiler/cpp/src/generate/t_rb_generator.cc index 5066e75d599..48ad16f1f09 100644 --- a/compiler/cpp/src/generate/t_rb_generator.cc +++ b/compiler/cpp/src/generate/t_rb_generator.cc @@ -977,23 +977,11 @@ void t_rb_generator::generate_service_server(t_service* tservice) { } void t_rb_generator::generate_before_call(const std::string& function_name) { - f_service_.indent() << "if @handler.respond_to? :before_call" << endl; - f_service_.indent_up(); f_service_.indent() << "@handler.before_call(:" << function_name << ")" << endl; - f_service_.indent_down(); - f_service_.indent() << "end" << endl; } void t_rb_generator::generate_on_exception() { - f_service_.indent() << "if @handler.respond_to? :on_exception" << endl; - f_service_.indent_up(); f_service_.indent() << "@handler.on_exception(e)" << endl; - f_service_.indent_down(); - f_service_.indent() << "else" << endl; - f_service_.indent_up(); - f_service_.indent() << "raise e" << endl; - f_service_.indent_down(); - f_service_.indent() << "end" << endl; } /** From 0809a4c4ef42c637b01c8ea1da411d3fa319dc43 Mon Sep 17 00:00:00 2001 From: Devansh Gupta Date: Sat, 10 Jan 2015 18:24:57 -0800 Subject: [PATCH 7/7] before_call inside block --- compiler/cpp/src/generate/t_rb_generator.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler/cpp/src/generate/t_rb_generator.cc b/compiler/cpp/src/generate/t_rb_generator.cc index 48ad16f1f09..9e1bd435cdd 100644 --- a/compiler/cpp/src/generate/t_rb_generator.cc +++ b/compiler/cpp/src/generate/t_rb_generator.cc @@ -1012,16 +1012,16 @@ void t_rb_generator::generate_process_function(t_service* tservice, t_function* if (generate_hooks_) { f_service_.indent() << "begin" << endl; f_service_.indent_up(); - generate_before_call(tfunction->get_name()); } - // Try block for a function with exceptions if (xceptions.size() > 0) { f_service_.indent() << "begin" << endl; f_service_.indent_up(); } + generate_before_call(tfunction->get_name()); + // Generate the function call t_struct* arg_struct = tfunction->get_arglist(); const std::vector& fields = arg_struct->get_members();