summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/webkit/JavaScriptCore/assembler/AbstractMacroAssembler.h
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2009-07-29 06:43:12 (GMT)
committerSimon Hausmann <simon.hausmann@nokia.com>2009-07-29 06:49:41 (GMT)
commitafce2170aae53a93e8fd3e8cbb24d8bb8148ec11 (patch)
treead4986fa9ffa4b9ae7bb79351a41c72ea038620c /src/3rdparty/webkit/JavaScriptCore/assembler/AbstractMacroAssembler.h
parente06e82f843f671ecbb5d10a2262a5866f79da3d9 (diff)
downloadQt-afce2170aae53a93e8fd3e8cbb24d8bb8148ec11.zip
Qt-afce2170aae53a93e8fd3e8cbb24d8bb8148ec11.tar.gz
Qt-afce2170aae53a93e8fd3e8cbb24d8bb8148ec11.tar.bz2
Updated WebKit from /home/shausman/src/webkit/trunk to qtwebkit-4.6-snapshot-29072009 ( 07fbaeddfade72be1d0d7e7f2b947e5d3c183f4a )
Changes in WebKit since the last update: ++ b/WebKit/qt/ChangeLog 2009-07-28 Simon Hausmann <simon.hausmann@nokia.com> Rubber-stamped by Ariya Hidayat. Fix compilation with the precompiled header. * WebKit_pch.h: Don't include JSDOMBinding.h and MathObject.h, as they include AtomicString.h. AtomicString.cpp needs to enable a #define before including AtomicString.h, which breaks if the PCH forces the inclusion beforehand. 2009-07-28 Ariya Hidayat <ariya.hidayat@nokia.com> Reviewed by Simon Hausmann. Added tests to ensure that scroll position can be changed programmatically, even when the scroll bar policy is set to off. * tests/qwebframe/tst_qwebframe.cpp: 2009-07-28 Tor Arne Vestbø <tor.arne.vestbo@nokia.com> Reviewed by Simon Hausmann. Fix a few compilation warnings in the QWebFrame tests. * tests/qwebframe/tst_qwebframe.cpp: 2009-07-28 Andre Pedralho <andre.pedralho@openbossa.org> Reviewed by Simon Hausmann. Fixed tst_QWebFrame::hasSetFocus test which was using an undefined resource. https://bugs.webkit.org/show_bug.cgi?id=27512 * tests/qwebframe/tst_qwebframe.cpp: 2009-07-28 Simon Hausmann <simon.hausmann@nokia.com> Reviewed by Ariya Hidayat. Make it possible to pass relative file names to QtLauncher. * QtLauncher/main.cpp: (MainWindow::MainWindow): 2009-07-27 Alexey Proskuryakov <ap@webkit.org> Reviewed by Darin Adler. https://bugs.webkit.org/show_bug.cgi?id=27735 Give a helpful name to JSLock constructor argument * Api/qwebframe.cpp: (QWebFrame::addToJavaScriptWindowObject): 2009-07-27 Volker Hilsheimer <volker.hilsheimer@nokia.com> Reviewed by Simon Hausmann. QWebView's "enabled" parameter should default to true, as with QGraphicsView and QPainter. * Api/qwebview.cpp: Add reference to QPainter::renderHints(). * Api/qwebview.h: Add default for enabled argument. 2009-07-26 Kavindra Palaraja <kavindra.palaraja@nokia.com> Reviewed by Simon Hausmann. More documentation cleanups in the QWebElement class overview. * Api/qwebelement.cpp: 2009-07-26 Kavindra Palaraja <kavindra.palaraja@nokia.com> Reviewed by Simon Hausmann. Clean up documentation of QWebElement's findFirst and findAll functions, as well as their QWebFrame counterparts. * Api/qwebelement.cpp: * Api/qwebframe.cpp: 2009-07-26 Kavindra Palaraja <kavindra.palaraja@nokia.com> Reviewed by Simon Hausmann. Various documentation cleanups * Fixed qdoc warnings * Hide QWebNetworkInterface from the class overview * Mention QWebElement in the module overview * More cleanups * Api/qwebframe.cpp: * Api/qwebnetworkinterface.cpp: * Api/qwebview.cpp: * docs/qtwebkit.qdoc: 2009-07-26 Kavindra Palaraja <kavindra.palaraja@nokia.com> Reviewed by Simon Hausmann. Added missing class diagram referenced from the docs, taken from the Qt documentation. * docs/qtwebkit.qdocconf: Register the image directory with qdoc. * docs/qwebview-diagram.png: Added. 2009-07-24 Antonio Gomes <antonio.gomes@openbossa.org> Reviewed by Adam Treat. As per discussion on IRC, changed originalUrl by requestedUrl. * Api/qwebframe.cpp: (QWebFrame::requestedUrl): * Api/qwebframe.h: * tests/qwebframe/tst_qwebframe.cpp: 2009-07-24 Andre Pedralho <andre.pedralho@openbossa.org> Reviewed by Adam Treat. Removed void QWebFrame::renderContents(...) and added the Q_PROPERTY clipRenderToViewport to control whether QWebFrame::render would call FrameView::paintContents rather than FrameView::paint and do not clip the frame content to viewport. * Api/qwebframe.cpp: (QWebFramePrivate::renderPrivate): (QWebFrame::clipRenderToViewport): (QWebFrame::setClipRenderToViewport): * Api/qwebframe.h: * Api/qwebframe_p.h: (QWebFramePrivate::QWebFramePrivate): * tests/qwebframe/tst_qwebframe.cpp: 2009-07-24 Antonio Gomes <antonio.gomes@openbossa.org> Reviewed by Simon Hausmann. [QT] Implement originalUrl getter method to the API https://bugs.webkit.org/show_bug.cgi?id=25867 * Api/qwebframe.cpp: (QWebFrame::originalUrl): * Api/qwebframe.h: * tests/qwebframe/qwebframe.qrc: * tests/qwebframe/test1.html: Added. * tests/qwebframe/test2.html: Added. * tests/qwebframe/tst_qwebframe.cpp: 2009-07-24 Kenneth Rohde Christiansen <kenneth@webkit.org> Build fix for Qt. Fix build issue introduced in 46344 ([Bug 22700] ApplicationCache should have size limit) Remove method only added to the Qt ChromeClient. * WebCoreSupport/ChromeClientQt.h: 2009-07-24 Andrei Popescu <andreip@google.com> Reviewed by Anders Carlsson. ApplicationCache should have size limit https://bugs.webkit.org/show_bug.cgi?id=22700 * WebCoreSupport/ChromeClientQt.cpp: (WebCore::ChromeClientQt::reachedMaxAppCacheSize): Adds empty implementation of the reachedMaxAppCacheSize callback. * WebCoreSupport/ChromeClientQt.h: 2009-07-23 Laszlo Gombos <laszlo.1.gombos@nokia.com> Reviewed by Simon Hausmann. [Qt] Add simple proxy support for QtLauncher https://bugs.webkit.org/show_bug.cgi?id=27495 Picks up proxy settings from the http_proxy environment variable. * QtLauncher/QtLauncher.pro: Add QtNetwork dependency for all platforms. * QtLauncher/main.cpp: (MainWindow::MainWindow): 2009-07-23 Simon Hausmann <simon.hausmann@nokia.com> Reviewed by Holger Freyther. Added a testcase to verify that cached methods in the QOBject bindings remain alife even after garbage collection. * tests/qwebpage/tst_qwebpage.cpp: (tst_QWebPage::protectBindingsRuntimeObjectsFromCollector): 2009-07-23 Zoltan Herczeg <zherczeg@inf.u-szeged.hu> Reviewed by Simon Hausmann. Fixing two issues related to QtLauncher - MainWindow objects are not always freed after close - JavaScript window.close() sometimes crashes https://bugs.webkit.org/show_bug.cgi?id=27601 * QtLauncher/main.cpp: (MainWindow::MainWindow): (main): 2009-07-21 Volker Hilsheimer <volker.hilsheimer@nokia.com> Reviewed by Simon Hausmann. Various improvements to the API documentation. * Updated link to W3c Database spec * Formatting fixes, cleanups * Add missing \since 4.6 tags to QWebPage::frameAt * Extend QWebDatabase and QWebSecurityOrigin docs. * Api/qwebdatabase.cpp: * Api/qwebpage.cpp: * Api/qwebsecurityorigin.cpp: * Api/qwebview.cpp: 2009-07-21 Tor Arne Vestbø <tor.arne.vestbo@nokia.com> Rubber-stamped by Simon Hausmann. Remove preliminary-tag from QWebElement * Api/qwebelement.cpp: 2009-07-20 Kenneth Rohde Christiansen <kenneth@webkit.org> Reviewed by Eric Seidel. Fix Qt code to follow the WebKit Coding Style. * Api/qcookiejar.cpp: (QCookieJar::setCookieJar): (QCookieJar::cookieJar): * Api/qcookiejar.h: * Api/qwebdatabase.cpp: (QWebDatabase::QWebDatabase): (QWebDatabase::removeDatabase): * Api/qwebdatabase.h: * Api/qwebdatabase_p.h: * Api/qwebelement.h: * Api/qwebframe.cpp: (QWebFrame::title): (QWebFrame::print): * Api/qwebframe.h: * Api/qwebframe_p.h: * Api/qwebhistory.cpp: (QWebHistory::clear): * Api/qwebhistory.h: * Api/qwebhistory_p.h: * Api/qwebhistoryinterface.cpp: (gCleanupInterface): (QWebHistoryInterface::setDefaultInterface): (QWebHistoryInterface::defaultInterface): (QWebHistoryInterface::QWebHistoryInterface): * Api/qwebhistoryinterface.h: * Api/qwebnetworkinterface.cpp: (QWebNetworkManager::started): (QWebNetworkManager::finished): (QWebNetworkInterfacePrivate::parseDataUrl): (QWebNetworkInterface::addJob): (WebCoreHttp::onResponseHeaderReceived): (WebCoreHttp::onReadyRead): * Api/qwebnetworkinterface.h: * Api/qwebnetworkinterface_p.h: * Api/qwebpage.cpp: (QWebPagePrivate::editorCommandForWebActions): (QWebPagePrivate::createContextMenu): (QWebPagePrivate::focusInEvent): (QWebPage::fixedContentsSize): (QWebPage::setContentEditable): (QWebPage::swallowContextMenuEvent): (QWebPage::findText): * Api/qwebpage.h: * Api/qwebpage_p.h: * Api/qwebpluginfactory.h: * Api/qwebsecurityorigin.h: * Api/qwebsecurityorigin_p.h: * Api/qwebsettings.cpp: (QWebSettingsPrivate::QWebSettingsPrivate): (QWebSettingsPrivate::apply): (QWebSettings::globalSettings): (QWebSettings::QWebSettings): (QWebSettings::fontSize): (QWebSettings::setUserStyleSheetUrl): (QWebSettings::setDefaultTextEncoding): (QWebSettings::setIconDatabasePath): (QWebSettings::iconDatabasePath): (QWebSettings::iconForUrl): (QWebSettings::setWebGraphic): (QWebSettings::setFontFamily): (QWebSettings::fontFamily): (QWebSettings::testAttribute): (qt_websettings_setLocalStorageDatabasePath): * Api/qwebsettings.h: * Api/qwebview.cpp: (QWebView::setPage): (QWebView::event): * Api/qwebview.h: 2009-07-20 Holger Hans Peter Freyther <zecke@selfish.org> Reviewed by Simon Hausmann. [Qt] Add test for loading webpages... Performance test for loading webpages. Wait for the loadFinished signal to be fired. This should include a non empty layout. * tests/benchmarks/loading/tst_loading.cpp: Added. (waitForSignal): (tst_Loading::init): (tst_Loading::cleanup): (tst_Loading::load_data): (tst_Loading::load): * tests/benchmarks/loading/tst_loading.pro: Added. * tests/tests.pro: 2009-07-20 Holger Hans Peter Freyther <zecke@selfish.org> Reviewed by Simon Hausmann. [Qt] Add a test case for drawing a simple viewrect to a QPixmap * tests/benchmarks/painting/tst_painting.cpp: Added. (waitForSignal): (tst_Painting::init): (tst_Painting::cleanup): (tst_Painting::paint_data): (tst_Painting::paint): * tests/benchmarks/painting/tst_painting.pro: Added. * tests/tests.pro: 2009-07-20 Laszlo Gombos <laszlo.1.gombos@nokia.com> Reviewed by Holger Freyther. [Qt] Add an option for QtLauncher to build without QtUiTools dependency https://bugs.webkit.org/show_bug.cgi?id=27438 Based on Norbert Leser's work. * QtLauncher/main.cpp: (WebPage::createPlugin): 2009-07-17 Kenneth Rohde Christiansen <kenneth.christiansen@openbossa.org> Reviewed by Adam Treat. Coding style fixes. * Api/qcookiejar.cpp: (QCookieJarPrivate::QCookieJarPrivate): (qHash): (QCookieJar::cookieJar): * Api/qwebelement.cpp: (QWebElement::functions): (QWebElement::scriptableProperties): * Api/qwebframe.cpp: (QWebFrame::metaData): (QWebFrame::scrollBarValue): (QWebFrame::scroll): (QWebFrame::scrollPosition): (QWebFrame::print): * Api/qwebnetworkinterface.cpp: (decodePercentEncoding): (QWebNetworkRequestPrivate::init): (QWebNetworkRequestPrivate::setURL): (QWebNetworkRequest::QWebNetworkRequest): (QWebNetworkRequest::operator=): (QWebNetworkRequest::setUrl): (QWebNetworkRequest::setHttpHeader): (QWebNetworkRequest::httpHeaderField): (QWebNetworkRequest::setHttpHeaderField): (QWebNetworkRequest::setPostData): (QWebNetworkJob::setResponse): (QWebNetworkJob::frame): (QWebNetworkManager::add): (QWebNetworkManager::cancel): (QWebNetworkManager::started): (QWebNetworkManager::data): (QWebNetworkManager::finished): (QWebNetworkManager::addHttpJob): (QWebNetworkManager::cancelHttpJob): (QWebNetworkManager::httpConnectionClosed): (QWebNetworkInterfacePrivate::sendFileData): (QWebNetworkInterfacePrivate::parseDataUrl): (QWebNetworkManager::doWork): (QWebNetworkInterface::setDefaultInterface): (QWebNetworkInterface::defaultInterface): (QWebNetworkInterface::QWebNetworkInterface): (QWebNetworkInterface::addJob): (QWebNetworkInterface::cancelJob): (WebCoreHttp::WebCoreHttp): (WebCoreHttp::request): (WebCoreHttp::scheduleNextRequest): (WebCoreHttp::getConnection): (WebCoreHttp::onResponseHeaderReceived): (WebCoreHttp::onReadyRead): (WebCoreHttp::onRequestFinished): (WebCoreHttp::onAuthenticationRequired): (WebCoreHttp::onProxyAuthenticationRequired): * Api/qwebpage.cpp: (QWebPagePrivate::QWebPagePrivate): (QWebPagePrivate::mouseReleaseEvent): (QWebPagePrivate::inputMethodEvent): (QWebPagePrivate::shortcutOverrideEvent): (QWebPage::inputMethodQuery): (QWebPage::javaScriptPrompt): (QWebPage::updatePositionDependentActions): (QWebPage::userAgentForUrl): (QWebPagePrivate::_q_onLoadProgressChanged): (QWebPage::totalBytes): (QWebPage::bytesReceived): * Api/qwebsettings.cpp: (QWebSettings::iconForUrl): (QWebSettings::setObjectCacheCapacities): * Api/qwebview.cpp: (QWebView::paintEvent): (QWebView::changeEvent): 2009-07-17 Kenneth Rohde Christiansen <kenneth.christiansen@openbossa.org> Reviewed by Simon Hausmann. Overwrite the plugin directories for the DRT. Part of https://bugs.webkit.org/show_bug.cgi?id=27215 * Api/qwebpage.cpp: (qt_drt_overwritePluginDirectories): Only set the plugin directories to the ones in the QTWEBKIT_PLUGIN_PATH environment variable. 2009-07-16 Xiaomei Ji <xji@chromium.org> Reviewed by Dan Bernstein. This is the 2nd part of fixing "RTL: tooltip does not get its directionlity from its element's." https://bugs.webkit.org/show_bug.cgi?id=24187 Add one extra parameter to the callee of HitTestResult::title() due to the signature change. * Api/qwebframe.cpp: (QWebHitTestResultPrivate::QWebHitTestResultPrivate): Add direction as a parameter to the callee of HitTestResult::title(). * WebCoreSupport/ChromeClientQt.cpp: (WebCore::ChromeClientQt::mouseDidMoveOverElement): Add direction as a parameter to the callee of HitTestResult::title(). 2009-07-16 Benjamin C Meyer <benjamin.meyer@torchmobile.com> Reviewed by Adam Treat. Add new action to qwebpage to reload without cache. * Api/qwebpage.cpp: (QWebPagePrivate::updateAction): (QWebPagePrivate::updateNavigationActions): (QWebPage::triggerAction): * Api/qwebpage.h: 2009-07-16 Xiaomei Ji <xji@chromium.org> Reviewed by Darin Adler. Fix tooltip does not get its directionality from its element's directionality. https://bugs.webkit.org/show_bug.cgi?id=24187 Per mitz's suggestion in comment #6, while getting the plain-text title, we also get the directionality of the title. How to handle the directionality is up to clients. Clients could ignore it, or use attribute or unicode control characters to display the title as what they want. * WebCoreSupport/ChromeClientQt.cpp: (WebCore::ChromeClientQt::setToolTip): Add directionality as 2nd parameter to setToopTip() (without handling it yet). * WebCoreSupport/ChromeClientQt.h: Add directionality as 2nd parameter to setToolTip(). 2009-07-15 Yael Aharon <yael.aharon@nokia.com> Reviewed by Simon Hausmann. https://bugs.webkit.org/show_bug.cgi?id=27285 When the user clicks a link with a target attribute, the newly created window should be visible. Make new windows created in Qtlauncher visible. * QtLauncher/main.cpp: (WebPage::createWindow): 2009-07-14 Adam Treat <adam.treat@torchmobile.com> Reviewed by Zack Rusin. https://bugs.webkit.org/show_bug.cgi?id=26983 The default constructed values for QSize and WebCore::IntSize are different. The former produces an invalid size whereas the latter produces a size of zero. This was causing a layout to be triggered when constructing a view and an assert to be hit. This patch fixes the crash by taking care not to cause an unnecessary layout triggered by ScrollView::setFixedLayoutSize. * WebCoreSupport/FrameLoaderClientQt.cpp: (WebCore::FrameLoaderClientQt::transitionToCommittedForNewPage):
Diffstat (limited to 'src/3rdparty/webkit/JavaScriptCore/assembler/AbstractMacroAssembler.h')
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/assembler/AbstractMacroAssembler.h322
1 files changed, 71 insertions, 251 deletions
diff --git a/src/3rdparty/webkit/JavaScriptCore/assembler/AbstractMacroAssembler.h b/src/3rdparty/webkit/JavaScriptCore/assembler/AbstractMacroAssembler.h
index cf94677..95b5afc 100644
--- a/src/3rdparty/webkit/JavaScriptCore/assembler/AbstractMacroAssembler.h
+++ b/src/3rdparty/webkit/JavaScriptCore/assembler/AbstractMacroAssembler.h
@@ -35,22 +35,20 @@
#if ENABLE(ASSEMBLER)
-// FIXME: keep transitioning this out into MacroAssemblerX86_64.
-#if PLATFORM(X86_64)
-#define REPTACH_OFFSET_CALL_R11 3
-#endif
-
namespace JSC {
+class LinkBuffer;
+class RepatchBuffer;
+
template <class AssemblerType>
class AbstractMacroAssembler {
public:
+ typedef AssemblerType AssemblerType_T;
+
typedef MacroAssemblerCodePtr CodePtr;
typedef MacroAssemblerCodeRef CodeRef;
class Jump;
- class LinkBuffer;
- class RepatchBuffer;
typedef typename AssemblerType::RegisterID RegisterID;
typedef typename AssemblerType::FPRegisterID FPRegisterID;
@@ -292,7 +290,7 @@ public:
class Call {
template<class TemplateAssemblerType>
friend class AbstractMacroAssembler;
- friend class LinkBuffer;
+
public:
enum Flags {
None = 0x0,
@@ -322,8 +320,13 @@ public:
return Call(jump.m_jmp, Linkable);
}
- private:
+ void enableLatePatch()
+ {
+ m_jmp.enableLatePatch();
+ }
+
JmpSrc m_jmp;
+ private:
Flags m_flags;
};
@@ -358,6 +361,11 @@ public:
masm->m_assembler.linkJump(m_jmp, label.m_label);
}
+ void enableLatePatch()
+ {
+ m_jmp.enableLatePatch();
+ }
+
private:
JmpSrc m_jmp;
};
@@ -406,254 +414,13 @@ public:
};
- // Section 3: LinkBuffer - utility to finalize code generation.
+ // Section 3: Misc admin methods
static CodePtr trampolineAt(CodeRef ref, Label label)
{
return CodePtr(AssemblerType::getRelocatedAddress(ref.m_code.dataLocation(), label.m_label));
}
- // LinkBuffer:
- //
- // This class assists in linking code generated by the macro assembler, once code generation
- // has been completed, and the code has been copied to is final location in memory. At this
- // time pointers to labels within the code may be resolved, and relative offsets to external
- // addresses may be fixed.
- //
- // Specifically:
- // * Jump objects may be linked to external targets,
- // * The address of Jump objects may taken, such that it can later be relinked.
- // * The return address of a Jump object representing a call may be acquired.
- // * The address of a Label pointing into the code may be resolved.
- // * The value referenced by a DataLabel may be fixed.
- //
- // FIXME: distinguish between Calls & Jumps (make a specific call to obtain the return
- // address of calls, as opposed to a point that can be used to later relink a Jump -
- // possibly wrap the later up in an object that can do just that).
- class LinkBuffer : public Noncopyable {
- public:
- // Note: Initialization sequence is significant, since executablePool is a PassRefPtr.
- // First, executablePool is copied into m_executablePool, then the initialization of
- // m_code uses m_executablePool, *not* executablePool, since this is no longer valid.
- LinkBuffer(AbstractMacroAssembler<AssemblerType>* masm, PassRefPtr<ExecutablePool> executablePool)
- : m_executablePool(executablePool)
- , m_code(masm->m_assembler.executableCopy(m_executablePool.get()))
- , m_size(masm->m_assembler.size())
-#ifndef NDEBUG
- , m_completed(false)
-#endif
- {
- }
-
- ~LinkBuffer()
- {
- ASSERT(m_completed);
- }
-
- // These methods are used to link or set values at code generation time.
-
- void link(Call call, FunctionPtr function)
- {
- ASSERT(call.isFlagSet(Call::Linkable));
-#if PLATFORM(X86_64)
- if (!call.isFlagSet(Call::Near)) {
- char* callLocation = reinterpret_cast<char*>(AssemblerType::getRelocatedAddress(code(), call.m_jmp)) - REPTACH_OFFSET_CALL_R11;
- AssemblerType::patchPointerForCall(callLocation, function.value());
- } else
-#endif
- AssemblerType::linkCall(code(), call.m_jmp, function.value());
- }
-
- void link(Jump jump, CodeLocationLabel label)
- {
- AssemblerType::linkJump(code(), jump.m_jmp, label.dataLocation());
- }
-
- void link(JumpList list, CodeLocationLabel label)
- {
- for (unsigned i = 0; i < list.m_jumps.size(); ++i)
- AssemblerType::linkJump(code(), list.m_jumps[i].m_jmp, label.dataLocation());
- }
-
- void patch(DataLabelPtr label, void* value)
- {
- AssemblerType::patchPointer(code(), label.m_label, value);
- }
-
- void patch(DataLabelPtr label, CodeLocationLabel value)
- {
- AssemblerType::patchPointer(code(), label.m_label, value.executableAddress());
- }
-
- // These methods are used to obtain handles to allow the code to be relinked / repatched later.
-
- CodeLocationCall locationOf(Call call)
- {
- ASSERT(call.isFlagSet(Call::Linkable));
- ASSERT(!call.isFlagSet(Call::Near));
- return CodeLocationCall(AssemblerType::getRelocatedAddress(code(), call.m_jmp));
- }
-
- CodeLocationNearCall locationOfNearCall(Call call)
- {
- ASSERT(call.isFlagSet(Call::Linkable));
- ASSERT(call.isFlagSet(Call::Near));
- return CodeLocationNearCall(AssemblerType::getRelocatedAddress(code(), call.m_jmp));
- }
-
- CodeLocationLabel locationOf(Label label)
- {
- return CodeLocationLabel(AssemblerType::getRelocatedAddress(code(), label.m_label));
- }
-
- CodeLocationDataLabelPtr locationOf(DataLabelPtr label)
- {
- return CodeLocationDataLabelPtr(AssemblerType::getRelocatedAddress(code(), label.m_label));
- }
-
- CodeLocationDataLabel32 locationOf(DataLabel32 label)
- {
- return CodeLocationDataLabel32(AssemblerType::getRelocatedAddress(code(), label.m_label));
- }
-
- // This method obtains the return address of the call, given as an offset from
- // the start of the code.
- unsigned returnAddressOffset(Call call)
- {
- return AssemblerType::getCallReturnOffset(call.m_jmp);
- }
-
- // Upon completion of all patching either 'finalizeCode()' or 'finalizeCodeAddendum()' should be called
- // once to complete generation of the code. 'finalizeCode()' is suited to situations
- // where the executable pool must also be retained, the lighter-weight 'finalizeCodeAddendum()' is
- // suited to adding to an existing allocation.
- CodeRef finalizeCode()
- {
- performFinalization();
-
- return CodeRef(m_code, m_executablePool, m_size);
- }
- CodeLocationLabel finalizeCodeAddendum()
- {
- performFinalization();
-
- return CodeLocationLabel(code());
- }
-
- private:
- // Keep this private! - the underlying code should only be obtained externally via
- // finalizeCode() or finalizeCodeAddendum().
- void* code()
- {
- return m_code;
- }
-
- void performFinalization()
- {
-#ifndef NDEBUG
- ASSERT(!m_completed);
- m_completed = true;
-#endif
-
- ExecutableAllocator::makeExecutable(code(), m_size);
- }
-
- RefPtr<ExecutablePool> m_executablePool;
- void* m_code;
- size_t m_size;
-#ifndef NDEBUG
- bool m_completed;
-#endif
- };
-
- class RepatchBuffer {
- public:
- RepatchBuffer()
- {
- }
-
- void relink(CodeLocationJump jump, CodeLocationLabel destination)
- {
- AssemblerType::relinkJump(jump.dataLocation(), destination.dataLocation());
- }
-
- void relink(CodeLocationCall call, CodeLocationLabel destination)
- {
-#if PLATFORM(X86_64)
- repatch(call.dataLabelPtrAtOffset(-REPTACH_OFFSET_CALL_R11), destination.executableAddress());
-#else
- AssemblerType::relinkCall(call.dataLocation(), destination.executableAddress());
-#endif
- }
-
- void relink(CodeLocationCall call, FunctionPtr destination)
- {
-#if PLATFORM(X86_64)
- repatch(call.dataLabelPtrAtOffset(-REPTACH_OFFSET_CALL_R11), destination.executableAddress());
-#else
- AssemblerType::relinkCall(call.dataLocation(), destination.executableAddress());
-#endif
- }
-
- void relink(CodeLocationNearCall nearCall, CodePtr destination)
- {
- AssemblerType::relinkCall(nearCall.dataLocation(), destination.executableAddress());
- }
-
- void relink(CodeLocationNearCall nearCall, CodeLocationLabel destination)
- {
- AssemblerType::relinkCall(nearCall.dataLocation(), destination.executableAddress());
- }
-
- void relink(CodeLocationNearCall nearCall, FunctionPtr destination)
- {
- AssemblerType::relinkCall(nearCall.dataLocation(), destination.executableAddress());
- }
-
- void repatch(CodeLocationDataLabel32 dataLabel32, int32_t value)
- {
- AssemblerType::repatchInt32(dataLabel32.dataLocation(), value);
- }
-
- void repatch(CodeLocationDataLabelPtr dataLabelPtr, void* value)
- {
- AssemblerType::repatchPointer(dataLabelPtr.dataLocation(), value);
- }
-
- void relinkCallerToTrampoline(ReturnAddressPtr returnAddress, CodeLocationLabel label)
- {
- relink(CodeLocationCall(CodePtr(returnAddress)), label);
- }
-
- void relinkCallerToTrampoline(ReturnAddressPtr returnAddress, CodePtr newCalleeFunction)
- {
- relinkCallerToTrampoline(returnAddress, CodeLocationLabel(newCalleeFunction));
- }
-
- void relinkCallerToFunction(ReturnAddressPtr returnAddress, FunctionPtr function)
- {
- relink(CodeLocationCall(CodePtr(returnAddress)), function);
- }
-
- void relinkNearCallerToTrampoline(ReturnAddressPtr returnAddress, CodeLocationLabel label)
- {
- relink(CodeLocationNearCall(CodePtr(returnAddress)), label);
- }
-
- void relinkNearCallerToTrampoline(ReturnAddressPtr returnAddress, CodePtr newCalleeFunction)
- {
- relinkNearCallerToTrampoline(returnAddress, CodeLocationLabel(newCalleeFunction));
- }
-
- void repatchLoadPtrToLEA(CodeLocationInstruction instruction)
- {
- AssemblerType::repatchLoadPtrToLEA(instruction.dataLocation());
- }
- };
-
-
- // Section 4: Misc admin methods
-
size_t size()
{
return m_assembler.size();
@@ -712,6 +479,59 @@ public:
protected:
AssemblerType m_assembler;
+
+ friend class LinkBuffer;
+ friend class RepatchBuffer;
+
+ static void linkJump(void* code, Jump jump, CodeLocationLabel target)
+ {
+ AssemblerType::linkJump(code, jump.m_jmp, target.dataLocation());
+ }
+
+ static void linkPointer(void* code, typename AssemblerType::JmpDst label, void* value)
+ {
+ AssemblerType::linkPointer(code, label, value);
+ }
+
+ static void* getLinkerAddress(void* code, typename AssemblerType::JmpSrc label)
+ {
+ return AssemblerType::getRelocatedAddress(code, label);
+ }
+
+ static void* getLinkerAddress(void* code, typename AssemblerType::JmpDst label)
+ {
+ return AssemblerType::getRelocatedAddress(code, label);
+ }
+
+ static unsigned getLinkerCallReturnOffset(Call call)
+ {
+ return AssemblerType::getCallReturnOffset(call.m_jmp);
+ }
+
+ static void repatchJump(CodeLocationJump jump, CodeLocationLabel destination)
+ {
+ AssemblerType::relinkJump(jump.dataLocation(), destination.dataLocation());
+ }
+
+ static void repatchNearCall(CodeLocationNearCall nearCall, CodeLocationLabel destination)
+ {
+ AssemblerType::relinkCall(nearCall.dataLocation(), destination.executableAddress());
+ }
+
+ static void repatchInt32(CodeLocationDataLabel32 dataLabel32, int32_t value)
+ {
+ AssemblerType::repatchInt32(dataLabel32.dataLocation(), value);
+ }
+
+ static void repatchPointer(CodeLocationDataLabelPtr dataLabelPtr, void* value)
+ {
+ AssemblerType::repatchPointer(dataLabelPtr.dataLocation(), value);
+ }
+
+ static void repatchLoadPtrToLEA(CodeLocationInstruction instruction)
+ {
+ AssemblerType::repatchLoadPtrToLEA(instruction.dataLocation());
+ }
};
} // namespace JSC