Skip to content

Commit e37feaa

Browse files
awesomeklingkalenikaliaksandr
authored andcommitted
LibJS/Bytecode: Skip unnecessary exception checks in interpreter
Many opcodes cannot ever throw an exception, so we can just avoid checking it after executing them.
1 parent 34f2870 commit e37feaa

File tree

1 file changed

+22
-14
lines changed

1 file changed

+22
-14
lines changed

Userland/Libraries/LibJS/Bytecode/Interpreter.cpp

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -526,20 +526,28 @@ FLATTEN_ON_CLANG void Interpreter::run_bytecode(size_t entry_point)
526526
DISPATCH_NEXT(name); \
527527
}
528528

529+
#define HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(name) \
530+
handle_##name: \
531+
{ \
532+
auto& instruction = *reinterpret_cast<Op::name const*>(&bytecode[program_counter]); \
533+
(void)instruction.execute_impl(*this); \
534+
DISPATCH_NEXT(name); \
535+
}
536+
529537
HANDLE_INSTRUCTION(Add);
530538
HANDLE_INSTRUCTION(ArrayAppend);
531539
HANDLE_INSTRUCTION(AsyncIteratorClose);
532540
HANDLE_INSTRUCTION(BitwiseAnd);
533541
HANDLE_INSTRUCTION(BitwiseNot);
534542
HANDLE_INSTRUCTION(BitwiseOr);
535543
HANDLE_INSTRUCTION(BitwiseXor);
536-
HANDLE_INSTRUCTION(BlockDeclarationInstantiation);
544+
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(BlockDeclarationInstantiation);
537545
HANDLE_INSTRUCTION(Call);
538546
HANDLE_INSTRUCTION(CallWithArgumentArray);
539-
HANDLE_INSTRUCTION(Catch);
547+
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(Catch);
540548
HANDLE_INSTRUCTION(ConcatString);
541549
HANDLE_INSTRUCTION(CopyObjectExcludingProperties);
542-
HANDLE_INSTRUCTION(CreateLexicalEnvironment);
550+
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(CreateLexicalEnvironment);
543551
HANDLE_INSTRUCTION(CreateVariable);
544552
HANDLE_INSTRUCTION(Decrement);
545553
HANDLE_INSTRUCTION(DeleteById);
@@ -548,7 +556,7 @@ FLATTEN_ON_CLANG void Interpreter::run_bytecode(size_t entry_point)
548556
HANDLE_INSTRUCTION(DeleteByValueWithThis);
549557
HANDLE_INSTRUCTION(DeleteVariable);
550558
HANDLE_INSTRUCTION(Div);
551-
HANDLE_INSTRUCTION(Dump);
559+
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(Dump);
552560
HANDLE_INSTRUCTION(EnterObjectEnvironment);
553561
HANDLE_INSTRUCTION(Exp);
554562
HANDLE_INSTRUCTION(GetById);
@@ -557,10 +565,10 @@ FLATTEN_ON_CLANG void Interpreter::run_bytecode(size_t entry_point)
557565
HANDLE_INSTRUCTION(GetByValueWithThis);
558566
HANDLE_INSTRUCTION(GetCalleeAndThisFromEnvironment);
559567
HANDLE_INSTRUCTION(GetGlobal);
560-
HANDLE_INSTRUCTION(GetImportMeta);
568+
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(GetImportMeta);
561569
HANDLE_INSTRUCTION(GetIterator);
562570
HANDLE_INSTRUCTION(GetMethod);
563-
HANDLE_INSTRUCTION(GetNewTarget);
571+
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(GetNewTarget);
564572
HANDLE_INSTRUCTION(GetNextMethodFromIteratorRecord);
565573
HANDLE_INSTRUCTION(GetObjectFromIteratorRecord);
566574
HANDLE_INSTRUCTION(GetObjectPropertyIterator);
@@ -576,8 +584,8 @@ FLATTEN_ON_CLANG void Interpreter::run_bytecode(size_t entry_point)
576584
HANDLE_INSTRUCTION(IteratorClose);
577585
HANDLE_INSTRUCTION(IteratorNext);
578586
HANDLE_INSTRUCTION(IteratorToArray);
579-
HANDLE_INSTRUCTION(LeaveFinally);
580-
HANDLE_INSTRUCTION(LeaveLexicalEnvironment);
587+
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(LeaveFinally);
588+
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(LeaveLexicalEnvironment);
581589
HANDLE_INSTRUCTION(LeaveUnwindContext);
582590
HANDLE_INSTRUCTION(LeftShift);
583591
HANDLE_INSTRUCTION(LessThan);
@@ -586,13 +594,13 @@ FLATTEN_ON_CLANG void Interpreter::run_bytecode(size_t entry_point)
586594
HANDLE_INSTRUCTION(LooselyInequals);
587595
HANDLE_INSTRUCTION(Mod);
588596
HANDLE_INSTRUCTION(Mul);
589-
HANDLE_INSTRUCTION(NewArray);
597+
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(NewArray);
590598
HANDLE_INSTRUCTION(NewClass);
591-
HANDLE_INSTRUCTION(NewFunction);
592-
HANDLE_INSTRUCTION(NewObject);
593-
HANDLE_INSTRUCTION(NewPrimitiveArray);
594-
HANDLE_INSTRUCTION(NewRegExp);
595-
HANDLE_INSTRUCTION(NewTypeError);
599+
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(NewFunction);
600+
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(NewObject);
601+
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(NewPrimitiveArray);
602+
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(NewRegExp);
603+
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(NewTypeError);
596604
HANDLE_INSTRUCTION(Not);
597605
HANDLE_INSTRUCTION(PostfixDecrement);
598606
HANDLE_INSTRUCTION(PostfixIncrement);

0 commit comments

Comments
 (0)