| // Copyright 2012 the V8 project authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef V8_JSON_STRINGIFIER_H_ | |
| #define V8_JSON_STRINGIFIER_H_ | |
| #include "src/objects.h" | |
| #include "src/string-builder.h" | |
| namespace v8 { | |
| namespace internal { | |
| class JsonStringifier BASE_EMBEDDED { | |
| public: | |
| explicit JsonStringifier(Isolate* isolate); | |
| ~JsonStringifier() { DeleteArray(gap_); } | |
| MUST_USE_RESULT MaybeHandle<Object> Stringify(Handle<Object> object, | |
| Handle<Object> replacer, | |
| Handle<Object> gap); | |
| private: | |
| enum Result { UNCHANGED, SUCCESS, EXCEPTION }; | |
| bool InitializeReplacer(Handle<Object> replacer); | |
| bool InitializeGap(Handle<Object> gap); | |
| MUST_USE_RESULT MaybeHandle<Object> ApplyToJsonFunction( | |
| Handle<Object> object, | |
| Handle<Object> key); | |
| MUST_USE_RESULT MaybeHandle<Object> ApplyReplacerFunction( | |
| Handle<Object> value, Handle<Object> key, Handle<Object> initial_holder); | |
| // Entry point to serialize the object. | |
| INLINE(Result SerializeObject(Handle<Object> obj)) { | |
| return Serialize_<false>(obj, false, factory()->empty_string()); | |
| } | |
| // Serialize an array element. | |
| // The index may serve as argument for the toJSON function. | |
| INLINE(Result SerializeElement(Isolate* isolate, | |
| Handle<Object> object, | |
| int i)) { | |
| return Serialize_<false>(object, | |
| false, | |
| Handle<Object>(Smi::FromInt(i), isolate)); | |
| } | |
| // Serialize a object property. | |
| // The key may or may not be serialized depending on the property. | |
| // The key may also serve as argument for the toJSON function. | |
| INLINE(Result SerializeProperty(Handle<Object> object, | |
| bool deferred_comma, | |
| Handle<String> deferred_key)) { | |
| DCHECK(!deferred_key.is_null()); | |
| return Serialize_<true>(object, deferred_comma, deferred_key); | |
| } | |
| template <bool deferred_string_key> | |
| Result Serialize_(Handle<Object> object, bool comma, Handle<Object> key); | |
| INLINE(void SerializeDeferredKey(bool deferred_comma, | |
| Handle<Object> deferred_key)); | |
| Result SerializeSmi(Smi* object); | |
| Result SerializeDouble(double number); | |
| INLINE(Result SerializeHeapNumber(Handle<HeapNumber> object)) { | |
| return SerializeDouble(object->value()); | |
| } | |
| Result SerializeJSValue(Handle<JSValue> object); | |
| INLINE(Result SerializeJSArray(Handle<JSArray> object)); | |
| INLINE(Result SerializeJSObject(Handle<JSObject> object)); | |
| Result SerializeJSProxy(Handle<JSProxy> object); | |
| Result SerializeJSReceiverSlow(Handle<JSReceiver> object); | |
| Result SerializeArrayLikeSlow(Handle<JSReceiver> object, uint32_t start, | |
| uint32_t length); | |
| void SerializeString(Handle<String> object); | |
| template <typename SrcChar, typename DestChar> | |
| INLINE(static void SerializeStringUnchecked_( | |
| Vector<const SrcChar> src, | |
| IncrementalStringBuilder::NoExtend<DestChar>* dest)); | |
| template <typename SrcChar, typename DestChar> | |
| INLINE(void SerializeString_(Handle<String> string)); | |
| template <typename Char> | |
| INLINE(static bool DoNotEscape(Char c)); | |
| INLINE(void NewLine()); | |
| INLINE(void Indent() { indent_++; }); | |
| INLINE(void Unindent() { indent_--; }); | |
| INLINE(void Separator(bool first)); | |
| Handle<JSReceiver> CurrentHolder(Handle<Object> value, | |
| Handle<Object> inital_holder); | |
| Result StackPush(Handle<Object> object); | |
| void StackPop(); | |
| Factory* factory() { return isolate_->factory(); } | |
| Isolate* isolate_; | |
| IncrementalStringBuilder builder_; | |
| Handle<String> tojson_string_; | |
| Handle<JSArray> stack_; | |
| Handle<FixedArray> property_list_; | |
| Handle<JSReceiver> replacer_function_; | |
| uc16* gap_; | |
| int indent_; | |
| static const int kJsonEscapeTableEntrySize = 8; | |
| static const char* const JsonEscapeTable; | |
| }; | |
| } // namespace internal | |
| } // namespace v8 | |
| #endif // V8_JSON_STRINGIFIER_H_ |