#[ derive(Debug)]
pub struct FunctionFlags {
flags: u16,
}
// WARNING
// The following section is generated by update_stencil.py.
// Do mot modify manually.
//
// @@@@ BEGIN TYPES @@@@
#[ derive(Debug, Clone, Copy)]
pub enum FunctionKind {
NormalFunction = 0 ,
Arrow = 1 ,
Method = 2 ,
ClassConstructor = 3 ,
Getter = 4 ,
Setter = 5 ,
AsmJS = 6 ,
Wasm = 7 ,
FunctionKindLimit = 8 ,
}
#[ allow(dead_code)]
const FUNCTION_KIND_SHIFT: u16 = 0 ;
#[ allow(dead_code)]
const FUNCTION_KIND_MASK: u16 = 0 x0007;
#[ allow(dead_code)]
const EXTENDED: u16 = 1 << 3 ;
#[ allow(dead_code)]
const SELF_HOSTED: u16 = 1 << 4 ;
#[ allow(dead_code)]
const BASESCRIPT: u16 = 1 << 5 ;
#[ allow(dead_code)]
const SELFHOSTLAZY: u16 = 1 << 6 ;
#[ allow(dead_code)]
const CONSTRUCTOR: u16 = 1 << 7 ;
#[ allow(dead_code)]
const LAMBDA: u16 = 1 << 9 ;
#[ allow(dead_code)]
const WASM_JIT_ENTRY: u16 = 1 << 10 ;
#[ allow(dead_code)]
const HAS_INFERRED_NAME: u16 = 1 << 11 ;
#[ allow(dead_code)]
const HAS_GUESSED_ATOM: u16 = 1 << 12 ;
#[ allow(dead_code)]
const RESOLVED_NAME: u16 = 1 << 13 ;
#[ allow(dead_code)]
const RESOLVED_LENGTH: u16 = 1 << 14 ;
#[ allow(dead_code)]
const GHOST_FUNCTION: u16 = 1 << 15 ;
#[ allow(dead_code)]
const NORMAL_KIND: u16 = (FunctionKind::NormalFunction as u16) << FUNCTION_KIND_SHIFT;
#[ allow(dead_code)]
const ASMJS_KIND: u16 = (FunctionKind::AsmJS as u16) << FUNCTION_KIND_SHIFT;
#[ allow(dead_code)]
const WASM_KIND: u16 = (FunctionKind::Wasm as u16) << FUNCTION_KIND_SHIFT;
#[ allow(dead_code)]
const ARROW_KIND: u16 = (FunctionKind::Arrow as u16) << FUNCTION_KIND_SHIFT;
#[ allow(dead_code)]
const METHOD_KIND: u16 = (FunctionKind::Method as u16) << FUNCTION_KIND_SHIFT;
#[ allow(dead_code)]
const CLASSCONSTRUCTOR_KIND: u16 = (FunctionKind::ClassConstructor as u16) << FUNCTION_KIND_SHIFT;
#[ allow(dead_code)]
const GETTER_KIND: u16 = (FunctionKind::Getter as u16) << FUNCTION_KIND_SHIFT;
#[ allow(dead_code)]
const SETTER_KIND: u16 = (FunctionKind::Setter as u16) << FUNCTION_KIND_SHIFT;
#[ allow(dead_code)]
const NATIVE_FUN: u16 = NORMAL_KIND;
#[ allow(dead_code)]
const NATIVE_CTOR: u16 = CONSTRUCTOR | NORMAL_KIND;
#[ allow(dead_code)]
const ASMJS_CTOR: u16 = CONSTRUCTOR | ASMJS_KIND;
#[ allow(dead_code)]
const ASMJS_LAMBDA_CTOR: u16 = CONSTRUCTOR | LAMBDA | ASMJS_KIND;
#[ allow(dead_code)]
const WASM: u16 = WASM_KIND;
#[ allow(dead_code)]
const INTERPRETED_NORMAL: u16 = BASESCRIPT | CONSTRUCTOR | NORMAL_KIND;
#[ allow(dead_code)]
const INTERPRETED_CLASS_CTOR: u16 = BASESCRIPT | CONSTRUCTOR | CLASSCONSTRUCTOR_KIND;
#[ allow(dead_code)]
const INTERPRETED_GENERATOR_OR_ASYNC: u16 = BASESCRIPT | NORMAL_KIND;
#[ allow(dead_code)]
const INTERPRETED_LAMBDA: u16 = BASESCRIPT | LAMBDA | CONSTRUCTOR | NORMAL_KIND;
#[ allow(dead_code)]
const INTERPRETED_LAMBDA_ARROW: u16 = BASESCRIPT | LAMBDA | ARROW_KIND;
#[ allow(dead_code)]
const INTERPRETED_LAMBDA_GENERATOR_OR_ASYNC: u16 = BASESCRIPT | LAMBDA | NORMAL_KIND;
#[ allow(dead_code)]
const INTERPRETED_GETTER: u16 = BASESCRIPT | GETTER_KIND;
#[ allow(dead_code)]
const INTERPRETED_SETTER: u16 = BASESCRIPT | SETTER_KIND;
#[ allow(dead_code)]
const INTERPRETED_METHOD: u16 = BASESCRIPT | METHOD_KIND;
#[ allow(dead_code)]
const MUTABLE_FLAGS: u16 = RESOLVED_NAME | RESOLVED_LENGTH;
#[ allow(dead_code)]
const STABLE_ACROSS_CLONES: u16 =
CONSTRUCTOR | LAMBDA | SELF_HOSTED | FUNCTION_KIND_MASK | GHOST_FUNCTION;
// @@@@ END TYPES @@@@
#[ derive(Debug)]
pub struct FunctionSyntaxKind {
kind: FunctionKind,
is_lambda: bool,
is_generator: bool,
is_async: bool,
}
impl FunctionSyntaxKind {
pub fn function_declaration(is_generator: bool, is_async: bool) -> Self {
Self {
kind: FunctionKind::NormalFunction,
is_lambda: false ,
is_generator,
is_async,
}
}
pub fn function_expression(is_generator: bool, is_async: bool) -> Self {
Self {
kind: FunctionKind::NormalFunction,
is_lambda: true ,
is_generator,
is_async,
}
}
pub fn method(is_generator: bool, is_async: bool) -> Self {
Self {
kind: FunctionKind::Method,
is_lambda: false ,
is_generator,
is_async,
}
}
pub fn getter() -> Self {
FunctionSyntaxKind {
kind: FunctionKind::Getter,
is_lambda: false ,
is_generator: false ,
is_async: false ,
}
}
pub fn setter() -> Self {
FunctionSyntaxKind {
kind: FunctionKind::Setter,
is_lambda: false ,
is_generator: false ,
is_async: false ,
}
}
pub fn arrow(is_async: bool) -> Self {
Self {
kind: FunctionKind::Arrow,
is_lambda: true ,
is_generator: false ,
is_async,
}
}
pub fn is_generator(&self ) -> bool {
self .is_generator
}
pub fn is_async(&self ) -> bool {
self .is_async
}
}
impl FunctionFlags {
fn new(flags: u16) -> Self {
debug_assert!(
(((FunctionKind::FunctionKindLimit as u16) - 1 ) << FUNCTION_KIND_SHIFT)
<= FUNCTION_KIND_MASK
);
Self { flags }
}
/// Returns empty flag that is used for top level script
pub fn empty() -> Self {
Self { flags: 0 }
}
pub fn interpreted(syntax_kind: FunctionSyntaxKind) -> Self {
let kind_flag = (syntax_kind.kind as u16) << FUNCTION_KIND_SHIFT;
let mut flags = BASESCRIPT | kind_flag;
match syntax_kind.kind {
FunctionKind::NormalFunction => {
if !syntax_kind.is_generator && !syntax_kind.is_async {
flags |= CONSTRUCTOR;
}
if syntax_kind.is_lambda {
flags |= LAMBDA;
}
}
FunctionKind::ClassConstructor => {
debug_assert!(!syntax_kind.is_generator);
debug_assert!(!syntax_kind.is_async);
flags |= CONSTRUCTOR;
}
_ => {}
}
Self ::new(flags)
}
pub fn is_arrow(&self ) -> bool {
let kind_num = (self .flags >> FUNCTION_KIND_SHIFT) & FUNCTION_KIND_MASK;
kind_num == FunctionKind::Arrow as u16
}
}
impl From<FunctionFlags> for u16 {
fn from(flags: FunctionFlags) -> u16 {
flags.flags
}
}
Messung V0.5 in Prozent C=93 H=94 G=93
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-06-27)
¤
*© Formatika GbR, Deutschland