Add UserData-value
This commit is contained in:
parent
641aa878bb
commit
5246028c90
@ -27,6 +27,9 @@ impl<UserData: Clone> RustFunction<UserData> for SetMetatable {
|
||||
match table {
|
||||
Value::Table {
|
||||
metatable: inner, ..
|
||||
}
|
||||
| Value::UserData {
|
||||
metatable: inner, ..
|
||||
} => match metatable {
|
||||
Value::Table {
|
||||
contents: metatable,
|
||||
@ -819,7 +822,7 @@ impl<UserData: Clone> ClosureRunner<UserData> {
|
||||
}
|
||||
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<Value<UserData>> =
|
||||
@ -1292,6 +1295,7 @@ impl<UserData: Clone> ClosureRunner<UserData> {
|
||||
fn extract_metatable<UserData: Clone>(value: &Value<UserData>) -> Option<&Table<UserData>> {
|
||||
match value {
|
||||
Value::Table { metatable, .. } => Some(metatable),
|
||||
Value::UserData { metatable, .. } => Some(metatable),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
@ -133,8 +133,8 @@ impl Debug for Constant {
|
||||
}
|
||||
}
|
||||
|
||||
pub type Table<UserData: Clone> = Rc<RefCell<TableMap<UserData>>>;
|
||||
pub type TableMap<UserData: Clone> = HashMap<IndexableValue, Value<UserData>>;
|
||||
pub type Table<UserData> = Rc<RefCell<TableMap<UserData>>>;
|
||||
pub type TableMap<UserData> = HashMap<IndexableValue, Value<UserData>>;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub enum Value<UserData: Clone> {
|
||||
@ -149,6 +149,10 @@ pub enum Value<UserData: Clone> {
|
||||
contents: Table<UserData>,
|
||||
metatable: Table<UserData>,
|
||||
},
|
||||
UserData {
|
||||
contents: UserData,
|
||||
metatable: Table<UserData>,
|
||||
},
|
||||
}
|
||||
|
||||
impl<UserData: Clone> Value<UserData> {
|
||||
@ -164,6 +168,7 @@ impl<UserData: Clone> Value<UserData> {
|
||||
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<UserData: Clone> Display for Value<UserData> {
|
||||
Value::Function(closure) => write!(f, "<function#{}>", closure.prototype),
|
||||
Value::Nil => write!(f, "nil"),
|
||||
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::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<UserData: Clone> Value<UserData> {
|
||||
Value::Function(_) => true,
|
||||
Value::Nil => false,
|
||||
Value::Table { .. } => true,
|
||||
Value::UserData { .. } => true,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -633,6 +641,7 @@ impl<UserData: Clone> Debug for Value<UserData> {
|
||||
}
|
||||
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 {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user