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

Reply via email to