698
static GCExtension kGCExtension;
699
v8::DeclareExtension kGCExtensionDeclaration(&kGCExtension);
698
static GCExtension gc_extension;
699
static v8::DeclareExtension gc_extension_declaration(&gc_extension);
702
// --- E x t e r n a l i z e S t r i n g E x t e n s i o n ---
705
template <typename Char, typename Base>
706
class SimpleStringResource : public Base {
708
// Takes ownership of |data|.
709
SimpleStringResource(Char* data, size_t length)
713
virtual ~SimpleStringResource() { delete data_; }
715
virtual const Char* data() const { return data_; }
717
virtual size_t length() const { return length_; }
721
const size_t length_;
725
typedef SimpleStringResource<char, v8::String::ExternalAsciiStringResource>
726
SimpleAsciiStringResource;
727
typedef SimpleStringResource<uc16, v8::String::ExternalStringResource>
728
SimpleTwoByteStringResource;
731
const char* const ExternalizeStringExtension::kSource =
732
"native function externalizeString();"
733
"native function isAsciiString();";
736
v8::Handle<v8::FunctionTemplate> ExternalizeStringExtension::GetNativeFunction(
737
v8::Handle<v8::String> str) {
738
if (strcmp(*v8::String::AsciiValue(str), "externalizeString") == 0) {
739
return v8::FunctionTemplate::New(ExternalizeStringExtension::Externalize);
741
ASSERT(strcmp(*v8::String::AsciiValue(str), "isAsciiString") == 0);
742
return v8::FunctionTemplate::New(ExternalizeStringExtension::IsAscii);
747
v8::Handle<v8::Value> ExternalizeStringExtension::Externalize(
748
const v8::Arguments& args) {
749
if (args.Length() < 1 || !args[0]->IsString()) {
750
return v8::ThrowException(v8::String::New(
751
"First parameter to externalizeString() must be a string."));
753
bool force_two_byte = false;
754
if (args.Length() >= 2) {
755
if (args[1]->IsBoolean()) {
756
force_two_byte = args[1]->BooleanValue();
758
return v8::ThrowException(v8::String::New(
759
"Second parameter to externalizeString() must be a boolean."));
763
Handle<String> string = Utils::OpenHandle(*args[0].As<v8::String>());
764
if (string->IsExternalString()) {
765
return v8::ThrowException(v8::String::New(
766
"externalizeString() can't externalize twice."));
768
if (string->IsAsciiRepresentation() && !force_two_byte) {
769
char* data = new char[string->length()];
770
String::WriteToFlat(*string, data, 0, string->length());
771
SimpleAsciiStringResource* resource = new SimpleAsciiStringResource(
772
data, string->length());
773
result = string->MakeExternal(resource);
774
if (result && !string->IsSymbol()) {
775
i::ExternalStringTable::AddString(*string);
778
uc16* data = new uc16[string->length()];
779
String::WriteToFlat(*string, data, 0, string->length());
780
SimpleTwoByteStringResource* resource = new SimpleTwoByteStringResource(
781
data, string->length());
782
result = string->MakeExternal(resource);
783
if (result && !string->IsSymbol()) {
784
i::ExternalStringTable::AddString(*string);
788
return v8::ThrowException(v8::String::New("externalizeString() failed."));
790
return v8::Undefined();
794
v8::Handle<v8::Value> ExternalizeStringExtension::IsAscii(
795
const v8::Arguments& args) {
796
if (args.Length() != 1 || !args[0]->IsString()) {
797
return v8::ThrowException(v8::String::New(
798
"isAsciiString() requires a single string argument."));
800
return Utils::OpenHandle(*args[0].As<v8::String>())->IsAsciiRepresentation() ?
801
v8::True() : v8::False();
805
static ExternalizeStringExtension externalize_extension;
806
static v8::DeclareExtension externalize_extension_declaration(
807
&externalize_extension);
701
809
} } // namespace v8::internal