From a35fd06fce069bb3559f216e070e2836991a7bb0 Mon Sep 17 00:00:00 2001 From: Andrew Morris Date: Wed, 17 Jul 2024 15:09:39 +0900 Subject: [PATCH] Move some things into utils.rs --- valuescript_common/src/lib.rs | 2 + valuescript_common/src/utils.rs | 56 +++++++++++++++++++ valuescript_compiler/src/get_span_text.rs | 2 +- valuescript_compiler/src/optimization/kal.rs | 3 +- .../src/static_expression_compiler.rs | 2 +- valuescript_vm/src/builtins/math_builtin.rs | 3 +- valuescript_vm/src/lib.rs | 1 - valuescript_vm/src/operations.rs | 22 +------- valuescript_vm/src/string_methods.rs | 39 +------------ 9 files changed, 68 insertions(+), 62 deletions(-) create mode 100644 valuescript_common/src/utils.rs diff --git a/valuescript_common/src/lib.rs b/valuescript_common/src/lib.rs index 4d67a315..7f3ebf5e 100644 --- a/valuescript_common/src/lib.rs +++ b/valuescript_common/src/lib.rs @@ -1,5 +1,7 @@ mod builtins; mod instruction_byte; +mod utils; pub use builtins::*; pub use instruction_byte::*; +pub use utils::*; diff --git a/valuescript_common/src/utils.rs b/valuescript_common/src/utils.rs new file mode 100644 index 00000000..9c8bee6b --- /dev/null +++ b/valuescript_common/src/utils.rs @@ -0,0 +1,56 @@ +pub fn to_i32(x: f64) -> i32 { + if x == f64::INFINITY { + return 0; + } + + let int1 = (x.trunc() as i64) & 0xffffffff; + + int1 as i32 +} + +pub fn to_u32(x: f64) -> u32 { + if x == f64::INFINITY { + return 0; + } + + let int1 = (x.trunc() as i64) & 0xffffffff; + + int1 as u32 +} + +pub fn unicode_at(bytes: &[u8], len: usize, index: usize) -> Option { + code_point_at(bytes, len, index) + .map(|code_point| std::char::from_u32(code_point).expect("Invalid code point")) +} + +pub fn code_point_at(bytes: &[u8], len: usize, index: usize) -> Option { + if index >= len { + return None; + } + + let byte = bytes[index]; + + let leading_ones = byte.leading_ones() as usize; + + if leading_ones == 0 { + return Some(byte as u32); + } + + if leading_ones == 1 || leading_ones > 4 || index + leading_ones > len { + return None; + } + + let mut value = (byte & (0x7F >> leading_ones)) as u32; + + for i in 1..leading_ones { + let next_byte = bytes[index + i]; + + if next_byte.leading_ones() != 1 { + return None; + } + + value = (value << 6) | (next_byte & 0x3F) as u32; + } + + Some(value) +} diff --git a/valuescript_compiler/src/get_span_text.rs b/valuescript_compiler/src/get_span_text.rs index b9edad75..a711ad11 100644 --- a/valuescript_compiler/src/get_span_text.rs +++ b/valuescript_compiler/src/get_span_text.rs @@ -1,4 +1,4 @@ -use valuescript_vm::unicode_at; +use valuescript_common::unicode_at; pub fn get_span_text(span: swc_common::Span, source: &str) -> String { let mut res = String::new(); diff --git a/valuescript_compiler/src/optimization/kal.rs b/valuescript_compiler/src/optimization/kal.rs index 21afadb2..baa2b95a 100644 --- a/valuescript_compiler/src/optimization/kal.rs +++ b/valuescript_compiler/src/optimization/kal.rs @@ -1,6 +1,7 @@ use num_bigint::BigInt; +use valuescript_common::unicode_at; use valuescript_vm::{ - operations, unicode_at, + operations, vs_class::VsClass, vs_object::VsObject, vs_value::{number_to_index, ToVal, Val}, diff --git a/valuescript_compiler/src/static_expression_compiler.rs b/valuescript_compiler/src/static_expression_compiler.rs index 157fb216..2ac8f9d4 100644 --- a/valuescript_compiler/src/static_expression_compiler.rs +++ b/valuescript_compiler/src/static_expression_compiler.rs @@ -1,7 +1,7 @@ use std::cell::RefCell; use swc_common::Spanned; -use valuescript_vm::operations::to_i32; +use valuescript_common::to_i32; use crate::{ asm::{Array, Builtin, Number, Object, Value}, diff --git a/valuescript_vm/src/builtins/math_builtin.rs b/valuescript_vm/src/builtins/math_builtin.rs index 40e2cbcd..56463245 100644 --- a/valuescript_vm/src/builtins/math_builtin.rs +++ b/valuescript_vm/src/builtins/math_builtin.rs @@ -1,8 +1,9 @@ use std::fmt; use std::rc::Rc; +use valuescript_common::to_u32; + use crate::native_function::{native_fn, NativeFunction}; -use crate::operations::to_u32; use crate::vs_class::VsClass; use crate::vs_value::{LoadFunctionResult, ToVal, Val, ValTrait}; diff --git a/valuescript_vm/src/lib.rs b/valuescript_vm/src/lib.rs index 3121c79a..ff0e2740 100644 --- a/valuescript_vm/src/lib.rs +++ b/valuescript_vm/src/lib.rs @@ -36,7 +36,6 @@ pub use builtins::error_builtin; pub use builtins::type_error_builtin; pub use bytecode::{Bytecode, DecoderMaker}; pub use jsx_element::is_jsx_element; -pub use string_methods::unicode_at; pub use virtual_machine::VirtualMachine; pub use vs_symbol::VsSymbol; pub use vs_value::{LoadFunctionResult, ValTrait}; diff --git a/valuescript_vm/src/operations.rs b/valuescript_vm/src/operations.rs index 2dffd6f6..68fa737d 100644 --- a/valuescript_vm/src/operations.rs +++ b/valuescript_vm/src/operations.rs @@ -6,6 +6,8 @@ use num_bigint::BigInt; use num_bigint::Sign; use num_traits::FromPrimitive; use num_traits::ToPrimitive; +use valuescript_common::to_i32; +use valuescript_common::to_u32; use crate::array_methods::op_sub_array; use crate::bigint_methods::op_sub_bigint; @@ -541,26 +543,6 @@ pub fn op_optional_chain(left: &mut Val, right: &Val) -> Result { } } -pub fn to_i32(x: f64) -> i32 { - if x == f64::INFINITY { - return 0; - } - - let int1 = (x.trunc() as i64) & 0xffffffff; - - int1 as i32 -} - -pub fn to_u32(x: f64) -> u32 { - if x == f64::INFINITY { - return 0; - } - - let int1 = (x.trunc() as i64) & 0xffffffff; - - int1 as u32 -} - pub fn op_bit_and(left: &Val, right: &Val) -> Result { if let Some(res) = try_binary_override(BinaryOp::BitAnd, left, right) { return res; diff --git a/valuescript_vm/src/string_methods.rs b/valuescript_vm/src/string_methods.rs index f55197cf..7be2154a 100644 --- a/valuescript_vm/src/string_methods.rs +++ b/valuescript_vm/src/string_methods.rs @@ -1,5 +1,7 @@ use std::{rc::Rc, str::Chars}; +use valuescript_common::{code_point_at, unicode_at}; + use crate::{ builtins::internal_error_builtin::ToInternalError, helpers::{to_wrapping_index, to_wrapping_index_clamped}, @@ -741,40 +743,3 @@ fn last_index_of(string_bytes: &[u8], search_bytes: &[u8], at_least_pos: usize) None } - -pub fn unicode_at(bytes: &[u8], len: usize, index: usize) -> Option { - code_point_at(bytes, len, index) - .map(|code_point| std::char::from_u32(code_point).expect("Invalid code point")) -} - -fn code_point_at(bytes: &[u8], len: usize, index: usize) -> Option { - if index >= len { - return None; - } - - let byte = bytes[index]; - - let leading_ones = byte.leading_ones() as usize; - - if leading_ones == 0 { - return Some(byte as u32); - } - - if leading_ones == 1 || leading_ones > 4 || index + leading_ones > len { - return None; - } - - let mut value = (byte & (0x7F >> leading_ones)) as u32; - - for i in 1..leading_ones { - let next_byte = bytes[index + i]; - - if next_byte.leading_ones() != 1 { - return None; - } - - value = (value << 6) | (next_byte & 0x3F) as u32; - } - - Some(value) -}