Codemod asserts to assertxs in the runtime
[hiphop-php.git] / hphp / runtime / base / tv-helpers.cpp
blobc11d4c96dbc5ff9fa2ad95cda97b63e35f9c0830
1 /*
2 +----------------------------------------------------------------------+
3 | HipHop for PHP |
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"
27 namespace HPHP {
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));
38 [&] {
39 switch (cell.m_type) {
40 case KindOfUninit:
41 case KindOfNull:
42 return;
43 case KindOfBoolean:
44 assertx(cell.m_data.num == 0 || cell.m_data.num == 1);
45 return;
46 case KindOfInt64:
47 case KindOfDouble:
48 return;
49 case KindOfPersistentString:
50 assertPtr(cell.m_data.pstr);
51 assertx(cell.m_data.pstr->kindIsValid());
52 assertx(!cell.m_data.pstr->isRefCounted());
53 return;
54 case KindOfString:
55 assertPtr(cell.m_data.pstr);
56 assertx(cell.m_data.pstr->kindIsValid());
57 assertx(cell.m_data.pstr->checkCount());
58 return;
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());
64 return;
65 case KindOfVec:
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());
70 return;
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());
76 return;
77 case KindOfDict:
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());
82 return;
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());
88 return;
89 case KindOfKeyset:
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());
94 return;
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());
101 return;
102 case KindOfArray:
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());
108 return;
109 case KindOfObject:
110 assertPtr(cell.m_data.pobj);
111 assertx(cell.m_data.pobj->kindIsValid());
112 assertx(cell.m_data.pobj->checkCount());
113 return;
114 case KindOfResource:
115 assertPtr(cell.m_data.pres);
116 assertx(cell.m_data.pres->kindIsValid());
117 assertx(cell.m_data.pres->checkCount());
118 return;
119 case KindOfRef:
120 assertx(!"KindOfRef found in a Cell");
121 break;
123 not_reached();
124 }();
126 return true;
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 ///////////////////////////////////////////////////////////////////////////////