THRIFT-3378 c_glib service does not handle negative Thrift byte values correctly
This closes #644
diff --git a/compiler/cpp/src/generate/t_c_glib_generator.cc b/compiler/cpp/src/generate/t_c_glib_generator.cc
index 47aa4d2..bf5dc7d 100644
--- a/compiler/cpp/src/generate/t_c_glib_generator.cc
+++ b/compiler/cpp/src/generate/t_c_glib_generator.cc
@@ -2302,7 +2302,13 @@
// The handler reported success; return the result, if any, to the caller
if (!(*function_iter)->is_oneway()) {
if (has_return_value) {
- f_service_ << indent() << "g_object_set (result_struct, \"success\", return_value, "
+ f_service_ << indent() << "g_object_set (result_struct, \"success\", ";
+ if (type_name(return_type) != property_type_name(return_type)) {
+ // Roundtrip cast to fix the position of sign bit.
+ f_service_ << "(" << property_type_name(return_type) << ")"
+ << "(" << type_name(return_type) << ")";
+ }
+ f_service_ << "return_value, "
<< "NULL);" << endl;
// Deallocate (or unref) return_value
diff --git a/test/c_glib/src/test_client.c b/test/c_glib/src/test_client.c
index fd429c8..0f8a713 100644
--- a/test/c_glib/src/test_client.c
+++ b/test/c_glib/src/test_client.c
@@ -356,6 +356,22 @@
fail_count++;
}
+ printf ("testByte(-1)");
+ if (t_test_thrift_test_if_test_byte (test_client,
+ &byte,
+ -1,
+ &error)) {
+ printf (" = %d\n", byte);
+ if (byte != -1)
+ fail_count++;
+ }
+ else {
+ printf ("%s\n", error->message);
+ g_error_free (error);
+ error = NULL;
+
+ fail_count++;
+ }
/**
* I32 TEST