diff --git a/src/vm/mod.rs b/src/vm/mod.rs index 2e0561e..4903ca0 100644 --- a/src/vm/mod.rs +++ b/src/vm/mod.rs @@ -27,6 +27,9 @@ impl RustFunction for SetMetatable { match table { Value::Table { metatable: inner, .. + } + | Value::UserData { + metatable: inner, .. } => match metatable { Value::Table { contents: metatable, @@ -819,7 +822,7 @@ impl ClosureRunner { } self.inner = Some(Box::new(closure.run(params))); } - Value::Table { metatable, .. } => { + Value::Table { metatable, .. } | Value::UserData { metatable, .. } => { let mut metamethod_params = vec![value.clone()]; metamethod_params.extend(params); let ret_values: Vec> = @@ -1292,6 +1295,7 @@ impl ClosureRunner { fn extract_metatable(value: &Value) -> Option<&Table> { match value { Value::Table { metatable, .. } => Some(metatable), + Value::UserData { metatable, .. } => Some(metatable), _ => None, } } diff --git a/src/vm/value.rs b/src/vm/value.rs index a15fb6f..22af071 100644 --- a/src/vm/value.rs +++ b/src/vm/value.rs @@ -133,8 +133,8 @@ impl Debug for Constant { } } -pub type Table = Rc>>; -pub type TableMap = HashMap>; +pub type Table = Rc>>; +pub type TableMap = HashMap>; #[derive(Clone)] pub enum Value { @@ -149,6 +149,10 @@ pub enum Value { contents: Table, metatable: Table, }, + UserData { + contents: UserData, + metatable: Table, + }, } impl Value { @@ -164,6 +168,7 @@ impl Value { Value::Function(closure) => Ok(IndexableValue::Function(closure.prototype)), Value::Nil => Err(RuntimeError::InvalidTableIndex(self)), Value::Table { contents, .. } => Ok(IndexableValue::Table(contents.as_ptr() as u64)), + Value::UserData { .. } => Err(RuntimeError::InvalidTableIndex(self)), } } @@ -214,6 +219,7 @@ impl Display for Value { Value::Function(closure) => write!(f, "", closure.prototype), Value::Nil => write!(f, "nil"), Value::Table { contents, .. } => write!(f, "", contents.as_ptr() as u64), + Value::UserData { .. } => write!(f, ""), } } } @@ -573,6 +579,7 @@ impl Value { Value::RustFunction(_) => Err(RuntimeError::NotLengthable(self.clone())), Value::Function(_) => Err(RuntimeError::NotLengthable(self.clone())), Value::Nil => Err(RuntimeError::NotLengthable(self.clone())), + Value::UserData { .. } => Err(RuntimeError::NotLengthable(self.clone())), } } @@ -610,6 +617,7 @@ impl Value { Value::Function(_) => true, Value::Nil => false, Value::Table { .. } => true, + Value::UserData { .. } => true, } } } @@ -633,6 +641,7 @@ impl Debug for Value { } table.finish() } + Value::UserData { .. } => write!(f, "UserData"), } } } @@ -646,6 +655,7 @@ pub enum IndexableValue { RustFunction(String), Function(u32), Table(u64), + UserData(u64), } impl From<&str> for IndexableValue {