CVarRef Array::setRef(CVarRef key, CVarRef v, bool isKey /* = false */) {
    if (key.getRawType() == KindOfInt64) {
        return setRefImpl(key.getNumData(), v);
    }
    if (isKey) return setRefImpl(key, v);
    VarNR k(key.toKey());
    if (!k.isNull()) {
        return setRefImpl<Variant>(k, v);
    }
    return Variant::lvalBlackHole();
}
CVarRef Array::setRef(CStrRef key, CVarRef v, bool isKey /* = false */) {
    if (isKey) return setRefImpl(key, v);
    return setRefImpl(key.toKey(), v);
}
CVarRef Array::setRef(int64   key, CVarRef v) {
    return setRefImpl(key, v);
}
CVarRef Array::setRef(litstr  key, CVarRef v, bool isKey /* = false */) {
    if (isKey) return setRefImpl(String(key), v);
    return setRefImpl(String(key).toKey(), v);
}
Variant TempExpressionList::setRef(VariableEnvironment &env,
                                   CVarRef val) const {
  TempExpressionHelper helper(this, env);
  return setRefImpl(env, val);
}