@@ -15,7 +15,7 @@ module Parse.Primitives
1515 , string, character
1616 , digit, number
1717 , shaderSource, shaderFailure
18− , kernelChunk
18+ , kernelChunk, ChunkTag(..)
1919 )
2020 where
2121
@@ -36,7 +36,7 @@ import qualified Data.Text.Lazy as LT
3636import qualified Data.Text.Lazy.Builder as LB
3737import Data.Text.Internal.Encoding.Utf16 (chr2)
3838import Data.Text.Internal.Unsafe.Char (unsafeChr)
39−import GHC.Word (Word16(..))
39+import GHC.Word (Word8, Word16)
4040
4141import qualified AST.Helpers as Help (isSymbol)
4242import qualified AST.Literal as L
@@ -1029,7 +1029,7 @@ digit =
10291029 in
10301030 if isDigit word then
10311031 cok
1032− (fromIntegral (word - 0x0030))
1032+ (fromIntegral (word - 0x0030 {- 0 -}))
10331033 (State array (offset + 1) (length - 1) indent row (col + 1) ctx)
10341034 noError
10351035 else
@@ -1307,50 +1307,52 @@ eatShader array offset length row col =
13071307-- KERNEL CHOMP
13081308
13091309
1310−kernelChunk :: Parser (Either BS.ByteString (BS.ByteString, Text))
1310+data ChunkTag = KernelEnum Word8 | KernelImport
1311+
1312+
1313+kernelChunk :: Parser (BS.ByteString, Maybe (ChunkTag, Text))
13111314kernelChunk =
13121315 Parser $ \(State array offset length indent row col ctx) cok _ _ _ ->
13131316 let
1314− (# isAtUnderscores, newOffset, newLength, newRow, newCol #) =
1317+ (# maybeChunkTag, newOffset, newLength, newRow, newCol #) =
13151318 kernelChunkHelp array offset length row col
13161319
13171320 javascript =
13181321 Text.encodeUtf8 (Text.Text array offset (newOffset - offset))
13191322 in
1320− if not isAtUnderscores then
1321−
1322− let
1323− !newState =
1324− State array newOffset newLength indent newRow newCol ctx
1325− in
1326− cok (Left javascript) newState noError
1327−
1328− else
1323+ case maybeChunkTag of
1324+ Nothing ->
1325+ let
1326+ !newState =
1327+ State array newOffset newLength indent newRow newCol ctx
1328+ in
1329+ cok (javascript, Nothing) newState noError
13291330
1330− let
1331− (# newerOffset, newerLength, newerCol #) =
1332− varPrimHelp array newOffset newLength newCol
1331+ Just tag ->
1332+ let
1333+ (# newerOffset, newerLength, newerCol #) =
1334+ varPrimHelp array newOffset newLength newCol
13331335
1334− !newState =
1335− State array newerOffset newerLength indent newRow newerCol ctx
1336+ !newState =
1337+ State array newerOffset newerLength indent newRow newerCol ctx
13361338
1337− !kernelSymbol =
1338− Text.Text array newOffset (newerOffset - newOffset)
1339− in
1340− cok (Right (javascript, kernelSymbol)) newState noError
1339+ !kernelSymbol =
1340+ Text.Text array newOffset (newerOffset - newOffset)
1341+ in
1342+ cok (javascript, Just (tag, kernelSymbol)) newState noError
13411343
13421344
1343−kernelChunkHelp :: Text.Array -> Int -> Int -> Int -> Int -> (# Bool, Int, Int, Int, Int #)
1345+kernelChunkHelp :: Text.Array -> Int -> Int -> Int -> Int -> (# Maybe ChunkTag, Int, Int, Int, Int #)
13441346kernelChunkHelp array offset length row col =
1345− if length < 2 then
1346− (# False, offset, length, row, col #)
1347+ if length == 0 then
1348+ (# Nothing, offset, length, row, col #)
13471349
13481350 else
13491351 let
13501352 !word = Text.unsafeIndex array offset
13511353 in
1352− if word == 0x005F {- _ -} && Text.unsafeIndex array (offset + 1) == 0x005F {- _ -} then
1353− (# True, offset, length, row, col #)
1354+ if word == 0x005F {- _ -} && length > 3 && Text.unsafeIndex array (offset + 1) == 0x005F {- _ -} then
1355+ (# Just (toChunkTag (Text.unsafeIndex array (offset + 2))), offset, length, row, col #)
13541356
13551357 else if word == 0x000A {- \n -} then
13561358 kernelChunkHelp array (offset + 1) (length - 1) (row + 1) 1
@@ -1360,3 +1362,11 @@ kernelChunkHelp array offset length row col =
13601362
13611363 else
13621364 kernelChunkHelp array (offset + 2) (length - 2) row (col + 1)
1365+
1366+
1367+toChunkTag :: Word16 -> ChunkTag
1368+toChunkTag word =
1369+ if isDigit word then
1370+ KernelEnum (fromIntegral (word - 0x0030 {- 0 -}))
1371+ else
1372+ KernelImport