From 813749dc50676c9d2ba778bf73bcb9bb872bd30c Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Fri, 31 Jan 2014 23:42:57 +0100 Subject: [PATCH] THRIFT-2338 First doctext wrongly interpreted as program doctext in some cases Patch: Jens Geyer --- compiler/cpp/src/globals.h | 3 ++- compiler/cpp/src/logging.h | 46 ++++++++++++++++++++++++++++++++++ compiler/cpp/src/main.cc | 5 ++++ compiler/cpp/src/main.h | 21 +--------------- compiler/cpp/src/parse/t_doc.h | 2 ++ compiler/cpp/src/thriftl.ll | 3 ++- 6 files changed, 58 insertions(+), 22 deletions(-) create mode 100644 compiler/cpp/src/logging.h diff --git a/compiler/cpp/src/globals.h b/compiler/cpp/src/globals.h index 957e5d19..cf924f1c 100644 --- a/compiler/cpp/src/globals.h +++ b/compiler/cpp/src/globals.h @@ -121,7 +121,8 @@ enum PROGDOCTEXT_STATUS { INVALID = 0, STILL_CANDIDATE = 1, // the text may or may not be the program doctext ALREADY_PROCESSED = 2, // doctext has been used and is no longer available - ABSOLUTELY_SURE = 3 // this is the program doctext + ABSOLUTELY_SURE = 3, // this is the program doctext + NO_PROGRAM_DOCTEXT = 4 // there is no program doctext }; diff --git a/compiler/cpp/src/logging.h b/compiler/cpp/src/logging.h new file mode 100644 index 00000000..097469d5 --- /dev/null +++ b/compiler/cpp/src/logging.h @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef T_LOGGING_H +#define T_LOGGING_H + +#include + +/** + * Parse debugging output, used to print helpful info + */ +void pdebug(const char* fmt, ...); + +/** + * Parser warning + */ +void pwarning(int level, const char* fmt, ...); + +/** + * Print verbose output message + */ +void pverbose(const char* fmt, ...); + +/** + * Failure! + */ +void failure(const char* fmt, ...); + + +#endif diff --git a/compiler/cpp/src/main.cc b/compiler/cpp/src/main.cc index bba4cdc4..781db3b4 100755 --- a/compiler/cpp/src/main.cc +++ b/compiler/cpp/src/main.cc @@ -406,6 +406,7 @@ void reset_program_doctext_info() { } g_program_doctext_lineno = 0; g_program_doctext_status = INVALID; + pdebug("%s","program doctext set to INVALID"); } /** @@ -414,6 +415,10 @@ void reset_program_doctext_info() { void declare_valid_program_doctext() { if((g_program_doctext_candidate != NULL) && (g_program_doctext_status == STILL_CANDIDATE)) { g_program_doctext_status = ABSOLUTELY_SURE; + pdebug("%s","program doctext set to ABSOLUTELY_SURE"); + } else { + g_program_doctext_status = NO_PROGRAM_DOCTEXT; + pdebug("%s","program doctext set to NO_PROGRAM_DOCTEXT"); } } diff --git a/compiler/cpp/src/main.h b/compiler/cpp/src/main.h index d5549709..87af5f6e 100644 --- a/compiler/cpp/src/main.h +++ b/compiler/cpp/src/main.h @@ -21,6 +21,7 @@ #define T_MAIN_H #include +#include "logging.h" #include "parse/t_const.h" #include "parse/t_field.h" @@ -37,26 +38,6 @@ int yyparse(void); */ void yyerror(const char* fmt, ...); -/** - * Parse debugging output, used to print helpful info - */ -void pdebug(const char* fmt, ...); - -/** - * Parser warning - */ -void pwarning(int level, const char* fmt, ...); - -/** - * Print verbose output message - */ -void pverbose(const char* fmt, ...); - -/** - * Failure! - */ -void failure(const char* fmt, ...); - /** * Check simple identifier names */ diff --git a/compiler/cpp/src/parse/t_doc.h b/compiler/cpp/src/parse/t_doc.h index a7c8cc94..2c63b5a3 100644 --- a/compiler/cpp/src/parse/t_doc.h +++ b/compiler/cpp/src/parse/t_doc.h @@ -21,6 +21,7 @@ #define T_DOC_H #include "globals.h" +#include "logging.h" /** * Documentation stubs @@ -36,6 +37,7 @@ class t_doc { has_doc_ = true; if( (g_program_doctext_lineno == g_doctext_lineno) && (g_program_doctext_status == STILL_CANDIDATE)) { g_program_doctext_status = ALREADY_PROCESSED; + pdebug("%s","program doctext set to ALREADY_PROCESSED"); } } diff --git a/compiler/cpp/src/thriftl.ll b/compiler/cpp/src/thriftl.ll index 4df4ccb0..685bb543 100644 --- a/compiler/cpp/src/thriftl.ll +++ b/compiler/cpp/src/thriftl.ll @@ -384,10 +384,11 @@ literal_begin (['\"]) g_doctext[strlen(g_doctext) - 1] = '\0'; g_doctext = clean_up_doctext(g_doctext); g_doctext_lineno = yylineno; - if(g_program_doctext_candidate == NULL){ + if( (g_program_doctext_candidate == NULL) && (g_program_doctext_status == INVALID)){ g_program_doctext_candidate = strdup(g_doctext); g_program_doctext_lineno = g_doctext_lineno; g_program_doctext_status = STILL_CANDIDATE; + pdebug("%s","program doctext set to STILL_CANDIDATE"); } } } -- 2.17.1