Skip to content

Javascript backend: RuntimeRep handling

I was looking at StgToJS and found some suspicious code around RuntimeReps.

To set the stage: parameters r to constructs such as TYPE r (when describing a type's kind) or (#,#) @r1 @r2 are special, because they describe a runtime representation. But aside from that, RuntimeRep is just a regular data type; GHC should never do anything special just because a type has that kind. Rather, any special handling should be done based on the fact that a RuntimeRep is used in a position describing the runtime representation.

As a consequence, every call to isRuntimeRepKinded here violates this rule:

GHC/HsToCore/Foreign/JavaScript.hs:  | isRuntimeRepKindedTy result_ty = panic "boxJsResult: runtime rep ty" -- fixme
GHC/HsToCore/Foreign/JavaScript.hs:  | isRuntimeRepKindedTy result_ty = return (Nothing, id) -- fixme this seems like a hack
GHC/StgToJS/CoreUtils.hs:typeVt t | isRuntimeRepKindedTy t = []
GHC/StgToJS/CoreUtils.hs:  | isRuntimeRepKindedTy ut = VoidV
GHC/StgToJS/Expr.hs:    args = filter (not . isRuntimeRepKindedTy . idType) args0

The last check, isRuntimeRepKindedTy . idType looks wrong: an Id has a type whose kind should be either TYPE sth or CONSTRAINT sth - it cannot be RuntimeRep.

Low priority - this is cleanup only.

To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information