Ignore:
Timestamp:
Apr 3, 2012, 9:25:56 PM (13 years ago)
Author:
[email protected]
Message:

jsr/sret should be removed
https://bugs.webkit.org/show_bug.cgi?id=82986
<rdar://problem/11017015>

Reviewed by Sam Weinig and Geoff Garen.

Replaces jsr/sret with finally block inlining.

  • bytecode/CodeBlock.cpp:

(JSC::CodeBlock::dump):

  • bytecode/Opcode.h:

(JSC):
(JSC::padOpcodeName):

  • bytecompiler/BytecodeGenerator.cpp:

(JSC::BytecodeGenerator::pushFinallyContext):
(JSC::BytecodeGenerator::emitComplexJumpScopes):
(JSC):

  • bytecompiler/BytecodeGenerator.h:

(FinallyContext):
(BytecodeGenerator):

  • bytecompiler/NodesCodegen.cpp:

(JSC::TryNode::emitBytecode):

  • interpreter/Interpreter.cpp:

(JSC::Interpreter::privateExecute):

  • jit/JIT.cpp:

(JSC::JIT::privateCompileMainPass):
(JSC::JIT::privateCompile):

  • jit/JIT.h:

(JIT):

  • jit/JITOpcodes.cpp:

(JSC):

  • jit/JITOpcodes32_64.cpp:

(JSC):

  • llint/LowLevelInterpreter32_64.asm:
  • llint/LowLevelInterpreter64.asm:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp

    r112555 r113136  
    22*  Copyright (C) 1999-2002 Harri Porten ([email protected])
    33*  Copyright (C) 2001 Peter Kelly ([email protected])
    4 *  Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
     4*  Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2012 Apple Inc. All rights reserved.
    55*  Copyright (C) 2007 Cameron Zwarich ([email protected])
    66*  Copyright (C) 2007 Maks Orlovich
     
    17281728    if (generator.scopeDepth()) {
    17291729        RefPtr<Label> l0 = generator.newLabel();
    1730         if (generator.hasFinaliser() && !r0->isTemporary()) {
     1730        if (generator.hasFinaliser()) {
    17311731            returnRegister = generator.emitMove(generator.newTemporary(), r0);
    17321732            r0 = returnRegister.get();
     
    19581958
    19591959    RefPtr<Label> tryStartLabel = generator.newLabel();
    1960     RefPtr<Label> finallyStart;
    1961     RefPtr<RegisterID> finallyReturnAddr;
    1962     if (m_finallyBlock) {
    1963         finallyStart = generator.newLabel();
    1964         finallyReturnAddr = generator.newTemporary();
    1965         generator.pushFinallyContext(finallyStart.get(), finallyReturnAddr.get());
    1966     }
     1960    if (m_finallyBlock)
     1961        generator.pushFinallyContext(m_finallyBlock);
    19671962
    19681963    generator.emitLabel(tryStartLabel.get());
     
    19861981    if (m_finallyBlock) {
    19871982        generator.popFinallyContext();
    1988         // there may be important registers live at the time we jump
    1989         // to a finally block (such as for a return or throw) so we
    1990         // ref the highest register ever used as a conservative
    1991         // approach to not clobbering anything important
    1992         RefPtr<RegisterID> highestUsedRegister = generator.highestUsedRegister();
     1983
    19931984        RefPtr<Label> finallyEndLabel = generator.newLabel();
    19941985
    1995         // Normal path: invoke the finally block, then jump over it.
    1996         generator.emitJumpSubroutine(finallyReturnAddr.get(), finallyStart.get());
     1986        // Normal path: run the finally code, and jump to the end.
     1987        generator.emitNode(dst, m_finallyBlock);
    19971988        generator.emitJump(finallyEndLabel.get());
    19981989
     
    20001991        RefPtr<Label> here = generator.emitLabel(generator.newLabel().get());
    20011992        RefPtr<RegisterID> tempExceptionRegister = generator.emitCatch(generator.newTemporary(), tryStartLabel.get(), here.get());
    2002         generator.emitJumpSubroutine(finallyReturnAddr.get(), finallyStart.get());
     1993        generator.emitNode(dst, m_finallyBlock);
    20031994        generator.emitThrow(tempExceptionRegister.get());
    2004 
    2005         // The finally block.
    2006         generator.emitLabel(finallyStart.get());
    2007         generator.emitNode(dst, m_finallyBlock);
    2008         generator.emitSubroutineReturn(finallyReturnAddr.get());
    20091995
    20101996        generator.emitLabel(finallyEndLabel.get());
Note: See TracChangeset for help on using the changeset viewer.