Reviewers: Yang,

Description:
Add externalize(str) function to d8 to convert strings to external strings.

[email protected]
BUG=


Please review this at https://codereview.chromium.org/11858011/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/d8.h
  M src/d8.cc


Index: src/d8.cc
diff --git a/src/d8.cc b/src/d8.cc
index b0986284d929d7e9e3a8aca2ae534870310136bf..38ad130cda0f812d933e716ee322e106ef60085c 100644
--- a/src/d8.cc
+++ b/src/d8.cc
@@ -297,6 +297,41 @@ Handle<Value> Shell::Read(const Arguments& args) {
 }


+class ShellExternalStringResource : public String::ExternalStringResource {
+ public:
+  ShellExternalStringResource(Handle<String> str) {
+    length_ = str->Length();
+    buffer_ = new uint16_t[length_];
+    str->Write(buffer_, 0, length_);
+  }
+
+  virtual ~ShellExternalStringResource() {
+    delete[] buffer_;
+  }
+
+  virtual const uint16_t* data() const { return buffer_; }
+  virtual size_t length() const { return length_; }
+
+ private:
+  uint16_t* buffer_;
+  size_t length_;
+};
+
+
+Handle<Value> Shell::Externalize(const Arguments& args) {
+  HandleScope scope;
+
+  if (args.Length() < 1 || !args[0]->IsString()) {
+    return Throw("argument is not a string");
+  }
+
+  ShellExternalStringResource* resource =
+      new ShellExternalStringResource(Handle<String>::Cast(args[0]));
+
+  return scope.Close(String::NewExternal(resource));
+}
+
+
 Handle<String> Shell::ReadFromStdin(Isolate* isolate) {
   static const int kBufferSize = 256;
   char buffer[kBufferSize];
@@ -1210,6 +1245,8 @@ Handle<ObjectTemplate> Shell::CreateGlobalTemplate(Isolate* isolate) {
                        FunctionTemplate::New(EnableProfiler));
   global_template->Set(String::New("disableProfiler"),
                        FunctionTemplate::New(DisableProfiler));
+  global_template->Set(String::New("externalize"),
+                       FunctionTemplate::New(Externalize));

   // Bind the handlers for external arrays.
   PropertyAttribute attr =
Index: src/d8.h
diff --git a/src/d8.h b/src/d8.h
index 07699e85c0137847baf49d4990d9954ff48a16b1..8563aa30f28a2aa6720da79743c00999f8ceff21 100644
--- a/src/d8.h
+++ b/src/d8.h
@@ -309,6 +309,7 @@ class Shell : public i::AllStatic {
   static Handle<Value> EnableProfiler(const Arguments& args);
   static Handle<Value> DisableProfiler(const Arguments& args);
   static Handle<Value> Read(const Arguments& args);
+  static Handle<Value> Externalize(const Arguments& args);
   static Handle<Value> ReadBuffer(const Arguments& args);
   static Handle<String> ReadFromStdin(Isolate* isolate);
   static Handle<Value> ReadLine(const Arguments& args) {


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to