V8 Project
externalize-string-extension.cc
Go to the documentation of this file.
1 // Copyright 2010 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
6 
7 namespace v8 {
8 namespace internal {
9 
10 template <typename Char, typename Base>
11 class SimpleStringResource : public Base {
12  public:
13  // Takes ownership of |data|.
15  : data_(data),
16  length_(length) {}
17 
18  virtual ~SimpleStringResource() { delete[] data_; }
19 
20  virtual const Char* data() const { return data_; }
21 
22  virtual size_t length() const { return length_; }
23 
24  private:
25  Char* const data_;
26  const size_t length_;
27 };
28 
29 
34 
35 
36 const char* const ExternalizeStringExtension::kSource =
37  "native function externalizeString();"
38  "native function isOneByteString();";
39 
42  v8::Isolate* isolate, v8::Handle<v8::String> str) {
43  if (strcmp(*v8::String::Utf8Value(str), "externalizeString") == 0) {
44  return v8::FunctionTemplate::New(isolate,
46  } else {
47  DCHECK(strcmp(*v8::String::Utf8Value(str), "isOneByteString") == 0);
48  return v8::FunctionTemplate::New(isolate,
50  }
51 }
52 
53 
56  if (args.Length() < 1 || !args[0]->IsString()) {
58  args.GetIsolate(),
59  "First parameter to externalizeString() must be a string."));
60  return;
61  }
62  bool force_two_byte = false;
63  if (args.Length() >= 2) {
64  if (args[1]->IsBoolean()) {
65  force_two_byte = args[1]->BooleanValue();
66  } else {
68  args.GetIsolate(),
69  "Second parameter to externalizeString() must be a boolean."));
70  return;
71  }
72  }
73  bool result = false;
74  Handle<String> string = Utils::OpenHandle(*args[0].As<v8::String>());
75  if (string->IsExternalString()) {
77  args.GetIsolate(),
78  "externalizeString() can't externalize twice."));
79  return;
80  }
81  if (string->IsOneByteRepresentation() && !force_two_byte) {
82  uint8_t* data = new uint8_t[string->length()];
83  String::WriteToFlat(*string, data, 0, string->length());
85  reinterpret_cast<char*>(data), string->length());
86  result = string->MakeExternal(resource);
87  if (result) {
88  i::Isolate* isolate = reinterpret_cast<i::Isolate*>(args.GetIsolate());
89  isolate->heap()->external_string_table()->AddString(*string);
90  }
91  if (!result) delete resource;
92  } else {
93  uc16* data = new uc16[string->length()];
94  String::WriteToFlat(*string, data, 0, string->length());
96  data, string->length());
97  result = string->MakeExternal(resource);
98  if (result) {
99  i::Isolate* isolate = reinterpret_cast<i::Isolate*>(args.GetIsolate());
100  isolate->heap()->external_string_table()->AddString(*string);
101  }
102  if (!result) delete resource;
103  }
104  if (!result) {
106  args.GetIsolate(), "externalizeString() failed."));
107  return;
108  }
109 }
110 
111 
114  if (args.Length() != 1 || !args[0]->IsString()) {
116  args.GetIsolate(),
117  "isOneByteString() requires a single string argument."));
118  return;
119  }
120  bool is_one_byte =
121  Utils::OpenHandle(*args[0].As<v8::String>())->IsOneByteRepresentation();
122  args.GetReturnValue().Set(is_one_byte);
123 }
124 
125 } } // namespace v8::internal
The argument information given to function call callbacks.
Definition: v8.h:2650
ReturnValue< T > GetReturnValue() const
Definition: v8.h:6348
Isolate * GetIsolate() const
Definition: v8.h:6342
int Length() const
Definition: v8.h:6360
static Local< FunctionTemplate > New(Isolate *isolate, FunctionCallback callback=0, Handle< Value > data=Handle< Value >(), Handle< Signature > signature=Handle< Signature >(), int length=0)
Creates a function template.
Definition: api.cc:904
An object reference managed by the v8 garbage collector.
Definition: v8.h:198
Isolate represents an isolated instance of the V8 engine.
Definition: v8.h:4356
Local< Value > ThrowException(Local< Value > exception)
Schedules an exception to be thrown when returning to JavaScript.
Definition: api.cc:6411
Converts an object to a UTF-8-encoded character array.
Definition: v8.h:2048
static Local< String > NewFromUtf8(Isolate *isolate, const char *data, NewStringType type=kNormalString, int length=-1)
Allocates a new string from UTF-8 data.
Definition: api.cc:5447
static v8::internal::Handle< To > OpenHandle(v8::Local< From > handle)
Definition: api.h:288
void AddString(String *string)
Definition: heap-inl.h:644
static void IsOneByte(const v8::FunctionCallbackInfo< v8::Value > &args)
virtual v8::Handle< v8::FunctionTemplate > GetNativeFunctionTemplate(v8::Isolate *isolate, v8::Handle< v8::String > name)
static void Externalize(const v8::FunctionCallbackInfo< v8::Value > &args)
ExternalStringTable * external_string_table()
Definition: heap.h:1207
static void WriteToFlat(String *source, sinkchar *sink, int from, int to)
Definition: objects.cc:8370
#define DCHECK(condition)
Definition: logging.h:205
SimpleStringResource< char, v8::String::ExternalOneByteStringResource > SimpleOneByteStringResource
uint16_t uc16
Definition: globals.h:184
SimpleStringResource< uc16, v8::String::ExternalStringResource > SimpleTwoByteStringResource
Debugger support for the V8 JavaScript engine.
Definition: accessors.cc:20