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; }