Remove array_iter_foo functions from Variant and VRefParam @override-unit-failures
Pretty much just moves them to their only callers in ext_array.
Esse commit está contido em:
@@ -513,92 +513,6 @@ void Variant::prepend(CVarRef v) {
|
||||
}
|
||||
}
|
||||
|
||||
Variant Variant::array_iter_reset() {
|
||||
if (is(KindOfArray)) {
|
||||
ArrayData *arr = getArrayData();
|
||||
if (arr->getCount() > 1 && !arr->isHead() && !arr->noCopyOnWrite()) {
|
||||
arr = arr->copy();
|
||||
set(arr);
|
||||
assert(arr == getArrayData());
|
||||
}
|
||||
return arr->reset();
|
||||
}
|
||||
throw_bad_type_exception("expecting an array");
|
||||
return false;
|
||||
}
|
||||
|
||||
Variant Variant::array_iter_prev() {
|
||||
if (is(KindOfArray)) {
|
||||
ArrayData *arr = getArrayData();
|
||||
if (arr->getCount() > 1 && !arr->isInvalid() && !arr->noCopyOnWrite()) {
|
||||
arr = arr->copy();
|
||||
set(arr);
|
||||
assert(arr == getArrayData());
|
||||
}
|
||||
return arr->prev();
|
||||
}
|
||||
throw_bad_type_exception("expecting an array");
|
||||
return false;
|
||||
}
|
||||
|
||||
Variant Variant::array_iter_current() const {
|
||||
if (is(KindOfArray)) {
|
||||
return getArrayData()->current();
|
||||
}
|
||||
throw_bad_type_exception("expecting an array");
|
||||
return false;
|
||||
}
|
||||
|
||||
Variant Variant::array_iter_next() {
|
||||
if (is(KindOfArray)) {
|
||||
ArrayData *arr = getArrayData();
|
||||
if (arr->getCount() > 1 && !arr->isInvalid() && !arr->noCopyOnWrite()) {
|
||||
arr = arr->copy();
|
||||
set(arr);
|
||||
assert(arr == getArrayData());
|
||||
}
|
||||
return arr->next();
|
||||
}
|
||||
throw_bad_type_exception("expecting an array");
|
||||
return false;
|
||||
}
|
||||
|
||||
Variant Variant::array_iter_end() {
|
||||
if (is(KindOfArray)) {
|
||||
ArrayData *arr = getArrayData();
|
||||
if (arr->getCount() > 1 && !arr->isTail() && !arr->noCopyOnWrite()) {
|
||||
arr = arr->copy();
|
||||
set(arr);
|
||||
assert(arr == getArrayData());
|
||||
}
|
||||
return arr->end();
|
||||
}
|
||||
throw_bad_type_exception("expecting an array");
|
||||
return false;
|
||||
}
|
||||
|
||||
Variant Variant::array_iter_key() const {
|
||||
if (is(KindOfArray)) {
|
||||
return getArrayData()->key();
|
||||
}
|
||||
throw_bad_type_exception("expecting an array");
|
||||
return false;
|
||||
}
|
||||
|
||||
Variant Variant::array_iter_each() {
|
||||
if (is(KindOfArray)) {
|
||||
ArrayData *arr = getArrayData();
|
||||
if (arr->getCount() > 1 && !arr->isInvalid() && !arr->noCopyOnWrite()) {
|
||||
arr = arr->copy();
|
||||
set(arr);
|
||||
assert(arr == getArrayData());
|
||||
}
|
||||
return arr->each();
|
||||
}
|
||||
throw_bad_type_exception("expecting an array");
|
||||
return null_variant;
|
||||
}
|
||||
|
||||
inline DataType Variant::convertToNumeric(int64_t *lval, double *dval) const {
|
||||
StringData *s = getStringData();
|
||||
assert(s);
|
||||
|
||||
@@ -862,17 +862,6 @@ class Variant : private TypedValue {
|
||||
Variant dequeue();
|
||||
void prepend(CVarRef v);
|
||||
|
||||
/**
|
||||
* Position-based iterations.
|
||||
*/
|
||||
Variant array_iter_reset();
|
||||
Variant array_iter_prev();
|
||||
Variant array_iter_current() const;
|
||||
Variant array_iter_next();
|
||||
Variant array_iter_end();
|
||||
Variant array_iter_key() const;
|
||||
Variant array_iter_each();
|
||||
|
||||
/**
|
||||
* For C++ library users to write "var.cast<c_MyClass>()->mf_func()".
|
||||
*/
|
||||
@@ -1221,14 +1210,6 @@ public:
|
||||
bool isArray() const { return m_var.isArray(); }
|
||||
ArrNR toArrNR() const { return m_var.toArrNR(); }
|
||||
|
||||
Variant array_iter_reset() const { return m_var.array_iter_reset(); }
|
||||
Variant array_iter_prev() const { return m_var.array_iter_prev(); }
|
||||
Variant array_iter_current() const { return m_var.array_iter_current(); }
|
||||
Variant array_iter_next() const { return m_var.array_iter_next(); }
|
||||
Variant array_iter_end() const { return m_var.array_iter_end(); }
|
||||
Variant array_iter_key() const { return m_var.array_iter_key(); }
|
||||
Variant array_iter_each() const { return m_var.array_iter_each(); }
|
||||
|
||||
private:
|
||||
mutable Variant m_var;
|
||||
};
|
||||
|
||||
@@ -228,6 +228,7 @@ bool f_array_key_exists(CVarRef key, CVarRef search) {
|
||||
raise_warning("Array key should be either a string or an integer");
|
||||
return false;
|
||||
}
|
||||
|
||||
bool f_key_exists(CVarRef key, CVarRef search) {
|
||||
return f_array_key_exists(key, search);
|
||||
}
|
||||
@@ -250,6 +251,7 @@ static Variant map_func(CArrRef params, const void *data) {
|
||||
g_vmContext->invokeFunc((TypedValue*)&ret, *ctx, params);
|
||||
return ret;
|
||||
}
|
||||
|
||||
Variant f_array_map(int _argc, CVarRef callback, CVarRef arr1, CArrRef _argv /* = null_array */) {
|
||||
Array inputs;
|
||||
if (!arr1.isArray()) {
|
||||
@@ -565,7 +567,7 @@ int64_t f_array_unshift(int _argc, VRefParam array, CVarRef var, CArrRef _argv /
|
||||
}
|
||||
// Reset the array's internal pointer
|
||||
if (array.is(KindOfArray)) {
|
||||
array.array_iter_reset();
|
||||
f_reset(array);
|
||||
}
|
||||
}
|
||||
return array.toArray().size();
|
||||
@@ -586,6 +588,7 @@ static void walk_func(VRefParam value, CVarRef key, CVarRef userdata,
|
||||
tvDup(*userdata.asTypedValue(), args[2]);
|
||||
g_vmContext->invokeFuncFew(sink.asTypedValue(), *ctx, 3, args);
|
||||
}
|
||||
|
||||
bool f_array_walk_recursive(VRefParam input, CVarRef funcname,
|
||||
CVarRef userdata /* = null_variant */) {
|
||||
if (!input.isArray()) {
|
||||
@@ -602,6 +605,7 @@ bool f_array_walk_recursive(VRefParam input, CVarRef funcname,
|
||||
ArrayUtil::Walk(input, walk_func, &ctx, true, &seen, userdata);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool f_array_walk(VRefParam input, CVarRef funcname,
|
||||
CVarRef userdata /* = null_variant */) {
|
||||
if (!input.isArray()) {
|
||||
@@ -690,29 +694,92 @@ int64_t f_count(CVarRef var, bool recursive /* = false */) {
|
||||
int64_t f_sizeof(CVarRef var, bool recursive /* = false */) {
|
||||
return f_count(var, recursive);
|
||||
}
|
||||
Variant f_each(VRefParam array) {
|
||||
return array.array_iter_each();
|
||||
|
||||
namespace {
|
||||
|
||||
enum class CowTag {
|
||||
Yes,
|
||||
No
|
||||
};
|
||||
|
||||
template<CowTag Cow, class Op, class NonArrayRet>
|
||||
static Variant iter_op_impl(VRefParam refParam, Op op, NonArrayRet nonArray) {
|
||||
auto& cell = *refParam.wrapped().asCell();
|
||||
if (cell.m_type != KindOfArray) {
|
||||
throw_bad_type_exception("expecting an array");
|
||||
return Variant(nonArray);
|
||||
}
|
||||
|
||||
auto ad = cell.m_data.parr;
|
||||
if (Cow == CowTag::Yes) {
|
||||
if (ad->getCount() > 1 && !ad->isInvalid() && !ad->noCopyOnWrite()) {
|
||||
ad = ad->copy();
|
||||
cellSet(make_tv<KindOfArray>(ad), cell);
|
||||
}
|
||||
}
|
||||
return op(ad);
|
||||
}
|
||||
Variant f_current(VRefParam array) {
|
||||
return array.array_iter_current();
|
||||
|
||||
}
|
||||
Variant f_next(VRefParam array) {
|
||||
return array.array_iter_next();
|
||||
|
||||
Variant f_each(VRefParam refParam) {
|
||||
return iter_op_impl<CowTag::Yes>(
|
||||
refParam,
|
||||
[] (ArrayData* ad) { return ad->each(); },
|
||||
Variant::NullInit()
|
||||
);
|
||||
}
|
||||
Variant f_pos(VRefParam array) {
|
||||
return array.array_iter_current();
|
||||
|
||||
Variant f_current(VRefParam refParam) {
|
||||
return iter_op_impl<CowTag::No>(
|
||||
refParam,
|
||||
[] (ArrayData* ad) { return ad->current(); },
|
||||
false
|
||||
);
|
||||
}
|
||||
Variant f_prev(VRefParam array) {
|
||||
return array.array_iter_prev();
|
||||
|
||||
Variant f_pos(VRefParam refParam) {
|
||||
return f_current(refParam);
|
||||
}
|
||||
Variant f_reset(VRefParam array) {
|
||||
return array.array_iter_reset();
|
||||
|
||||
Variant f_key(VRefParam refParam) {
|
||||
return iter_op_impl<CowTag::No>(
|
||||
refParam,
|
||||
[] (ArrayData* ad) { return ad->key(); },
|
||||
false
|
||||
);
|
||||
}
|
||||
Variant f_end(VRefParam array) {
|
||||
return array.array_iter_end();
|
||||
|
||||
Variant f_next(VRefParam refParam) {
|
||||
return iter_op_impl<CowTag::Yes>(
|
||||
refParam,
|
||||
[] (ArrayData* ad) { return ad->next(); },
|
||||
false
|
||||
);
|
||||
}
|
||||
Variant f_key(VRefParam array) {
|
||||
return array.array_iter_key();
|
||||
|
||||
Variant f_prev(VRefParam refParam) {
|
||||
return iter_op_impl<CowTag::Yes>(
|
||||
refParam,
|
||||
[] (ArrayData* ad) { return ad->prev(); },
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
Variant f_reset(VRefParam refParam) {
|
||||
return iter_op_impl<CowTag::No>(
|
||||
refParam,
|
||||
[] (ArrayData* ad) { return ad->reset(); },
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
Variant f_end(VRefParam refParam) {
|
||||
return iter_op_impl<CowTag::No>(
|
||||
refParam,
|
||||
[] (ArrayData* ad) { return ad->end(); },
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
bool f_in_array(CVarRef needle, CVarRef haystack, bool strict /* = false */) {
|
||||
|
||||
@@ -113,12 +113,12 @@ int64_t f_count(CVarRef var, bool recursive = false);
|
||||
int64_t f_sizeof(CVarRef var, bool recursive = false);
|
||||
Variant f_each(VRefParam array);
|
||||
Variant f_current(VRefParam array);
|
||||
Variant f_next(VRefParam array);
|
||||
Variant f_pos(VRefParam array);
|
||||
Variant f_key(VRefParam array);
|
||||
Variant f_next(VRefParam array);
|
||||
Variant f_prev(VRefParam array);
|
||||
Variant f_reset(VRefParam array);
|
||||
Variant f_end(VRefParam array);
|
||||
Variant f_key(VRefParam array);
|
||||
|
||||
bool f_in_array(CVarRef needle, CVarRef haystack, bool strict = false);
|
||||
Variant f_range(CVarRef low, CVarRef high, CVarRef step = 1);
|
||||
|
||||
Referência em uma Nova Issue
Bloquear um usuário