News:

The new Release 25.03 is out! You can download binaries for Windows and many major Linux distros here .

Main Menu

CC bug: show "lass" in find implementation

Started by ollydbg, April 05, 2013, 05:13:49 PM

Previous topic - Next topic

ollydbg


Look at the screen shot above, I see a "lass", I think it's a bug.
If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.

Jenna

Quote from: ollydbg on April 05, 2013, 05:13:49 PM
Look at the screen shot above, I see a "lass", I think it's a bug.

Maybe a new widley unknown token in C++  ;) ?

ollydbg

Quote from: jens on April 05, 2013, 05:21:02 PM
Quote from: ollydbg on April 05, 2013, 05:13:49 PM
Look at the screen shot above, I see a "lass", I think it's a bug.

Maybe a new widley unknown token in C++  ;) ?

I guess it is a "class", but I don't know why the first char "c" is missing.
If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.

Jenna

Quote from: ollydbg on April 05, 2013, 05:24:39 PM
Quote from: jens on April 05, 2013, 05:21:02 PM
Quote from: ollydbg on April 05, 2013, 05:13:49 PM
Look at the screen shot above, I see a "lass", I think it's a bug.

Maybe a new widley unknown token in C++  ;) ?

I guess it is a "class", but I don't know why the first char "c" is missing.
Adding a space before the class-keyword makes it works correctly, if I hover over UserVariableManager in uservarmanager.h: it shows the class and the two constructors.

By the way, "Find implementation" from inside manager.cpp (as on your screenshot) does not work for me at all (fedora 18 64-bit with C::B 8938 from my repo).

oBFusCATed

This is happening for a long time. I've even seen the second row repeated multiple times.
Hope you fix it Ollydbg, because it is annoying a bit. :)
(most of the time I ignore long posts)
[strangers don't send me private messages, I'll ignore them; post a topic in the forum, but first read the rules!]

Alpha


MortenMacFly

Quote from: Alpha on April 06, 2013, 07:30:10 PM
Maybe related:
[...]
... Unequal? ;)
Mmmmh... I recall I had fixed this in trunk some times back. It may got re-introduced.
Compiler logging: Settings->Compiler & Debugger->tab "Other"->Compiler logging="Full command line"
C::B Manual: [url="https://www.codeblocks.org/docs/main_codeblocks_en.html"]https://www.codeblocks.org/docs/main_codeblocks_en.html[/url]
C::B FAQ: [url="https://wiki.codeblocks.org/index.php?title=FAQ"]https://wiki.codeblocks.org/index.php?title=FAQ[/url]

ollydbg

#7
Debug for a while, I found that the function:

bool NativeParser::ParseLocalBlock(ccSearchData* searchData, TokenIdxSet& search_scope, int caretPos)
{
   if (s_DebugSmartSense)
       CCLogger::Get()->DebugLog(_T("ParseLocalBlock() Parse local block"));
   TRACE(_T("NativeParser::ParseLocalBlock()"));

   int parentIdx = -1;
   int blockStart = FindCurrentFunctionStart(searchData, nullptr, nullptr, &parentIdx, caretPos);
   int initLine = 0;
   if (parentIdx != -1)
   {
       TokenTree* tree = m_Parser->GetTokenTree();

       CC_LOCKER_TRACK_TT_MTX_LOCK(s_TokenTreeMutex)

       const Token* parent = tree->at(parentIdx);
       if (parent && (parent->m_TokenKind & tkAnyFunction))
       {
           m_LastFuncTokenIdx = parent->m_Index;
           initLine = parent->m_ImplLineStart;
       }

       CC_LOCKER_TRACK_TT_MTX_UNLOCK(s_TokenTreeMutex)

       if (!parent)
           return false;
   }

   if (blockStart != -1)
   {
       ++blockStart; // skip {
       cbStyledTextCtrl* stc = searchData->control;
       const int pos         = (caretPos == -1 ? stc->GetCurrentPos() : caretPos);
       const int line        = stc->LineFromPosition(pos);
       const int blockEnd    = stc->GetLineEndPosition(line);
       if (blockEnd < 0 || blockEnd > stc->GetLength())
       {
           if (s_DebugSmartSense)
           {
               CCLogger::Get()->DebugLog(F(_T("ParseLocalBlock() ERROR blockEnd=%d and edLength=%d?!"),
                                           blockEnd, stc->GetLength()));
           }
           return false;
       }

       if (blockStart >= blockEnd)
           blockStart = blockEnd;

//        wxString buffer = searchData->control->GetTextRange(blockStart, blockEnd);
       wxString buffer;
       // condense out-of-scope braces {...}
       int scanPos = blockEnd;
       for (int curPos = pos; curPos > blockStart; --curPos)
       {
           if (stc->GetCharAt(curPos) != wxT('}'))
               continue;
           const int style = stc->GetStyleAt(curPos);
           if (   stc->IsString(style)
               || stc->IsCharacter(style)
               || stc->IsComment(style))
           {
               continue;
           }
           const int scopeStart = stc->BraceMatch(curPos);
           if (scopeStart < blockStart)
               break;
           buffer.Prepend(stc->GetTextRange(curPos, scanPos));
           int startLn = stc->LineFromPosition(scopeStart);
           int endLn   = stc->LineFromPosition(curPos);
           if (startLn < endLn) // maintain correct line numbers for parsed tokens
               buffer.Prepend( wxString(wxT('\n'), endLn - startLn) );
           scanPos = scopeStart + 1;
           curPos  = scopeStart;

           // condense out-of-scope for/if/while declarations
           int prevCharIdx = scopeStart - 1;
           for (; prevCharIdx > blockStart; --prevCharIdx)
           {
               if (stc->IsComment(stc->GetStyleAt(prevCharIdx)))
                   continue;
               if (!wxIsspace(stc->GetCharAt(prevCharIdx)))
                   break;
           }
           if (stc->GetCharAt(prevCharIdx) != wxT(')'))
               continue;
           const int paramStart = stc->BraceMatch(prevCharIdx);
           if (paramStart < blockStart)
               continue;
           for (prevCharIdx = paramStart - 1; prevCharIdx > blockStart; --prevCharIdx)
           {
               if (stc->IsComment(stc->GetStyleAt(prevCharIdx)))
                   continue;
               if (!wxIsspace(stc->GetCharAt(prevCharIdx)))
                   break;
           }
           const wxString text = stc->GetTextRange(stc->WordStartPosition(prevCharIdx, true),
                                                   stc->WordEndPosition(  prevCharIdx, true));
           if (text == wxT("for"))
               buffer.Prepend(wxT("(;;){"));
           else if (text == wxT("if") || text == wxT("while"))
               buffer.Prepend(wxT("(0){"));
           else
               continue;
           startLn = stc->LineFromPosition(prevCharIdx);
           endLn   = stc->LineFromPosition(scopeStart);
           if (startLn < endLn)
               buffer.Prepend( wxString(wxT('\n'), endLn - startLn) );
           curPos  = stc->WordStartPosition(prevCharIdx, true);
           scanPos = stc->WordEndPosition(  prevCharIdx, true);
       }
       buffer.Prepend(stc->GetTextRange(blockStart, scanPos));

       buffer.Trim();


The "buffer" is start with "lass". ???

EDIT
Oh, I see the code

   if (blockStart != -1)
   {
       ++blockStart; // skip {

But apparently, it was not "{", so the "c" of "class" was removed.
If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.

ollydbg


Index: E:/code/cb/cb_trunk_sf/src/plugins/codecompletion/nativeparser.cpp
===================================================================
--- E:/code/cb/cb_trunk_sf/src/plugins/codecompletion/nativeparser.cpp (revision 9090)
+++ E:/code/cb/cb_trunk_sf/src/plugins/codecompletion/nativeparser.cpp (working copy)
@@ -1857,8 +1857,9 @@

     if (blockStart != -1)
     {
-        ++blockStart; // skip {
         cbStyledTextCtrl* stc = searchData->control;
+        if (stc->GetCharAt(blockStart) == wxT('{'))
+            ++blockStart; // skip { if we are in a function body
         const int pos         = (caretPos == -1 ? stc->GetCurrentPos() : caretPos);
         const int line        = stc->LineFromPosition(pos);
         const int blockEnd    = stc->GetLineEndPosition(line);

The patch above should fix this bug.
If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.

MortenMacFly

Compiler logging: Settings->Compiler & Debugger->tab "Other"->Compiler logging="Full command line"
C::B Manual: [url="https://www.codeblocks.org/docs/main_codeblocks_en.html"]https://www.codeblocks.org/docs/main_codeblocks_en.html[/url]
C::B FAQ: [url="https://wiki.codeblocks.org/index.php?title=FAQ"]https://wiki.codeblocks.org/index.php?title=FAQ[/url]

ollydbg

If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.