Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1103)

Unified Diff: include/v8.h

Issue 366153002: Add script streaming API (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: cleanup Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « BUILD.gn ('k') | src/api.cc » ('j') | src/background-parsing-task.h » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: include/v8.h
diff --git a/include/v8.h b/include/v8.h
index e3cd10fa8d690cca9ddf4ed5b8fdbc4a1f366f67..41d8c51ae9ff392b4902b5cfb372a15673db9297 100644
--- a/include/v8.h
+++ b/include/v8.h
@@ -126,10 +126,13 @@ template<typename T> class ReturnValue;
namespace internal {
class Arguments;
+class BackgroundParsingTask;
+class ExternalStreamingStream;
class Heap;
class HeapObject;
class Isolate;
class Object;
+class StreamingData;
template<typename T> class CustomArguments;
class PropertyCallbackArguments;
class FunctionCallbackArguments;
@@ -1088,6 +1091,79 @@ class V8_EXPORT ScriptCompiler {
CachedData* cached_data;
};
+ /**
+ * For streaming incomplete script data to V8. The embedder should implement a
+ * subclass of this class.
+ */
+ class V8_EXPORT ExternalSourceStream {
+ public:
+ enum Encoding { ONE_BYTE, TWO_BYTE, UTF8 };
+
+ ExternalSourceStream(Encoding encoding) : encoding(encoding) {}
jochen (gone - plz use gerrit) 2014/09/08 11:27:06 explicit
marja 2014/09/08 16:14:46 (This was removed)
+ virtual ~ExternalSourceStream() {}
+
+ /**
+ * V8 calls this to request the next chunk of data from the embedder. This
+ * function will be called on a background thread, so it's OK to block and
+ * wait for the data, if the embedder doesn't have data yet. Returns the
+ * length of the data returned. The caller takes ownership of the data.
+ *
+ * When streaming UTF-8 data, V8 handles multi-byte characters split between
+ * two data chunks, but doesn't handle multi-byte characters split between
+ * more than two data chunks. The embedder can avoid this problem by always
+ * returning at least 4 bytes of data.
+ */
+ virtual size_t GetMoreData(const uint8_t** src) = 0;
jochen (gone - plz use gerrit) 2014/09/08 11:27:06 that's kinda odd, a pure virtual interface shouldn
marja 2014/09/08 16:14:47 Done.
+
+ private:
+ friend class internal::ExternalStreamingStream;
+ const Encoding encoding;
jochen (gone - plz use gerrit) 2014/09/08 11:27:06 or friends, or data members it seems like all thi
marja 2014/09/08 16:14:47 Done.
+ };
+
+
+ /**
+ * Source code which can be streamed into V8 in pieces. It will be parsed
+ * while streaming. It can be compiled after the streaming is complete.
+ * StreamedSource must be kept alive while the compilation is ongoing.
+ */
+ class StreamedSource {
+ public:
+ V8_INLINE explicit StreamedSource(ExternalSourceStream* source_stream);
+ ~StreamedSource();
+
+ // Ownership of the CachedData or its buffers is *not* transferred to the
+ // caller. The CachedData object is alive as long as the StreamedSource
+ // object is alive.
+ V8_INLINE const CachedData* GetCachedData() const;
+
+ private:
+ friend class ScriptCompiler;
+ friend class internal::BackgroundParsingTask;
jochen (gone - plz use gerrit) 2014/09/08 11:27:06 can we do without friends here?
marja 2014/09/08 16:14:47 Added a private implementation and an accessor to
+
+ // Prevent copying. Not implemented.
+ StreamedSource(const StreamedSource&);
+ StreamedSource& operator=(const StreamedSource&);
+
+ ExternalSourceStream* source_stream;
jochen (gone - plz use gerrit) 2014/09/08 11:27:06 members should end in _
marja 2014/09/08 16:14:46 These are now in an internal struct, so not ending
+
+ // Cached data generated during compilation (if the generate_cached_data
+ // flag is passed to ScriptCompiler::StartStreamingScript). Streamed scripts
+ // cannot utilize already existing cached data.
+ CachedData* cached_data;
+
+ internal::StreamingData* streaming_data;
+ };
+
+ /**
+ * A streaming task which the embedder must run on a background thread to
+ * stream scripts into V8. Returned by ScriptCompiler::StartStreamingScript.
+ */
+ class ScriptStreamingTask {
+ public:
+ virtual ~ScriptStreamingTask() {}
+ virtual void Run() = 0;
+ };
+
enum CompileOptions {
kNoCompileOptions = 0,
kProduceParserCache,
@@ -1130,6 +1206,32 @@ class V8_EXPORT ScriptCompiler {
static Local<Script> Compile(
Isolate* isolate, Source* source,
CompileOptions options = kNoCompileOptions);
+
+ /**
+ * Returns a task which streams script data into V8, or NULL if the script
+ * cannot be streamed. The user is responsible for running the task on a
+ * background thread and deleting it. When ran, the task starts parsing the
+ * script, and it will request data from the StreamedSource as needed. When
+ * ScriptStreamingTask::Run exits, all data has been streamed and the script
+ * can be compiled (see Compile below).
+ *
+ * This API allows to start the streaming with as little data as possible, and
+ * the remaining data (for example, the ScriptOrigin) is passed to Compile.
+ */
+ static ScriptStreamingTask* StartStreamingScript(
+ Isolate* isolate, StreamedSource* source,
+ CompileOptions options = kNoCompileOptions);
+
+ /**
+ * Compiles a streamed script (bound to current context).
+ *
+ * This can only be called after the streaming has finished (the background
+ * task has been run and completed). V8 doesn't construct the source string
+ * during streaming, so the embedder needs to pass the full source here.
+ */
+ static Local<Script> Compile(Isolate* isolate, StreamedSource* source,
+ Handle<String> full_source_string,
+ const ScriptOrigin& origin);
};
@@ -6264,6 +6366,16 @@ const ScriptCompiler::CachedData* ScriptCompiler::Source::GetCachedData()
}
+ScriptCompiler::StreamedSource::StreamedSource(ExternalSourceStream* stream)
+ : source_stream(stream), cached_data(NULL), streaming_data(NULL) {}
+
+
+const ScriptCompiler::CachedData*
+ScriptCompiler::StreamedSource::GetCachedData() const {
+ return cached_data;
+}
+
+
Handle<Boolean> Boolean::New(Isolate* isolate, bool value) {
return value ? True(isolate) : False(isolate);
}
« no previous file with comments | « BUILD.gn ('k') | src/api.cc » ('j') | src/background-parsing-task.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698