| Index: src/parser.cc | 
| =================================================================== | 
| --- src/parser.cc	(revision 7898) | 
| +++ src/parser.cc	(working copy) | 
| @@ -4014,201 +4014,7 @@ | 
| scanner().location().beg_pos); | 
| } | 
|  | 
| -// ---------------------------------------------------------------------------- | 
| -// JSON | 
|  | 
| -Handle<Object> JsonParser::ParseJson(Handle<String> script, | 
| -                                     UC16CharacterStream* source) { | 
| -  scanner_.Initialize(source); | 
| -  stack_overflow_ = false; | 
| -  Handle<Object> result = ParseJsonValue(); | 
| -  if (result.is_null() || scanner_.Next() != Token::EOS) { | 
| -    if (stack_overflow_) { | 
| -      // Scanner failed. | 
| -      isolate()->StackOverflow(); | 
| -    } else { | 
| -      // Parse failed. Scanner's current token is the unexpected token. | 
| -      Token::Value token = scanner_.current_token(); | 
| - | 
| -      const char* message; | 
| -      const char* name_opt = NULL; | 
| - | 
| -      switch (token) { | 
| -        case Token::EOS: | 
| -          message = "unexpected_eos"; | 
| -          break; | 
| -        case Token::NUMBER: | 
| -          message = "unexpected_token_number"; | 
| -          break; | 
| -        case Token::STRING: | 
| -          message = "unexpected_token_string"; | 
| -          break; | 
| -        case Token::IDENTIFIER: | 
| -        case Token::FUTURE_RESERVED_WORD: | 
| -          message = "unexpected_token_identifier"; | 
| -          break; | 
| -        default: | 
| -          message = "unexpected_token"; | 
| -          name_opt = Token::String(token); | 
| -          ASSERT(name_opt != NULL); | 
| -          break; | 
| -      } | 
| - | 
| -      Scanner::Location source_location = scanner_.location(); | 
| -      Factory* factory = isolate()->factory(); | 
| -      MessageLocation location(factory->NewScript(script), | 
| -                               source_location.beg_pos, | 
| -                               source_location.end_pos); | 
| -      Handle<JSArray> array; | 
| -      if (name_opt == NULL) { | 
| -        array = factory->NewJSArray(0); | 
| -      } else { | 
| -        Handle<String> name = factory->NewStringFromUtf8(CStrVector(name_opt)); | 
| -        Handle<FixedArray> element = factory->NewFixedArray(1); | 
| -        element->set(0, *name); | 
| -        array = factory->NewJSArrayWithElements(element); | 
| -      } | 
| -      Handle<Object> result = factory->NewSyntaxError(message, array); | 
| -      isolate()->Throw(*result, &location); | 
| -      return Handle<Object>::null(); | 
| -    } | 
| -  } | 
| -  return result; | 
| -} | 
| - | 
| - | 
| -Handle<String> JsonParser::GetString() { | 
| -  int literal_length = scanner_.literal_length(); | 
| -  if (literal_length == 0) { | 
| -    return isolate()->factory()->empty_string(); | 
| -  } | 
| -  if (scanner_.is_literal_ascii()) { | 
| -    return isolate()->factory()->NewStringFromAscii( | 
| -        scanner_.literal_ascii_string()); | 
| -  } else { | 
| -    return isolate()->factory()->NewStringFromTwoByte( | 
| -        scanner_.literal_uc16_string()); | 
| -  } | 
| -} | 
| - | 
| - | 
| -Handle<String> JsonParser::GetSymbol() { | 
| -  int literal_length = scanner_.literal_length(); | 
| -  if (literal_length == 0) { | 
| -    return isolate()->factory()->empty_string(); | 
| -  } | 
| -  if (scanner_.is_literal_ascii()) { | 
| -    return isolate()->factory()->LookupAsciiSymbol( | 
| -        scanner_.literal_ascii_string()); | 
| -  } else { | 
| -    return isolate()->factory()->LookupTwoByteSymbol( | 
| -        scanner_.literal_uc16_string()); | 
| -  } | 
| -} | 
| - | 
| - | 
| -// Parse any JSON value. | 
| -Handle<Object> JsonParser::ParseJsonValue() { | 
| -  Token::Value token = scanner_.Next(); | 
| -  switch (token) { | 
| -    case Token::STRING: | 
| -      return GetString(); | 
| -    case Token::NUMBER: | 
| -      return isolate()->factory()->NewNumber(scanner_.number()); | 
| -    case Token::FALSE_LITERAL: | 
| -      return isolate()->factory()->false_value(); | 
| -    case Token::TRUE_LITERAL: | 
| -      return isolate()->factory()->true_value(); | 
| -    case Token::NULL_LITERAL: | 
| -      return isolate()->factory()->null_value(); | 
| -    case Token::LBRACE: | 
| -      return ParseJsonObject(); | 
| -    case Token::LBRACK: | 
| -      return ParseJsonArray(); | 
| -    default: | 
| -      return ReportUnexpectedToken(); | 
| -  } | 
| -} | 
| - | 
| - | 
| -// Parse a JSON object. Scanner must be right after '{' token. | 
| -Handle<Object> JsonParser::ParseJsonObject() { | 
| -  Handle<JSFunction> object_constructor( | 
| -      isolate()->global_context()->object_function()); | 
| -  Handle<JSObject> json_object = | 
| -      isolate()->factory()->NewJSObject(object_constructor); | 
| -  if (scanner_.peek() == Token::RBRACE) { | 
| -    scanner_.Next(); | 
| -  } else { | 
| -    if (StackLimitCheck(isolate()).HasOverflowed()) { | 
| -      stack_overflow_ = true; | 
| -      return Handle<Object>::null(); | 
| -    } | 
| -    do { | 
| -      if (scanner_.Next() != Token::STRING) { | 
| -        return ReportUnexpectedToken(); | 
| -      } | 
| -      Handle<String> key = GetSymbol(); | 
| -      if (scanner_.Next() != Token::COLON) { | 
| -        return ReportUnexpectedToken(); | 
| -      } | 
| -      Handle<Object> value = ParseJsonValue(); | 
| -      if (value.is_null()) return Handle<Object>::null(); | 
| -      uint32_t index; | 
| -      if (key->AsArrayIndex(&index)) { | 
| -        SetOwnElement(json_object, index, value, kNonStrictMode); | 
| -      } else if (key->Equals(isolate()->heap()->Proto_symbol())) { | 
| -        // We can't remove the __proto__ accessor since it's hardcoded | 
| -        // in several places. Instead go along and add the value as | 
| -        // the prototype of the created object if possible. | 
| -        SetPrototype(json_object, value); | 
| -      } else { | 
| -        SetLocalPropertyIgnoreAttributes(json_object, key, value, NONE); | 
| -      } | 
| -    } while (scanner_.Next() == Token::COMMA); | 
| -    if (scanner_.current_token() != Token::RBRACE) { | 
| -      return ReportUnexpectedToken(); | 
| -    } | 
| -  } | 
| -  return json_object; | 
| -} | 
| - | 
| - | 
| -// Parse a JSON array. Scanner must be right after '[' token. | 
| -Handle<Object> JsonParser::ParseJsonArray() { | 
| -  ZoneScope zone_scope(DELETE_ON_EXIT); | 
| -  ZoneList<Handle<Object> > elements(4); | 
| - | 
| -  Token::Value token = scanner_.peek(); | 
| -  if (token == Token::RBRACK) { | 
| -    scanner_.Next(); | 
| -  } else { | 
| -    if (StackLimitCheck(isolate()).HasOverflowed()) { | 
| -      stack_overflow_ = true; | 
| -      return Handle<Object>::null(); | 
| -    } | 
| -    do { | 
| -      Handle<Object> element = ParseJsonValue(); | 
| -      if (element.is_null()) return Handle<Object>::null(); | 
| -      elements.Add(element); | 
| -      token = scanner_.Next(); | 
| -    } while (token == Token::COMMA); | 
| -    if (token != Token::RBRACK) { | 
| -      return ReportUnexpectedToken(); | 
| -    } | 
| -  } | 
| - | 
| -  // Allocate a fixed array with all the elements. | 
| -  Handle<FixedArray> fast_elements = | 
| -      isolate()->factory()->NewFixedArray(elements.length()); | 
| - | 
| -  for (int i = 0, n = elements.length(); i < n; i++) { | 
| -    fast_elements->set(i, *elements[i]); | 
| -  } | 
| - | 
| -  return isolate()->factory()->NewJSArrayWithElements(fast_elements); | 
| -} | 
| - | 
| // ---------------------------------------------------------------------------- | 
| // Regular expressions | 
|  | 
|  |