diff options
Diffstat (limited to 'Source/JavaScriptCore')
14 files changed, 272 insertions, 3 deletions
diff --git a/Source/JavaScriptCore/CMakeLists.txt b/Source/JavaScriptCore/CMakeLists.txt index 317814aa9..9c18f5b03 100644 --- a/Source/JavaScriptCore/CMakeLists.txt +++ b/Source/JavaScriptCore/CMakeLists.txt @@ -130,6 +130,7 @@ SET(JavaScriptCore_SOURCES interpreter/CallFrame.cpp interpreter/Interpreter.cpp interpreter/RegisterFile.cpp + interpreter/VMInspector.cpp jit/ExecutableAllocator.cpp jit/HostCallReturnValue.cpp diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog index 4297df1e5..ac3aae5ff 100644 --- a/Source/JavaScriptCore/ChangeLog +++ b/Source/JavaScriptCore/ChangeLog @@ -1,3 +1,60 @@ +2012-08-21 Mark Lam <mark.lam@apple.com> + + Introducing the VMInspector for VM debugging use. + https://bugs.webkit.org/show_bug.cgi?id=94613. + + Reviewed by Filip Pizlo. + + Adding some utility functions for debugging the VM. This code is + presently #ifdef'd out by default. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * interpreter/CallFrame.h: + (ExecState): + * interpreter/VMInspector.cpp: Added. + (JSC): + (JSC::VMInspector::getTypeName): + (JSC::VMInspector::dumpFrame0): + (JSC::VMInspector::dumpFrame): + (JSC::VMInspector::countFrames): + * interpreter/VMInspector.h: Added. + (JSC): + (VMInspector): + +2012-08-21 Filip Pizlo <fpizlo@apple.com> + + A patchable GetById right after a watchpoint should have the appropriate nop padding + https://bugs.webkit.org/show_bug.cgi?id=94635 + + Reviewed by Mark Hahnenberg. + + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::padBeforePatch): + (AbstractMacroAssembler): + * assembler/MacroAssemblerARMv7.h: + (JSC::MacroAssemblerARMv7::load32WithCompactAddressOffsetPatch): + (JSC::MacroAssemblerARMv7::moveWithPatch): + (JSC::MacroAssemblerARMv7::patchableJump): + * assembler/MacroAssemblerX86.h: + (JSC::MacroAssemblerX86::moveWithPatch): + (JSC::MacroAssemblerX86::branchPtrWithPatch): + (JSC::MacroAssemblerX86::storePtrWithPatch): + * assembler/MacroAssemblerX86Common.h: + (JSC::MacroAssemblerX86Common::load32WithAddressOffsetPatch): + (JSC::MacroAssemblerX86Common::load32WithCompactAddressOffsetPatch): + (JSC::MacroAssemblerX86Common::loadCompactWithAddressOffsetPatch): + (JSC::MacroAssemblerX86Common::store32WithAddressOffsetPatch): + * assembler/MacroAssemblerX86_64.h: + (JSC::MacroAssemblerX86_64::loadPtrWithAddressOffsetPatch): + (JSC::MacroAssemblerX86_64::loadPtrWithCompactAddressOffsetPatch): + (JSC::MacroAssemblerX86_64::storePtrWithAddressOffsetPatch): + (JSC::MacroAssemblerX86_64::moveWithPatch): + * jit/JumpReplacementWatchpoint.cpp: + (JSC::JumpReplacementWatchpoint::fireInternal): + 2012-08-20 Mark Lam <mark.lam@apple.com> Fix broken non-JIT build. diff --git a/Source/JavaScriptCore/GNUmakefile.list.am b/Source/JavaScriptCore/GNUmakefile.list.am index c504962cc..ed79e6873 100644 --- a/Source/JavaScriptCore/GNUmakefile.list.am +++ b/Source/JavaScriptCore/GNUmakefile.list.am @@ -362,6 +362,8 @@ javascriptcore_sources += \ Source/JavaScriptCore/interpreter/RegisterFile.cpp \ Source/JavaScriptCore/interpreter/RegisterFile.h \ Source/JavaScriptCore/interpreter/Register.h \ + Source/JavaScriptCore/interpreter/VMInspector.cpp \ + Source/JavaScriptCore/interpreter/VMInspector.h \ Source/JavaScriptCore/JavaScriptCorePrefix.h \ Source/JavaScriptCore/jit/CompactJITCodeMap.h \ Source/JavaScriptCore/jit/ExecutableAllocator.cpp \ diff --git a/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj b/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj index e91baa473..8695a7557 100644 --- a/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj +++ b/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj @@ -2045,6 +2045,14 @@ RelativePath="..\..\interpreter\RegisterFile.h" > </File> + <File + RelativePath="..\..\interpreter\VMInspector.cpp" + > + </File> + <File + RelativePath="..\..\interpreter\VMInspector.h" + > + </File> </Filter> <Filter Name="bytecompiler" diff --git a/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj b/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj index a41fb993b..7dd87fee0 100644 --- a/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj +++ b/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj @@ -712,6 +712,8 @@ E49DC16B12EF293E00184A1F /* SourceProviderCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E49DC15512EF277200184A1F /* SourceProviderCache.cpp */; }; E49DC16C12EF294E00184A1F /* SourceProviderCache.h in Headers */ = {isa = PBXBuildFile; fileRef = E49DC15112EF272200184A1F /* SourceProviderCache.h */; settings = {ATTRIBUTES = (Private, ); }; }; E49DC16D12EF295300184A1F /* SourceProviderCacheItem.h in Headers */ = {isa = PBXBuildFile; fileRef = E49DC14912EF261A00184A1F /* SourceProviderCacheItem.h */; settings = {ATTRIBUTES = (Private, ); }; }; + FE4A331F15BD2E07006F54F3 /* VMInspector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE4A331D15BD2E07006F54F3 /* VMInspector.cpp */; }; + FE4A332015BD2E07006F54F3 /* VMInspector.h in Headers */ = {isa = PBXBuildFile; fileRef = FE4A331E15BD2E07006F54F3 /* VMInspector.h */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -1503,6 +1505,8 @@ F692A8850255597D01FF60F7 /* UString.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UString.cpp; sourceTree = "<group>"; tabWidth = 8; }; F692A8860255597D01FF60F7 /* UString.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = UString.h; sourceTree = "<group>"; tabWidth = 8; }; F692A8870255597D01FF60F7 /* JSValue.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSValue.cpp; sourceTree = "<group>"; tabWidth = 8; }; + FE4A331D15BD2E07006F54F3 /* VMInspector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VMInspector.cpp; sourceTree = "<group>"; }; + FE4A331E15BD2E07006F54F3 /* VMInspector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VMInspector.h; sourceTree = "<group>"; }; FEB63AA2159B9DA3008932A6 /* Comment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Comment.h; sourceTree = "<group>"; }; /* End PBXFileReference section */ @@ -1705,6 +1709,8 @@ 1429D77A0ED20D7300B89619 /* interpreter */ = { isa = PBXGroup; children = ( + FE4A331D15BD2E07006F54F3 /* VMInspector.cpp */, + FE4A331E15BD2E07006F54F3 /* VMInspector.h */, 0F55F0F114D1063600AC7649 /* AbstractPC.cpp */, 0F55F0F214D1063600AC7649 /* AbstractPC.h */, A7F8690E0F9584A100558697 /* CachedCall.h */, @@ -2875,6 +2881,7 @@ 0F766D3915AE4A1F008F363E /* StructureStubClearingWatchpoint.h in Headers */, 0F766D4415B2A3C0008F363E /* DFGRegisterSet.h in Headers */, 0F766D4615B3701F008F363E /* DFGScratchRegisterAllocator.h in Headers */, + FE4A332015BD2E07006F54F3 /* VMInspector.h in Headers */, 0F63943F15C75F19006A597C /* DFGStructureCheckHoistingPhase.h in Headers */, 0F63945515D07057006A597C /* ArrayProfile.h in Headers */, 0F63947815DCE34B006A597C /* DFGStructureAbstractValue.h in Headers */, @@ -3475,6 +3482,7 @@ 0F766D2F15A8DCE0008F363E /* GCAwareJITStubRoutine.cpp in Sources */, 0F766D3415AE2538008F363E /* JumpReplacementWatchpoint.cpp in Sources */, 0F766D3815AE4A1C008F363E /* StructureStubClearingWatchpoint.cpp in Sources */, + FE4A331F15BD2E07006F54F3 /* VMInspector.cpp in Sources */, 0F63944015C75F1D006A597C /* DFGStructureCheckHoistingPhase.cpp in Sources */, 0F63945415D07055006A597C /* ArrayProfile.cpp in Sources */, ); diff --git a/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h b/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h index ef1808ffb..e6a9df994 100644 --- a/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h +++ b/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h @@ -606,6 +606,12 @@ public: return Label(this); } + void padBeforePatch() + { + // Rely on the fact that asking for a label already does the padding. + (void)label(); + } + Label watchpointLabel() { Label result; diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h b/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h index 183e8f980..d2da886c2 100644 --- a/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h +++ b/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h @@ -646,6 +646,8 @@ public: DataLabelCompact load32WithCompactAddressOffsetPatch(Address address, RegisterID dest) { + padBeforePatch(); + RegisterID base = address.base; DataLabelCompact label(this); @@ -1626,12 +1628,14 @@ public: ALWAYS_INLINE DataLabel32 moveWithPatch(TrustedImm32 imm, RegisterID dst) { + padBeforePatch(); moveFixedWidthEncoding(imm, dst); return DataLabel32(this); } ALWAYS_INLINE DataLabelPtr moveWithPatch(TrustedImmPtr imm, RegisterID dst) { + padBeforePatch(); moveFixedWidthEncoding(TrustedImm32(imm), dst); return DataLabelPtr(this); } @@ -1659,6 +1663,7 @@ public: PatchableJump patchableJump() { + padBeforePatch(); m_makeJumpPatchable = true; Jump result = jump(); m_makeJumpPatchable = false; diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerX86.h b/Source/JavaScriptCore/assembler/MacroAssemblerX86.h index da9dd8f2a..d1a4ff3c4 100644 --- a/Source/JavaScriptCore/assembler/MacroAssemblerX86.h +++ b/Source/JavaScriptCore/assembler/MacroAssemblerX86.h @@ -175,6 +175,7 @@ public: DataLabelPtr moveWithPatch(TrustedImmPtr initialValue, RegisterID dest) { + padBeforePatch(); m_assembler.movl_i32r(initialValue.asIntptr(), dest); return DataLabelPtr(this); } @@ -191,6 +192,7 @@ public: Jump branchPtrWithPatch(RelationalCondition cond, RegisterID left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0)) { + padBeforePatch(); m_assembler.cmpl_ir_force32(initialRightValue.asIntptr(), left); dataLabel = DataLabelPtr(this); return Jump(m_assembler.jCC(x86Condition(cond))); @@ -198,6 +200,7 @@ public: Jump branchPtrWithPatch(RelationalCondition cond, Address left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0)) { + padBeforePatch(); m_assembler.cmpl_im_force32(initialRightValue.asIntptr(), left.offset, left.base); dataLabel = DataLabelPtr(this); return Jump(m_assembler.jCC(x86Condition(cond))); @@ -205,6 +208,7 @@ public: DataLabelPtr storePtrWithPatch(TrustedImmPtr initialValue, ImplicitAddress address) { + padBeforePatch(); m_assembler.movl_i32m(initialValue.asIntptr(), address.offset, address.base); return DataLabelPtr(this); } diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h b/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h index 115b337f7..905c09426 100644 --- a/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h +++ b/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h @@ -485,12 +485,14 @@ public: DataLabel32 load32WithAddressOffsetPatch(Address address, RegisterID dest) { + padBeforePatch(); m_assembler.movl_mr_disp32(address.offset, address.base, dest); return DataLabel32(this); } DataLabelCompact load32WithCompactAddressOffsetPatch(Address address, RegisterID dest) { + padBeforePatch(); m_assembler.movl_mr_disp8(address.offset, address.base, dest); return DataLabelCompact(this); } @@ -503,6 +505,7 @@ public: DataLabelCompact loadCompactWithAddressOffsetPatch(Address address, RegisterID dest) { + padBeforePatch(); m_assembler.movl_mr_disp8(address.offset, address.base, dest); return DataLabelCompact(this); } @@ -549,6 +552,7 @@ public: DataLabel32 store32WithAddressOffsetPatch(RegisterID src, Address address) { + padBeforePatch(); m_assembler.movl_rm_disp32(src, address.offset, address.base); return DataLabel32(this); } diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h b/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h index f5af51323..ac90516f4 100644 --- a/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h +++ b/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h @@ -304,12 +304,14 @@ public: DataLabel32 loadPtrWithAddressOffsetPatch(Address address, RegisterID dest) { + padBeforePatch(); m_assembler.movq_mr_disp32(address.offset, address.base, dest); return DataLabel32(this); } DataLabelCompact loadPtrWithCompactAddressOffsetPatch(Address address, RegisterID dest) { + padBeforePatch(); m_assembler.movq_mr_disp8(address.offset, address.base, dest); return DataLabelCompact(this); } @@ -348,6 +350,7 @@ public: DataLabel32 storePtrWithAddressOffsetPatch(RegisterID src, Address address) { + padBeforePatch(); m_assembler.movq_rm_disp32(src, address.offset, address.base); return DataLabel32(this); } @@ -518,6 +521,7 @@ public: DataLabelPtr moveWithPatch(TrustedImmPtr initialValue, RegisterID dest) { + padBeforePatch(); m_assembler.movq_i64r(initialValue.asIntptr(), dest); return DataLabelPtr(this); } diff --git a/Source/JavaScriptCore/interpreter/CallFrame.h b/Source/JavaScriptCore/interpreter/CallFrame.h index 0488bb4ea..ea98f6652 100644 --- a/Source/JavaScriptCore/interpreter/CallFrame.h +++ b/Source/JavaScriptCore/interpreter/CallFrame.h @@ -272,6 +272,8 @@ namespace JSC { #endif ExecState(); ~ExecState(); + + friend class VMInspector; }; } // namespace JSC diff --git a/Source/JavaScriptCore/interpreter/VMInspector.cpp b/Source/JavaScriptCore/interpreter/VMInspector.cpp new file mode 100644 index 000000000..34bf61535 --- /dev/null +++ b/Source/JavaScriptCore/interpreter/VMInspector.cpp @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2012 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "VMInspector.h" + +#if ENABLE(VMINSPECTOR) + +namespace JSC { + +const char* VMInspector::getTypeName(JSValue value) +{ + if (value.isInt32()) + return "<Int32>"; + if (value.isBoolean()) + return "<Boolean>"; + if (value.isNull()) + return "<Empty>"; + if (value.isUndefined()) + return "<Undefined>"; + if (value.isCell()) + return "<Cell>"; + if (value.isEmpty()) + return "<Empty>"; + return ""; +} + +void VMInspector::dumpFrame0(CallFrame* frame) +{ + dumpFrame(frame, 0, 0, 0, 0); +} + +void VMInspector::dumpFrame(CallFrame* frame, const char* prefix, + const char* funcName, const char* file, int line) +{ + int frameCount = VMInspector::countFrames(frame); + if (frameCount < 0) + return; + + Instruction* vPC = 0; + if (frame->codeBlock()) + vPC = frame->currentVPC(); + + #define CAST reinterpret_cast + + if (prefix) + printf("%s ", prefix); + + printf("frame [%d] %p { cb %p:%s, retPC %p:%s, scope %p:%s, callee %p:%s, callerFrame %p:%s, argc %d, vPC %p }", + frameCount, frame, + + CAST<void*>(frame[RegisterFile::CodeBlock].payload()), + getTypeName(frame[RegisterFile::CodeBlock].jsValue()), + + CAST<void*>(frame[RegisterFile::ReturnPC].payload()), + getTypeName(frame[RegisterFile::ReturnPC].jsValue()), + + CAST<void*>(frame[RegisterFile::ScopeChain].payload()), + getTypeName(frame[RegisterFile::ScopeChain].jsValue()), + + CAST<void*>(frame[RegisterFile::Callee].payload()), + getTypeName(frame[RegisterFile::Callee].jsValue()), + + CAST<void*>(frame[RegisterFile::CallerFrame].payload()), + getTypeName(frame[RegisterFile::CallerFrame].jsValue()), + + frame[RegisterFile::ArgumentCount].payload(), + vPC); + + if (funcName || file || (line >= 0)) { + printf(" @"); + if (funcName) + printf(" %s", funcName); + if (file) + printf(" %s", file); + if (line >= 0) + printf(":%d", line); + } + printf("\n"); +} + +int VMInspector::countFrames(CallFrame* frame) +{ + int count = -1; + while (frame && !frame->hasHostCallFrameFlag()) { + count++; + frame = frame->callerFrame(); + } + return count; +} + +} // namespace JSC + +#endif // ENABLE(VMINSPECTOR) diff --git a/Source/JavaScriptCore/interpreter/VMInspector.h b/Source/JavaScriptCore/interpreter/VMInspector.h new file mode 100644 index 000000000..6806cafa1 --- /dev/null +++ b/Source/JavaScriptCore/interpreter/VMInspector.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2012 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef VMInspector_h +#define VMInspector_h + +#define ENABLE_VMINSPECTOR 0 + +#if ENABLE(VMINSPECTOR) + +#include "CallFrame.h" +#include "JSValue.h" + +namespace JSC { + +class VMInspector { +public: + static JS_EXPORT_PRIVATE const char* getTypeName(JSValue); + static JS_EXPORT_PRIVATE void dumpFrame0(CallFrame*); + static JS_EXPORT_PRIVATE void dumpFrame(CallFrame*, const char* prefix = 0, const char* funcName = 0, const char* file = 0, int line = -1); + static JS_EXPORT_PRIVATE int countFrames(CallFrame*); +}; + +} // namespace JSC + +#endif // ENABLE(VMINSPECTOR) + +#endif // VMInspector.h diff --git a/Source/JavaScriptCore/jit/JumpReplacementWatchpoint.cpp b/Source/JavaScriptCore/jit/JumpReplacementWatchpoint.cpp index 725108dd5..00311dab4 100644 --- a/Source/JavaScriptCore/jit/JumpReplacementWatchpoint.cpp +++ b/Source/JavaScriptCore/jit/JumpReplacementWatchpoint.cpp @@ -43,9 +43,11 @@ void JumpReplacementWatchpoint::correctLabels(LinkBuffer& linkBuffer) void JumpReplacementWatchpoint::fireInternal() { - MacroAssembler::replaceWithJump( - CodeLocationLabel(bitwise_cast<void*>(m_source)), - CodeLocationLabel(bitwise_cast<void*>(m_destination))); + void* source = bitwise_cast<void*>(m_source); + void* destination = bitwise_cast<void*>(m_destination); + if (Options::showDisassembly()) + dataLog("Firing jump replacement watchpoint from %p, to %p.\n", source, destination); + MacroAssembler::replaceWithJump(CodeLocationLabel(source), CodeLocationLabel(destination)); if (isOnList()) remove(); } |