Not a big deal.  Formal changes are fine, but even dead code in areas you don’t 
work on might represent a work in progress, so it’s good to ask first.  For 
instance, Enrico and Greg originally had plans for “frame var” to be able to 
print slices of arrays - that’s presumably the dead code functions you stripped 
in a change before this one.  That idea was probably abandoned long enough ago 
that we’re unlikely to revive it, but you never know.

Jim.

> On Nov 18, 2016, at 12:32 PM, Zachary Turner <ztur...@google.com> wrote:
> 
> I admit I've been moving somewhat fast with these changes.  The parameter in 
> question was only used in one logging statement, so the benefit did not seem 
> worth the added cost of complexity.  But you're right, that involved a 
> judgement call on my part that I didn't vet first. 
> 
> +Enrico Granata <mailto:egran...@apple.com> , who can hopefully do a 
> post-commit review on this.  I can add it back without much effort if he 
> feels it's important. 
> 
> On Fri, Nov 18, 2016 at 12:02 PM Jim Ingham <jing...@apple.com 
> <mailto:jing...@apple.com>> wrote:
> I didn’t see this patch go up for review.  The parameter you removed might 
> have been vestigial or might have been one that the owner of this code was 
> planning to do something with.  Anyway, this seems to go beyond purely formal 
> changes and so should have been discussed.  My apologies if I just missed the 
> review.
> 
> Jim
> 
> > On Nov 18, 2016, at 9:55 AM, Zachary Turner via lldb-commits 
> > <lldb-commits@lists.llvm.org <mailto:lldb-commits@lists.llvm.org>> wrote:
> >
> > Author: zturner
> > Date: Fri Nov 18 11:55:04 2016
> > New Revision: 287354
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=287354&view=rev 
> > <http://llvm.org/viewvc/llvm-project?rev=287354&view=rev>
> > Log:
> > Resubmit "Remove an output-parameter from Variable function".
> >
> > The scanning algorithm had a few little subtleties that I
> > overlooked, but this patch should fix everything.
> >
> > I still haven't changed the function to take a StringRef since
> > that has some trickle down effect and is mostly mechanical,
> > I just wanted to get the tricky part as isolated as possible.
> >
> > Modified:
> >    lldb/trunk/include/lldb/Core/ValueObject.h
> >    lldb/trunk/source/Core/FormatEntity.cpp
> >    lldb/trunk/source/Core/ValueObject.cpp
> >    lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxx.cpp
> >    lldb/trunk/source/Symbol/Variable.cpp
> >
> > Modified: lldb/trunk/include/lldb/Core/ValueObject.h
> > URL: 
> > http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/ValueObject.h?rev=287354&r1=287353&r2=287354&view=diff
> >  
> > <http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/ValueObject.h?rev=287354&r1=287353&r2=287354&view=diff>
> > ==============================================================================
> > --- lldb/trunk/include/lldb/Core/ValueObject.h (original)
> > +++ lldb/trunk/include/lldb/Core/ValueObject.h Fri Nov 18 11:55:04 2016
> > @@ -394,7 +394,7 @@ public:
> >       GetExpressionPathFormat = 
> > eGetExpressionPathFormatDereferencePointers);
> >
> >   lldb::ValueObjectSP GetValueForExpressionPath(
> > -      const char *expression, const char **first_unparsed = nullptr,
> > +      const char *expression,
> >       ExpressionPathScanEndReason *reason_to_stop = nullptr,
> >       ExpressionPathEndResultType *final_value_type = nullptr,
> >       const GetValueForExpressionPathOptions &options =
> > @@ -1002,8 +1002,7 @@ private:
> >   virtual CompilerType MaybeCalculateCompleteType();
> >
> >   lldb::ValueObjectSP GetValueForExpressionPath_Impl(
> > -      const char *expression_cstr, const char **first_unparsed,
> > -      ExpressionPathScanEndReason *reason_to_stop,
> > +      const char *expression_cstr, ExpressionPathScanEndReason 
> > *reason_to_stop,
> >       ExpressionPathEndResultType *final_value_type,
> >       const GetValueForExpressionPathOptions &options,
> >       ExpressionPathAftermath *final_task_on_target);
> >
> > Modified: lldb/trunk/source/Core/FormatEntity.cpp
> > URL: 
> > http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/FormatEntity.cpp?rev=287354&r1=287353&r2=287354&view=diff
> >  
> > <http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/FormatEntity.cpp?rev=287354&r1=287353&r2=287354&view=diff>
> > ==============================================================================
> > --- lldb/trunk/source/Core/FormatEntity.cpp (original)
> > +++ lldb/trunk/source/Core/FormatEntity.cpp Fri Nov 18 11:55:04 2016
> > @@ -614,7 +614,6 @@ static ValueObjectSP ExpandIndexedExpres
> >   if (log)
> >     log->Printf("[ExpandIndexedExpression] name to deref: %s",
> >                 ptr_deref_buffer.c_str());
> > -  const char *first_unparsed;
> >   ValueObject::GetValueForExpressionPathOptions options;
> >   ValueObject::ExpressionPathEndResultType final_value_type;
> >   ValueObject::ExpressionPathScanEndReason reason_to_stop;
> > @@ -622,20 +621,18 @@ static ValueObjectSP ExpandIndexedExpres
> >       (deref_pointer ? ValueObject::eExpressionPathAftermathDereference
> >                      : ValueObject::eExpressionPathAftermathNothing);
> >   ValueObjectSP item = valobj->GetValueForExpressionPath(
> > -      ptr_deref_buffer.c_str(), &first_unparsed, &reason_to_stop,
> > -      &final_value_type, options, &what_next);
> > +      ptr_deref_buffer.c_str(), &reason_to_stop, &final_value_type, 
> > options,
> > +      &what_next);
> >   if (!item) {
> >     if (log)
> > -      log->Printf("[ExpandIndexedExpression] ERROR: unparsed portion = %s, 
> > why "
> > -                  "stopping = %d,"
> > +      log->Printf("[ExpandIndexedExpression] ERROR: why stopping = %d,"
> >                   " final_value_type %d",
> > -                  first_unparsed, reason_to_stop, final_value_type);
> > +                  reason_to_stop, final_value_type);
> >   } else {
> >     if (log)
> > -      log->Printf("[ExpandIndexedExpression] ALL RIGHT: unparsed portion = 
> > %s, "
> > -                  "why stopping = %d,"
> > +      log->Printf("[ExpandIndexedExpression] ALL RIGHT: why stopping = %d,"
> >                   " final_value_type %d",
> > -                  first_unparsed, reason_to_stop, final_value_type);
> > +                  reason_to_stop, final_value_type);
> >   }
> >   return item;
> > }
> > @@ -724,7 +721,6 @@ static bool DumpValue(Stream &s, const S
> >   int64_t index_lower = -1;
> >   int64_t index_higher = -1;
> >   bool is_array_range = false;
> > -  const char *first_unparsed;
> >   bool was_plain_var = false;
> >   bool was_var_format = false;
> >   bool was_var_indexed = false;
> > @@ -762,25 +758,23 @@ static bool DumpValue(Stream &s, const S
> >       log->Printf("[Debugger::FormatPrompt] symbol to expand: %s",
> >                   expr_path.c_str());
> >
> > -    target = valobj
> > -                 ->GetValueForExpressionPath(expr_path.c_str(), 
> > &first_unparsed,
> > -                                             &reason_to_stop, 
> > &final_value_type,
> > -                                             options, &what_next)
> > -                 .get();
> > +    target =
> > +        valobj
> > +            ->GetValueForExpressionPath(expr_path.c_str(), &reason_to_stop,
> > +                                        &final_value_type, options, 
> > &what_next)
> > +            .get();
> >
> >     if (!target) {
> >       if (log)
> > -        log->Printf("[Debugger::FormatPrompt] ERROR: unparsed portion = 
> > %s, "
> > -                    "why stopping = %d,"
> > +        log->Printf("[Debugger::FormatPrompt] ERROR: why stopping = %d,"
> >                     " final_value_type %d",
> > -                    first_unparsed, reason_to_stop, final_value_type);
> > +                    reason_to_stop, final_value_type);
> >       return false;
> >     } else {
> >       if (log)
> > -        log->Printf("[Debugger::FormatPrompt] ALL RIGHT: unparsed portion 
> > = "
> > -                    "%s, why stopping = %d,"
> > +        log->Printf("[Debugger::FormatPrompt] ALL RIGHT: why stopping = 
> > %d,"
> >                     " final_value_type %d",
> > -                    first_unparsed, reason_to_stop, final_value_type);
> > +                    reason_to_stop, final_value_type);
> >       target = target
> >                    ->GetQualifiedRepresentationIfAvailable(
> >                        target->GetDynamicValueType(), true)
> >
> > Modified: lldb/trunk/source/Core/ValueObject.cpp
> > URL: 
> > http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObject.cpp?rev=287354&r1=287353&r2=287354&view=diff
> >  
> > <http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObject.cpp?rev=287354&r1=287353&r2=287354&view=diff>
> > ==============================================================================
> > --- lldb/trunk/source/Core/ValueObject.cpp (original)
> > +++ lldb/trunk/source/Core/ValueObject.cpp Fri Nov 18 11:55:04 2016
> > @@ -1922,7 +1922,7 @@ ValueObject::GetSyntheticExpressionPathC
> >     // We haven't made a synthetic array member for expression yet, so
> >     // lets make one and cache it for any future reference.
> >     synthetic_child_sp = GetValueForExpressionPath(
> > -        expression, NULL, NULL, NULL,
> > +        expression, NULL, NULL,
> >         GetValueForExpressionPathOptions().SetSyntheticChildrenTraversal(
> >             GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
> >                 None));
> > @@ -2166,13 +2166,11 @@ void ValueObject::GetExpressionPath(Stre
> > }
> >
> > ValueObjectSP ValueObject::GetValueForExpressionPath(
> > -    const char *expression, const char **first_unparsed,
> > -    ExpressionPathScanEndReason *reason_to_stop,
> > +    const char *expression, ExpressionPathScanEndReason *reason_to_stop,
> >     ExpressionPathEndResultType *final_value_type,
> >     const GetValueForExpressionPathOptions &options,
> >     ExpressionPathAftermath *final_task_on_target) {
> >
> > -  const char *dummy_first_unparsed;
> >   ExpressionPathScanEndReason dummy_reason_to_stop =
> >       ValueObject::eExpressionPathScanEndReasonUnknown;
> >   ExpressionPathEndResultType dummy_final_value_type =
> > @@ -2181,8 +2179,7 @@ ValueObjectSP ValueObject::GetValueForEx
> >       ValueObject::eExpressionPathAftermathNothing;
> >
> >   ValueObjectSP ret_val = GetValueForExpressionPath_Impl(
> > -      expression, first_unparsed ? first_unparsed : &dummy_first_unparsed,
> > -      reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
> > +      expression, reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
> >       final_value_type ? final_value_type : &dummy_final_value_type, 
> > options,
> >       final_task_on_target ? final_task_on_target
> >                            : &dummy_final_task_on_target);
> > @@ -2237,8 +2234,7 @@ ValueObjectSP ValueObject::GetValueForEx
> > }
> >
> > ValueObjectSP ValueObject::GetValueForExpressionPath_Impl(
> > -    const char *expression_cstr, const char **first_unparsed,
> > -    ExpressionPathScanEndReason *reason_to_stop,
> > +    const char *expression_cstr2, ExpressionPathScanEndReason 
> > *reason_to_stop,
> >     ExpressionPathEndResultType *final_result,
> >     const GetValueForExpressionPathOptions &options,
> >     ExpressionPathAftermath *what_next) {
> > @@ -2247,12 +2243,10 @@ ValueObjectSP ValueObject::GetValueForEx
> >   if (!root.get())
> >     return ValueObjectSP();
> >
> > -  *first_unparsed = expression_cstr;
> > +  llvm::StringRef remainder(expression_cstr2);
> >
> >   while (true) {
> > -
> > -    const char *expression_cstr =
> > -        *first_unparsed; // hide the top level expression_cstr
> > +    llvm::StringRef temp_expression = remainder;
> >
> >     CompilerType root_compiler_type = root->GetCompilerType();
> >     CompilerType pointee_compiler_type;
> > @@ -2263,20 +2257,20 @@ ValueObjectSP ValueObject::GetValueForEx
> >     if (pointee_compiler_type)
> >       pointee_compiler_type_info.Reset(pointee_compiler_type.GetTypeInfo());
> >
> > -    if (!expression_cstr || *expression_cstr == '\0') {
> > +    if (temp_expression.empty()) {
> >       *reason_to_stop = 
> > ValueObject::eExpressionPathScanEndReasonEndOfString;
> >       return root;
> >     }
> >
> > -    switch (*expression_cstr) {
> > +    switch (temp_expression.front()) {
> >     case '-': {
> > +      temp_expression = temp_expression.drop_front();
> >       if (options.m_check_dot_vs_arrow_syntax &&
> >           root_compiler_type_info.Test(eTypeIsPointer)) // if you are 
> > trying to
> >                                                         // use -> on a
> >                                                         // non-pointer and I
> >                                                         // must catch the 
> > error
> >       {
> > -        *first_unparsed = expression_cstr;
> >         *reason_to_stop =
> >             ValueObject::eExpressionPathScanEndReasonArrowInsteadOfDot;
> >         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
> > @@ -2287,48 +2281,46 @@ ValueObjectSP ValueObject::GetValueForEx
> >                                                        // when this is 
> > forbidden
> >           root_compiler_type_info.Test(eTypeIsPointer) &&
> >           options.m_no_fragile_ivar) {
> > -        *first_unparsed = expression_cstr;
> >         *reason_to_stop =
> >             ValueObject::eExpressionPathScanEndReasonFragileIVarNotAllowed;
> >         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
> >         return ValueObjectSP();
> >       }
> > -      if (expression_cstr[1] != '>') {
> > -        *first_unparsed = expression_cstr;
> > +      if (!temp_expression.startswith(">")) {
> >         *reason_to_stop =
> >             ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
> >         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
> >         return ValueObjectSP();
> >       }
> > -      expression_cstr++; // skip the -
> >     }
> >       LLVM_FALLTHROUGH;
> >     case '.': // or fallthrough from ->
> >     {
> > -      if (options.m_check_dot_vs_arrow_syntax && *expression_cstr == '.' &&
> > +      if (options.m_check_dot_vs_arrow_syntax &&
> > +          temp_expression.front() == '.' &&
> >           root_compiler_type_info.Test(eTypeIsPointer)) // if you are 
> > trying to
> >                                                         // use . on a 
> > pointer
> >                                                         // and I must catch 
> > the
> >                                                         // error
> >       {
> > -        *first_unparsed = expression_cstr;
> >         *reason_to_stop =
> >             ValueObject::eExpressionPathScanEndReasonDotInsteadOfArrow;
> >         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
> > -        return ValueObjectSP();
> > +        return nullptr;
> >       }
> > -      expression_cstr++; // skip .
> > -      const char *next_separator = strpbrk(expression_cstr + 1, "-.[");
> > +      temp_expression = temp_expression.drop_front(); // skip . or >
> > +
> > +      size_t next_sep_pos = temp_expression.find_first_of("-.[", 1);
> >       ConstString child_name;
> > -      if (!next_separator) // if no other separator just expand this last 
> > layer
> > +      if (next_sep_pos == llvm::StringRef::npos) // if no other separator 
> > just
> > +                                                 // expand this last layer
> >       {
> > -        child_name.SetCString(expression_cstr);
> > +        child_name.SetString(temp_expression);
> >         ValueObjectSP child_valobj_sp =
> >             root->GetChildMemberWithName(child_name, true);
> >
> >         if (child_valobj_sp.get()) // we know we are done, so just return
> >         {
> > -          *first_unparsed = "";
> >           *reason_to_stop =
> >               ValueObject::eExpressionPathScanEndReasonEndOfString;
> >           *final_result = ValueObject::eExpressionPathEndResultTypePlain;
> > @@ -2378,28 +2370,28 @@ ValueObjectSP ValueObject::GetValueForEx
> >         // so we hit the "else" branch, and return an error
> >         if (child_valobj_sp.get()) // if it worked, just return
> >         {
> > -          *first_unparsed = "";
> >           *reason_to_stop =
> >               ValueObject::eExpressionPathScanEndReasonEndOfString;
> >           *final_result = ValueObject::eExpressionPathEndResultTypePlain;
> >           return child_valobj_sp;
> >         } else {
> > -          *first_unparsed = expression_cstr;
> >           *reason_to_stop =
> >               ValueObject::eExpressionPathScanEndReasonNoSuchChild;
> >           *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
> > -          return ValueObjectSP();
> > +          return nullptr;
> >         }
> >       } else // other layers do expand
> >       {
> > -        child_name.SetCStringWithLength(expression_cstr,
> > -                                        next_separator - expression_cstr);
> > +        llvm::StringRef next_separator = 
> > temp_expression.substr(next_sep_pos);
> > +
> > +        child_name.SetString(temp_expression.slice(0, next_sep_pos));
> > +
> >         ValueObjectSP child_valobj_sp =
> >             root->GetChildMemberWithName(child_name, true);
> >         if (child_valobj_sp.get()) // store the new root and move on
> >         {
> >           root = child_valobj_sp;
> > -          *first_unparsed = next_separator;
> > +          remainder = next_separator;
> >           *final_result = ValueObject::eExpressionPathEndResultTypePlain;
> >           continue;
> >         } else {
> > @@ -2448,15 +2440,14 @@ ValueObjectSP ValueObject::GetValueForEx
> >         if (child_valobj_sp.get()) // if it worked, move on
> >         {
> >           root = child_valobj_sp;
> > -          *first_unparsed = next_separator;
> > +          remainder = next_separator;
> >           *final_result = ValueObject::eExpressionPathEndResultTypePlain;
> >           continue;
> >         } else {
> > -          *first_unparsed = expression_cstr;
> >           *reason_to_stop =
> >               ValueObject::eExpressionPathScanEndReasonNoSuchChild;
> >           *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
> > -          return ValueObjectSP();
> > +          return nullptr;
> >         }
> >       }
> >       break;
> > @@ -2474,7 +2465,6 @@ ValueObjectSP ValueObject::GetValueForEx
> >               GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
> >                   None) // ...only chance left is synthetic
> >           {
> > -            *first_unparsed = expression_cstr;
> >             *reason_to_stop =
> >                 
> > ValueObject::eExpressionPathScanEndReasonRangeOperatorInvalid;
> >             *final_result = 
> > ValueObject::eExpressionPathEndResultTypeInvalid;
> > @@ -2484,26 +2474,23 @@ ValueObjectSP ValueObject::GetValueForEx
> >                                                       // check that we can
> >                                                       // expand bitfields
> >         {
> > -          *first_unparsed = expression_cstr;
> >           *reason_to_stop =
> >               
> > ValueObject::eExpressionPathScanEndReasonRangeOperatorNotAllowed;
> >           *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
> >           return ValueObjectSP();
> >         }
> >       }
> > -      if (*(expression_cstr + 1) ==
> > +      if (temp_expression[1] ==
> >           ']') // if this is an unbounded range it only works for arrays
> >       {
> >         if (!root_compiler_type_info.Test(eTypeIsArray)) {
> > -          *first_unparsed = expression_cstr;
> >           *reason_to_stop =
> >               ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed;
> >           *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
> > -          return ValueObjectSP();
> > +          return nullptr;
> >         } else // even if something follows, we cannot expand unbounded 
> > ranges,
> >                // just let the caller do it
> >         {
> > -          *first_unparsed = expression_cstr + 2;
> >           *reason_to_stop =
> >               
> > ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet;
> >           *final_result =
> > @@ -2511,32 +2498,36 @@ ValueObjectSP ValueObject::GetValueForEx
> >           return root;
> >         }
> >       }
> > -      const char *separator_position = ::strchr(expression_cstr + 1, '-');
> > -      const char *close_bracket_position = ::strchr(expression_cstr + 1, 
> > ']');
> > -      if (!close_bracket_position) // if there is no ], this is a syntax 
> > error
> > +
> > +      size_t close_bracket_position = temp_expression.find(']', 1);
> > +      if (close_bracket_position ==
> > +          llvm::StringRef::npos) // if there is no ], this is a syntax 
> > error
> >       {
> > -        *first_unparsed = expression_cstr;
> >         *reason_to_stop =
> >             ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
> >         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
> > -        return ValueObjectSP();
> > +        return nullptr;
> >       }
> >
> > -      if (!separator_position || separator_position > 
> > close_bracket_position) {
> > +      llvm::StringRef bracket_expr =
> > +          temp_expression.slice(1, close_bracket_position);
> > +
> > +      // If this was an empty expression it would have been caught by the 
> > if
> > +      // above.
> > +      assert(!bracket_expr.empty());
> > +
> > +      if (!bracket_expr.contains('-')) {
> >         // if no separator, this is of the form [N].  Note that this cannot
> >         // be an unbounded range of the form [], because that case was 
> > handled
> >         // above with an unconditional return.
> > -        char *end = NULL;
> > -        unsigned long index = ::strtoul(expression_cstr + 1, &end, 0);
> > -        if (end != close_bracket_position) // if something weird is in
> > -                                           // our way return an error
> > -        {
> > -          *first_unparsed = expression_cstr;
> > +        unsigned long index = 0;
> > +        if (bracket_expr.getAsInteger(0, index)) {
> >           *reason_to_stop =
> >               ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
> >           *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
> > -          return ValueObjectSP();
> > +          return nullptr;
> >         }
> > +
> >         // from here on we do have a valid index
> >         if (root_compiler_type_info.Test(eTypeIsArray)) {
> >           ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index, 
> > true);
> > @@ -2549,15 +2540,15 @@ ValueObjectSP ValueObject::GetValueForEx
> >                   root->GetSyntheticValue()->GetChildAtIndex(index, true);
> >           if (child_valobj_sp) {
> >             root = child_valobj_sp;
> > -            *first_unparsed = end + 1; // skip ]
> > +            remainder =
> > +                temp_expression.substr(close_bracket_position + 1); // 
> > skip ]
> >             *final_result = ValueObject::eExpressionPathEndResultTypePlain;
> >             continue;
> >           } else {
> > -            *first_unparsed = expression_cstr;
> >             *reason_to_stop =
> >                 ValueObject::eExpressionPathScanEndReasonNoSuchChild;
> >             *final_result = 
> > ValueObject::eExpressionPathEndResultTypeInvalid;
> > -            return ValueObjectSP();
> > +            return nullptr;
> >           }
> >         } else if (root_compiler_type_info.Test(eTypeIsPointer)) {
> >           if (*what_next ==
> > @@ -2575,11 +2566,10 @@ ValueObjectSP ValueObject::GetValueForEx
> >             Error error;
> >             root = root->Dereference(error);
> >             if (error.Fail() || !root.get()) {
> > -              *first_unparsed = expression_cstr;
> >               *reason_to_stop =
> >                   
> > ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
> >               *final_result = 
> > ValueObject::eExpressionPathEndResultTypeInvalid;
> > -              return ValueObjectSP();
> > +              return nullptr;
> >             } else {
> >               *what_next = eExpressionPathAftermathNothing;
> >               continue;
> > @@ -2599,13 +2589,13 @@ ValueObjectSP ValueObject::GetValueForEx
> >             } else
> >               root = root->GetSyntheticArrayMember(index, true);
> >             if (!root.get()) {
> > -              *first_unparsed = expression_cstr;
> >               *reason_to_stop =
> >                   ValueObject::eExpressionPathScanEndReasonNoSuchChild;
> >               *final_result = 
> > ValueObject::eExpressionPathEndResultTypeInvalid;
> > -              return ValueObjectSP();
> > +              return nullptr;
> >             } else {
> > -              *first_unparsed = end + 1; // skip ]
> > +              remainder =
> > +                  temp_expression.substr(close_bracket_position + 1); // 
> > skip ]
> >               *final_result = 
> > ValueObject::eExpressionPathEndResultTypePlain;
> >               continue;
> >             }
> > @@ -2613,15 +2603,13 @@ ValueObjectSP ValueObject::GetValueForEx
> >         } else if (root_compiler_type_info.Test(eTypeIsScalar)) {
> >           root = root->GetSyntheticBitFieldChild(index, index, true);
> >           if (!root.get()) {
> > -            *first_unparsed = expression_cstr;
> >             *reason_to_stop =
> >                 ValueObject::eExpressionPathScanEndReasonNoSuchChild;
> >             *final_result = 
> > ValueObject::eExpressionPathEndResultTypeInvalid;
> > -            return ValueObjectSP();
> > +            return nullptr;
> >           } else // we do not know how to expand members of bitfields, so we
> >                  // just return and let the caller do any further processing
> >           {
> > -            *first_unparsed = end + 1; // skip ]
> >             *reason_to_stop = ValueObject::
> >                 eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
> >             *final_result = 
> > ValueObject::eExpressionPathEndResultTypeBitfield;
> > @@ -2630,13 +2618,13 @@ ValueObjectSP ValueObject::GetValueForEx
> >         } else if (root_compiler_type_info.Test(eTypeIsVector)) {
> >           root = root->GetChildAtIndex(index, true);
> >           if (!root.get()) {
> > -            *first_unparsed = expression_cstr;
> >             *reason_to_stop =
> >                 ValueObject::eExpressionPathScanEndReasonNoSuchChild;
> >             *final_result = 
> > ValueObject::eExpressionPathEndResultTypeInvalid;
> >             return ValueObjectSP();
> >           } else {
> > -            *first_unparsed = end + 1; // skip ]
> > +            remainder =
> > +                temp_expression.substr(close_bracket_position + 1); // 
> > skip ]
> >             *final_result = ValueObject::eExpressionPathEndResultTypePlain;
> >             continue;
> >           }
> > @@ -2649,80 +2637,64 @@ ValueObjectSP ValueObject::GetValueForEx
> >           if (root->HasSyntheticValue())
> >             root = root->GetSyntheticValue();
> >           else if (!root->IsSynthetic()) {
> > -            *first_unparsed = expression_cstr;
> >             *reason_to_stop =
> >                 
> > ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing;
> >             *final_result = 
> > ValueObject::eExpressionPathEndResultTypeInvalid;
> > -            return ValueObjectSP();
> > +            return nullptr;
> >           }
> >           // if we are here, then root itself is a synthetic VO.. should be 
> > good
> >           // to go
> >
> >           if (!root.get()) {
> > -            *first_unparsed = expression_cstr;
> >             *reason_to_stop =
> >                 
> > ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing;
> >             *final_result = 
> > ValueObject::eExpressionPathEndResultTypeInvalid;
> > -            return ValueObjectSP();
> > +            return nullptr;
> >           }
> >           root = root->GetChildAtIndex(index, true);
> >           if (!root.get()) {
> > -            *first_unparsed = expression_cstr;
> >             *reason_to_stop =
> >                 ValueObject::eExpressionPathScanEndReasonNoSuchChild;
> >             *final_result = 
> > ValueObject::eExpressionPathEndResultTypeInvalid;
> > -            return ValueObjectSP();
> > +            return nullptr;
> >           } else {
> > -            *first_unparsed = end + 1; // skip ]
> > +            remainder =
> > +                temp_expression.substr(close_bracket_position + 1); // 
> > skip ]
> >             *final_result = ValueObject::eExpressionPathEndResultTypePlain;
> >             continue;
> >           }
> >         } else {
> > -          *first_unparsed = expression_cstr;
> >           *reason_to_stop =
> >               ValueObject::eExpressionPathScanEndReasonNoSuchChild;
> >           *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
> > -          return ValueObjectSP();
> > -        }
> > -      } else // we have a low and a high index
> > -      {
> > -        char *end = NULL;
> > -        unsigned long index_lower = ::strtoul(expression_cstr + 1, &end, 
> > 0);
> > -        if (end != separator_position) // if something weird is in our
> > -                                       // way return an error
> > -        {
> > -          *first_unparsed = expression_cstr;
> > -          *reason_to_stop =
> > -              ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
> > -          *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
> > -          return ValueObjectSP();
> > +          return nullptr;
> >         }
> > -        unsigned long index_higher = ::strtoul(separator_position + 1, 
> > &end, 0);
> > -        if (end != close_bracket_position) // if something weird is in
> > -                                           // our way return an error
> > -        {
> > -          *first_unparsed = expression_cstr;
> > +      } else {
> > +        // we have a low and a high index
> > +        llvm::StringRef sleft, sright;
> > +        unsigned long low_index, high_index;
> > +        std::tie(sleft, sright) = bracket_expr.split('-');
> > +        if (sleft.getAsInteger(0, low_index) ||
> > +            sright.getAsInteger(0, high_index)) {
> >           *reason_to_stop =
> >               ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
> >           *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
> > -          return ValueObjectSP();
> > +          return nullptr;
> >         }
> > -        if (index_lower > index_higher) // swap indices if required
> > -          std::swap(index_lower, index_higher);
> > +
> > +        if (low_index > high_index) // swap indices if required
> > +          std::swap(low_index, high_index);
> >
> >         if (root_compiler_type_info.Test(
> >                 eTypeIsScalar)) // expansion only works for scalars
> >         {
> > -          root =
> > -              root->GetSyntheticBitFieldChild(index_lower, index_higher, 
> > true);
> > +          root = root->GetSyntheticBitFieldChild(low_index, high_index, 
> > true);
> >           if (!root.get()) {
> > -            *first_unparsed = expression_cstr;
> >             *reason_to_stop =
> >                 ValueObject::eExpressionPathScanEndReasonNoSuchChild;
> >             *final_result = 
> > ValueObject::eExpressionPathEndResultTypeInvalid;
> > -            return ValueObjectSP();
> > +            return nullptr;
> >           } else {
> > -            *first_unparsed = end + 1; // skip ]
> >             *reason_to_stop = ValueObject::
> >                 eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
> >             *final_result = 
> > ValueObject::eExpressionPathEndResultTypeBitfield;
> > @@ -2739,17 +2711,15 @@ ValueObjectSP ValueObject::GetValueForEx
> >           Error error;
> >           root = root->Dereference(error);
> >           if (error.Fail() || !root.get()) {
> > -            *first_unparsed = expression_cstr;
> >             *reason_to_stop =
> >                 
> > ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
> >             *final_result = 
> > ValueObject::eExpressionPathEndResultTypeInvalid;
> > -            return ValueObjectSP();
> > +            return nullptr;
> >           } else {
> >             *what_next = ValueObject::eExpressionPathAftermathNothing;
> >             continue;
> >           }
> >         } else {
> > -          *first_unparsed = expression_cstr;
> >           *reason_to_stop =
> >               
> > ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet;
> >           *final_result = 
> > ValueObject::eExpressionPathEndResultTypeBoundedRange;
> > @@ -2760,12 +2730,10 @@ ValueObjectSP ValueObject::GetValueForEx
> >     }
> >     default: // some non-separator is in the way
> >     {
> > -      *first_unparsed = expression_cstr;
> >       *reason_to_stop =
> >           ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
> >       *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
> > -      return ValueObjectSP();
> > -      break;
> > +      return nullptr;
> >     }
> >     }
> >   }
> >
> > Modified: lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxx.cpp
> > URL: 
> > http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxx.cpp?rev=287354&r1=287353&r2=287354&view=diff
> >  
> > <http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxx.cpp?rev=287354&r1=287353&r2=287354&view=diff>
> > ==============================================================================
> > --- lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxx.cpp (original)
> > +++ lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxx.cpp Fri Nov 18 
> > 11:55:04 2016
> > @@ -280,7 +280,7 @@ bool lldb_private::formatters::LibCxxMap
> >   // die and free their memory
> >   m_pair_ptr = valobj_sp
> >                    ->GetValueForExpressionPath(
> > -                       ".__i_.__ptr_->__value_", nullptr, nullptr, nullptr,
> > +                       ".__i_.__ptr_->__value_", nullptr, nullptr,
> >                        ValueObject::GetValueForExpressionPathOptions()
> >                            .DontCheckDotVsArrowSyntax()
> >                            .SetSyntheticChildrenTraversal(
> > @@ -288,16 +288,18 @@ bool lldb_private::formatters::LibCxxMap
> >                                    SyntheticChildrenTraversal::None),
> >                        nullptr)
> >                    .get();
> > -
> > +
> >   if (!m_pair_ptr) {
> > -    m_pair_ptr = valobj_sp->GetValueForExpressionPath(".__i_.__ptr_", 
> > nullptr, nullptr, nullptr,
> > -                                                      
> > ValueObject::GetValueForExpressionPathOptions()
> > -                                                      
> > .DontCheckDotVsArrowSyntax()
> > -                                                      
> > .SetSyntheticChildrenTraversal(
> > -                                                                           
> >           ValueObject::GetValueForExpressionPathOptions::
> > -                                                                           
> >           SyntheticChildrenTraversal::None),
> > -                                                      nullptr)
> > -    .get();
> > +    m_pair_ptr = valobj_sp
> > +                     ->GetValueForExpressionPath(
> > +                         ".__i_.__ptr_", nullptr, nullptr,
> > +                         ValueObject::GetValueForExpressionPathOptions()
> > +                             .DontCheckDotVsArrowSyntax()
> > +                             .SetSyntheticChildrenTraversal(
> > +                                 
> > ValueObject::GetValueForExpressionPathOptions::
> > +                                     SyntheticChildrenTraversal::None),
> > +                         nullptr)
> > +                     .get();
> >     if (m_pair_ptr) {
> >       auto __i_(valobj_sp->GetChildMemberWithName(g___i_, true));
> >       lldb::TemplateArgumentKind kind;
> >
> > Modified: lldb/trunk/source/Symbol/Variable.cpp
> > URL: 
> > http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Variable.cpp?rev=287354&r1=287353&r2=287354&view=diff
> >  
> > <http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Variable.cpp?rev=287354&r1=287353&r2=287354&view=diff>
> > ==============================================================================
> > --- lldb/trunk/source/Symbol/Variable.cpp (original)
> > +++ lldb/trunk/source/Symbol/Variable.cpp Fri Nov 18 11:55:04 2016
> > @@ -404,16 +404,14 @@ Error Variable::GetValuesForVariableExpr
> >                   const char *variable_sub_expr_path =
> >                       variable_expr_path + variable_name.size();
> >                   if (*variable_sub_expr_path) {
> > -                    const char *first_unparsed = nullptr;
> >                     ValueObject::ExpressionPathScanEndReason reason_to_stop;
> >                     ValueObject::ExpressionPathEndResultType 
> > final_value_type;
> >                     ValueObject::GetValueForExpressionPathOptions options;
> >                     ValueObject::ExpressionPathAftermath 
> > final_task_on_target;
> >
> >                     valobj_sp = 
> > variable_valobj_sp->GetValueForExpressionPath(
> > -                        variable_sub_expr_path, &first_unparsed,
> > -                        &reason_to_stop, &final_value_type, options,
> > -                        &final_task_on_target);
> > +                        variable_sub_expr_path, &reason_to_stop,
> > +                        &final_value_type, options, &final_task_on_target);
> >                     if (!valobj_sp) {
> >                       error.SetErrorStringWithFormat(
> >                           "invalid expression path '%s' for variable '%s'",
> >
> >
> > _______________________________________________
> > lldb-commits mailing list
> > lldb-commits@lists.llvm.org <mailto:lldb-commits@lists.llvm.org>
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits 
> > <http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits>
> 

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to