use strict;
use Hasher;
-sub GenerateStringData($)
+sub GenerateStrings($)
{
my $stringsRef = shift;
my %strings = %$stringsRef;
push(@result, "static const LChar ${name}String8[] = \"$strings{$name}\";\n");
}
- return join "", @result;
-}
-
-sub GenerateASCIILiteral($$)
-{
- my $name = shift;
- my $value = shift;
-
- my $length = length($value);
- my $hash = Hasher::GenerateHashValue($value);
- return "{ StaticASCIILiteral::s_initialRefCount, $length, ${name}String8, StaticASCIILiteral::s_initialFlags | (${hash} << StaticASCIILiteral::s_hashShift) }";
-}
-
-sub GenerateStrings($)
-{
- my $stringsRef = shift;
- my %strings = %$stringsRef;
-
- my @result = ();
-
- push(@result, GenerateStringData($stringsRef));
push(@result, "\n");
for my $name (sort keys %strings) {
my $value = $strings{$name};
- push(@result, "static StaticASCIILiteral ${name}Data = ");
- push(@result, GenerateASCIILiteral($name, $strings{$name}));
- push(@result, ";\n");
+ my $length = length($value);
+ my $hash = Hasher::GenerateHashValue($value);
+ push(@result, <<END);
+static StringImpl::StaticASCIILiteral ${name}Data = {
+ StringImpl::StaticASCIILiteral::s_initialRefCount,
+ $length,
+ ${name}String8,
+ StringImpl::StaticASCIILiteral::s_initialFlags | (${hash} << StringImpl::StaticASCIILiteral::s_hashShift)
+};
+END
}
push(@result, "\n");
print F "#endif\n\n";
print F "#include \"${namespace}Names.h\"\n\n";
- print F "#include <array>\n";
- print F "#include <wtf/StaticConstructors.h>\n\n";
+ print F "#include <wtf/StaticConstructors.h>\n";
print F "namespace WebCore {\n\n";
print F "namespace ${namespace}Names {\n\n";
- print F "using namespace $usedNamespace;\n";
- print F "using StaticASCIILiteral = StringImpl::StaticASCIILiteral;\n\n";
+ print F "using namespace $usedNamespace;\n\n";
}
sub printInit
return;
initialized = true;
+ // Use placement new to initialize the globals.
+
AtomicString::init();
";
}
print F "WEBCORE_EXPORT DEFINE_GLOBAL(AtomicString, ${lowercaseNamespacePrefix}NamespaceURI)\n\n";
- print F StaticString::GenerateStringData(\%allStrings);
- print F "\n";
+ print F StaticString::GenerateStrings(\%allStrings);
if (keys %allTags) {
- printStaticData($F, \%allTags, "Tag", $parameters{namespace}, "$parameters{namespace}QualifiedName");
+ print F "// Tags\n";
+ for my $name (sort keys %allTags) {
+ print F "WEBCORE_EXPORT DEFINE_GLOBAL($parameters{namespace}QualifiedName, ", $name, "Tag)\n";
+ }
+
+ print F "\n\nconst WebCore::$parameters{namespace}QualifiedName* const* get$parameters{namespace}Tags()\n";
+ print F "{\n static const WebCore::$parameters{namespace}QualifiedName* const $parameters{namespace}Tags[] = {\n";
+ for my $name (sort keys %allTags) {
+ print F " reinterpret_cast<const WebCore::$parameters{namespace}QualifiedName*>(&${name}Tag),\n";
+ }
+ print F " };\n";
+ print F " return $parameters{namespace}Tags;\n";
+ print F "}\n";
}
if (keys %allAttrs) {
- printStaticData($F, \%allAttrs, "Attr", $parameters{namespace}, "QualifiedName");
+ print F "\n// Attributes\n";
+ for my $name (sort keys %allAttrs) {
+ print F "WEBCORE_EXPORT DEFINE_GLOBAL(QualifiedName, ", $name, "Attr)\n";
+ }
+ print F "\n\nconst WebCore::QualifiedName* const* get$parameters{namespace}Attrs()\n";
+ print F "{\n static const WebCore::QualifiedName* const $parameters{namespace}Attrs[] = {\n";
+ for my $name (sort keys %allAttrs) {
+ print F " reinterpret_cast<const WebCore::QualifiedName*>(&${name}Attr),\n";
+ }
+ print F " };\n";
+ print F " return $parameters{namespace}Attrs;\n";
+ print F "}\n";
}
printInit($F, 0);
print(F " // Namespace\n");
print(F " new (NotNull, (void*)&${lowercaseNamespacePrefix}NamespaceURI) AtomicString(${lowercaseNamespacePrefix}NS);\n");
+ print(F "\n");
+ print F StaticString::GenerateStringAsserts(\%allStrings);
if (keys %allTags) {
my $tagsNamespace = $parameters{tagsNullNamespace} ? "nullAtom" : "${lowercaseNamespacePrefix}NS";
- printQualifiedNameCreation($F, "Tags", $parameters{namespace}, "$parameters{namespace}QualifiedName", $tagsNamespace);
+ printDefinitions($F, \%allTags, "tags", $tagsNamespace);
}
-
if (keys %allAttrs) {
my $attrsNamespace = $parameters{attrsNullNamespace} ? "nullAtom" : "${lowercaseNamespacePrefix}NS";
- printQualifiedNameCreation($F, "Attrs", $parameters{namespace}, "QualifiedName", $attrsNamespace);
+ printDefinitions($F, \%allAttrs, "attributes", $attrsNamespace);
}
print F "}\n\n} }\n\n";
}
}
-sub printStaticData
+sub printDefinitions
{
- my ($F, $namesRef, $type, $namespace, $qualifiedNameType) = @_;
+ my ($F, $namesRef, $type, $namespaceURI) = @_;
- my $nameCount = scalar(keys %$namesRef);
-
- print F "// $type\n";
- for my $name (sort keys %$namesRef) {
- print F "WEBCORE_EXPORT DEFINE_GLOBAL($qualifiedNameType, ${name}${type})\n";
- }
+ my $shortCamelType = ucfirst(substr(substr($type, 0, -1), 0, 4));
+ my $capitalizedType = ucfirst($type);
+
+print F <<END
- print F "\n";
- print F "static const std::array<const $qualifiedNameType*, $nameCount> ${namespace}${type}s = { {\n";
- for my $name (sort keys %$namesRef) {
- print F " reinterpret_cast<const $qualifiedNameType*>(&${name}${type}),\n";
- }
- print F "} };\n\n";
+ struct ${capitalizedType}TableEntry {
+ void* targetAddress;
+ StringImpl& name;
+ };
- print F "static const std::array<StaticASCIILiteral, $nameCount> ${namespace}${type}sLiterals = { {\n";
+ static const ${capitalizedType}TableEntry ${type}Table[] = {
+END
+;
for my $name (sort keys %$namesRef) {
- print F " ", StaticString::GenerateASCIILiteral($name, valueForName($name)), ",\n";
+ print F " { (void*)&$name$shortCamelType, *reinterpret_cast<StringImpl*>(&${name}Data) },\n";
}
- print F "} };\n\n";
-
- print F "const $qualifiedNameType* const* get${namespace}${type}s()\n";
- print F "{\n";
- print F " return ${namespace}${type}s.data();\n";
- print F "}\n";
-}
-
-sub printQualifiedNameCreation
-{
- my ($F, $type, $namespace, $qualifiedNameType, $namespaceURI) = @_;
- print F "\n";
- print F " static_assert(${namespace}${type}.size() == ${namespace}${type}Literals.size(), \"Arrays match in size\");\n";
- print F " for (size_t i = 0; i < ${namespace}${type}.size(); ++i) {\n";
- print F "#ifndef NDEBUG\n";
- print F " reinterpret_cast<const StringImpl&>(${namespace}${type}Literals[i]).assertHashIsCorrect();\n";
- print F "#endif\n";
+print F <<END
+ };
+ for (unsigned i = 0; i < WTF_ARRAY_LENGTH(${type}Table); ++i)
+END
+;
if ($namespaceURI eq "nullAtom") {
- print F " createQualifiedName(reinterpret_cast<void*>(const_cast<$qualifiedNameType*>(${namespace}${type}\[i\])),\n";
- print F " reinterpret_cast<StringImpl*>(const_cast<StaticASCIILiteral*>(&${namespace}${type}Literals\[i\])));\n";
+ print F " createQualifiedName(${type}Table[i].targetAddress, &${type}Table[i].name);\n";
} else {
- print F " createQualifiedName(reinterpret_cast<void*>(const_cast<$qualifiedNameType*>(${namespace}${type}\[i\])),\n";
- print F " reinterpret_cast<StringImpl*>(const_cast<StaticASCIILiteral*>(&${namespace}${type}Literals\[i\])), $namespaceURI);\n";
+ print F " createQualifiedName(${type}Table[i].targetAddress, &${type}Table[i].name, $namespaceURI);\n";
}
-
- print F " }\n";
}
## ElementFactory routines