| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 #include "spaces-inl.h" | 36 #include "spaces-inl.h" |
| 37 #include "token.h" | 37 #include "token.h" |
| 38 | 38 |
| 39 namespace v8 { | 39 namespace v8 { |
| 40 namespace internal { | 40 namespace internal { |
| 41 | 41 |
| 42 // A simple json parser. | 42 // A simple json parser. |
| 43 template <bool seq_ascii> | 43 template <bool seq_ascii> |
| 44 class JsonParser BASE_EMBEDDED { | 44 class JsonParser BASE_EMBEDDED { |
| 45 public: | 45 public: |
| 46 static Handle<Object> Parse(Handle<String> source) { | 46 static MaybeHandle<Object> Parse(Handle<String> source) { |
| 47 return JsonParser(source).ParseJson(); | 47 return JsonParser(source).ParseJson(); |
| 48 } | 48 } |
| 49 | 49 |
| 50 static const int kEndOfString = -1; | 50 static const int kEndOfString = -1; |
| 51 | 51 |
| 52 private: | 52 private: |
| 53 explicit JsonParser(Handle<String> source) | 53 explicit JsonParser(Handle<String> source) |
| 54 : source_(source), | 54 : source_(source), |
| 55 source_length_(source->length()), | 55 source_length_(source->length()), |
| 56 isolate_(source->map()->GetHeap()->isolate()), | 56 isolate_(source->map()->GetHeap()->isolate()), |
| 57 factory_(isolate_->factory()), | 57 factory_(isolate_->factory()), |
| 58 zone_(isolate_), | 58 zone_(isolate_), |
| 59 object_constructor_(isolate_->native_context()->object_function(), | 59 object_constructor_(isolate_->native_context()->object_function(), |
| 60 isolate_), | 60 isolate_), |
| 61 position_(-1) { | 61 position_(-1) { |
| 62 FlattenString(source_); | 62 FlattenString(source_); |
| 63 pretenure_ = (source_length_ >= kPretenureTreshold) ? TENURED : NOT_TENURED; | 63 pretenure_ = (source_length_ >= kPretenureTreshold) ? TENURED : NOT_TENURED; |
| 64 | 64 |
| 65 // Optimized fast case where we only have ASCII characters. | 65 // Optimized fast case where we only have ASCII characters. |
| 66 if (seq_ascii) { | 66 if (seq_ascii) { |
| 67 seq_source_ = Handle<SeqOneByteString>::cast(source_); | 67 seq_source_ = Handle<SeqOneByteString>::cast(source_); |
| 68 } | 68 } |
| 69 } | 69 } |
| 70 | 70 |
| 71 // Parse a string containing a single JSON value. | 71 // Parse a string containing a single JSON value. |
| 72 Handle<Object> ParseJson(); | 72 MaybeHandle<Object> ParseJson(); |
| 73 | 73 |
| 74 inline void Advance() { | 74 inline void Advance() { |
| 75 position_++; | 75 position_++; |
| 76 if (position_ >= source_length_) { | 76 if (position_ >= source_length_) { |
| 77 c0_ = kEndOfString; | 77 c0_ = kEndOfString; |
| 78 } else if (seq_ascii) { | 78 } else if (seq_ascii) { |
| 79 c0_ = seq_source_->SeqOneByteStringGet(position_); | 79 c0_ = seq_source_->SeqOneByteStringGet(position_); |
| 80 } else { | 80 } else { |
| 81 c0_ = source_->Get(position_); | 81 c0_ = source_->Get(position_); |
| 82 } | 82 } |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 PretenureFlag pretenure_; | 212 PretenureFlag pretenure_; |
| 213 Isolate* isolate_; | 213 Isolate* isolate_; |
| 214 Factory* factory_; | 214 Factory* factory_; |
| 215 Zone zone_; | 215 Zone zone_; |
| 216 Handle<JSFunction> object_constructor_; | 216 Handle<JSFunction> object_constructor_; |
| 217 uc32 c0_; | 217 uc32 c0_; |
| 218 int position_; | 218 int position_; |
| 219 }; | 219 }; |
| 220 | 220 |
| 221 template <bool seq_ascii> | 221 template <bool seq_ascii> |
| 222 Handle<Object> JsonParser<seq_ascii>::ParseJson() { | 222 MaybeHandle<Object> JsonParser<seq_ascii>::ParseJson() { |
| 223 // Advance to the first character (possibly EOS) | 223 // Advance to the first character (possibly EOS) |
| 224 AdvanceSkipWhitespace(); | 224 AdvanceSkipWhitespace(); |
| 225 Handle<Object> result = ParseJsonValue(); | 225 Handle<Object> result = ParseJsonValue(); |
| 226 if (result.is_null() || c0_ != kEndOfString) { | 226 if (result.is_null() || c0_ != kEndOfString) { |
| 227 // Some exception (for example stack overflow) is already pending. | 227 // Some exception (for example stack overflow) is already pending. |
| 228 if (isolate_->has_pending_exception()) return Handle<Object>::null(); | 228 if (isolate_->has_pending_exception()) return Handle<Object>::null(); |
| 229 | 229 |
| 230 // Parse failed. Current character is the unexpected token. | 230 // Parse failed. Current character is the unexpected token. |
| 231 const char* message; | 231 const char* message; |
| 232 Factory* factory = this->factory(); | 232 Factory* factory = this->factory(); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 261 LookupSingleCharacterStringFromCode(isolate_, c0_); | 261 LookupSingleCharacterStringFromCode(isolate_, c0_); |
| 262 Handle<FixedArray> element = factory->NewFixedArray(1); | 262 Handle<FixedArray> element = factory->NewFixedArray(1); |
| 263 element->set(0, *name); | 263 element->set(0, *name); |
| 264 array = factory->NewJSArrayWithElements(element); | 264 array = factory->NewJSArrayWithElements(element); |
| 265 break; | 265 break; |
| 266 } | 266 } |
| 267 | 267 |
| 268 MessageLocation location(factory->NewScript(source_), | 268 MessageLocation location(factory->NewScript(source_), |
| 269 position_, | 269 position_, |
| 270 position_ + 1); | 270 position_ + 1); |
| 271 Handle<Object> result = factory->NewSyntaxError(message, array); | 271 Handle<Object> error = factory->NewSyntaxError(message, array); |
| 272 isolate()->Throw(*result, &location); | 272 return isolate()->template Throw<Object>(error, &location); |
| 273 return Handle<Object>::null(); | |
| 274 } | 273 } |
| 275 return result; | 274 return result; |
| 276 } | 275 } |
| 277 | 276 |
| 278 | 277 |
| 279 // Parse any JSON value. | 278 // Parse any JSON value. |
| 280 template <bool seq_ascii> | 279 template <bool seq_ascii> |
| 281 Handle<Object> JsonParser<seq_ascii>::ParseJsonValue() { | 280 Handle<Object> JsonParser<seq_ascii>::ParseJsonValue() { |
| 282 StackLimitCheck stack_check(isolate_); | 281 StackLimitCheck stack_check(isolate_); |
| 283 if (stack_check.HasOverflowed()) { | 282 if (stack_check.HasOverflowed()) { |
| (...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 799 | 798 |
| 800 ASSERT_EQ('"', c0_); | 799 ASSERT_EQ('"', c0_); |
| 801 // Advance past the last '"'. | 800 // Advance past the last '"'. |
| 802 AdvanceSkipWhitespace(); | 801 AdvanceSkipWhitespace(); |
| 803 return result; | 802 return result; |
| 804 } | 803 } |
| 805 | 804 |
| 806 } } // namespace v8::internal | 805 } } // namespace v8::internal |
| 807 | 806 |
| 808 #endif // V8_JSON_PARSER_H_ | 807 #endif // V8_JSON_PARSER_H_ |
| OLD | NEW |