2 +----------------------------------------------------------------------+
4 +----------------------------------------------------------------------+
5 | Copyright (c) 2010-present Facebook, Inc. (http://www.facebook.com) |
6 +----------------------------------------------------------------------+
7 | This source file is subject to version 3.01 of the PHP license, |
8 | that is bundled with this package in the file LICENSE, and is |
9 | available through the world-wide-web at the following url: |
10 | http://www.php.net/license/3_01.txt |
11 | If you did not receive a copy of the PHP license and are unable to |
12 | obtain it through the world-wide-web, please send a note to |
13 | license@php.net so we can mail you a copy immediately. |
14 +----------------------------------------------------------------------+
17 #include "hphp/runtime/base/array-data.h"
18 #include "hphp/runtime/base/datatype.h"
19 #include "hphp/runtime/base/object-data.h"
20 #include "hphp/runtime/base/ref-data.h"
21 #include "hphp/runtime/base/resource-data.h"
22 #include "hphp/runtime/base/string-data.h"
23 #include "hphp/runtime/base/typed-value.h"
25 #include "hphp/util/assertions.h"
29 ///////////////////////////////////////////////////////////////////////////////
31 bool cellIsPlausible(const Cell cell
) {
32 assertx(cell
.m_type
!= KindOfRef
);
34 auto assertPtr
= [](void* ptr
) {
35 assertx(ptr
&& (uintptr_t(ptr
) % sizeof(ptr
) == 0));
39 switch (cell
.m_type
) {
44 assertx(cell
.m_data
.num
== 0 || cell
.m_data
.num
== 1);
49 case KindOfPersistentString
:
50 assertPtr(cell
.m_data
.pstr
);
51 assertx(cell
.m_data
.pstr
->kindIsValid());
52 assertx(!cell
.m_data
.pstr
->isRefCounted());
55 assertPtr(cell
.m_data
.pstr
);
56 assertx(cell
.m_data
.pstr
->kindIsValid());
57 assertx(cell
.m_data
.pstr
->checkCount());
59 case KindOfPersistentVec
:
60 assertPtr(cell
.m_data
.parr
);
61 assertx(!cell
.m_data
.parr
->isRefCounted());
62 assertx(cell
.m_data
.parr
->isVecArray());
63 assertx(cell
.m_data
.parr
->isNotDVArray());
66 assertPtr(cell
.m_data
.parr
);
67 assertx(cell
.m_data
.parr
->checkCount());
68 assertx(cell
.m_data
.parr
->isVecArray());
69 assertx(cell
.m_data
.parr
->isNotDVArray());
71 case KindOfPersistentDict
:
72 assertPtr(cell
.m_data
.parr
);
73 assertx(!cell
.m_data
.parr
->isRefCounted());
74 assertx(cell
.m_data
.parr
->isDict());
75 assertx(cell
.m_data
.parr
->isNotDVArray());
78 assertPtr(cell
.m_data
.parr
);
79 assertx(cell
.m_data
.parr
->checkCount());
80 assertx(cell
.m_data
.parr
->isDict());
81 assertx(cell
.m_data
.parr
->isNotDVArray());
83 case KindOfPersistentKeyset
:
84 assertPtr(cell
.m_data
.parr
);
85 assertx(!cell
.m_data
.parr
->isRefCounted());
86 assertx(cell
.m_data
.parr
->isKeyset());
87 assertx(cell
.m_data
.parr
->isNotDVArray());
90 assertPtr(cell
.m_data
.parr
);
91 assertx(cell
.m_data
.parr
->checkCount());
92 assertx(cell
.m_data
.parr
->isKeyset());
93 assertx(cell
.m_data
.parr
->isNotDVArray());
95 case KindOfPersistentArray
:
96 assertPtr(cell
.m_data
.parr
);
97 assertx(cell
.m_data
.parr
->kindIsValid());
98 assertx(!cell
.m_data
.parr
->isRefCounted());
99 assertx(cell
.m_data
.parr
->isPHPArray());
100 assertx(cell
.m_data
.parr
->dvArraySanityCheck());
103 assertPtr(cell
.m_data
.parr
);
104 assertx(cell
.m_data
.parr
->kindIsValid());
105 assertx(cell
.m_data
.parr
->checkCount());
106 assertx(cell
.m_data
.parr
->isPHPArray());
107 assertx(cell
.m_data
.parr
->dvArraySanityCheck());
110 assertPtr(cell
.m_data
.pobj
);
111 assertx(cell
.m_data
.pobj
->kindIsValid());
112 assertx(cell
.m_data
.pobj
->checkCount());
115 assertPtr(cell
.m_data
.pres
);
116 assertx(cell
.m_data
.pres
->kindIsValid());
117 assertx(cell
.m_data
.pres
->checkCount());
120 assertx(!"KindOfRef found in a Cell");
129 bool tvIsPlausible(TypedValue tv
) {
130 if (tv
.m_type
== KindOfRef
) {
131 assertx(tv
.m_data
.pref
);
132 assertx(uintptr_t(tv
.m_data
.pref
) % sizeof(void*) == 0);
133 assertx(tv
.m_data
.pref
->kindIsValid());
134 assertx(tv
.m_data
.pref
->checkCount());
135 tv
= *tv
.m_data
.pref
->tv();
137 return cellIsPlausible(tv
);
140 bool refIsPlausible(const Ref ref
) {
141 assertx(ref
.m_type
== KindOfRef
);
142 return tvIsPlausible(ref
);
145 ///////////////////////////////////////////////////////////////////////////////