| Index: src/json-parser.h
|
| diff --git a/src/json-parser.h b/src/json-parser.h
|
| index 245dfbfecb944748bff97a4713f0da8e5f668fb1..40116fa59ab9594c578d5467ac5330cf3509dd37 100644
|
| --- a/src/json-parser.h
|
| +++ b/src/json-parser.h
|
| @@ -149,6 +149,8 @@ class JsonParser BASE_EMBEDDED {
|
| }
|
|
|
| inline Isolate* isolate() { return isolate_; }
|
| + inline Factory* factory() { return factory_; }
|
| + inline Handle<JSFunction> object_constructor() { return object_constructor_; }
|
| inline Zone* zone() const { return zone_; }
|
|
|
| static const int kInitialSpecialStringLength = 1024;
|
| @@ -160,6 +162,8 @@ class JsonParser BASE_EMBEDDED {
|
| Handle<SeqAsciiString> seq_source_;
|
|
|
| Isolate* isolate_;
|
| + Factory* factory_;
|
| + Handle<JSFunction> object_constructor_;
|
| uc32 c0_;
|
| int position_;
|
| Zone* zone_;
|
| @@ -169,6 +173,9 @@ template <bool seq_ascii>
|
| Handle<Object> JsonParser<seq_ascii>::ParseJson(Handle<String> source,
|
| Zone* zone) {
|
| isolate_ = source->map()->GetHeap()->isolate();
|
| + factory_ = isolate_->factory();
|
| + object_constructor_ =
|
| + Handle<JSFunction>(isolate()->native_context()->object_function());
|
| zone_ = zone;
|
| FlattenString(source);
|
| source_ = source;
|
| @@ -188,7 +195,7 @@ Handle<Object> JsonParser<seq_ascii>::ParseJson(Handle<String> source,
|
| // Parse failed. Current character is the unexpected token.
|
|
|
| const char* message;
|
| - Factory* factory = isolate()->factory();
|
| + Factory* factory = this->factory();
|
| Handle<JSArray> array;
|
|
|
| switch (c0_) {
|
| @@ -237,52 +244,35 @@ Handle<Object> JsonParser<seq_ascii>::ParseJson(Handle<String> source,
|
| // Parse any JSON value.
|
| template <bool seq_ascii>
|
| Handle<Object> JsonParser<seq_ascii>::ParseJsonValue() {
|
| - switch (c0_) {
|
| - case '"':
|
| - return ParseJsonString();
|
| - case '-':
|
| - case '0':
|
| - case '1':
|
| - case '2':
|
| - case '3':
|
| - case '4':
|
| - case '5':
|
| - case '6':
|
| - case '7':
|
| - case '8':
|
| - case '9':
|
| - return ParseJsonNumber();
|
| - case 'f':
|
| - if (AdvanceGetChar() == 'a' && AdvanceGetChar() == 'l' &&
|
| - AdvanceGetChar() == 's' && AdvanceGetChar() == 'e') {
|
| - AdvanceSkipWhitespace();
|
| - return isolate()->factory()->false_value();
|
| - } else {
|
| - return ReportUnexpectedCharacter();
|
| - }
|
| - case 't':
|
| - if (AdvanceGetChar() == 'r' && AdvanceGetChar() == 'u' &&
|
| - AdvanceGetChar() == 'e') {
|
| - AdvanceSkipWhitespace();
|
| - return isolate()->factory()->true_value();
|
| - } else {
|
| - return ReportUnexpectedCharacter();
|
| - }
|
| - case 'n':
|
| - if (AdvanceGetChar() == 'u' && AdvanceGetChar() == 'l' &&
|
| - AdvanceGetChar() == 'l') {
|
| - AdvanceSkipWhitespace();
|
| - return isolate()->factory()->null_value();
|
| - } else {
|
| - return ReportUnexpectedCharacter();
|
| - }
|
| - case '{':
|
| - return ParseJsonObject();
|
| - case '[':
|
| - return ParseJsonArray();
|
| - default:
|
| - return ReportUnexpectedCharacter();
|
| + if (c0_ == '"') return ParseJsonString();
|
| + if ((c0_ >= '0' && c0_ <= '9') || c0_ == '-') return ParseJsonNumber();
|
| + if (c0_ == '{') return ParseJsonObject();
|
| + if (c0_ == '[') return ParseJsonArray();
|
| + if (c0_ == 'f') {
|
| + if (AdvanceGetChar() == 'a' && AdvanceGetChar() == 'l' &&
|
| + AdvanceGetChar() == 's' && AdvanceGetChar() == 'e') {
|
| + AdvanceSkipWhitespace();
|
| + return factory()->false_value();
|
| + }
|
| + return ReportUnexpectedCharacter();
|
| + }
|
| + if (c0_ == 't') {
|
| + if (AdvanceGetChar() == 'r' && AdvanceGetChar() == 'u' &&
|
| + AdvanceGetChar() == 'e') {
|
| + AdvanceSkipWhitespace();
|
| + return factory()->true_value();
|
| + }
|
| + return ReportUnexpectedCharacter();
|
| + }
|
| + if (c0_ == 'n') {
|
| + if (AdvanceGetChar() == 'u' && AdvanceGetChar() == 'l' &&
|
| + AdvanceGetChar() == 'l') {
|
| + AdvanceSkipWhitespace();
|
| + return factory()->null_value();
|
| + }
|
| + return ReportUnexpectedCharacter();
|
| }
|
| + return ReportUnexpectedCharacter();
|
| }
|
|
|
|
|
| @@ -290,10 +280,8 @@ Handle<Object> JsonParser<seq_ascii>::ParseJsonValue() {
|
| template <bool seq_ascii>
|
| Handle<Object> JsonParser<seq_ascii>::ParseJsonObject() {
|
| Handle<Object> prototype;
|
| - Handle<JSFunction> object_constructor(
|
| - isolate()->native_context()->object_function());
|
| Handle<JSObject> json_object =
|
| - isolate()->factory()->NewJSObject(object_constructor);
|
| + factory()->NewJSObject(object_constructor());
|
| ASSERT_EQ(c0_, '{');
|
|
|
| AdvanceSkipWhitespace();
|
| @@ -377,11 +365,11 @@ Handle<Object> JsonParser<seq_ascii>::ParseJsonArray() {
|
| AdvanceSkipWhitespace();
|
| // Allocate a fixed array with all the elements.
|
| Handle<FixedArray> fast_elements =
|
| - isolate()->factory()->NewFixedArray(elements.length());
|
| + 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);
|
| + return factory()->NewJSArrayWithElements(fast_elements);
|
| }
|
|
|
|
|
| @@ -448,7 +436,7 @@ Handle<Object> JsonParser<seq_ascii>::ParseJsonNumber() {
|
| buffer.Dispose();
|
| }
|
| SkipWhitespace();
|
| - return isolate()->factory()->NewNumber(number);
|
| + return factory()->NewNumber(number);
|
| }
|
|
|
|
|
| @@ -489,8 +477,7 @@ Handle<String> JsonParser<seq_ascii>::SlowScanJsonString(
|
| int count = end - start;
|
| int max_length = count + source_length_ - position_;
|
| int length = Min(max_length, Max(kInitialSpecialStringLength, 2 * count));
|
| - Handle<StringType> seq_str = NewRawString<StringType>(isolate()->factory(),
|
| - length);
|
| + Handle<StringType> seq_str = NewRawString<StringType>(factory(), length);
|
| // Copy prefix into seq_str.
|
| SinkChar* dest = seq_str->GetChars();
|
| String::WriteToFlat(*prefix, dest, start, end);
|
| @@ -668,11 +655,11 @@ Handle<String> JsonParser<seq_ascii>::ScanJsonString() {
|
| int length = position_ - beg_pos;
|
| Handle<String> result;
|
| if (seq_ascii && is_symbol) {
|
| - result = isolate()->factory()->LookupAsciiSymbol(seq_source_,
|
| + result = factory()->LookupAsciiSymbol(seq_source_,
|
| beg_pos,
|
| length);
|
| } else {
|
| - result = isolate()->factory()->NewRawAsciiString(length);
|
| + result = factory()->NewRawAsciiString(length);
|
| char* dest = SeqAsciiString::cast(*result)->GetChars();
|
| String::WriteToFlat(*source_, dest, beg_pos, position_);
|
| }
|
|
|