ArrayData *ArrayData::GetScalarArray(ArrayData *arr, const StringData *key /* = NULL */) { if (key == NULL) { key = StringData::GetStaticString(f_serialize(arr).get()); } else { assert(key->isStatic()); assert(key->same(f_serialize(arr).get())); } ArrayDataMap::accessor acc; if (s_arrayDataMap.insert(acc, key)) { ArrayData *ad = arr->nonSmartCopy(); ad->setStatic(); ad->onSetEvalScalar(); acc->second = ad; } return acc->second; }
ArrayData* ArrayData::GetScalarArray(ArrayData* arr, const ScalarArrayKey& key) { if (arr->empty() && !arr->isDict()) return staticEmptyArray(); assert(key == GetScalarArrayKey(arr)); ArrayDataMap::accessor acc; if (s_arrayDataMap.insert(acc, key)) { ArrayData* ad; if (arr->isVectorData() && !arr->isPacked() && !arr->isDict()) { ad = PackedArray::ConvertStatic(arr); } else { ad = arr->copyStatic(); } assert(ad->isStatic()); ad->onSetEvalScalar(); acc->second = ad; } return acc->second; }