#include "config.h"
#include "Identifier.h"
#include "IdentifierInlines.h"
#include "NumericStrings.h"
#include <wtf/Assertions.h>
namespace JSC {
Ref<StringImpl> Identifier::add(VM& vm, const char* c)
{
ASSERT(c);
ASSERT(c[0]);
if (!c[1])
return vm.smallStrings.singleCharacterStringRep(c[0]);
return *AtomStringImpl::add(c);
}
Ref<StringImpl> Identifier::add8(VM& vm, const UChar* s, int length)
{
if (length == 1) {
UChar c = s[0];
ASSERT(isLatin1(c));
if (canUseSingleCharacterString(c))
return vm.smallStrings.singleCharacterStringRep(c);
}
if (!length)
return *StringImpl::empty();
return *AtomStringImpl::add(s, length);
}
Identifier Identifier::from(VM& vm, unsigned value)
{
return Identifier(vm, vm.numericStrings.add(value));
}
Identifier Identifier::from(VM& vm, int value)
{
return Identifier(vm, vm.numericStrings.add(value));
}
Identifier Identifier::from(VM& vm, double value)
{
return Identifier(vm, vm.numericStrings.add(value));
}
void Identifier::dump(PrintStream& out) const
{
if (impl()) {
if (impl()->isSymbol()) {
auto* symbol = static_cast<SymbolImpl*>(impl());
if (symbol->isPrivate())
out.print("PrivateSymbol.");
}
out.print(impl());
} else
out.print("<null identifier>");
}
#ifndef NDEBUG
void Identifier::checkCurrentAtomStringTable(VM& vm)
{
ASSERT_UNUSED(vm, vm.atomStringTable() == Thread::current().atomStringTable());
}
#else
NO_RETURN_DUE_TO_CRASH void Identifier::checkCurrentAtomStringTable(VM&) { CRASH(); }
#endif
}