本文整理汇总了C++中ArrayData::incRefCount方法的典型用法代码示例。如果您正苦于以下问题:C++ ArrayData::incRefCount方法的具体用法?C++ ArrayData::incRefCount怎么用?C++ ArrayData::incRefCount使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ArrayData
的用法示例。
在下文中一共展示了ArrayData::incRefCount方法的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: new_array
HOT_FUNC_VM
ArrayData* new_array(int capacity) {
ArrayData *a = NEW(HphpArray)(capacity);
a->incRefCount();
TRACE(2, "newArrayHelper: capacity %d\n", capacity);
return a;
}
示例2: t___construct
void c_MutableArrayIterator::t___construct(VRefParam array) {
INSTANCE_METHOD_INJECTION_BUILTIN(MutableArrayIterator, MutableArrayIterator::__construct);
if (m_valid) {
MIterCtx& mi = marr();
mi.~MIterCtx();
m_valid = false;
}
Variant var(strongBind(array));
TypedValue* tv = (TypedValue*)(&var);
ASSERT(tv->m_type == KindOfRef);
if (tv->m_data.ptv->m_type == KindOfArray) {
ArrayData* ad = tv->m_data.ptv->m_data.parr;
if (ad->getCount() > 1) {
ArrayData* copy = ad->copy();
copy->incRefCount();
ad->decRefCount(); // count > 1 to begin with; don't need release
ad = tv->m_data.ptv->m_data.parr = copy;
}
MIterCtx& mi = marr();
(void) new (&mi) MIterCtx(tv->m_data.pref);
m_valid = mi.m_mArray->advance();
if (!m_valid) mi.~MIterCtx();
} else if (tv->m_data.ptv->m_type == KindOfObject) {
CStrRef ctxStr = hhvm
? g_vmContext->getContextClassName(true)
: FrameInjection::GetClassName(true);
bool isIterator;
Object obj = tv->m_data.ptv->m_data.pobj->iterableObject(isIterator);
if (isIterator) {
raise_error("An iterator cannot be used with foreach by reference");
}
Array iterArray = obj->o_toIterArray(ctxStr, true);
ArrayData* ad = iterArray.getArrayData();
if (ad->getCount() > 1) {
ArrayData* copy = ad->copy();
copy->incRefCount();
ad->decRefCount(); // count > 1 to begin with; don't need release
ad = copy;
}
MIterCtx& mi = marr();
(void) new (&mi) MIterCtx(ad);
m_valid = mi.m_mArray->advance();
if (!m_valid) mi.~MIterCtx();
} else {
raise_warning("Invalid argument supplied for foreach()");
}
}
示例3:
Variant::Variant(const Array& v) {
m_type = KindOfArray;
ArrayData *a = v.get();
if (a) {
m_data.parr = a;
a->incRefCount();
} else {
m_type = KindOfNull;
}
}
示例4: genericAddNewElemC
/*
* Cold path helper for AddNewElemC delegates to the ArrayData::append
* virtual method.
*/
static NEVER_INLINE
ArrayData* genericAddNewElemC(ArrayData* a, TypedValue value) {
ArrayData* r = a->append(tvAsCVarRef(&value), a->getCount() != 1);
if (UNLIKELY(r != a)) {
r->incRefCount();
decRefArr(a);
}
tvRefcountedDecRef(value);
return r;
}
示例5: zBoxAndProxy
void zBoxAndProxy(TypedValue* arg) {
if (arg->m_type != KindOfRef) {
tvBox(arg);
}
auto inner = arg->m_data.pref->tv();
if (inner->m_type == KindOfArray && !inner->m_data.parr->isProxyArray()) {
ArrayData * inner_arr = inner->m_data.parr;
if (inner_arr->isStatic() || inner_arr->hasMultipleRefs()) {
ArrayData * tmp = inner_arr->copy();
tmp->incRefCount();
inner_arr->decRefAndRelease();
inner_arr = tmp;
}
inner->m_data.parr = ProxyArray::Make(inner_arr);
}
}
示例6: hphp_ffi_exportVariant
int hphp_ffi_exportVariant(CVarRef v, void** result) {
switch (v.getType()) {
case KindOfNull: return 0;
case KindOfBoolean: *result = (void*)v.toBoolean(); return 1;
case KindOfByte:
case KindOfInt16:
case KindOfInt32:
case KindOfInt64: {
*result = (void*)v.toInt64();
return 2;
}
case KindOfDouble: {
union {
double d;
void* p;
} u;
u.d = v.toDouble();
*result = u.p;
return 3;
}
case LiteralString: *result = (void*)v.getLiteralString(); return 4;
case KindOfString: {
StringData *sd = v.getStringData();
sd->incRefCount();
*result = (void*)sd;
return 5;
}
case KindOfArray: {
ArrayData *ad = v.getArrayData();
ad->incRefCount();
*result = (void*)ad;
return 6;
}
case KindOfObject: {
ObjectData *od = v.getObjectData();
od->incRefCount();
*result = (void*)od;
return 7;
}
default:
ASSERT(false);
return 0;
}
}
示例7: array_add
ArrayData* array_add(ArrayData* a1, ArrayData* a2) {
if (!a2->empty()) {
if (a1->empty()) {
decRefArr(a1);
return a2;
}
if (a1 != a2) {
ArrayData *escalated = a1->plus(a2, a1->getCount() > 1);
if (escalated != a1) {
escalated->incRefCount();
decRefArr(a2);
decRefArr(a1);
return escalated;
}
}
}
decRefArr(a2);
return a1;
}
示例8: cowCheck
ArrayData* MutableArrayIter::cowCheck() {
ArrayData* data;
if (m_var) {
data = getData();
if (!data) return NULL;
if (data->getCount() > 1 && !data->noCopyOnWrite()) {
*const_cast<Variant*>(m_var) = (data = data->copyWithStrongIterators());
}
} else {
assert(m_data);
data = m_data;
if (data->getCount() > 1 && !data->noCopyOnWrite()) {
ArrayData* copied = data->copyWithStrongIterators();
copied->incRefCount();
decRefArr(data);
m_data = data = copied;
}
}
return data;
}
示例9: escalateCheck
void MutableArrayIter::escalateCheck() {
ArrayData* data;
if (m_var) {
data = getData();
if (!data) return;
ArrayData* esc = data->escalate(true);
if (data != esc) {
*const_cast<Variant*>(m_var) = esc;
}
} else {
assert(m_data);
data = m_data;
ArrayData* esc = data->escalate(true);
if (data != esc) {
esc->incRefCount();
decRefArr(data);
m_data = esc;
}
}
}