mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-03 16:44:33 +00:00
Add RocType.roc to glue
This commit is contained in:
parent
f2f4fb59b5
commit
539429f16b
1 changed files with 156 additions and 0 deletions
156
crates/glue/src/RocType.roc
Normal file
156
crates/glue/src/RocType.roc
Normal file
|
@ -0,0 +1,156 @@
|
|||
platform "roc-lang/rbt"
|
||||
requires {} { makeGlue : Str -> Types }
|
||||
exposes []
|
||||
packages {}
|
||||
imports []
|
||||
provides [makeGlueForHost]
|
||||
|
||||
makeGlueForHost : Str -> Types
|
||||
makeGlueForHost = makeGlue
|
||||
|
||||
# TODO move into separate Target.roc interface once glue works across interfaces.
|
||||
Target : {
|
||||
architecture: Architecture,
|
||||
operatingSystem: OperatingSystem,
|
||||
}
|
||||
|
||||
Architecture : [
|
||||
Aarch32,
|
||||
Aarch64,
|
||||
Wasm32,
|
||||
X86x32,
|
||||
X86x64,
|
||||
]
|
||||
|
||||
OperatingSystem : [
|
||||
Windows,
|
||||
Unix,
|
||||
Wasi,
|
||||
]
|
||||
|
||||
TypeId := Nat
|
||||
|
||||
Types := {
|
||||
# These are all indexed by TypeId
|
||||
types: List RocType,
|
||||
sizes: List U32,
|
||||
aligns: List U32,
|
||||
|
||||
# Needed to check for duplicates
|
||||
typesByName: Dict Str TypeId,
|
||||
|
||||
## Dependencies - that is, which type depends on which other type.
|
||||
## This is important for declaration order in C; we need to output a
|
||||
## type declaration earlier in the file than where it gets referenced by another type.
|
||||
deps: Dict TypeId (List TypeId),
|
||||
target: Target,
|
||||
}
|
||||
|
||||
RocType : [
|
||||
RocStr,
|
||||
Bool,
|
||||
RocResult TypeId TypeId,
|
||||
Num RocNum,
|
||||
RocList TypeId,
|
||||
RocDict TypeId TypeId,
|
||||
RocSet TypeId,
|
||||
RocBox TypeId,
|
||||
TagUnion RocTagUnion,
|
||||
EmptyTagUnion,
|
||||
Struct {
|
||||
name: Str,
|
||||
fields: List { name: Str, type: TypeId }
|
||||
},
|
||||
TagUnionPayload {
|
||||
name: Str,
|
||||
fields: List { discriminant: Nat, type: TypeId },
|
||||
},
|
||||
## A recursive pointer, e.g. in StrConsList : [Nil, Cons Str StrConsList],
|
||||
## this would be the field of Cons containing the (recursive) StrConsList type,
|
||||
## and the TypeId is the TypeId of StrConsList itself.
|
||||
RecursivePointer TypeId,
|
||||
Function {
|
||||
name: Str,
|
||||
args: List TypeId,
|
||||
ret: TypeId,
|
||||
},
|
||||
# A zero-sized type, such as an empty record or a single-tag union with no payload
|
||||
Unit,
|
||||
]
|
||||
|
||||
RocNum : [
|
||||
I8,
|
||||
U8,
|
||||
I16,
|
||||
U16,
|
||||
I32,
|
||||
U32,
|
||||
I64,
|
||||
U64,
|
||||
I128,
|
||||
U128,
|
||||
F32,
|
||||
F64,
|
||||
F128,
|
||||
Dec,
|
||||
]
|
||||
|
||||
RocTagUnion : [
|
||||
Enumeration {
|
||||
name: Str,
|
||||
tags: List Str,
|
||||
size: U32,
|
||||
},
|
||||
## A non-recursive tag union
|
||||
## e.g. `Result a e : [Ok a, Err e]`
|
||||
NonRecursive {
|
||||
name: Str,
|
||||
tags: List { name : Str, payload : [Some TypeId, None] },
|
||||
discriminantSize: U32,
|
||||
discriminantOffset: U32,
|
||||
},
|
||||
## A recursive tag union (general case)
|
||||
## e.g. `Expr : [Sym Str, Add Expr Expr]`
|
||||
Recursive {
|
||||
name: Str,
|
||||
tags: List { name : Str, payload : [Some TypeId, None] },
|
||||
discriminantSize: U32,
|
||||
discriminantOffset: U32,
|
||||
},
|
||||
## A recursive tag union that has an empty variant
|
||||
## Optimization: Represent the empty variant as null pointer => no memory usage & fast comparison
|
||||
## It has more than one other variant, so they need tag IDs (payloads are "wrapped")
|
||||
## e.g. `FingerTree a : [Empty, Single a, More (Some a) (FingerTree (Tuple a)) (Some a)]`
|
||||
## see also: https://youtu.be/ip92VMpf_-A?t=164
|
||||
NullableWrapped {
|
||||
name: Str,
|
||||
indexOfNullTag: U16,
|
||||
tags: List { name : Str, payload : [Some TypeId, None] },
|
||||
discriminantSize: U32,
|
||||
discriminantOffset: U32,
|
||||
},
|
||||
## Optimization: No need to store a tag ID (the payload is "unwrapped")
|
||||
## e.g. `RoseTree a : [Tree a (List (RoseTree a))]`
|
||||
NonNullableUnwrapped {
|
||||
name: Str,
|
||||
tagName: Str,
|
||||
payload: TypeId, # These always have a payload.
|
||||
},
|
||||
## Optimization: No need to store a tag ID (the payload is "unwrapped")
|
||||
## e.g. `[Foo Str Bool]`
|
||||
SingleTagStruct {
|
||||
name: Str,
|
||||
tagName: Str,
|
||||
payloadFields: List TypeId,
|
||||
},
|
||||
## A recursive tag union with only two variants, where one is empty.
|
||||
## Optimizations: Use null for the empty variant AND don't store a tag ID for the other variant.
|
||||
## e.g. `ConsList a : [Nil, Cons a (ConsList a)]`
|
||||
NullableUnwrapped {
|
||||
name: Str,
|
||||
nullTag: Str,
|
||||
nonNullTag: Str,
|
||||
nonNullPayload: TypeId,
|
||||
whichTagIsNull: [FirstTagIsNull, SecondTagIsNull],
|
||||
},
|
||||
]
|
Loading…
Add table
Add a link
Reference in a new issue