|  | // 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> object, Handle<Object> key); | 
|  |  | 
|  | // 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); | 
|  |  | 
|  | 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_ |