Skip to content

Compute literal length at compile time

SDoc string literals created for example with text "xyz" are converted into PtrString (Addr# + size in bytes) with a rewrite rule to avoid allocating a String.

Currently the size in bytes is still computed at runtime. For every literal, we obtained the following pseudo STG:

    x :: Addr#
    x = "xzy"#

    s :: PtrString
    s = \u [] case ffi:strlen [x realWorld#] of
            (# _, sz #) -> PtrString [x sz]

Since GHC 9.0, we can use cstringLength# instead to get:

    x :: Addr#
    x = "xzy"#

    s :: PtrString
    s = PtrString! [x 3#]
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information