FIX: Don not clone Locales and Languages, pass them by reference

This commit is contained in:
Nicolás Hatcher
2025-12-14 16:55:14 +01:00
parent ffe5d1a158
commit 96a5482e01
84 changed files with 308 additions and 251 deletions

View File

@@ -12,10 +12,14 @@ mod types;
create_exception!(_ironcalc, WorkbookError, PyException);
fn leak_str(s: &str) -> &'static str {
Box::leak(s.to_owned().into_boxed_str())
}
#[pyclass]
pub struct PyUserModel {
/// The user model, which is a wrapper around the Model
pub model: UserModel,
pub model: UserModel<'static>,
}
#[pymethods]
@@ -87,7 +91,7 @@ impl PyUserModel {
/// This is a model implementing the 'raw' API
#[pyclass]
pub struct PyModel {
model: Model,
model: Model<'static>,
}
#[pymethods]
@@ -335,6 +339,10 @@ pub fn load_from_xlsx(
tz: &str,
language_id: &str,
) -> PyResult<PyModel> {
// let locale = leak_str(locale);
// let tz = leak_str(tz);
let language_id = leak_str(language_id);
let model = import::load_from_xlsx(file_path, locale, tz, language_id)
.map_err(|e| WorkbookError::new_err(e.to_string()))?;
Ok(PyModel { model })
@@ -343,6 +351,7 @@ pub fn load_from_xlsx(
/// Loads a function from icalc binary representation
#[pyfunction]
pub fn load_from_icalc(file_name: &str, language_id: &str) -> PyResult<PyModel> {
let language_id = leak_str(language_id);
let model = import::load_from_icalc(file_name, language_id)
.map_err(|e| WorkbookError::new_err(e.to_string()))?;
Ok(PyModel { model })
@@ -355,6 +364,7 @@ pub fn load_from_icalc(file_name: &str, language_id: &str) -> PyResult<PyModel>
pub fn load_from_bytes(bytes: &[u8], language_id: &str) -> PyResult<PyModel> {
let workbook: Workbook =
bitcode::decode(bytes).map_err(|e| WorkbookError::new_err(e.to_string()))?;
let language_id = leak_str(language_id);
let model = Model::from_workbook(workbook, language_id)
.map_err(|e| WorkbookError::new_err(e.to_string()))?;
Ok(PyModel { model })
@@ -363,6 +373,10 @@ pub fn load_from_bytes(bytes: &[u8], language_id: &str) -> PyResult<PyModel> {
/// Creates an empty model in the raw API
#[pyfunction]
pub fn create(name: &str, locale: &str, tz: &str, language_id: &str) -> PyResult<PyModel> {
let name = leak_str(name);
let locale = leak_str(locale);
let tz = leak_str(tz);
let language_id = leak_str(language_id);
let model = Model::new_empty(name, locale, tz, language_id)
.map_err(|e| WorkbookError::new_err(e.to_string()))?;
Ok(PyModel { model })
@@ -376,6 +390,10 @@ pub fn create_user_model(
tz: &str,
language_id: &str,
) -> PyResult<PyUserModel> {
let name = leak_str(name);
let locale = leak_str(locale);
let tz = leak_str(tz);
let language_id = leak_str(language_id);
let model = UserModel::new_empty(name, locale, tz, language_id)
.map_err(|e| WorkbookError::new_err(e.to_string()))?;
Ok(PyUserModel { model })
@@ -389,6 +407,7 @@ pub fn create_user_model_from_xlsx(
tz: &str,
language_id: &str,
) -> PyResult<PyUserModel> {
let language_id = leak_str(language_id);
let model = import::load_from_xlsx(file_path, locale, tz, language_id)
.map_err(|e| WorkbookError::new_err(e.to_string()))?;
let model = UserModel::from_model(model);
@@ -398,6 +417,7 @@ pub fn create_user_model_from_xlsx(
/// Creates a user model from an icalc file
#[pyfunction]
pub fn create_user_model_from_icalc(file_name: &str, language_id: &str) -> PyResult<PyUserModel> {
let language_id = leak_str(language_id);
let model = import::load_from_icalc(file_name, language_id)
.map_err(|e| WorkbookError::new_err(e.to_string()))?;
let model = UserModel::from_model(model);
@@ -411,6 +431,7 @@ pub fn create_user_model_from_icalc(file_name: &str, language_id: &str) -> PyRes
pub fn create_user_model_from_bytes(bytes: &[u8], language_id: &str) -> PyResult<PyUserModel> {
let workbook: Workbook =
bitcode::decode(bytes).map_err(|e| WorkbookError::new_err(e.to_string()))?;
let language_id = leak_str(language_id);
let model = Model::from_workbook(workbook, language_id)
.map_err(|e| WorkbookError::new_err(e.to_string()))?;
let user_model = UserModel::from_model(model);