Arquivos
hhvm/hphp/runtime/base/variable_serializer.h
T
Jordan DeLong 0a18064197 Add some unique_ptr-related support to smart:: containers
- smart::make_unique, returns a unique pointer to smart allocated
    data.

  - Support forwarding in our allocator's construct, so
    smart::vector<foo::unique_ptr<>> works.

  - Move smart containers to their own header.
2013-06-04 17:53:38 -07:00

147 linhas
5.5 KiB
C++

/*
+----------------------------------------------------------------------+
| HipHop for PHP |
+----------------------------------------------------------------------+
| Copyright (c) 2010-2013 Facebook, Inc. (http://www.facebook.com) |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
*/
#ifndef incl_HPHP_VARIABLE_SERIALIZER_H_
#define incl_HPHP_VARIABLE_SERIALIZER_H_
#include "hphp/runtime/base/types.h"
#include "hphp/runtime/base/util/string_buffer.h"
#include "hphp/runtime/base/memory/smart_containers.h"
#include "hphp/runtime/vm/class.h"
#include "hphp/runtime/vm/unit.h"
namespace HPHP {
///////////////////////////////////////////////////////////////////////////////
class ClassInfo;
/**
* Maintaining states during serialization of a variable. We use this single
* class to uniformly serialize variables according to different formats.
*/
class VariableSerializer {
public:
/**
* Supported formats.
*/
enum Type {
PrintR, //print_r()
VarExport, //var_export()
VarDump, //var_dump()
DebugDump, //debug_zval_dump()
DebuggerDump, //used by hphp debugger to obtain user visible output
Serialize, // serialize()
JSON, //json_encode()
APCSerialize, //used in APC serialization (controlled by switch)
DebuggerSerialize, //used by hphp debugger for client<->proxy communication
PHPOutput, //used by compiler to output scalar values into byte code
};
/**
* Constructor and destructor.
*/
explicit VariableSerializer(Type type, int option = 0, int maxRecur = 3);
~VariableSerializer() {
if (m_arrayIds) delete m_arrayIds;
}
/**
* Top level entry function called by f_ functions.
*/
String serialize(CVarRef v, bool ret);
String serializeValue(CVarRef v, bool limit);
// Serialize with limit size of output, always return the serialized string.
// It does not work with Serialize, JSON, APCSerialize, DebuggerSerialize.
String serializeWithLimit(CVarRef v, int limit);
/**
* Type specialized output functions.
*/
void write(bool v);
void write(char v) { write((int64_t)v);}
void write(short v) { write((int64_t)v);}
void write(int v) { write((int64_t)v);}
void write(int64_t v);
void write(double v);
void write(const char *v, int len = -1, bool isArrayKey = false);
void write(CStrRef v);
void write(CObjRef v);
void write(CVarRef v, bool isArrayKey = false);
void writeNull();
// what to write if recursive level is over limit?
void writeOverflow(void* ptr, bool isObject = false);
void writeRefCount(); // for DebugDump only
void writeArrayHeader(int size, bool isVectorData);
void writeArrayKey(Variant key);
void writeArrayValue(CVarRef value);
void writeCollectionKey(CVarRef key);
void writeCollectionKeylessPrefix();
void writeArrayFooter();
void writeSerializableObject(CStrRef clsname, CStrRef serialized);
/**
* Helpers.
*/
void indent();
void setReferenced(bool referenced) { m_referenced = referenced;}
void setRefCount(int count) { m_refCount = count;}
void incMaxCount() { m_maxCount++; }
bool incNestedLevel(void *ptr, bool isObject = false);
void decNestedLevel(void *ptr);
void setObjectInfo(CStrRef objClass, int objId, char objCode);
void setResourceInfo(CStrRef rsrcName, int rsrcId);
void getResourceInfo(String &rsrcName, int &rsrcId);
Type getType() const { return m_type; }
private:
typedef smart::hash_map<void*, int, pointer_hash<void> > SmartPtrCtrMap;
Type m_type;
int m_option; // type specific extra options
StringBuffer *m_buf;
int m_indent;
SmartPtrCtrMap m_counts; // counting seen arrays for recursive levels
SmartPtrCtrMap *m_arrayIds; // reference ids for objs/arrays
int m_valueCount; // Current ref index
bool m_referenced; // mark current array element as reference
int m_refCount; // current variable's reference count
String m_objClass; // for object serialization
int m_objId; // for object serialization
char m_objCode; // for object serialization
String m_rsrcName; // for resource serialization
int m_rsrcId; // for resource serialization
int m_maxCount; // for max recursive levels
int m_levelDebugger; // keep track of levels for DebuggerSerialize
int m_maxLevelDebugger; // for max level of DebuggerSerialize
struct ArrayInfo {
bool is_object; // nested arrays or objects
bool is_vector; // whether current array is a vector
bool first_element; // whether this is first array element
int indent_delta; // the extra indent to serialize this object
};
smart::vector<ArrayInfo> m_arrayInfos;
void writePropertyKey(CStrRef prop);
};
///////////////////////////////////////////////////////////////////////////////
}
#endif // incl_HPHP_VARIABLE_SERIALIZER_H_