mod abs;
mod all;
mod any;
mod bin;
mod chr;
mod divmod;
mod enumerate;
mod filter;
mod getattr;
mod hasattr;
mod hash;
mod hex;
mod id;
mod isinstance;
mod len;
mod map;
mod min_max; mod next;
mod oct;
pub(crate) mod open;
mod ord;
mod pow;
mod print;
mod repr;
mod reversed;
mod round;
mod setattr;
mod sorted;
mod sum;
mod type_;
mod zip;
use std::{fmt, fmt::Write, str::FromStr};
use strum::{Display, EnumString, FromRepr, IntoStaticStr};
use crate::{
args::ArgValues,
bytecode::{CallResult, VM},
exception_private::{ExcType, RunResult},
resource::ResourceTracker,
types::Type,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
pub(crate) enum Builtins {
Function(BuiltinsFunctions),
ExcType(ExcType),
Type(Type),
}
impl Builtins {
pub fn call(self, vm: &mut VM<'_, impl ResourceTracker>, args: ArgValues) -> RunResult<CallResult> {
match self {
Self::Function(b) => b.call(vm, args),
Self::ExcType(exc) => exc.call(vm, args).map(CallResult::Value),
Self::Type(t) => t.call(vm, args).map(CallResult::Value),
}
}
pub fn py_repr_fmt<W: Write>(self, f: &mut W) -> fmt::Result {
match self {
Self::Function(b) => write!(f, "<built-in function {b}>"),
Self::ExcType(e) => write!(f, "<class '{e}'>"),
Self::Type(t) => write!(f, "<class '{t}'>"),
}
}
pub fn py_type(self) -> Type {
match self {
Self::Function(_) => Type::BuiltinFunction,
Self::ExcType(_) => Type::Type,
Self::Type(_) => Type::Type,
}
}
}
impl FromStr for Builtins {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
if let Ok(b) = BuiltinsFunctions::from_str(s) {
Ok(Self::Function(b))
} else if let Ok(exc) = ExcType::from_str(s) {
Ok(Self::ExcType(exc))
} else if let Some(t) = Type::from_builtin_name(s) {
Ok(Self::Type(t))
} else {
Err(())
}
}
}
#[derive(
Debug,
Clone,
Copy,
Display,
EnumString,
FromRepr,
IntoStaticStr,
PartialEq,
Eq,
Hash,
serde::Serialize,
serde::Deserialize,
)]
#[strum(serialize_all = "lowercase")]
#[repr(u8)]
pub enum BuiltinsFunctions {
Abs,
All,
Any,
Bin,
Chr,
Divmod,
Enumerate,
Filter,
Getattr,
Hasattr,
Hash,
Hex,
Id,
Isinstance,
Len,
Map,
Max,
Min,
Next,
Oct,
Open,
Ord,
Pow,
Print,
Repr,
Reversed,
Round,
Setattr,
Sorted,
Sum,
Type,
Zip,
}
impl BuiltinsFunctions {
pub(crate) fn call(self, vm: &mut VM<'_, impl ResourceTracker>, args: ArgValues) -> RunResult<CallResult> {
let r = match self {
Self::Abs => abs::builtin_abs(vm, args),
Self::All => all::builtin_all(vm, args),
Self::Any => any::builtin_any(vm, args),
Self::Bin => bin::builtin_bin(vm, args),
Self::Chr => chr::builtin_chr(vm, args),
Self::Divmod => divmod::builtin_divmod(vm, args),
Self::Enumerate => enumerate::builtin_enumerate(vm, args),
Self::Filter => filter::builtin_filter(vm, args),
Self::Getattr => getattr::builtin_getattr(vm, args),
Self::Hasattr => hasattr::builtin_hasattr(vm, args),
Self::Hash => hash::builtin_hash(vm, args),
Self::Hex => hex::builtin_hex(vm, args),
Self::Id => id::builtin_id(vm, args),
Self::Isinstance => isinstance::builtin_isinstance(vm, args),
Self::Len => len::builtin_len(vm, args),
Self::Map => map::builtin_map(vm, args),
Self::Max => min_max::builtin_max(vm, args),
Self::Min => min_max::builtin_min(vm, args),
Self::Next => next::builtin_next(vm, args),
Self::Oct => oct::builtin_oct(vm, args),
Self::Open => return open::builtin_open(vm, args),
Self::Ord => ord::builtin_ord(vm, args),
Self::Pow => pow::builtin_pow(vm, args),
Self::Print => print::builtin_print(vm, args),
Self::Repr => repr::builtin_repr(vm, args),
Self::Reversed => reversed::builtin_reversed(vm, args),
Self::Round => round::builtin_round(vm, args),
Self::Setattr => setattr::builtin_setattr(vm, args),
Self::Sorted => sorted::builtin_sorted(vm, args),
Self::Sum => sum::builtin_sum(vm, args),
Self::Type => type_::builtin_type(vm, args),
Self::Zip => zip::builtin_zip(vm, args),
};
r.map(CallResult::Value)
}
}