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 {
|
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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user