Keys can't be doubles: remove a bunch of Array/Variant methods.
Array and Variant don't need to accept double for array keys, since they can only be int or string anyways. The only place we called those methods was in test_cpp_base.cpp anyway.
Esse commit está contido em:
@@ -418,16 +418,6 @@ CVarRef Array::rvalAtRef(int64_t key, ACCESSPARAMS_IMPL) const {
|
||||
return null_variant;
|
||||
}
|
||||
|
||||
Variant Array::rvalAt(double key, ACCESSPARAMS_IMPL) const {
|
||||
if (m_px) return m_px->get(ToKey(key), flags & AccessFlags::Error);
|
||||
return null_variant;
|
||||
}
|
||||
|
||||
CVarRef Array::rvalAtRef(double key, ACCESSPARAMS_IMPL) const {
|
||||
if (m_px) return m_px->get(ToKey(key), flags & AccessFlags::Error);
|
||||
return null_variant;
|
||||
}
|
||||
|
||||
CVarRef Array::rvalAtRef(CStrRef key, ACCESSPARAMS_IMPL) const {
|
||||
if (m_px) {
|
||||
bool error = flags & AccessFlags::Error;
|
||||
|
||||
@@ -33,10 +33,6 @@
|
||||
namespace HPHP {
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
inline int64_t ToKey(double d) {
|
||||
return d > std::numeric_limits<uint64_t>::max() ? 0u : (uint64_t)d;
|
||||
}
|
||||
|
||||
// forward declaration
|
||||
class ArrayIter;
|
||||
|
||||
@@ -263,7 +259,7 @@ class Array : protected SmartPtr<ArrayData> {
|
||||
*/
|
||||
Variant rvalAt(int key, ACCESSPARAMS_DECL) const;
|
||||
Variant rvalAt(int64_t key, ACCESSPARAMS_DECL) const;
|
||||
Variant rvalAt(double key, ACCESSPARAMS_DECL) const;
|
||||
Variant rvalAt(double key, ACCESSPARAMS_DECL) const = delete;
|
||||
Variant rvalAt(CStrRef key, ACCESSPARAMS_DECL) const;
|
||||
Variant rvalAt(CVarRef key, ACCESSPARAMS_DECL) const;
|
||||
|
||||
@@ -272,13 +268,13 @@ class Array : protected SmartPtr<ArrayData> {
|
||||
*/
|
||||
CVarRef rvalAtRef(int key, ACCESSPARAMS_DECL) const;
|
||||
CVarRef rvalAtRef(int64_t key, ACCESSPARAMS_DECL) const;
|
||||
CVarRef rvalAtRef(double key, ACCESSPARAMS_DECL) const;
|
||||
CVarRef rvalAtRef(double key, ACCESSPARAMS_DECL) const = delete;
|
||||
CVarRef rvalAtRef(CVarRef key, ACCESSPARAMS_DECL) const;
|
||||
CVarRef rvalAtRef(CStrRef key, ACCESSPARAMS_DECL) const;
|
||||
|
||||
const Variant operator[](int key) const;
|
||||
const Variant operator[](int64_t key) const;
|
||||
const Variant operator[](double key) const;
|
||||
const Variant operator[](double key) const = delete;
|
||||
const Variant operator[](CStrRef key) const;
|
||||
const Variant operator[](CVarRef key) const;
|
||||
const Variant operator[](const char*) const = delete; // use CStrRef
|
||||
@@ -311,9 +307,7 @@ class Array : protected SmartPtr<ArrayData> {
|
||||
Variant &lvalAt(int64_t key, ACCESSPARAMS_DECL) {
|
||||
return lvalAtImpl(key, flags);
|
||||
}
|
||||
Variant &lvalAt(double key, ACCESSPARAMS_DECL) {
|
||||
return lvalAtImpl(ToKey(key), flags);
|
||||
}
|
||||
Variant &lvalAt(double key, ACCESSPARAMS_DECL) = delete;
|
||||
Variant &lvalAt(CStrRef key, ACCESSPARAMS_DECL);
|
||||
Variant &lvalAt(CVarRef key, ACCESSPARAMS_DECL);
|
||||
|
||||
@@ -376,9 +370,7 @@ class Array : protected SmartPtr<ArrayData> {
|
||||
Variant &addLval(int64_t key) {
|
||||
return addLvalImpl(key);
|
||||
}
|
||||
Variant &addLval(double key) {
|
||||
return addLvalImpl(ToKey(key));
|
||||
}
|
||||
Variant &addLval(double key) = delete;
|
||||
|
||||
Variant &addLval(CStrRef key, bool isKey = false);
|
||||
Variant &addLval(CVarRef key, bool isKey = false);
|
||||
@@ -403,9 +395,7 @@ class Array : protected SmartPtr<ArrayData> {
|
||||
bool exists(int64_t key) const {
|
||||
return existsImpl(key);
|
||||
}
|
||||
bool exists(double key) const {
|
||||
return existsImpl(ToKey(key));
|
||||
}
|
||||
bool exists(double key) const = delete;
|
||||
bool exists(CStrRef key, bool isKey = false) const;
|
||||
bool exists(CVarRef key, bool isKey = false) const;
|
||||
|
||||
@@ -428,9 +418,7 @@ class Array : protected SmartPtr<ArrayData> {
|
||||
void remove(int64_t key) {
|
||||
removeImpl(key);
|
||||
}
|
||||
void remove(double key) {
|
||||
removeImpl(ToKey(key));
|
||||
}
|
||||
void remove(double key) = delete;
|
||||
void remove(CStrRef key, bool isString = false);
|
||||
void remove(CVarRef key);
|
||||
|
||||
|
||||
@@ -69,6 +69,9 @@ static StaticString s_PHP_Incomplete_Class_Name("__PHP_Incomplete_Class_Name");
|
||||
// local helpers
|
||||
|
||||
static int64_t ToKey(int64_t i) { return i; }
|
||||
static int64_t ToKey(double d) {
|
||||
return d > std::numeric_limits<uint64_t>::max() ? 0u : uint64_t(d);
|
||||
}
|
||||
static VarNR ToKey(CStrRef s) { return s.toKey(); }
|
||||
static VarNR ToKey(CVarRef v) { return v.toKey(); }
|
||||
|
||||
@@ -1760,10 +1763,6 @@ static void raise_bad_offset_notice() {
|
||||
} \
|
||||
return null_variant;
|
||||
|
||||
Variant Variant::rvalAt(double offset, ACCESSPARAMS_IMPL) const {
|
||||
IMPLEMENT_RVAL_INTEGRAL
|
||||
}
|
||||
|
||||
Variant Variant::rvalAtHelper(int64_t offset, ACCESSPARAMS_IMPL) const {
|
||||
switch (m_type) {
|
||||
case KindOfStaticString:
|
||||
@@ -1934,13 +1933,6 @@ CVarRef Variant::rvalRefHelper(T offset, CVarRef tmp, ACCESSPARAMS_IMPL) const {
|
||||
template CVarRef
|
||||
Variant::rvalRefHelper(int64_t offset, CVarRef tmp, ACCESSPARAMS_IMPL) const;
|
||||
|
||||
CVarRef Variant::rvalRef(double offset, CVarRef tmp, ACCESSPARAMS_IMPL) const {
|
||||
if (m_type == KindOfArray) {
|
||||
return m_data.parr->get(ToKey(offset), flags & AccessFlags::Error);
|
||||
}
|
||||
return rvalRefHelper(offset, tmp, flags);
|
||||
}
|
||||
|
||||
CVarRef Variant::rvalRef(CStrRef offset, CVarRef tmp, ACCESSPARAMS_IMPL) const {
|
||||
if (m_type == KindOfArray) {
|
||||
bool error = flags & AccessFlags::Error;
|
||||
@@ -2017,9 +2009,6 @@ CVarRef Variant::rvalAtRefHelper<CStrRef>(CStrRef offset,
|
||||
template
|
||||
CVarRef Variant::rvalAtRefHelper<CVarRef>(CVarRef offset,
|
||||
ACCESSPARAMS_IMPL) const;
|
||||
CVarRef Variant::rvalAtRef(double offset, ACCESSPARAMS_IMPL) const {
|
||||
return rvalAtRefHelper(HPHP::toInt64(offset), flags);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
class LvalHelper {};
|
||||
@@ -2117,9 +2106,6 @@ Variant &Variant::lvalAt(int key, ACCESSPARAMS_IMPL) {
|
||||
Variant &Variant::lvalAt(int64_t key, ACCESSPARAMS_IMPL) {
|
||||
return lvalAtImpl(key, flags);
|
||||
}
|
||||
Variant &Variant::lvalAt(double key, ACCESSPARAMS_IMPL) {
|
||||
return lvalAtImpl(key, flags);
|
||||
}
|
||||
Variant &Variant::lvalAt(CStrRef key, ACCESSPARAMS_IMPL) {
|
||||
return lvalAtImpl<CStrRef>(key, flags);
|
||||
}
|
||||
@@ -2133,9 +2119,6 @@ Variant &Variant::lvalRef(int key, Variant& tmp, ACCESSPARAMS_IMPL) {
|
||||
Variant &Variant::lvalRef(int64_t key, Variant& tmp, ACCESSPARAMS_IMPL) {
|
||||
return LvalAtImpl0(this, key, &tmp, false, flags);
|
||||
}
|
||||
Variant &Variant::lvalRef(double key, Variant& tmp, ACCESSPARAMS_IMPL) {
|
||||
return LvalAtImpl0(this, key, &tmp, false, flags);
|
||||
}
|
||||
Variant &Variant::lvalRef(CStrRef key, Variant& tmp, ACCESSPARAMS_IMPL) {
|
||||
return Variant::LvalAtImpl0<CStrRef>(this, key, &tmp, false, flags);
|
||||
}
|
||||
@@ -2350,10 +2333,6 @@ CVarRef Variant::set(int64_t key, CVarRef v) {
|
||||
return SetImpl(this, key, v, false);
|
||||
}
|
||||
|
||||
CVarRef Variant::set(double key, CVarRef v) {
|
||||
return SetImpl(this, key, v, false);
|
||||
}
|
||||
|
||||
CVarRef Variant::set(CStrRef key, CVarRef v, bool isString /* = false */) {
|
||||
return SetImpl<CStrRef>(this, key, v, isString);
|
||||
}
|
||||
@@ -2474,10 +2453,6 @@ CVarRef Variant::setRef(int64_t key, CVarRef v) {
|
||||
return SetRefImpl(this, key, v, false);
|
||||
}
|
||||
|
||||
CVarRef Variant::setRef(double key, CVarRef v) {
|
||||
return SetRefImpl(this, key, v, false);
|
||||
}
|
||||
|
||||
CVarRef Variant::setRef(CStrRef key, CVarRef v, bool isString /* = false */) {
|
||||
return SetRefImpl<CStrRef>(this, key, v, isString);
|
||||
}
|
||||
@@ -2532,31 +2507,6 @@ CVarRef Variant::appendRef(CVarRef v) {
|
||||
return v;
|
||||
}
|
||||
|
||||
void Variant::removeImpl(double key) {
|
||||
switch (getType()) {
|
||||
case KindOfUninit:
|
||||
case KindOfNull:
|
||||
break;
|
||||
case KindOfArray:
|
||||
{
|
||||
ArrayData *arr = getArrayData();
|
||||
if (arr) {
|
||||
ArrayData *escalated = arr->remove(ToKey(key), (arr->getCount() > 1));
|
||||
if (escalated != arr) {
|
||||
set(escalated);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case KindOfObject:
|
||||
callOffsetUnset(key);
|
||||
break;
|
||||
default:
|
||||
lvalInvalid();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Variant::removeImpl(int64_t key) {
|
||||
switch (getType()) {
|
||||
case KindOfUninit:
|
||||
|
||||
@@ -776,7 +776,7 @@ class Variant : private TypedValue {
|
||||
}
|
||||
return rvalAtHelper(offset, flags);
|
||||
}
|
||||
Variant rvalAt(double offset, ACCESSPARAMS_DECL) const;
|
||||
Variant rvalAt(double offset, ACCESSPARAMS_DECL) const = delete;
|
||||
Variant rvalAt(litstr offset, ACCESSPARAMS_DECL) const = delete;
|
||||
Variant rvalAt(CStrRef offset, ACCESSPARAMS_DECL) const;
|
||||
Variant rvalAt(CVarRef offset, ACCESSPARAMS_DECL) const;
|
||||
@@ -793,7 +793,7 @@ class Variant : private TypedValue {
|
||||
}
|
||||
return rvalRefHelper(offset, tmp, flags);
|
||||
}
|
||||
CVarRef rvalRef(double offset, CVarRef tmp, ACCESSPARAMS_DECL) const;
|
||||
CVarRef rvalRef(double offset, CVarRef tmp, ACCESSPARAMS_DECL) const = delete;
|
||||
CVarRef rvalRef(litstr offset, CVarRef tmp, ACCESSPARAMS_DECL) const = delete;
|
||||
CVarRef rvalRef(CStrRef offset, CVarRef tmp, ACCESSPARAMS_DECL) const;
|
||||
CVarRef rvalRef(CVarRef offset, CVarRef tmp, ACCESSPARAMS_DECL) const;
|
||||
@@ -804,7 +804,7 @@ class Variant : private TypedValue {
|
||||
CVarRef rvalAtRef(int offset, ACCESSPARAMS_DECL) const {
|
||||
return rvalAtRefHelper((int64_t)offset, flags);
|
||||
}
|
||||
CVarRef rvalAtRef(double offset, ACCESSPARAMS_DECL) const;
|
||||
CVarRef rvalAtRef(double offset, ACCESSPARAMS_DECL) const = delete;
|
||||
CVarRef rvalAtRef(int64_t offset, ACCESSPARAMS_DECL) const {
|
||||
return rvalAtRefHelper(offset, flags);
|
||||
}
|
||||
@@ -816,7 +816,7 @@ class Variant : private TypedValue {
|
||||
}
|
||||
const Variant operator[](int key) const { return rvalAt(key);}
|
||||
const Variant operator[](int64_t key) const { return rvalAt(key);}
|
||||
const Variant operator[](double key) const { return rvalAt(key);}
|
||||
const Variant operator[](double key) const = delete;
|
||||
const Variant operator[](CStrRef key) const { return rvalAt(key);}
|
||||
const Variant operator[](CArrRef key) const { return rvalAt(key);}
|
||||
const Variant operator[](CObjRef key) const { return rvalAt(key);}
|
||||
@@ -847,14 +847,14 @@ class Variant : private TypedValue {
|
||||
|
||||
Variant &lvalAt(int key, ACCESSPARAMS_DECL);
|
||||
Variant &lvalAt(int64_t key, ACCESSPARAMS_DECL);
|
||||
Variant &lvalAt(double key, ACCESSPARAMS_DECL);
|
||||
Variant &lvalAt(double key, ACCESSPARAMS_DECL) = delete;
|
||||
Variant &lvalAt(litstr key, ACCESSPARAMS_DECL) = delete;
|
||||
Variant &lvalAt(CStrRef key, ACCESSPARAMS_DECL);
|
||||
Variant &lvalAt(CVarRef key, ACCESSPARAMS_DECL);
|
||||
|
||||
Variant &lvalRef(int key, Variant& tmp, ACCESSPARAMS_DECL);
|
||||
Variant &lvalRef(int64_t key, Variant& tmp, ACCESSPARAMS_DECL);
|
||||
Variant &lvalRef(double key, Variant& tmp, ACCESSPARAMS_DECL);
|
||||
Variant &lvalRef(double key, Variant& tmp, ACCESSPARAMS_DECL) = delete;
|
||||
Variant &lvalRef(litstr key, Variant& tmp, ACCESSPARAMS_DECL) = delete;
|
||||
Variant &lvalRef(CStrRef key, Variant& tmp, ACCESSPARAMS_DECL);
|
||||
Variant &lvalRef(CVarRef key, Variant& tmp, ACCESSPARAMS_DECL);
|
||||
@@ -881,7 +881,7 @@ class Variant : private TypedValue {
|
||||
|
||||
CVarRef set(int key, CVarRef v) { return set((int64_t)key, v); }
|
||||
CVarRef set(int64_t key, CVarRef v);
|
||||
CVarRef set(double key, CVarRef v);
|
||||
CVarRef set(double key, CVarRef v) = delete;
|
||||
CVarRef set(litstr key, CVarRef v, bool isString = false) = delete;
|
||||
CVarRef set(CStrRef key, CVarRef v, bool isString = false);
|
||||
CVarRef set(CVarRef key, CVarRef v);
|
||||
@@ -890,14 +890,14 @@ class Variant : private TypedValue {
|
||||
|
||||
CVarRef setRef(int key, CVarRef v) { return setRef((int64_t)key, v); }
|
||||
CVarRef setRef(int64_t key, CVarRef v);
|
||||
CVarRef setRef(double key, CVarRef v);
|
||||
CVarRef setRef(double key, CVarRef v) = delete;
|
||||
CVarRef setRef(litstr key, CVarRef v, bool isString = false) = delete;
|
||||
CVarRef setRef(CStrRef key, CVarRef v, bool isString = false);
|
||||
CVarRef setRef(CVarRef key, CVarRef v);
|
||||
|
||||
CVarRef set(int key, RefResult v) { return setRef(key, variant(v)); }
|
||||
CVarRef set(int64_t key, RefResult v) { return setRef(key, variant(v)); }
|
||||
CVarRef set(double key, RefResult v) { return setRef(key, variant(v)); }
|
||||
CVarRef set(double key, RefResult v) = delete;
|
||||
CVarRef set(litstr key, RefResult v, bool isString = false) = delete;
|
||||
CVarRef set(CStrRef key, RefResult v, bool isString = false) {
|
||||
return setRef(key, variant(v), isString);
|
||||
@@ -909,7 +909,7 @@ class Variant : private TypedValue {
|
||||
|
||||
void remove(int key) { removeImpl((int64_t)key);}
|
||||
void remove(int64_t key) { removeImpl(key);}
|
||||
void remove(double key) { removeImpl(key);}
|
||||
void remove(double key) = delete;
|
||||
void remove(litstr key, bool isString = false) = delete;
|
||||
void remove(CStrRef key, bool isString = false) {
|
||||
removeImpl(key, isString);
|
||||
@@ -1087,7 +1087,7 @@ class Variant : private TypedValue {
|
||||
(IS_STRING_TYPE(m_type) && m_data.pstr->empty());
|
||||
}
|
||||
|
||||
void removeImpl(double key);
|
||||
void removeImpl(double key) = delete;
|
||||
void removeImpl(int64_t key);
|
||||
void removeImpl(CVarRef key, bool isString = false);
|
||||
void removeImpl(CStrRef key, bool isString = false);
|
||||
@@ -1458,10 +1458,6 @@ inline const Variant Array::operator[](int64_t key) const {
|
||||
return rvalAt(key);
|
||||
}
|
||||
|
||||
inline const Variant Array::operator[](double key) const {
|
||||
return rvalAt(key);
|
||||
}
|
||||
|
||||
inline const Variant Array::operator[](CStrRef key) const {
|
||||
return rvalAt(key);
|
||||
}
|
||||
|
||||
@@ -364,7 +364,6 @@ bool TestCppBase::TestArray() {
|
||||
Array arr;
|
||||
arr.lvalAt(1) = 10;
|
||||
VS(arr[1], 10);
|
||||
VS(arr[1.5], 10);
|
||||
VS(arr[Variant(1.5)], 10);
|
||||
VS(arr[s_1], 10);
|
||||
VS(arr[Variant("1")], 10);
|
||||
@@ -373,7 +372,6 @@ bool TestCppBase::TestArray() {
|
||||
Array arr;
|
||||
arr.lvalAt(Variant(1.5)) = 10;
|
||||
VS(arr[1], 10);
|
||||
VS(arr[1.5], 10);
|
||||
VS(arr[Variant(1.5)], 10);
|
||||
VS(arr[s_1], 10);
|
||||
VS(arr[Variant("1")], 10);
|
||||
@@ -382,7 +380,6 @@ bool TestCppBase::TestArray() {
|
||||
Array arr;
|
||||
arr.lvalAt(s_1) = 10;
|
||||
VS(arr[1], 10);
|
||||
VS(arr[1.5], 10);
|
||||
VS(arr[Variant(1.5)], 10);
|
||||
VS(arr[s_1], 10);
|
||||
VS(arr[Variant("1")], 10);
|
||||
@@ -391,7 +388,6 @@ bool TestCppBase::TestArray() {
|
||||
Array arr;
|
||||
arr.lvalAt(Variant("1")) = 10;
|
||||
VS(arr[1], 10);
|
||||
VS(arr[1.5], 10);
|
||||
VS(arr[Variant(1.5)], 10);
|
||||
VS(arr[s_1], 10);
|
||||
VS(arr[Variant("1")], 10);
|
||||
@@ -470,7 +466,6 @@ bool TestCppBase::TestArray() {
|
||||
Array arr;
|
||||
arr.lvalAt(1) = String("value");
|
||||
VERIFY(arr.exists(1));
|
||||
VERIFY(arr.exists(1.5));
|
||||
VERIFY(arr.exists(s_1));
|
||||
VERIFY(arr.exists(Variant("1")));
|
||||
VERIFY(arr.exists(Variant(1)));
|
||||
@@ -480,17 +475,6 @@ bool TestCppBase::TestArray() {
|
||||
Array arr;
|
||||
arr.lvalAt(s_1) = String("value");
|
||||
VERIFY(arr.exists(1));
|
||||
VERIFY(arr.exists(1.5));
|
||||
VERIFY(arr.exists(s_1));
|
||||
VERIFY(arr.exists(Variant("1")));
|
||||
VERIFY(arr.exists(Variant(1)));
|
||||
VERIFY(arr.exists(Variant(1.5)));
|
||||
}
|
||||
{
|
||||
Array arr;
|
||||
arr.lvalAt(1.5) = String("value");
|
||||
VERIFY(arr.exists(1));
|
||||
VERIFY(arr.exists(1.5));
|
||||
VERIFY(arr.exists(s_1));
|
||||
VERIFY(arr.exists(Variant("1")));
|
||||
VERIFY(arr.exists(Variant(1)));
|
||||
@@ -500,7 +484,6 @@ bool TestCppBase::TestArray() {
|
||||
Array arr;
|
||||
arr.lvalAt(Variant(1.5)) = String("value");
|
||||
VERIFY(arr.exists(1));
|
||||
VERIFY(arr.exists(1.5));
|
||||
VERIFY(arr.exists(s_1));
|
||||
VERIFY(arr.exists(Variant("1")));
|
||||
VERIFY(arr.exists(Variant(1)));
|
||||
@@ -510,7 +493,6 @@ bool TestCppBase::TestArray() {
|
||||
Array arr;
|
||||
arr.lvalAt(Variant("1")) = String("value");
|
||||
VERIFY(arr.exists(1));
|
||||
VERIFY(arr.exists(1.5));
|
||||
VERIFY(arr.exists(s_1));
|
||||
VERIFY(arr.exists(Variant("1")));
|
||||
VERIFY(arr.exists(Variant(1)));
|
||||
@@ -676,7 +658,6 @@ bool TestCppBase::TestVariant() {
|
||||
Variant v;
|
||||
v.lvalAt(1) = String("test");
|
||||
VS(v[1], "test");
|
||||
VS(v[1.5], "test");
|
||||
VS(v[Variant(1.5)], "test");
|
||||
VS(v[s_1], "test");
|
||||
VS(v[Variant("1")], "test");
|
||||
@@ -685,7 +666,6 @@ bool TestCppBase::TestVariant() {
|
||||
Variant v;
|
||||
v.lvalAt(Variant(1.5)) = String("test");
|
||||
VS(v[1], "test");
|
||||
VS(v[1.5], "test");
|
||||
VS(v[Variant(1.5)], "test");
|
||||
VS(v[s_1], "test");
|
||||
VS(v[Variant("1")], "test");
|
||||
@@ -694,7 +674,6 @@ bool TestCppBase::TestVariant() {
|
||||
Variant v;
|
||||
v.lvalAt(s_1) = String("test");
|
||||
VS(v[1], "test");
|
||||
VS(v[1.5], "test");
|
||||
VS(v[Variant(1.5)], "test");
|
||||
VS(v[s_1], "test");
|
||||
VS(v[Variant("1")], "test");
|
||||
@@ -703,7 +682,6 @@ bool TestCppBase::TestVariant() {
|
||||
Variant v;
|
||||
v.lvalAt(Variant("1")) = String("test");
|
||||
VS(v[1], "test");
|
||||
VS(v[1.5], "test");
|
||||
VS(v[Variant(1.5)], "test");
|
||||
VS(v[s_1], "test");
|
||||
VS(v[Variant("1")], "test");
|
||||
|
||||
Referência em uma Nova Issue
Bloquear um usuário