646f1f0a4a
BUG=v8:5363 R=adamk@chromium.org, littledan@chromium.org, cbruni@chromium.org Review-Url: https://codereview.chromium.org/2328523002 Cr-Commit-Position: refs/heads/master@{#39291}
127 lines
4.1 KiB
C++
127 lines
4.1 KiB
C++
// 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_
|