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

Side by Side Diff: src/api.cc

Issue 376223002: Refactor ScriptData class for cached compile data. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 5 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « include/v8.h ('k') | src/compiler.h » ('j') | src/preparse-data.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/api.h" 5 #include "src/api.h"
6 6
7 #include <string.h> // For memcpy, strlen. 7 #include <string.h> // For memcpy, strlen.
8 #ifdef V8_USE_ADDRESS_SANITIZER 8 #ifdef V8_USE_ADDRESS_SANITIZER
9 #include <sanitizer/asan_interface.h> 9 #include <sanitizer/asan_interface.h>
10 #endif // V8_USE_ADDRESS_SANITIZER 10 #endif // V8_USE_ADDRESS_SANITIZER
(...skipping 1681 matching lines...) Expand 10 before | Expand all | Expand 10 after
1692 i::Handle<i::Object> obj = Utils::OpenHandle(this); 1692 i::Handle<i::Object> obj = Utils::OpenHandle(this);
1693 return ToApiHandle<UnboundScript>( 1693 return ToApiHandle<UnboundScript>(
1694 i::Handle<i::SharedFunctionInfo>(i::JSFunction::cast(*obj)->shared())); 1694 i::Handle<i::SharedFunctionInfo>(i::JSFunction::cast(*obj)->shared()));
1695 } 1695 }
1696 1696
1697 1697
1698 Local<UnboundScript> ScriptCompiler::CompileUnbound( 1698 Local<UnboundScript> ScriptCompiler::CompileUnbound(
1699 Isolate* v8_isolate, 1699 Isolate* v8_isolate,
1700 Source* source, 1700 Source* source,
1701 CompileOptions options) { 1701 CompileOptions options) {
1702 i::ScriptData* script_data_impl = NULL; 1702 i::ScriptData* script_data = NULL;
1703 i::CachedDataMode cached_data_mode = i::NO_CACHED_DATA; 1703 i::CachedDataMode cached_data_mode = i::NO_CACHED_DATA;
1704 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); 1704 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
1705 ON_BAILOUT(isolate, "v8::ScriptCompiler::CompileUnbound()", 1705 ON_BAILOUT(isolate, "v8::ScriptCompiler::CompileUnbound()",
1706 return Local<UnboundScript>()); 1706 return Local<UnboundScript>());
1707 if (options & kProduceDataToCache) { 1707 if (options & kProduceDataToCache) {
1708 cached_data_mode = i::PRODUCE_CACHED_DATA; 1708 cached_data_mode = i::PRODUCE_CACHED_DATA;
1709 ASSERT(source->cached_data == NULL); 1709 CHECK(source->cached_data == NULL);
1710 if (source->cached_data) {
1711 // Asked to produce cached data even though there is some already -> not
1712 // good. Fail the compilation.
1713 EXCEPTION_PREAMBLE(isolate);
1714 i::Handle<i::Object> result = isolate->factory()->NewSyntaxError(
1715 "invalid_cached_data", isolate->factory()->NewJSArray(0));
1716 isolate->Throw(*result);
1717 isolate->ReportPendingMessages();
1718 has_pending_exception = true;
1719 EXCEPTION_BAILOUT_CHECK(isolate, Local<UnboundScript>());
1720 }
1721 } else if (source->cached_data) { 1710 } else if (source->cached_data) {
1722 cached_data_mode = i::CONSUME_CACHED_DATA; 1711 cached_data_mode = i::CONSUME_CACHED_DATA;
1723 // ScriptData takes care of aligning, in case the data is not aligned 1712 // ScriptData takes care of pointer-aligning the data.
1724 // correctly. 1713 script_data = new i::ScriptData(source->cached_data->data,
1725 script_data_impl = i::ScriptData::New( 1714 source->cached_data->length);
1726 reinterpret_cast<const char*>(source->cached_data->data),
1727 source->cached_data->length);
1728 // If the cached data is not valid, fail the compilation.
1729 if (script_data_impl == NULL || !script_data_impl->SanityCheck()) {
1730 EXCEPTION_PREAMBLE(isolate);
1731 i::Handle<i::Object> result = isolate->factory()->NewSyntaxError(
1732 "invalid_cached_data", isolate->factory()->NewJSArray(0));
1733 isolate->Throw(*result);
1734 isolate->ReportPendingMessages();
1735 delete script_data_impl;
1736 has_pending_exception = true;
1737 EXCEPTION_BAILOUT_CHECK(isolate, Local<UnboundScript>());
1738 }
1739 } 1715 }
1740 1716
1741 i::Handle<i::String> str = Utils::OpenHandle(*(source->source_string)); 1717 i::Handle<i::String> str = Utils::OpenHandle(*(source->source_string));
1742 LOG_API(isolate, "ScriptCompiler::CompileUnbound"); 1718 LOG_API(isolate, "ScriptCompiler::CompileUnbound");
1743 ENTER_V8(isolate); 1719 ENTER_V8(isolate);
1744 i::SharedFunctionInfo* raw_result = NULL; 1720 i::SharedFunctionInfo* raw_result = NULL;
1745 { i::HandleScope scope(isolate); 1721 { i::HandleScope scope(isolate);
1746 i::Handle<i::Object> name_obj; 1722 i::Handle<i::Object> name_obj;
1747 int line_offset = 0; 1723 int line_offset = 0;
1748 int column_offset = 0; 1724 int column_offset = 0;
1749 bool is_shared_cross_origin = false; 1725 bool is_shared_cross_origin = false;
1750 if (!source->resource_name.IsEmpty()) { 1726 if (!source->resource_name.IsEmpty()) {
1751 name_obj = Utils::OpenHandle(*(source->resource_name)); 1727 name_obj = Utils::OpenHandle(*(source->resource_name));
1752 } 1728 }
1753 if (!source->resource_line_offset.IsEmpty()) { 1729 if (!source->resource_line_offset.IsEmpty()) {
1754 line_offset = static_cast<int>(source->resource_line_offset->Value()); 1730 line_offset = static_cast<int>(source->resource_line_offset->Value());
1755 } 1731 }
1756 if (!source->resource_column_offset.IsEmpty()) { 1732 if (!source->resource_column_offset.IsEmpty()) {
1757 column_offset = 1733 column_offset =
1758 static_cast<int>(source->resource_column_offset->Value()); 1734 static_cast<int>(source->resource_column_offset->Value());
1759 } 1735 }
1760 if (!source->resource_is_shared_cross_origin.IsEmpty()) { 1736 if (!source->resource_is_shared_cross_origin.IsEmpty()) {
1761 v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); 1737 v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate);
1762 is_shared_cross_origin = 1738 is_shared_cross_origin =
1763 source->resource_is_shared_cross_origin == v8::True(v8_isolate); 1739 source->resource_is_shared_cross_origin == v8::True(v8_isolate);
1764 } 1740 }
1765 EXCEPTION_PREAMBLE(isolate); 1741 EXCEPTION_PREAMBLE(isolate);
1766 i::Handle<i::SharedFunctionInfo> result = 1742 i::Handle<i::SharedFunctionInfo> result = i::Compiler::CompileScript(
1767 i::Compiler::CompileScript(str, 1743 str, name_obj, line_offset, column_offset, is_shared_cross_origin,
1768 name_obj, 1744 isolate->global_context(), NULL, &script_data, cached_data_mode,
1769 line_offset, 1745 i::NOT_NATIVES_CODE);
1770 column_offset,
1771 is_shared_cross_origin,
1772 isolate->global_context(),
1773 NULL,
1774 &script_data_impl,
1775 cached_data_mode,
1776 i::NOT_NATIVES_CODE);
1777 has_pending_exception = result.is_null(); 1746 has_pending_exception = result.is_null();
1778 if (has_pending_exception && cached_data_mode == i::CONSUME_CACHED_DATA) { 1747 if (has_pending_exception && cached_data_mode == i::CONSUME_CACHED_DATA) {
1779 // This case won't happen during normal operation; we have compiled 1748 // This case won't happen during normal operation; we have compiled
1780 // successfully and produced cached data, and but the second compilation 1749 // successfully and produced cached data, and but the second compilation
1781 // of the same source code fails. 1750 // of the same source code fails.
1782 delete script_data_impl; 1751 delete script_data;
1783 script_data_impl = NULL; 1752 script_data = NULL;
1784 } 1753 }
1785 EXCEPTION_BAILOUT_CHECK(isolate, Local<UnboundScript>()); 1754 EXCEPTION_BAILOUT_CHECK(isolate, Local<UnboundScript>());
1786 raw_result = *result; 1755 raw_result = *result;
1787 if ((options & kProduceDataToCache) && script_data_impl != NULL) { 1756 if ((options & kProduceDataToCache) && script_data != NULL) {
1788 // script_data_impl now contains the data that was generated. source will 1757 // script_data_impl now contains the data that was generated. source will
1789 // take the ownership. 1758 // take the ownership.
1790 source->cached_data = new CachedData( 1759 source->cached_data = new CachedData(
1791 reinterpret_cast<const uint8_t*>(script_data_impl->Data()), 1760 script_data->data(), script_data->length(), CachedData::BufferOwned);
1792 script_data_impl->Length(), CachedData::BufferOwned); 1761 script_data->ReleaseDataOwnership();
1793 script_data_impl->owns_store_ = false;
1794 } 1762 }
1795 delete script_data_impl; 1763 delete script_data;
1796 } 1764 }
1797 i::Handle<i::SharedFunctionInfo> result(raw_result, isolate); 1765 i::Handle<i::SharedFunctionInfo> result(raw_result, isolate);
1798 return ToApiHandle<UnboundScript>(result); 1766 return ToApiHandle<UnboundScript>(result);
1799 } 1767 }
1800 1768
1801 1769
1802 Local<Script> ScriptCompiler::Compile( 1770 Local<Script> ScriptCompiler::Compile(
1803 Isolate* v8_isolate, 1771 Isolate* v8_isolate,
1804 Source* source, 1772 Source* source,
1805 CompileOptions options) { 1773 CompileOptions options) {
(...skipping 5881 matching lines...) Expand 10 before | Expand all | Expand 10 after
7687 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); 7655 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate());
7688 Address callback_address = 7656 Address callback_address =
7689 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 7657 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
7690 VMState<EXTERNAL> state(isolate); 7658 VMState<EXTERNAL> state(isolate);
7691 ExternalCallbackScope call_scope(isolate, callback_address); 7659 ExternalCallbackScope call_scope(isolate, callback_address);
7692 callback(info); 7660 callback(info);
7693 } 7661 }
7694 7662
7695 7663
7696 } } // namespace v8::internal 7664 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « include/v8.h ('k') | src/compiler.h » ('j') | src/preparse-data.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698