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 +----------------------------------------------------------------------+
16 #ifndef incl_HPHP_APC_LOCAL_ARRAY_H_
17 #define incl_HPHP_APC_LOCAL_ARRAY_H_
22 #include <sys/types.h>
24 #include "hphp/runtime/base/array-data.h"
25 #include "hphp/runtime/base/apc-array.h"
26 #include "hphp/runtime/base/tv-val.h"
30 //////////////////////////////////////////////////////////////////////
36 //////////////////////////////////////////////////////////////////////
39 * Wrapper for APCArray. It is what gets returned when an array is fetched
40 * via APC. It has a pointer to the APCArray that it represents and it may
41 * cache values locally depending on the type accessed and/or the operation.
43 struct APCLocalArray final
: ArrayData
,
44 type_scan::MarkCollectable
<APCLocalArray
> {
45 static APCLocalArray
* Make(const APCArray
*);
47 static size_t Vsize(const ArrayData
*);
48 static tv_rval
RvalPos(const ArrayData
* ad
, ssize_t pos
);
49 static bool ExistsInt(const ArrayData
* ad
, int64_t k
);
50 static bool ExistsStr(const ArrayData
* ad
, const StringData
* k
);
51 static arr_lval
LvalInt(ArrayData
*, int64_t k
, bool copy
);
52 static arr_lval
LvalStr(ArrayData
*, StringData
* k
, bool copy
);
53 static arr_lval
LvalSilentInt(ArrayData
*, int64_t k
, bool copy
);
54 static arr_lval
LvalSilentStr(ArrayData
*, StringData
* k
, bool copy
);
55 static arr_lval
LvalForceNew(ArrayData
*, bool copy
);
56 static ArrayData
* SetInt(ArrayData
*, int64_t k
, TypedValue v
);
57 static ArrayData
* SetIntMove(ArrayData
*, int64_t k
, TypedValue v
);
58 static constexpr auto SetIntInPlace
= &SetInt
;
59 static ArrayData
* SetStr(ArrayData
*, StringData
* k
, TypedValue v
);
60 static ArrayData
* SetStrMove(ArrayData
*, StringData
* k
, TypedValue v
);
61 static constexpr auto SetStrInPlace
= &SetStr
;
62 static ArrayData
*RemoveInt(ArrayData
* ad
, int64_t k
);
63 static constexpr auto RemoveIntInPlace
= &RemoveInt
;
64 static ArrayData
*RemoveStr(ArrayData
* ad
, const StringData
* k
);
65 static constexpr auto RemoveStrInPlace
= &RemoveStr
;
66 static ArrayData
* Copy(const ArrayData
*);
67 static ArrayData
* Append(ArrayData
* a
, TypedValue v
);
68 static constexpr auto AppendInPlace
= &Append
;
69 static ArrayData
* PlusEq(ArrayData
*, const ArrayData
*elems
);
70 static ArrayData
* Merge(ArrayData
*, const ArrayData
*elems
);
71 static ArrayData
* Prepend(ArrayData
*, TypedValue v
);
72 static tv_rval
NvGetInt(const ArrayData
*, int64_t k
);
73 static constexpr auto NvTryGetInt
= &NvGetInt
;
74 static tv_rval
NvGetStr(const ArrayData
*, const StringData
* k
);
75 static constexpr auto NvTryGetStr
= &NvGetStr
;
76 static ssize_t
NvGetIntPos(const ArrayData
* ad
, int64_t k
);
77 static ssize_t
NvGetStrPos(const ArrayData
* ad
, const StringData
* k
);
78 static TypedValue
NvGetKey(const ArrayData
*, ssize_t pos
);
79 static bool IsVectorData(const ArrayData
* ad
);
80 static ssize_t
IterBegin(const ArrayData
*);
81 static ssize_t
IterLast(const ArrayData
*);
82 static ssize_t
IterEnd(const ArrayData
*);
83 static ssize_t
IterAdvance(const ArrayData
*, ssize_t prev
);
84 static ssize_t
IterRewind(const ArrayData
*, ssize_t prev
);
85 static ArrayData
* CopyStatic(const ArrayData
*);
86 static constexpr auto Pop
= &ArrayCommon::Pop
;
87 static constexpr auto Dequeue
= &ArrayCommon::Dequeue
;
88 static void Renumber(ArrayData
*);
89 static void OnSetEvalScalar(ArrayData
*);
90 static void Release(ArrayData
*);
91 static ArrayData
* EscalateForSort(ArrayData
*, SortFunction
);
92 static void Ksort(ArrayData
*, int, bool);
93 static void Sort(ArrayData
*, int, bool);
94 static void Asort(ArrayData
*, int, bool);
95 static bool Uksort(ArrayData
*, const Variant
&);
96 static bool Usort(ArrayData
*, const Variant
&);
97 static bool Uasort(ArrayData
*, const Variant
&);
98 static ArrayData
* ToPHPArray(ArrayData
* ad
, bool) {
101 static constexpr auto ToPHPArrayIntishCast
= &ToPHPArray
;
102 static constexpr auto ToVec
= &ArrayCommon::ToVec
;
103 static constexpr auto ToDict
= &ArrayCommon::ToDict
;
104 static constexpr auto ToKeyset
= &ArrayCommon::ToKeyset
;
105 static constexpr auto ToVArray
= &ArrayCommon::ToVArray
;
106 static constexpr auto ToDArray
= &ArrayCommon::ToDArray
;
109 using ArrayData::decRefCount
;
110 using ArrayData::hasMultipleRefs
;
111 using ArrayData::hasExactlyOneRef
;
112 using ArrayData::decWillRelease
;
113 using ArrayData::incRefCount
;
115 ssize_t
iterAdvanceImpl(ssize_t prev
) const {
116 assertx(prev
>= 0 && prev
< m_size
);
117 ssize_t next
= prev
+ 1;
118 return next
< m_size
? next
: m_size
;
121 // Only explicit conversions are allowed to and from ArrayData*.
122 ArrayData
* asArrayData() { return this; }
123 const ArrayData
* asArrayData() const { return this; }
125 // Pre: ad->isApcArray()
126 static APCLocalArray
* asApcArray(ArrayData
*);
127 static const APCLocalArray
* asApcArray(const ArrayData
*);
128 static ArrayData
* Escalate(const ArrayData
*);
130 void scan(type_scan::Scanner
& scanner
) const;
131 size_t heapSize() const;
134 explicit APCLocalArray(const APCArray
* source
, size_t heapSize
);
135 ~APCLocalArray() = delete;
137 static bool checkInvariants(const ArrayData
*);
138 ssize_t
getIndex(int64_t k
) const;
139 ssize_t
getIndex(const StringData
* k
) const;
140 ArrayData
* loadElems() const;
141 Variant
getKey(ssize_t pos
) const;
143 TypedValue
* localCache() const;
146 const APCArray
* m_arr
;
147 unsigned m_sweep_index
;
148 friend struct MemoryManager
; // access to m_sweep_index
151 //////////////////////////////////////////////////////////////////////