Revert "Parser & internalization fix: ensure no heap allocs during GetString(Handle...
authormarja@chromium.org <marja@chromium.org>
Wed, 5 Nov 2014 14:31:57 +0000 (14:31 +0000)
committermarja@chromium.org <marja@chromium.org>
Wed, 5 Nov 2014 14:32:17 +0000 (14:32 +0000)
This reverts r25155.

Reason: breaks webkit unit tests.

BUG=
TBR=marja@chromium.org

Review URL: https://codereview.chromium.org/707483002

Cr-Commit-Position: refs/heads/master@{#25159}
git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@25159 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/ast-value-factory.cc
src/ast-value-factory.h

index 7aa9b6c59ebb2e5a462dd32d4c11e58c8585f3c2..895ce39f652845fa83674d61ec98b0c9b8f1b5e1 100644 (file)
@@ -212,7 +212,7 @@ void AstValue::Internalize(Isolate* isolate) {
 }
 
 
-AstRawString* AstValueFactory::GetOneByteStringInternal(
+const AstRawString* AstValueFactory::GetOneByteString(
     Vector<const uint8_t> literal) {
   uint32_t hash = StringHasher::HashSequentialString<uint8_t>(
       literal.start(), literal.length(), hash_seed_);
@@ -220,7 +220,7 @@ AstRawString* AstValueFactory::GetOneByteStringInternal(
 }
 
 
-AstRawString* AstValueFactory::GetTwoByteStringInternal(
+const AstRawString* AstValueFactory::GetTwoByteString(
     Vector<const uint16_t> literal) {
   uint32_t hash = StringHasher::HashSequentialString<uint16_t>(
       literal.start(), literal.length(), hash_seed_);
@@ -229,22 +229,13 @@ AstRawString* AstValueFactory::GetTwoByteStringInternal(
 
 
 const AstRawString* AstValueFactory::GetString(Handle<String> literal) {
-  // For the FlatContent to stay valid, we shouldn't do any heap
-  // allocation. Make sure we won't try to internalize the string in GetString.
-  AstRawString* result = NULL;
-  Isolate* saved_isolate = isolate_;
-  isolate_ = NULL;
   DisallowHeapAllocation no_gc;
   String::FlatContent content = literal->GetFlatContent();
   if (content.IsOneByte()) {
-    result = GetOneByteStringInternal(content.ToOneByteVector());
-  } else {
-    DCHECK(content.IsTwoByte());
-    result = GetTwoByteStringInternal(content.ToUC16Vector());
+    return GetOneByteString(content.ToOneByteVector());
   }
-  isolate_ = saved_isolate;
-  result->string_ = literal;
-  return result;
+  DCHECK(content.IsTwoByte());
+  return GetTwoByteString(content.ToUC16Vector());
 }
 
 
@@ -357,8 +348,8 @@ const AstValue* AstValueFactory::NewTheHole() {
 
 #undef GENERATE_VALUE_GETTER
 
-AstRawString* AstValueFactory::GetString(uint32_t hash, bool is_one_byte,
-                                         Vector<const byte> literal_bytes) {
+const AstRawString* AstValueFactory::GetString(
+    uint32_t hash, bool is_one_byte, Vector<const byte> literal_bytes) {
   // literal_bytes here points to whatever the user passed, and this is OK
   // because we use vector_compare (which checks the contents) to compare
   // against the AstRawStrings which are in the string_table_. We should not
index 09a41400fb3ec9b4b89f97b3ebe57e097f374e07..071ca9ce9cc18abf23e17f09c31e69ca69a8ccce 100644 (file)
@@ -287,16 +287,12 @@ class AstValueFactory {
 
   Zone* zone() const { return zone_; }
 
-  const AstRawString* GetOneByteString(Vector<const uint8_t> literal) {
-    return GetOneByteStringInternal(literal);
-  }
+  const AstRawString* GetOneByteString(Vector<const uint8_t> literal);
   const AstRawString* GetOneByteString(const char* string) {
     return GetOneByteString(Vector<const uint8_t>(
         reinterpret_cast<const uint8_t*>(string), StrLength(string)));
   }
-  const AstRawString* GetTwoByteString(Vector<const uint16_t> literal) {
-    return GetTwoByteStringInternal(literal);
-  }
+  const AstRawString* GetTwoByteString(Vector<const uint16_t> literal);
   const AstRawString* GetString(Handle<String> literal);
   const AstConsString* NewConsString(const AstString* left,
                                      const AstString* right);
@@ -331,10 +327,8 @@ class AstValueFactory {
   const AstValue* NewTheHole();
 
  private:
-  AstRawString* GetOneByteStringInternal(Vector<const uint8_t> literal);
-  AstRawString* GetTwoByteStringInternal(Vector<const uint16_t> literal);
-  AstRawString* GetString(uint32_t hash, bool is_one_byte,
-                          Vector<const byte> literal_bytes);
+  const AstRawString* GetString(uint32_t hash, bool is_one_byte,
+                                Vector<const byte> literal_bytes);
 
   // All strings are copied here, one after another (no NULLs inbetween).
   HashMap string_table_;