Add UserData-value

This commit is contained in:
Sofia 2026-03-21 20:21:53 +02:00
parent 641aa878bb
commit 5246028c90
2 changed files with 17 additions and 3 deletions

View File

@ -27,6 +27,9 @@ impl<UserData: Clone> RustFunction<UserData> for SetMetatable {
match table { match table {
Value::Table { Value::Table {
metatable: inner, .. metatable: inner, ..
}
| Value::UserData {
metatable: inner, ..
} => match metatable { } => match metatable {
Value::Table { Value::Table {
contents: metatable, contents: metatable,
@ -819,7 +822,7 @@ impl<UserData: Clone> ClosureRunner<UserData> {
} }
self.inner = Some(Box::new(closure.run(params))); self.inner = Some(Box::new(closure.run(params)));
} }
Value::Table { metatable, .. } => { Value::Table { metatable, .. } | Value::UserData { metatable, .. } => {
let mut metamethod_params = vec![value.clone()]; let mut metamethod_params = vec![value.clone()];
metamethod_params.extend(params); metamethod_params.extend(params);
let ret_values: Vec<Value<UserData>> = let ret_values: Vec<Value<UserData>> =
@ -1292,6 +1295,7 @@ impl<UserData: Clone> ClosureRunner<UserData> {
fn extract_metatable<UserData: Clone>(value: &Value<UserData>) -> Option<&Table<UserData>> { fn extract_metatable<UserData: Clone>(value: &Value<UserData>) -> Option<&Table<UserData>> {
match value { match value {
Value::Table { metatable, .. } => Some(metatable), Value::Table { metatable, .. } => Some(metatable),
Value::UserData { metatable, .. } => Some(metatable),
_ => None, _ => None,
} }
} }

View File

@ -133,8 +133,8 @@ impl Debug for Constant {
} }
} }
pub type Table<UserData: Clone> = Rc<RefCell<TableMap<UserData>>>; pub type Table<UserData> = Rc<RefCell<TableMap<UserData>>>;
pub type TableMap<UserData: Clone> = HashMap<IndexableValue, Value<UserData>>; pub type TableMap<UserData> = HashMap<IndexableValue, Value<UserData>>;
#[derive(Clone)] #[derive(Clone)]
pub enum Value<UserData: Clone> { pub enum Value<UserData: Clone> {
@ -149,6 +149,10 @@ pub enum Value<UserData: Clone> {
contents: Table<UserData>, contents: Table<UserData>,
metatable: Table<UserData>, metatable: Table<UserData>,
}, },
UserData {
contents: UserData,
metatable: Table<UserData>,
},
} }
impl<UserData: Clone> Value<UserData> { impl<UserData: Clone> Value<UserData> {
@ -164,6 +168,7 @@ impl<UserData: Clone> Value<UserData> {
Value::Function(closure) => Ok(IndexableValue::Function(closure.prototype)), Value::Function(closure) => Ok(IndexableValue::Function(closure.prototype)),
Value::Nil => Err(RuntimeError::InvalidTableIndex(self)), Value::Nil => Err(RuntimeError::InvalidTableIndex(self)),
Value::Table { contents, .. } => Ok(IndexableValue::Table(contents.as_ptr() as u64)), Value::Table { contents, .. } => Ok(IndexableValue::Table(contents.as_ptr() as u64)),
Value::UserData { .. } => Err(RuntimeError::InvalidTableIndex(self)),
} }
} }
@ -214,6 +219,7 @@ impl<UserData: Clone> Display for Value<UserData> {
Value::Function(closure) => write!(f, "<function#{}>", closure.prototype), Value::Function(closure) => write!(f, "<function#{}>", closure.prototype),
Value::Nil => write!(f, "nil"), Value::Nil => write!(f, "nil"),
Value::Table { contents, .. } => write!(f, "<table#{}>", contents.as_ptr() as u64), Value::Table { contents, .. } => write!(f, "<table#{}>", contents.as_ptr() as u64),
Value::UserData { .. } => write!(f, "<userdata>"),
} }
} }
} }
@ -573,6 +579,7 @@ impl<UserData: Clone> Value<UserData> {
Value::RustFunction(_) => Err(RuntimeError::NotLengthable(self.clone())), Value::RustFunction(_) => Err(RuntimeError::NotLengthable(self.clone())),
Value::Function(_) => Err(RuntimeError::NotLengthable(self.clone())), Value::Function(_) => Err(RuntimeError::NotLengthable(self.clone())),
Value::Nil => Err(RuntimeError::NotLengthable(self.clone())), Value::Nil => Err(RuntimeError::NotLengthable(self.clone())),
Value::UserData { .. } => Err(RuntimeError::NotLengthable(self.clone())),
} }
} }
@ -610,6 +617,7 @@ impl<UserData: Clone> Value<UserData> {
Value::Function(_) => true, Value::Function(_) => true,
Value::Nil => false, Value::Nil => false,
Value::Table { .. } => true, Value::Table { .. } => true,
Value::UserData { .. } => true,
} }
} }
} }
@ -633,6 +641,7 @@ impl<UserData: Clone> Debug for Value<UserData> {
} }
table.finish() table.finish()
} }
Value::UserData { .. } => write!(f, "UserData"),
} }
} }
} }
@ -646,6 +655,7 @@ pub enum IndexableValue {
RustFunction(String), RustFunction(String),
Function(u32), Function(u32),
Table(u64), Table(u64),
UserData(u64),
} }
impl From<&str> for IndexableValue { impl From<&str> for IndexableValue {