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 |