static bool filter_var(Variant& ret, const Variant& variable, int64_t filter, const Variant& options) { const filter_list_entry* filter_func = php_find_filter(filter); if (!filter_func) { return false; } int64_t flags; Variant option_array; if (options.isArray()) { auto arr = options.toArray(); flags = arr[s_flags].toInt64(); option_array = arr[s_options]; } else { flags = options.toInt64(); } FAIL_IF(variable.isObject() && !variable.getObjectData()->hasToString()); ret = filter_func->function(variable.toString(), flags, option_array); if (option_array.isArray() && option_array.toArray().exists(s_default) && ((flags & k_FILTER_NULL_ON_FAILURE && ret.isNull()) || (!(flags & k_FILTER_NULL_ON_FAILURE) && ret.isBoolean() && ret.asBooleanVal() == 0))) { ret = option_array.toArray()[s_default]; } return true; }
Variant HHVM_FUNCTION(serialize_memoize_param, const Variant& param) { // Memoize throws in the emitter if any function parameters are references, so // we can just assert that the param is cell here const auto& cell_param = *tvAssertCell(param.asTypedValue()); auto type = param.getType(); if (type == KindOfInt64) { return param; } else if (type == KindOfUninit || type == KindOfNull) { return s_empty; } else if (type == KindOfBoolean) { return param.asBooleanVal() ? s_true : s_false; } else if (type == KindOfString) { auto str = param.asCStrRef(); if (str.empty()) { return s_emptyStr; } else if (str.charAt(0) > '9') { // If it doesn't start with a number, then we know it can never collide // with an int or any of our constants, so it's fine as is return param; } } else if (isContainer(cell_param) && getContainerSize(cell_param) == 0) { return s_emptyArr; } return fb_compact_serialize(param, FBCompactSerializeBehavior::MemoizeParam); }