docs(users/tazjin): add graph explaining tvix-eval Value structure
Change-Id: I436aeba6da6a0d5096452529d7dd0be11a466e8f Reviewed-on: https://cl.tvl.fyi/c/depot/+/9905 Reviewed-by: tazjin <tazjin@tvl.su> Tested-by: BuildkiteCI Autosubmit: tazjin <tazjin@tvl.su>
This commit is contained in:
parent
1571d7195e
commit
fd725bc7fd
1 changed files with 98 additions and 0 deletions
98
users/tazjin/tvix-eval-value.d2
Normal file
98
users/tazjin/tvix-eval-value.d2
Normal file
|
@ -0,0 +1,98 @@
|
|||
# D2 diagram of tvix-eval's `Value` type.
|
||||
#
|
||||
# can be rendered at https://play.d2lang.com/
|
||||
#
|
||||
# colours have meanings:
|
||||
#
|
||||
# yellow: recurses
|
||||
# orange: heap allocation
|
||||
# red: refcount
|
||||
#
|
||||
# this intentionally does *not* include some internal variants
|
||||
|
||||
Value -> Null
|
||||
Value -> Bool
|
||||
Value -> Integer
|
||||
Value -> Float
|
||||
|
||||
Box*.style.fill: "lightsalmon"
|
||||
Rc*.style.fill: "salmon"
|
||||
Vec\<*.style.fill: "salmon"
|
||||
|
||||
Value -> String -> NixString -> "Box<str>"
|
||||
|
||||
Value -> Path -> "Box<PathBuf>" -> PathBuf
|
||||
PathBuf.style.fill: "lightsalmon"
|
||||
|
||||
# attribute sets are kinda complicated
|
||||
Value -> Attrs -> "Box<NixAttrs>" -> NixAttrs
|
||||
NixAttrs -> Empty
|
||||
NixAttrs -> KV
|
||||
KV.style.fill: "LemonChiffon"
|
||||
KV -> Value
|
||||
KV -> Value
|
||||
NixAttrs -> Map
|
||||
Map -> "OrdMap<NixString, Value>" -> "MapEntry<NixString, Value>"
|
||||
"OrdMap<NixString, Value>".style.fill: "lightsalmon"
|
||||
"MapEntry<NixString, Value>".style.fill: "salmon"
|
||||
"MapEntry<NixString, Value>".style.multiple: true
|
||||
"MapEntry<NixString, Value>" -> NixString
|
||||
"MapEntry<NixString, Value>" -> Value
|
||||
"MapEntry<NixString, Value>".style.stroke-width: 15
|
||||
"MapEntry<NixString, Value>".style.stroke: "lemonchiffon"
|
||||
|
||||
Value -> List -> NixList -> "Rc<imbl::Vector<Value>>"
|
||||
"Rc<imbl::Vector<Value>>" -> "VecEntry<Value>" -> Value
|
||||
"VecEntry<Value>".style.multiple: true
|
||||
"VecEntry<Value>".style.fill: "salmon"
|
||||
"VecEntry<Value>".style.stroke-width: 15
|
||||
"VecEntry<Value>".style.stroke: "lemonchiffon"
|
||||
|
||||
# closures
|
||||
|
||||
Value -> Closure -> "Rc<Closure>" -> Closure
|
||||
Closure -> "Rc<Lambda>" -> Lambda
|
||||
|
||||
Lambda -> Chunk
|
||||
Lambda -> SmolStr: sometimes allocates
|
||||
SmolStr.style.fill: "lightsalmon"
|
||||
Lambda -> usize
|
||||
Lambda -> "Option<Formals>" -> Formals
|
||||
|
||||
Formals -> "HashMap<NixString, bool>" -> "MapEntry<NixString, bool>"
|
||||
"HashMap<NixString, bool>".style.fill: "lightsalmon"
|
||||
"MapEntry<NixString, bool>".style.fill: "salmon"
|
||||
"MapEntry<NixString, bool>".style.multiple: true
|
||||
"MapEntry<NixString, bool>" -> NixString
|
||||
|
||||
Closure -> "Rc<Upvalues>" -> Upvalues
|
||||
|
||||
Upvalues -> "Vec<Value>"
|
||||
"Vec<Value>" -> Value
|
||||
"Vec<Value>".style.stroke-width: 15
|
||||
"Vec<Value>".style.stroke: "lemonchiffon"
|
||||
Upvalues -> "Option<Vec<Value>>"
|
||||
"Option<Vec<Value>>" -> Value
|
||||
"Option<Vec<Value>>".style.fill: "lightsalmon"
|
||||
"Option<Vec<Value>>".style.stroke-width: 15
|
||||
"Option<Vec<Value>>".style.stroke: "lemonchiffon"
|
||||
|
||||
Value -> Blueprint -> "Rc<Lambda>"
|
||||
|
||||
# builtins
|
||||
|
||||
Value -> Builtin -> "Box<BuiltinRepr>" -> BuiltinRepr
|
||||
BuiltinRepr -> "Rc<dyn BuiltinGen>"
|
||||
BuiltinRepr -> "Vec<Value>"
|
||||
|
||||
# thunks
|
||||
|
||||
Value -> Thunk -> "Rc<RefCell<ThunkRepr>>" -> ThunkRepr
|
||||
ThunkRepr -> Suspended
|
||||
Suspended -> "Rc<Lambda>"
|
||||
Suspended -> "Rc<Upvalues>"
|
||||
|
||||
ThunkRepr -> Native -> "Box<dyn Fn() -> Result<Value, ErrorKind>>"
|
||||
ThunkRepr -> Blackhole
|
||||
ThunkRepr -> Evaluated -> Value
|
||||
Evaluated.style.fill: "lemonchiffon"
|
Loading…
Reference in a new issue