fix: builtins impl
This commit is contained in:
@@ -2,7 +2,7 @@ use hashbrown::HashSet;
|
||||
use std::cell::OnceCell;
|
||||
use std::cell::RefCell;
|
||||
use std::hash::Hash;
|
||||
use std::rc::Rc;
|
||||
use std::rc::{Rc, Weak};
|
||||
|
||||
use derive_more::{IsVariant, Unwrap};
|
||||
|
||||
@@ -24,7 +24,7 @@ pub use func::*;
|
||||
pub use list::List;
|
||||
pub use primop::*;
|
||||
|
||||
#[derive(Debug, IsVariant, Unwrap, Clone, PartialEq)]
|
||||
#[derive(Debug, IsVariant, Unwrap, Clone)]
|
||||
pub enum Value<'jit: 'vm, 'vm> {
|
||||
Const(Const),
|
||||
Thunk(Rc<Thunk<'jit, 'vm>>),
|
||||
@@ -35,7 +35,7 @@ pub enum Value<'jit: 'vm, 'vm> {
|
||||
PrimOp(Rc<PrimOp<'jit, 'vm>>),
|
||||
PartialPrimOp(Rc<PartialPrimOp<'jit, 'vm>>),
|
||||
Func(Rc<Func<'jit, 'vm>>),
|
||||
Builtins,
|
||||
Builtins(Weak<AttrSet<'jit, 'vm>>),
|
||||
}
|
||||
|
||||
impl Hash for Value<'_, '_> {
|
||||
@@ -52,7 +52,7 @@ impl Hash for Value<'_, '_> {
|
||||
PrimOp(x) => (x.as_ref() as *const self::PrimOp).hash(state),
|
||||
PartialPrimOp(x) => (x.as_ref() as *const self::PartialPrimOp).hash(state),
|
||||
Func(x) => (x.as_ref() as *const self::Func).hash(state),
|
||||
Builtins => (),
|
||||
Builtins(x) => (x.as_ptr()).hash(state),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -64,8 +64,21 @@ impl<'jit: 'vm, 'vm> Value<'jit, 'vm> {
|
||||
(Const(a), Const(b)) => a.eq(b),
|
||||
(AttrSet(a), AttrSet(b)) => a.eq_impl(b, vm),
|
||||
(List(a), List(b)) => a.eq(b),
|
||||
(Builtins, AttrSet(attrs)) => attrs.has_attr(vm.new_sym("builtins")),
|
||||
(AttrSet(attrs), Builtins) => attrs.has_attr(vm.new_sym("builtins")),
|
||||
(Builtins(_), AttrSet(attrs)) => attrs.has_attr(vm.new_sym("builtins")),
|
||||
(AttrSet(attrs), Builtins(_)) => attrs.has_attr(vm.new_sym("builtins")),
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'jit: 'vm, 'vm> PartialEq for Value<'jit, 'vm> {
|
||||
fn eq(&self, other: &Self) -> bool {
|
||||
use Value::*;
|
||||
match (self, other) {
|
||||
(Const(a), Const(b)) => a.eq(b),
|
||||
(AttrSet(a), AttrSet(b)) => (a.as_ref() as *const self::AttrSet).eq(&(b.as_ref() as *const _)),
|
||||
(List(a), List(b)) => (a.as_ref() as *const self::List).eq(&(b.as_ref() as *const _)),
|
||||
(Builtins(a), Builtins(b)) => a.ptr_eq(b),
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
@@ -111,7 +124,7 @@ impl<'v, 'vm: 'v, 'jit: 'vm> Value<'jit, 'vm> {
|
||||
PrimOp(x) => R::PrimOp(x),
|
||||
PartialPrimOp(x) => R::PartialPrimOp(x),
|
||||
Func(x) => R::Func(x),
|
||||
Builtins => unreachable!(),
|
||||
Builtins(_) => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,7 +141,7 @@ impl<'v, 'vm: 'v, 'jit: 'vm> Value<'jit, 'vm> {
|
||||
PrimOp(x) => M::PrimOp(Rc::make_mut(x)),
|
||||
PartialPrimOp(x) => M::PartialPrimOp(Rc::make_mut(x)),
|
||||
Func(x) => M::Func(x),
|
||||
Builtins => unreachable!(),
|
||||
Builtins(_) => unreachable!(),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -151,7 +164,7 @@ impl<'jit, 'vm> Value<'jit, 'vm> {
|
||||
PrimOp(_) => "lambda",
|
||||
PartialPrimOp(_) => "lambda",
|
||||
Func(_) => "lambda",
|
||||
Builtins => "set",
|
||||
Builtins(_) => "set",
|
||||
}
|
||||
}
|
||||
|
||||
@@ -360,7 +373,8 @@ impl<'jit, 'vm> Value<'jit, 'vm> {
|
||||
self.typename()
|
||||
))),
|
||||
}?;
|
||||
if let Value::Builtins = val {
|
||||
if let Value::Builtins(weak) = val {
|
||||
*self = Value::AttrSet(weak.upgrade().unwrap())
|
||||
} else {
|
||||
*self = val;
|
||||
}
|
||||
@@ -378,7 +392,8 @@ impl<'jit, 'vm> Value<'jit, 'vm> {
|
||||
)));
|
||||
}
|
||||
};
|
||||
if let Value::Builtins = val {
|
||||
if let Value::Builtins(weak) = val {
|
||||
*self = Value::AttrSet(weak.upgrade().unwrap())
|
||||
} else {
|
||||
*self = val;
|
||||
}
|
||||
@@ -452,7 +467,7 @@ impl<'jit, 'vm> Value<'jit, 'vm> {
|
||||
PrimOp(primop) => Value::PrimOp(primop.name),
|
||||
PartialPrimOp(primop) => Value::PartialPrimOp(primop.name),
|
||||
Func(_) => Value::Func,
|
||||
Builtins => Value::Repeated,
|
||||
Builtins(x) => x.upgrade().unwrap().to_public(vm, seen),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user