| Index: src/api.cc
|
| diff --git a/src/api.cc b/src/api.cc
|
| index 8238922453bfb48130955ebbf8eb8c63e5e72b36..2715ada5c39abeef159b125a5c5ba45802b29ec0 100644
|
| --- a/src/api.cc
|
| +++ b/src/api.cc
|
| @@ -1699,43 +1699,19 @@ Local<UnboundScript> ScriptCompiler::CompileUnbound(
|
| Isolate* v8_isolate,
|
| Source* source,
|
| CompileOptions options) {
|
| - i::ScriptData* script_data_impl = NULL;
|
| + i::ScriptData* script_data = NULL;
|
| i::CachedDataMode cached_data_mode = i::NO_CACHED_DATA;
|
| i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
|
| ON_BAILOUT(isolate, "v8::ScriptCompiler::CompileUnbound()",
|
| return Local<UnboundScript>());
|
| if (options & kProduceDataToCache) {
|
| cached_data_mode = i::PRODUCE_CACHED_DATA;
|
| - ASSERT(source->cached_data == NULL);
|
| - if (source->cached_data) {
|
| - // Asked to produce cached data even though there is some already -> not
|
| - // good. Fail the compilation.
|
| - EXCEPTION_PREAMBLE(isolate);
|
| - i::Handle<i::Object> result = isolate->factory()->NewSyntaxError(
|
| - "invalid_cached_data", isolate->factory()->NewJSArray(0));
|
| - isolate->Throw(*result);
|
| - isolate->ReportPendingMessages();
|
| - has_pending_exception = true;
|
| - EXCEPTION_BAILOUT_CHECK(isolate, Local<UnboundScript>());
|
| - }
|
| + CHECK(source->cached_data == NULL);
|
| } else if (source->cached_data) {
|
| cached_data_mode = i::CONSUME_CACHED_DATA;
|
| - // ScriptData takes care of aligning, in case the data is not aligned
|
| - // correctly.
|
| - script_data_impl = i::ScriptData::New(
|
| - reinterpret_cast<const char*>(source->cached_data->data),
|
| - source->cached_data->length);
|
| - // If the cached data is not valid, fail the compilation.
|
| - if (script_data_impl == NULL || !script_data_impl->SanityCheck()) {
|
| - EXCEPTION_PREAMBLE(isolate);
|
| - i::Handle<i::Object> result = isolate->factory()->NewSyntaxError(
|
| - "invalid_cached_data", isolate->factory()->NewJSArray(0));
|
| - isolate->Throw(*result);
|
| - isolate->ReportPendingMessages();
|
| - delete script_data_impl;
|
| - has_pending_exception = true;
|
| - EXCEPTION_BAILOUT_CHECK(isolate, Local<UnboundScript>());
|
| - }
|
| + // ScriptData takes care of pointer-aligning the data.
|
| + script_data = new i::ScriptData(source->cached_data->data,
|
| + source->cached_data->length);
|
| }
|
|
|
| i::Handle<i::String> str = Utils::OpenHandle(*(source->source_string));
|
| @@ -1763,36 +1739,28 @@ Local<UnboundScript> ScriptCompiler::CompileUnbound(
|
| source->resource_is_shared_cross_origin == v8::True(v8_isolate);
|
| }
|
| EXCEPTION_PREAMBLE(isolate);
|
| - i::Handle<i::SharedFunctionInfo> result =
|
| - i::Compiler::CompileScript(str,
|
| - name_obj,
|
| - line_offset,
|
| - column_offset,
|
| - is_shared_cross_origin,
|
| - isolate->global_context(),
|
| - NULL,
|
| - &script_data_impl,
|
| - cached_data_mode,
|
| - i::NOT_NATIVES_CODE);
|
| + i::Handle<i::SharedFunctionInfo> result = i::Compiler::CompileScript(
|
| + str, name_obj, line_offset, column_offset, is_shared_cross_origin,
|
| + isolate->global_context(), NULL, &script_data, cached_data_mode,
|
| + i::NOT_NATIVES_CODE);
|
| has_pending_exception = result.is_null();
|
| if (has_pending_exception && cached_data_mode == i::CONSUME_CACHED_DATA) {
|
| // This case won't happen during normal operation; we have compiled
|
| // successfully and produced cached data, and but the second compilation
|
| // of the same source code fails.
|
| - delete script_data_impl;
|
| - script_data_impl = NULL;
|
| + delete script_data;
|
| + script_data = NULL;
|
| }
|
| EXCEPTION_BAILOUT_CHECK(isolate, Local<UnboundScript>());
|
| raw_result = *result;
|
| - if ((options & kProduceDataToCache) && script_data_impl != NULL) {
|
| + if ((options & kProduceDataToCache) && script_data != NULL) {
|
| // script_data_impl now contains the data that was generated. source will
|
| // take the ownership.
|
| source->cached_data = new CachedData(
|
| - reinterpret_cast<const uint8_t*>(script_data_impl->Data()),
|
| - script_data_impl->Length(), CachedData::BufferOwned);
|
| - script_data_impl->owns_store_ = false;
|
| + script_data->data(), script_data->length(), CachedData::BufferOwned);
|
| + script_data->ReleaseDataOwnership();
|
| }
|
| - delete script_data_impl;
|
| + delete script_data;
|
| }
|
| i::Handle<i::SharedFunctionInfo> result(raw_result, isolate);
|
| return ToApiHandle<UnboundScript>(result);
|
|
|