diff options
author | Stiopa Koltsov <nga@meta.com> | 2024-10-01 08:06:40 -0700 |
---|---|---|
committer | Facebook GitHub Bot <facebook-github-bot@users.noreply.github.com> | 2024-10-01 08:06:40 -0700 |
commit | 85fcfabf1898eed5735de73d3d4027c069567d8e (patch) | |
tree | c88821bbbbf6f1501758c8349e4670029aedf6aa | |
parent | 661918821643a1f2c0e6bc5775941dc0e4858a09 (diff) |
Reviewed By: perehonchuk
Differential Revision: D63677028
fbshipit-source-id: 23171d3bbcd17106c68e25f7ea4296c9189cb014
-rw-r--r-- | starlark/src/values/typing/callable.rs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/starlark/src/values/typing/callable.rs b/starlark/src/values/typing/callable.rs index be39ce17..4ba65f4a 100644 --- a/starlark/src/values/typing/callable.rs +++ b/starlark/src/values/typing/callable.rs @@ -311,11 +311,59 @@ impl<P: StarlarkCallableParamSpec, R: StarlarkTypeRepr> FrozenStarlarkCallable<P /// Unpacking with this type is expensive: /// usually it is OK to use it for code executed once at top-level scope (like `rule()`), /// but not for code executed many times (like `partial()`). +#[derive(Allocative)] +#[allocative(bound = "")] pub struct StarlarkCallableChecked<'v, P: StarlarkCallableParamSpec, R: StarlarkTypeRepr>( pub Value<'v>, PhantomData<AtomicPtr<(P, R)>>, ); +impl<'v, P: StarlarkCallableParamSpec, R: StarlarkTypeRepr> Clone + for StarlarkCallableChecked<'v, P, R> +{ + fn clone(&self) -> Self { + *self + } +} + +impl<'v, P: StarlarkCallableParamSpec, R: StarlarkTypeRepr> Copy + for StarlarkCallableChecked<'v, P, R> +{ +} + +impl<'v, P: StarlarkCallableParamSpec, R: StarlarkTypeRepr> Dupe + for StarlarkCallableChecked<'v, P, R> +{ +} + +impl<'v, P: StarlarkCallableParamSpec, R: StarlarkTypeRepr> Debug + for StarlarkCallableChecked<'v, P, R> +{ + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + f.debug_tuple("StarlarkCallableChecked") + .field(&self.0) + .finish() + } +} + +unsafe impl<'v, P: StarlarkCallableParamSpec, R: StarlarkTypeRepr> Trace<'v> + for StarlarkCallableChecked<'v, P, R> +{ + fn trace(&mut self, tracer: &Tracer<'v>) { + let StarlarkCallableChecked(value, phantom) = self; + value.trace(tracer); + phantom.trace(tracer); + } +} + +impl<'v, P: StarlarkCallableParamSpec, R: StarlarkTypeRepr> AllocValue<'v> + for StarlarkCallableChecked<'v, P, R> +{ + fn alloc_value(self, _heap: &'v Heap) -> Value<'v> { + self.0 + } +} + impl<'v, P: StarlarkCallableParamSpec, R: StarlarkTypeRepr> StarlarkCallableChecked<'v, P, R> { /// Convert to [`StarlarkCallable`]. pub fn to_unchecked(self) -> StarlarkCallable<'v, P, R> { |