示例#1
0
void objOffsetAppend(ObjectData* base, TypedValue* val,
                     bool validate /* = true */) {
  assert(!base->isCollection());
  if (validate) {
    objArrayAccess(base);
  }
  objOffsetSet(base, init_null_variant, val, false);
}
示例#2
0
void objOffsetUnset(ObjectData* base, const Variant& offset) {
  objArrayAccess(base);
  assert(!base->isCollection());
  const Func* method = base->methodNamed(s_offsetUnset.get());
  assert(method != nullptr);
  TypedValue tv;
  tvWriteUninit(&tv);
  g_context->invokeFuncFew(&tv, method, base, nullptr, 1, offset.asCell());
  tvRefcountedDecRef(&tv);
}
示例#3
0
void objOffsetUnset(ObjectData* base, TypedValue offset) {
  objArrayAccess(base);

  assertx(!base->isCollection());
  assertx(offset.m_type != KindOfRef);

  auto const method = base->methodNamed(s_offsetUnset.get());
  assert(method != nullptr);

  g_context->invokeMethodV(base, method, InvokeArgs(&offset, 1));
}
示例#4
0
void objOffsetAppend(
  ObjectData* base,
  TypedValue* val,
  bool validate /* = true */
) {
  assertx(!base->isCollection());
  if (validate) {
    objArrayAccess(base);
  }
  objOffsetSet(base, make_tv<KindOfNull>(), val, false);
}
示例#5
0
void objOffsetUnset(ObjectData* base, CVarRef offset) {
  objArrayAccess(base);
  static StringData* sd__offsetUnset
    = StringData::GetStaticString("offsetUnset");
  assert(!base->isCollection());
  const Func* method = base->methodNamed(sd__offsetUnset);
  assert(method != nullptr);
  TypedValue tv;
  tvWriteUninit(&tv);
  base->invokeUserMethod(&tv, method, CREATE_VECTOR1(offset));
  tvRefcountedDecRef(&tv);
}
示例#6
0
void objOffsetUnset(ObjectData* base, CVarRef offset) {
  objArrayAccess(base);
  static StringData* sd__offsetUnset
    = makeStaticString("offsetUnset");
  assert(!base->isCollection());
  const Func* method = base->methodNamed(sd__offsetUnset);
  assert(method != nullptr);
  TypedValue tv;
  tvWriteUninit(&tv);
  g_vmContext->invokeFuncFew(&tv, method, base, nullptr, 1, offset.asCell());
  tvRefcountedDecRef(&tv);
}
示例#7
0
void objOffsetUnset(TypedValue* base, CVarRef offset) {
  objArrayAccess(base);
  static StringData* sd__offsetUnset
    = StringData::GetStaticString("offsetUnset");
  ObjectData* obj = base->m_data.pobj;
  Instance* instance = static_cast<Instance*>(obj);
  const Func* method = instance->methodNamed(sd__offsetUnset);
  ASSERT(method != NULL);
  TypedValue tv;
  tvWriteUninit(&tv);
  instance->invokeUserMethod(&tv, method, CREATE_VECTOR1(offset));
  tvRefcountedDecRef(&tv);
}
示例#8
0
TypedValue* objOffsetGet(TypedValue& tvRef, ObjectData* base,
                         const Variant& offset, bool validate /* = true */) {
  if (validate) {
    objArrayAccess(base);
  }
  TypedValue* result;
  assert(!base->isCollection());
  const Func* method = base->methodNamed(s_offsetGet.get());
  assert(method != nullptr);
  g_context->invokeFuncFew(&tvRef, method, base, nullptr, 1, offset.asCell());
  result = &tvRef;
  return result;
}
示例#9
0
static bool objOffsetExists(ObjectData* base, CVarRef offset) {
  objArrayAccess(base);
  TypedValue tvResult;
  tvWriteUninit(&tvResult);
  static StringData* sd__offsetExists
    = StringData::GetStaticString("offsetExists");
  assert(!base->isCollection());
  const Func* method = base->methodNamed(sd__offsetExists);
  assert(method != nullptr);
  base->invokeUserMethod(&tvResult, method, CREATE_VECTOR1(offset));
  tvCastToBooleanInPlace(&tvResult);
  return bool(tvResult.m_data.num);
}
示例#10
0
void objOffsetSet(ObjectData* base, const Variant& offset, TypedValue* val,
                  bool validate /* = true */) {
  if (validate) {
    objArrayAccess(base);
  }
  assert(!base->isCollection());
  const Func* method = base->methodNamed(s_offsetSet.get());
  assert(method != nullptr);
  TypedValue tvResult;
  tvWriteUninit(&tvResult);
  TypedValue args[2] = { *offset.asCell(), *tvToCell(val) };
  g_context->invokeFuncFew(&tvResult, method, base, nullptr, 2, args);
  tvRefcountedDecRef(&tvResult);
}
示例#11
0
bool objOffsetExists(TypedValue* base, CVarRef offset) {
  objArrayAccess(base);
  TypedValue tvResult;
  tvWriteUninit(&tvResult);
  static StringData* sd__offsetExists
    = StringData::GetStaticString("offsetExists");
  ObjectData* obj = base->m_data.pobj;
  Instance* instance = static_cast<Instance*>(obj);
  const Func* method = instance->methodNamed(sd__offsetExists);
  ASSERT(method != NULL);
  instance->invokeUserMethod(&tvResult, method, CREATE_VECTOR1(offset));
  tvCastToBooleanInPlace(&tvResult);
  return bool(tvResult.m_data.num);
}
示例#12
0
TypedValue* objOffsetGet(TypedValue& tvRef, ObjectData* base,
                         CVarRef offset, bool validate /* = true */) {
  if (validate) {
    objArrayAccess(base);
  }
  TypedValue* result;
  assert(!base->isCollection());
  static StringData* sd__offsetGet = makeStaticString("offsetGet");
  const Func* method = base->methodNamed(sd__offsetGet);
  assert(method != nullptr);
  g_vmContext->invokeFuncFew(&tvRef, method, base, nullptr, 1, offset.asCell());
  result = &tvRef;
  return result;
}
示例#13
0
TypedValue* objOffsetGet(TypedValue& tvRef, ObjectData* base,
                         CVarRef offset, bool validate /* = true */) {
  if (validate) {
    objArrayAccess(base);
  }
  TypedValue* result;
  assert(!base->isCollection());
  static StringData* sd__offsetGet = StringData::GetStaticString("offsetGet");
  const Func* method = base->methodNamed(sd__offsetGet);
  assert(method != nullptr);
  base->invokeUserMethod(&tvRef, method, CREATE_VECTOR1(offset));
  result = &tvRef;
  return result;
}
示例#14
0
static bool objOffsetExists(ObjectData* base, CVarRef offset) {
  objArrayAccess(base);
  TypedValue tvResult;
  tvWriteUninit(&tvResult);
  static StringData* sd__offsetExists
    = makeStaticString("offsetExists");
  assert(!base->isCollection());
  const Func* method = base->methodNamed(sd__offsetExists);
  assert(method != nullptr);
  g_vmContext->invokeFuncFew(&tvResult, method, base, nullptr, 1,
                             offset.asCell());
  tvCastToBooleanInPlace(&tvResult);
  return bool(tvResult.m_data.num);
}
示例#15
0
TypedValue* objOffsetGet(TypedValue& tvRef, TypedValue* base,
                         CVarRef offset, bool validate /* = true */) {
  if (validate) {
    objArrayAccess(base);
  }
  TypedValue* result;
  ObjectData* obj = base->m_data.pobj;
  Instance* instance = static_cast<Instance*>(obj);
  static StringData* sd__offsetGet = StringData::GetStaticString("offsetGet");
  const Func* method = instance->methodNamed(sd__offsetGet);
  ASSERT(method != NULL);
  instance->invokeUserMethod(&tvRef, method, CREATE_VECTOR1(offset));
  result = &tvRef;
  return result;
}
示例#16
0
void objOffsetSet(ObjectData* base, CVarRef offset, TypedValue* val,
                  bool validate /* = true */) {
  if (validate) {
    objArrayAccess(base);
  }
  static StringData* sd__offsetSet = StringData::GetStaticString("offsetSet");
  assert(!base->isCollection());
  const Func* method = base->methodNamed(sd__offsetSet);
  assert(method != nullptr);
  TypedValue tvResult;
  tvWriteUninit(&tvResult);
  base->invokeUserMethod(&tvResult, method,
                         CREATE_VECTOR2(offset, tvAsCVarRef(val)));
  tvRefcountedDecRef(&tvResult);
}
示例#17
0
static OffsetExistsResult objOffsetExists(ObjectData* base,
                                          const Variant& offset) {
  objArrayAccess(base);
  TypedValue tvResult;
  tvWriteUninit(&tvResult);
  assert(!base->isCollection());
  const Func* method = base->methodNamed(s_offsetExists.get());
  assert(method != nullptr);
  g_context->invokeFuncFew(&tvResult, method, base, nullptr, 1,
                             offset.asCell());
  tvCastToBooleanInPlace(&tvResult);
  if (!tvResult.m_data.num) return OffsetExistsResult::DoesNotExist;
  return method->cls() == SystemLib::s_ArrayObjectClass ?
    OffsetExistsResult::IssetIfNonNull : OffsetExistsResult::DefinitelyExists;
}
示例#18
0
void objOffsetSet(TypedValue* base, CVarRef offset, TypedValue* val,
                  bool validate /* = true */) {
  if (validate) {
    objArrayAccess(base);
  }
  static StringData* sd__offsetSet = StringData::GetStaticString("offsetSet");
  ObjectData* obj = base->m_data.pobj;
  Instance* instance = static_cast<Instance*>(obj);
  const Func* method = instance->methodNamed(sd__offsetSet);
  ASSERT(method != NULL);
  TypedValue tvResult;
  tvWriteUninit(&tvResult);
  instance->invokeUserMethod(&tvResult, method,
                             CREATE_VECTOR2(offset, tvAsCVarRef(val)));
  tvRefcountedDecRef(&tvResult);
}
示例#19
0
TypedValue objOffsetGet(
  ObjectData* base,
  TypedValue offset,
  bool validate /* = true */
) {
  if (validate) {
    objArrayAccess(base);
  }

  assertx(!base->isCollection());
  assertx(offset.m_type != KindOfRef);

  auto const method = base->methodNamed(s_offsetGet.get());
  assert(method != nullptr);

  return g_context->invokeMethod(base, method, InvokeArgs(&offset, 1));
}
示例#20
0
void objOffsetSet(
  ObjectData* base,
  TypedValue offset,
  TypedValue* val,
  bool validate /* = true */
) {
  if (validate) {
    objArrayAccess(base);
  }

  assertx(!base->isCollection());
  assertx(offset.m_type != KindOfRef);

  auto const method = base->methodNamed(s_offsetSet.get());
  assert(method != nullptr);

  TypedValue args[2] = { offset, *tvToCell(val) };
  g_context->invokeMethodV(base, method, folly::range(args));
}
示例#21
0
static OffsetExistsResult objOffsetExists(ObjectData* base, TypedValue offset) {
  objArrayAccess(base);

  assertx(!base->isCollection());
  assertx(offset.m_type != KindOfRef);

  auto const method = base->methodNamed(s_offsetExists.get());
  assert(method != nullptr);

  auto result = g_context->invokeMethod(base, method, InvokeArgs(&offset, 1));
  // In-place cast decrefs the function call result.
  tvCastToBooleanInPlace(&result);

  if (!result.m_data.num) {
    return OffsetExistsResult::DoesNotExist;
  }

  return method->cls() == SystemLib::s_ArrayObjectClass
    ? OffsetExistsResult::IssetIfNonNull
    : OffsetExistsResult::DefinitelyExists;
}