mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 21:08:12 +00:00
LibJS: Introduce Builtins
Builtins are functions that can be detected during bytecode generation and enable fast-paths in the JIT.
This commit is contained in:
parent
b9141d85d8
commit
86b85aa68b
13 changed files with 191 additions and 4 deletions
66
Userland/Libraries/LibJS/Bytecode/Builtins.h
Normal file
66
Userland/Libraries/LibJS/Bytecode/Builtins.h
Normal file
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
* Copyright (c) 2023, Simon Wanner <simon@skyrising.xyz>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AK/Format.h>
|
||||
#include <LibJS/Forward.h>
|
||||
|
||||
namespace JS::Bytecode {
|
||||
|
||||
// TitleCaseName, snake_case_name, base, property, argument_count
|
||||
#define JS_ENUMERATE_BUILTINS(O)
|
||||
|
||||
enum class Builtin {
|
||||
#define DEFINE_BUILTIN_ENUM(name, ...) name,
|
||||
JS_ENUMERATE_BUILTINS(DEFINE_BUILTIN_ENUM)
|
||||
#undef DEFINE_BUILTIN_ENUM
|
||||
__Count,
|
||||
};
|
||||
|
||||
static StringView builtin_name(Builtin value)
|
||||
{
|
||||
switch (value) {
|
||||
#define DEFINE_BUILTIN_CASE(name, snake_case_name, base, property, ...) \
|
||||
case Builtin::name: \
|
||||
return #base "." #property##sv;
|
||||
JS_ENUMERATE_BUILTINS(DEFINE_BUILTIN_CASE)
|
||||
#undef DEFINE_BUILTIN_CASE
|
||||
case Builtin::__Count:
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
inline size_t builtin_argument_count(Builtin value)
|
||||
{
|
||||
switch (value) {
|
||||
#define DEFINE_BUILTIN_CASE(name, snake_case_name, base, property, arg_count, ...) \
|
||||
case Builtin::name: \
|
||||
return arg_count;
|
||||
JS_ENUMERATE_BUILTINS(DEFINE_BUILTIN_CASE)
|
||||
#undef DEFINE_BUILTIN_CASE
|
||||
case Builtin::__Count:
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
Optional<Builtin> get_builtin(MemberExpression const& expression);
|
||||
|
||||
}
|
||||
|
||||
namespace AK {
|
||||
|
||||
template<>
|
||||
struct Formatter<JS::Bytecode::Builtin> : Formatter<StringView> {
|
||||
ErrorOr<void> format(FormatBuilder& builder, JS::Bytecode::Builtin value)
|
||||
{
|
||||
return Formatter<StringView>::format(builder, builtin_name(value));
|
||||
}
|
||||
};
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue