impl Hash for Value
parent
8d80ebc052
commit
693efa47bd
|
@ -18,14 +18,14 @@ pub (crate) fn compile_bytecode (source: Vec <u8>) -> Vec <u8> {
|
|||
},
|
||||
};
|
||||
|
||||
let mut child = Command::new ("luac")
|
||||
let mut child = Command::new ("luac5.4")
|
||||
.arg ("-o") // Output to...
|
||||
.arg ("-") // Standard output
|
||||
.arg ("-") // Input from standard input
|
||||
.stdin (Stdio::piped ())
|
||||
.stdout (Stdio::piped ())
|
||||
.spawn ()
|
||||
.expect ("failed to execute `luac`. Is Lua installed?");
|
||||
.expect ("failed to execute `luac5.4`. Is Lua installed?");
|
||||
|
||||
let mut stdin = child.stdin.take ().expect ("failed to get stdin");
|
||||
std::thread::spawn (move || {
|
||||
|
|
22
src/state.rs
22
src/state.rs
|
@ -65,7 +65,7 @@ pub enum Instruction {
|
|||
VarArgPrep (i32),
|
||||
}
|
||||
|
||||
#[derive (Clone, Debug, PartialEq)]
|
||||
#[derive (Clone, Debug, Hash, PartialEq)]
|
||||
pub struct BogusClosure {
|
||||
idx: usize,
|
||||
upvalues: Vec <Value>,
|
||||
|
@ -118,6 +118,26 @@ impl From <f64> for Value {
|
|||
}
|
||||
}
|
||||
|
||||
impl std::hash::Hash for Value {
|
||||
fn hash <H: std::hash::Hasher> (&self, state: &mut H) {
|
||||
// Per https://doc.rust-lang.org/std/hash/trait.Hash.html#prefix-collisions
|
||||
[0xff].hash (state);
|
||||
|
||||
match self {
|
||||
// TODO: Weaken to a Lua error
|
||||
Self::Nil => panic! ("can't hash a nil value"),
|
||||
Self::Boolean (x) => x.hash (state),
|
||||
Self::Float (x) => x.to_ne_bytes ().hash (state),
|
||||
Self::Integer (x) => x.hash (state),
|
||||
Self::String (x) => x.as_ptr ().hash (state),
|
||||
Self::BogusArg (_) => panic! ("can't hash Bogus values"),
|
||||
Self::BogusClosure (_) => panic! ("can't hash Bogus values"),
|
||||
Self::BogusEnv (_) => panic! ("can't hash Bogus values"),
|
||||
Self::BogusPrint => panic! ("can't hash Bogus values"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Value {
|
||||
fn as_float (&self) -> Option <f64> {
|
||||
match self {
|
||||
|
|
Loading…
Reference in New Issue