blob: 1844c8e3237f4bc4ef5bb3702cfcf26a5aea0554 [file]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#pragma once
namespace JSON
{
class JSONStack;
class JSONParser;
class EntryInfo
{
public:
static Js::FunctionInfo Stringify;
static Js::FunctionInfo Parse;
};
Js::Var Stringify(Js::RecyclableObject* function, Js::CallInfo callInfo, ...);
Js::Var Parse(Js::RecyclableObject* function, Js::CallInfo callInfo, ...);
class StringifySession
{
public:
enum ReplacerType
{
ReplacerNone,
ReplacerFunction,
ReplacerArray
};
struct StringTable
{
Js::JavascriptString * propName;
Js::PropertyRecord const * propRecord;
};
StringifySession(Js::ScriptContext* sc)
: scriptContext(sc),
replacerType(ReplacerNone),
gap(NULL),
indent(0),
propertySeparator(NULL)
{
replacer.propertyList.propertyNames = NULL;
replacer.propertyList.length = 0;
};
Js::Var Stringify(){};
// Init operation is split in three functions
void InitReplacer(Js::RecyclableObject* f)
{
replacerType = ReplacerFunction;
replacer.ReplacerFunction = f;
}
void InitReplacer(StringTable *nameTable, uint len)
{
replacerType = ReplacerArray;
replacer.propertyList.propertyNames = nameTable;
replacer.propertyList.length = len;
}
void CompleteInit(Js::Var space, ArenaAllocator* alloc);
Js::Var Str(Js::JavascriptString* key, Js::PropertyId keyId, Js::Var holder);
Js::Var Str(uint32 index, Js::Var holder);
private:
Js::JavascriptString* Quote(Js::JavascriptString* value);
Js::Var StringifyObject(Js::Var value);
Js::Var StringifyArray(Js::Var value);
Js::JavascriptString* GetArrayElementString(uint32 index, Js::Var arrayVar);
Js::JavascriptString* GetPropertySeparator();
Js::JavascriptString* GetIndentString(uint count);
Js::JavascriptString* GetMemberSeparator(Js::JavascriptString* indentString);
void StringifyMemberObject( Js::JavascriptString* propertyName, Js::PropertyId id, Js::Var value, Js::ConcatStringBuilder* result,
Js::JavascriptString* &indentString, Js::JavascriptString* &memberSeparator, bool &isFirstMember, bool &isEmpty );
uint32 GetPropertyCount(Js::RecyclableObject* object, Js::JavascriptStaticEnumerator* enumerator);
uint32 GetPropertyCount(Js::RecyclableObject* object, Js::JavascriptStaticEnumerator* enumerator, bool* isPrecise);
JSONStack *objectStack;
Js::ScriptContext* scriptContext;
ReplacerType replacerType;
union
{
Js::RecyclableObject* ReplacerFunction;
struct PropertyList
{
StringTable *propertyNames;
uint length;
} propertyList;
} replacer;
Js::JavascriptString* gap;
uint indent;
Js::JavascriptString* propertySeparator; // colon or colon+space
Js::Var StrHelper(Js::JavascriptString* key, Js::Var value, Js::Var holder);
};
} // namespace JSON