implementation module Snug.Compile.ABI import StdEnv import Text import MIPS.MIPS32 import Snug.Compile constructorLabel :: !Namespace !ConstructorIdent -> Label constructorLabel "" id = "_c" +++ id // for built-in constructors constructorLabel ns id = concat4 "__" (escapeLabel ns) "_c" (escapeLabel id) functionLabel :: !Namespace !EntryPoint !SymbolIdent -> Label functionLabel ns entry_point id | size ns == 0 = {#'_',e} +++ escapeLabel id = concat4 "__" (escapeLabel ns) {#'_',e} (escapeLabel id) where e = case entry_point of NodeEntry -> 'n' escapeLabel :: !String -> String escapeLabel s = {#c \\ c <- escape [c \\ c <-: s]} where escape [] = [] escape [c:cs] | isAlphanum c = [c:escape cs] escape ['_':cs] = ['__':escape cs] escape ['`':cs] = ['_B':escape cs] escape [':':cs] = ['_C':escape cs] escape ['.':cs] = ['_D':escape cs] escape ['>':cs] = ['_G':escape cs] escape ['=':cs] = ['_I':escape cs] escape ['<':cs] = ['_L':escape cs] escape ['-':cs] = ['_M':escape cs] escape ['+':cs] = ['_P':escape cs] escape ['\'':cs] = ['_Q':escape cs] escape ['~':cs] = ['_T':escape cs]