Пример #1
0
ArrayData*
GlobalsArray::RemoveStr(ArrayData* ad, const StringData* k,
                                 bool copy) {
  auto a = asGlobals(ad);
  a->m_tab->unset(k);
  return a;
}
Пример #2
0
ArrayData* GlobalsArray::SetRefStr(ArrayData* ad,
                                            StringData* k,
                                            Variant& v,
                                            bool copy) {
  auto a = asGlobals(ad);
  tvAsVariant(a->m_tab->lookupAdd(k)).assignRef(v);
  return a;
}
Пример #3
0
ArrayData* GlobalsArray::SetStr(ArrayData* ad,
                                         StringData* k,
                                         Cell v,
                                         bool copy) {
  auto a = asGlobals(ad);
  cellSet(v, *tvToCell(a->m_tab->lookupAdd(k)));
  return a;
}
Пример #4
0
bool
GlobalsArray::ValidMArrayIter(const ArrayData* ad,
                                       const MArrayIter & fp) {
  assert(fp.getContainer() == ad);
  auto a = asGlobals(ad);
  if (fp.getResetFlag()) return false;
  if (fp.m_pos == IterEnd(a)) return false;
  NameValueTable::Iterator iter(a->m_tab, fp.m_pos);
  return iter.valid();
}
Пример #5
0
member_lval GlobalsArray::LvalStr(ArrayData* ad, StringData* k, bool /*copy*/) {
  auto a = asGlobals(ad);
  TypedValue* tv = a->m_tab->lookup(k);
  if (!tv) {
    TypedValue nulVal;
    tvWriteNull(nulVal);
    tv = a->m_tab->set(k, &nulVal);
  }
  return member_lval { a, tv };
}
Пример #6
0
Cell GlobalsArray::NvGetKey(const ArrayData* ad, ssize_t pos) {
  auto a = asGlobals(ad);
  NameValueTable::Iterator iter(a->m_tab, pos);
  if (iter.valid()) {
    auto k = iter.curKey();
    if (k->isRefCounted()) {
      k->rawIncRefCount();
      return make_tv<KindOfString>(const_cast<StringData*>(k));
    }
    return make_tv<KindOfPersistentString>(k);
  }
  return make_tv<KindOfUninit>();
}
Пример #7
0
ArrayData*
GlobalsArray::LvalStr(ArrayData* ad, StringData* k, Variant*& ret,
                               bool copy) {
  auto a = asGlobals(ad);
  TypedValue* tv = a->m_tab->lookup(k);
  if (!tv) {
    TypedValue nulVal;
    tvWriteNull(&nulVal);
    tv = a->m_tab->set(k, &nulVal);
  }
  ret = &tvAsVariant(tv);
  return a;
}
Пример #8
0
size_t GlobalsArray::Vsize(const ArrayData* ad) {
  // We need to iterate to find out the actual size, since kNamedLocalDataType
  // elements in the array may have been set to KindOfUninit.
  auto a = asGlobals(ad);
  size_t count = 0;
  auto iter_limit = IterEnd(a);
  for (auto iter = IterBegin(a);
       iter != iter_limit;
       iter = IterAdvance(a, iter)) {
    ++count;
  }
  return count;
}
Пример #9
0
void GlobalsArray::NvGetKey(const ArrayData* ad, TypedValue* out,
                                     ssize_t pos) {
  auto a = asGlobals(ad);
  NameValueTable::Iterator iter(a->m_tab, pos);
  if (iter.valid()) {
    auto k = iter.curKey();
    out->m_data.pstr = const_cast<StringData*>(k);
    out->m_type = KindOfString;
    k->incRefCount();
  } else {
    out->m_type = KindOfUninit;
  }
}
Пример #10
0
bool GlobalsArray::AdvanceMArrayIter(ArrayData* ad, MArrayIter& fp) {
  auto a = asGlobals(ad);
  bool reset = fp.getResetFlag();
  NameValueTable::Iterator iter = reset ?
    NameValueTable::Iterator(a->m_tab) :
    NameValueTable::Iterator(a->m_tab, fp.m_pos);
  if (reset) {
    fp.setResetFlag(false);
  } else {
    if (!iter.valid()) {
      return false;
    }
    iter.next();
  }
  fp.m_pos = iter.toInteger();
  if (!iter.valid()) return false;
  // To conform to PHP behavior, we need to set the internal
  // cursor to point to the next element.
  iter.next();
  a->m_pos = iter.toInteger();
  return true;
}
Пример #11
0
const TypedValue*
GlobalsArray::NvGetStr(const ArrayData* ad, const StringData* k) {
  return asGlobals(ad)->m_tab->lookup(k);
}
Пример #12
0
bool
GlobalsArray::ExistsStr(const ArrayData* ad, const StringData* k) {
  return asGlobals(ad)->m_tab->lookup(k) != nullptr;
}
Пример #13
0
const Variant& GlobalsArray::GetValueRef(const ArrayData* ad, ssize_t pos) {
  auto a = asGlobals(ad);
  NameValueTable::Iterator iter(a->m_tab, pos);
  return iter.valid() ? tvAsCVarRef(iter.curVal()) : null_variant;
}
Пример #14
0
ArrayData* GlobalsArray::SetWithRefStr(ArrayData* ad, StringData* k,
                                       TypedValue v, bool) {
  auto a = asGlobals(ad);
  tvSetWithRef(v, *a->m_tab->lookupAdd(k));
  return a;
}
Пример #15
0
ssize_t GlobalsArray::IterEnd(const ArrayData* ad) {
  auto a = asGlobals(ad);
  return NameValueTable::Iterator::getEnd(a->m_tab).toInteger();
}
Пример #16
0
ssize_t GlobalsArray::IterRewind(const ArrayData* ad, ssize_t prev) {
  auto a = asGlobals(ad);
  NameValueTable::Iterator iter(a->m_tab, prev);
  iter.prev();
  return iter.toInteger();
}
Пример #17
0
member_rval::ptr_u
GlobalsArray::NvGetInt(const ArrayData* ad, int64_t k) {
  return asGlobals(ad)->m_tab->lookup(String(k).get());
}
Пример #18
0
const TypedValue*
GlobalsArray::NvGetInt(const ArrayData* ad, int64_t k) {
  return asGlobals(ad)->m_tab->lookup(String(k).get());
}
Пример #19
0
ArrayData* GlobalsArray::SetRefStr(ArrayData* ad, StringData* k,
                                   member_lval v, bool) {
  auto a = asGlobals(ad);
  tvAsVariant(a->m_tab->lookupAdd(k)).assignRef(tvAsVariant(v.tv_ptr()));
  return a;
}
Пример #20
0
ArrayData* GlobalsArray::SetRefInt(ArrayData* ad,
                                            int64_t k,
                                            Variant& v,
                                            bool copy) {
  return asGlobals(ad)->setRef(String(k).get(), v, copy);
}
Пример #21
0
member_rval::ptr_u GlobalsArray::GetValueRef(const ArrayData* ad, ssize_t pos) {
  auto a = asGlobals(ad);
  NameValueTable::Iterator iter(a->m_tab, pos);
  return iter.valid() ? iter.curVal() : uninit_variant.asTypedValue();
}
Пример #22
0
ssize_t GlobalsArray::IterBegin(const ArrayData* ad) {
  auto a = asGlobals(ad);
  NameValueTable::Iterator iter(a->m_tab);
  return iter.toInteger();
}
Пример #23
0
member_rval::ptr_u
GlobalsArray::NvGetStr(const ArrayData* ad, const StringData* k) {
  return asGlobals(ad)->m_tab->lookup(k);
}