Reviewers: Lasse Reichstein, Description: Factor out code for flattening a string.
Please review this at http://codereview.chromium.org/5458002/ SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/ Affected files: M src/runtime.cc Index: src/runtime.cc =================================================================== --- src/runtime.cc (revision 5910) +++ src/runtime.cc (working copy) @@ -95,6 +95,20 @@ RUNTIME_ASSERT(obj->IsNumber()); \ type name = NumberTo##Type(obj); + +#define FLATTEN(input) \ + if (!input->IsFlat()) { \ + Object* flat; \ + { MaybeObject* maybe_flat = input->TryFlatten(); \ + if (!maybe_flat->ToObject(&flat)) { \ + return maybe_flat; \ + } \ + } \ + input = String::cast(flat); \ + } + + + // Non-reentrant string buffer for efficient general use in this file. static StaticResource<StringInputBuffer> runtime_string_input_buffer; @@ -1808,11 +1822,7 @@ // Flatten the string. If someone wants to get a char at an index // in a cons string, it is likely that more indices will be // accessed. - Object* flat; - { MaybeObject* maybe_flat = subject->TryFlatten(); - if (!maybe_flat->ToObject(&flat)) return maybe_flat; - } - subject = String::cast(flat); + FLATTEN(subject); if (i >= static_cast<uint32_t>(subject->length())) { return Heap::nan_value(); @@ -2549,26 +2559,10 @@ ASSERT(args.length() == 4); CONVERT_CHECKED(String, subject, args[0]); - if (!subject->IsFlat()) { - Object* flat_subject; - { MaybeObject* maybe_flat_subject = subject->TryFlatten(); - if (!maybe_flat_subject->ToObject(&flat_subject)) { - return maybe_flat_subject; - } - } - subject = String::cast(flat_subject); - } + FLATTEN(subject); CONVERT_CHECKED(String, replacement, args[2]); - if (!replacement->IsFlat()) { - Object* flat_replacement; - { MaybeObject* maybe_flat_replacement = replacement->TryFlatten(); - if (!maybe_flat_replacement->ToObject(&flat_replacement)) { - return maybe_flat_replacement; - } - } - replacement = String::cast(flat_replacement); - } + FLATTEN(replacement); CONVERT_CHECKED(JSRegExp, regexp, args[1]); CONVERT_CHECKED(JSArray, last_match_info, args[3]); @@ -4665,15 +4659,7 @@ static MaybeObject* Runtime_QuoteJSONString(Arguments args) { NoHandleAllocation ha; CONVERT_CHECKED(String, str, args[0]); - if (!str->IsFlat()) { - MaybeObject* try_flatten = str->TryFlatten(); - Object* flat; - if (!try_flatten->ToObject(&flat)) { - return try_flatten; - } - str = String::cast(flat); - ASSERT(str->IsFlat()); - } + FLATTEN(str); if (str->IsTwoByteRepresentation()) { return QuoteJsonString<uc16, SeqTwoByteString>(str->ToUC16Vector()); } else { -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev
