shrinkage and fixes

This commit is contained in:
trimill 2024-11-04 21:39:24 -05:00
parent 151c6abf45
commit 00fa1f1d7c
8 changed files with 77 additions and 60 deletions

25
Cargo.lock generated
View file

@ -367,9 +367,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]] [[package]]
name = "rustix" name = "rustix"
version = "0.38.38" version = "0.38.39"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a" checksum = "375116bee2be9ed569afe2154ea6a99dfdffd257f533f187498c2a8f5feaf4ee"
dependencies = [ dependencies = [
"bitflags", "bitflags",
"errno", "errno",
@ -436,7 +436,6 @@ dependencies = [
"num-complex", "num-complex",
"num-rational", "num-rational",
"num-traits", "num-traits",
"thiserror",
"unicode-ident", "unicode-ident",
] ]
@ -459,26 +458,6 @@ dependencies = [
"talc-macros", "talc-macros",
] ]
[[package]]
name = "thiserror"
version = "1.0.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b3c6efbfc763e64eb85c11c25320f0737cb7364c4b6336db90aa9ebe27a0bbd"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
version = "1.0.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b607164372e89797d78b8e23a6d67d5d1038c1c65efd52e1389ef8b77caba2a6"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "unicode-ident" name = "unicode-ident"
version = "1.0.13" version = "1.0.13"

View file

@ -2,6 +2,11 @@
members = ["talc-lang", "talc-bin", "talc-std", "talc-macros"] members = ["talc-lang", "talc-bin", "talc-std", "talc-macros"]
resolver = "2" resolver = "2"
[profile.release-lto] [profile.release-opt]
inherits = "release" inherits = "release"
lto = "fat" lto = "fat"
strip = true
codegen-units = 1
panic = "abort"

View file

@ -7,7 +7,6 @@ edition = "2021"
num-complex = "0.4" num-complex = "0.4"
num-rational = { version = "0.4", default-features = false, features = [] } num-rational = { version = "0.4", default-features = false, features = [] }
num-traits = "0.2" num-traits = "0.2"
thiserror = "1.0"
lazy_static = "1.5" lazy_static = "1.5"
unicode-ident = "1.0" unicode-ident = "1.0"

View file

@ -158,10 +158,10 @@ impl std::fmt::Display for Instruction {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match *self { match *self {
Self::Nop => write!(f, "nop"), Self::Nop => write!(f, "nop"),
Self::LoadLocal(a) => write!(f, "load {}", usize::from(a)), Self::LoadLocal(a) => write!(f, "load ${}", usize::from(a)),
Self::StoreLocal(a) => write!(f, "store {}", usize::from(a)), Self::StoreLocal(a) => write!(f, "store ${}", usize::from(a)),
Self::NewLocal => write!(f, "newlocal"), Self::NewLocal => write!(f, "newlocal"),
Self::DropLocal(n) => write!(f, "discardlocal {}", usize::from(n)), Self::DropLocal(n) => write!(f, "discardlocal ${}", usize::from(n)),
Self::LoadGlobal(s) => write!( Self::LoadGlobal(s) => write!(
f, f,
"loadglobal {}", "loadglobal {}",
@ -172,14 +172,14 @@ impl std::fmt::Display for Instruction {
"storeglobal {}", "storeglobal {}",
Symbol::try_from(s).expect("symbol does not exist").name() Symbol::try_from(s).expect("symbol does not exist").name()
), ),
Self::CloseOver(n) => write!(f, "closeover {}", usize::from(n)), Self::CloseOver(n) => write!(f, "closeover ${}", usize::from(n)),
Self::Closure(c) => write!(f, "closure {}", usize::from(c)), Self::Closure(c) => write!(f, "closure %{}", usize::from(c)),
Self::LoadUpvalue(n) => write!(f, "load_upval {}", usize::from(n)), Self::LoadUpvalue(n) => write!(f, "load_upval ^{}", usize::from(n)),
Self::StoreUpvalue(n) => write!(f, "store_upval {}", usize::from(n)), Self::StoreUpvalue(n) => write!(f, "store_upval ^{}", usize::from(n)),
Self::ContinueUpvalue(n) => write!(f, "cont_upval {}", usize::from(n)), Self::ContinueUpvalue(n) => write!(f, "cont_upval ^{}", usize::from(n)),
Self::LoadClosedLocal(n) => write!(f, "load_closed {}", usize::from(n)), Self::LoadClosedLocal(n) => write!(f, "load_closed ${}", usize::from(n)),
Self::StoreClosedLocal(n) => write!(f, "store_closed {}", usize::from(n)), Self::StoreClosedLocal(n) => write!(f, "store_closed ${}", usize::from(n)),
Self::Const(c) => write!(f, "const {}", usize::from(c)), Self::Const(c) => write!(f, "const %{}", usize::from(c)),
Self::Int(i) => write!(f, "int {}", i64::from(i)), Self::Int(i) => write!(f, "int {}", i64::from(i)),
Self::Symbol(s) => write!( Self::Symbol(s) => write!(
f, f,
@ -190,24 +190,24 @@ impl std::fmt::Display for Instruction {
Self::Nil => write!(f, "nil"), Self::Nil => write!(f, "nil"),
Self::Dup => write!(f, "dup"), Self::Dup => write!(f, "dup"),
Self::DupTwo => write!(f, "duptwo"), Self::DupTwo => write!(f, "duptwo"),
Self::Drop(n) => write!(f, "discard {}", usize::from(n)), Self::Drop(n) => write!(f, "discard #{}", usize::from(n)),
Self::Swap => write!(f, "swap"), Self::Swap => write!(f, "swap"),
Self::UnaryOp(o) => write!(f, "unary {o:?}"), Self::UnaryOp(o) => write!(f, "unary {o:?}"),
Self::BinaryOp(o) => write!(f, "binary {o:?}"), Self::BinaryOp(o) => write!(f, "binary {o:?}"),
Self::NewList(n) => write!(f, "newlist {n}"), Self::NewList(n) => write!(f, "newlist #{n}"),
Self::GrowList(n) => write!(f, "growlist {n}"), Self::GrowList(n) => write!(f, "growlist #{n}"),
Self::NewTable(n) => write!(f, "newtable {n}"), Self::NewTable(n) => write!(f, "newtable #{n}"),
Self::GrowTable(n) => write!(f, "growtable {n}"), Self::GrowTable(n) => write!(f, "growtable #{n}"),
Self::Index => write!(f, "index"), Self::Index => write!(f, "index"),
Self::StoreIndex => write!(f, "storeindex"), Self::StoreIndex => write!(f, "storeindex"),
Self::Jump(a) => write!(f, "jump {}", usize::from(a)), Self::Jump(a) => write!(f, "jump @{}", usize::from(a)),
Self::JumpTrue(a) => write!(f, "jumptrue {}", usize::from(a)), Self::JumpTrue(a) => write!(f, "jumptrue @{}", usize::from(a)),
Self::JumpFalse(a) => write!(f, "jumpfalse {}", usize::from(a)), Self::JumpFalse(a) => write!(f, "jumpfalse @{}", usize::from(a)),
Self::IterBegin => write!(f, "iterbegin"), Self::IterBegin => write!(f, "iterbegin"),
Self::IterTest(a) => write!(f, "itertest {}", usize::from(a)), Self::IterTest(a) => write!(f, "itertest @{}", usize::from(a)),
Self::BeginTry(t) => write!(f, "begintry {}", usize::from(t)), Self::BeginTry(t) => write!(f, "begintry #{}", usize::from(t)),
Self::EndTry => write!(f, "endtry"), Self::EndTry => write!(f, "endtry"),
Self::Call(n) => write!(f, "call {n}"), Self::Call(n) => write!(f, "call #{n}"),
Self::Return => write!(f, "return"), Self::Return => write!(f, "return"),
} }
} }

View file

@ -855,6 +855,11 @@ impl LStr {
self.to_str().is_ok() self.to_str().is_ok()
} }
#[inline]
pub const fn is_ascii(&self) -> bool {
self.as_bytes().is_ascii()
}
#[inline] #[inline]
pub fn to_utf8_lossy(&self) -> Cow<'_, LStr> { pub fn to_utf8_lossy(&self) -> Cow<'_, LStr> {
match String::from_utf8_lossy(self.as_bytes()) { match String::from_utf8_lossy(self.as_bytes()) {

View file

@ -402,7 +402,6 @@ impl<'s> Lexer<'s> {
self.next()?; self.next()?;
} }
match self.peek()? { match self.peek()? {
'r' => todo!("arbitrary radix integer literals"),
'e' => { 'e' => {
self.next()?; self.next()?;
self.next_float(true) self.next_float(true)

View file

@ -1,18 +1,18 @@
use core::fmt; use core::fmt;
use std::num::{ParseFloatError, ParseIntError}; use std::num::{ParseFloatError, ParseIntError};
use thiserror::Error;
use crate::lstring::{LStr, LString}; use crate::lstring::{LStr, LString};
use super::Span; use super::Span;
#[derive(Clone, Debug, Error)] #[derive(Clone, Debug)]
pub struct ParserError { pub struct ParserError {
pub span: Span, pub span: Span,
pub msg: String, pub msg: String,
} }
impl std::error::Error for ParserError {}
impl fmt::Display for ParserError { impl fmt::Display for ParserError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{} | {}", self.span, self.msg) write!(f, "{} | {}", self.span, self.msg)
@ -34,26 +34,43 @@ impl<T, E: std::error::Error> SpanParserError for Result<T, E> {
} }
} }
#[derive(Clone, Copy, Debug, Error)] #[derive(Clone, Copy, Debug)]
pub enum StrEscapeError { pub enum StrEscapeError {
#[error("EOF in string escape")]
Eof, Eof,
#[error("EOF in string escape \\x")]
HexEof, HexEof,
#[error("EOF in string escape \\u")]
UnicodeEof, UnicodeEof,
#[error("invalid string escape \\{0}")]
Invalid(char), Invalid(char),
#[error("invalid hex digit '{0}' in string escape")]
InvalidHex(char), InvalidHex(char),
#[error("missing brace after string escape \\u")]
MissingBrace, MissingBrace,
#[error("invalid codepoint in string escape: {0:x}")]
InvalidCodepoint(u32), InvalidCodepoint(u32),
#[error("codepoint in string escape too large")]
CodepointTooLarge, CodepointTooLarge,
} }
impl std::error::Error for StrEscapeError {}
impl fmt::Display for StrEscapeError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
StrEscapeError::Eof => write!(f, "EOF in string escape"),
StrEscapeError::HexEof => write!(f, "EOF in string escape \\x"),
StrEscapeError::UnicodeEof => write!(f, "EOF in string escape \\u"),
StrEscapeError::Invalid(c) => write!(f, "invalid string escape \\{c}"),
StrEscapeError::InvalidHex(x) => {
write!(f, "invalid hex digit '{x}' in string escape")
}
StrEscapeError::MissingBrace => {
write!(f, "missing brace after string escape \\u")
}
StrEscapeError::InvalidCodepoint(n) => {
write!(f, "invalid codepoint in string escape: U+{n:0>4x})")
}
StrEscapeError::CodepointTooLarge => {
write!(f, "codepoint in string escape too large")
}
}
}
}
pub fn parse_str_escapes(src: &str) -> Result<LString, StrEscapeError> { pub fn parse_str_escapes(src: &str) -> Result<LString, StrEscapeError> {
let mut s = LString::with_capacity(src.len()); let mut s = LString::with_capacity(src.len());
let mut chars = src.chars(); let mut chars = src.chars();

View file

@ -19,6 +19,7 @@ pub fn load(vm: &mut Vm) {
vm.set_global_name("lower", lower().into()); vm.set_global_name("lower", lower().into());
vm.set_global_name("starts_with", starts_with().into()); vm.set_global_name("starts_with", starts_with().into());
vm.set_global_name("ends_with", ends_with().into()); vm.set_global_name("ends_with", ends_with().into());
vm.set_global_name("is_ascii", is_ascii().into());
vm.set_global_name("is_utf8", is_utf8().into()); vm.set_global_name("is_utf8", is_utf8().into());
vm.set_global_name("to_utf8", to_utf8().into()); vm.set_global_name("to_utf8", to_utf8().into());
vm.set_global_name("to_utf8_lossy", to_utf8_lossy().into()); vm.set_global_name("to_utf8_lossy", to_utf8_lossy().into());
@ -124,6 +125,18 @@ pub fn ends_with(_: &mut Vm, args: Vec<Value>) -> Result<Value> {
Ok(res.into()) Ok(res.into())
} }
#[native_func(1)]
pub fn is_ascii(_: &mut Vm, args: Vec<Value>) -> Result<Value> {
let [_, s] = unpack_args!(args);
let Value::String(s) = s else {
throw!(
*SYM_TYPE_ERROR,
"is_ascii expected string argument, got {s:#}"
)
};
Ok(s.is_ascii().into())
}
#[native_func(1)] #[native_func(1)]
pub fn is_utf8(_: &mut Vm, args: Vec<Value>) -> Result<Value> { pub fn is_utf8(_: &mut Vm, args: Vec<Value>) -> Result<Value> {
let [_, s] = unpack_args!(args); let [_, s] = unpack_args!(args);