@@ -15,7 +15,7 @@ module Parse.Primitives
15 , string, character
15 , string, character
16 , digit, number
16 , digit, number
17 , shaderSource, shaderFailure
17 , shaderSource, shaderFailure
18− , kernelChunk
18+ , kernelChunk, ChunkTag(..)
@@ -36,7 +36,7 @@ import qualified Data.Text.Lazy as LT
36import qualified Data.Text.Lazy.Builder as LB
36import qualified Data.Text.Lazy.Builder as LB
37import Data.Text.Internal.Encoding.Utf16 (chr2)
37import Data.Text.Internal.Encoding.Utf16 (chr2)
38import Data.Text.Internal.Unsafe.Char (unsafeChr)
38import Data.Text.Internal.Unsafe.Char (unsafeChr)
39−import GHC.Word (Word16(..))
39+import GHC.Word (Word8, Word16)
41import qualified AST.Helpers as Help (isSymbol)
41import qualified AST.Helpers as Help (isSymbol)
42import qualified AST.Literal as L
42import qualified AST.Literal as L
@@ -1029,7 +1029,7 @@ digit =
1030 if isDigit word then
1030 if isDigit word then
1032− (fromIntegral (word - 0x0030))
1032+ (fromIntegral (word - 0x0030 {- 0 -}))
1033 (State array (offset + 1) (length - 1) indent row (col + 1) ctx)
1033 (State array (offset + 1) (length - 1) indent row (col + 1) ctx)
@@ -1307,50 +1307,52 @@ eatShader array offset length row col =
1307-- KERNEL CHOMP
1307-- KERNEL CHOMP
1310+data ChunkTag = KernelEnum Word8 | KernelImport
1310−kernelChunk :: Parser (Either BS.ByteString (BS.ByteString, Text))
1313+kernelChunk :: Parser (BS.ByteString, Maybe (ChunkTag, Text))
1311kernelChunk =
1314kernelChunk =
1312 Parser $ \(State array offset length indent row col ctx) cok _ _ _ ->
1315 Parser $ \(State array offset length indent row col ctx) cok _ _ _ ->
1314− (# isAtUnderscores, newOffset, newLength, newRow, newCol #) =
1317+ (# maybeChunkTag, newOffset, newLength, newRow, newCol #) =
1315 kernelChunkHelp array offset length row col
1318 kernelChunkHelp array offset length row col
1317 javascript =
1320 javascript =
1318 Text.encodeUtf8 (Text.Text array offset (newOffset - offset))
1321 Text.encodeUtf8 (Text.Text array offset (newOffset - offset))
1320− if not isAtUnderscores then
1323+ case maybeChunkTag of
1323− !newState =
1326+ !newState =
1324− State array newOffset newLength indent newRow newCol ctx
1327+ State array newOffset newLength indent newRow newCol ctx
1326− cok (Left javascript) newState noError
1329+ cok (javascript, Nothing) newState noError
1331− (# newerOffset, newerLength, newerCol #) =
1333+ (# newerOffset, newerLength, newerCol #) =
1332− varPrimHelp array newOffset newLength newCol
1334+ varPrimHelp array newOffset newLength newCol
1334− !newState =
1336+ !newState =
1335− State array newerOffset newerLength indent newRow newerCol ctx
1337+ State array newerOffset newerLength indent newRow newerCol ctx
1337− !kernelSymbol =
1339+ !kernelSymbol =
1338− Text.Text array newOffset (newerOffset - newOffset)
1340+ Text.Text array newOffset (newerOffset - newOffset)
1340− cok (Right (javascript, kernelSymbol)) newState noError
1342+ cok (javascript, Just (tag, kernelSymbol)) newState noError
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 #)
1344kernelChunkHelp array offset length row col =
1346kernelChunkHelp array offset length row col =
1345− if length < 2 then
1347+ if length == 0 then
1346− (# False, offset, length, row, col #)
1348+ (# Nothing, offset, length, row, col #)
1350 !word = Text.unsafeIndex array offset
1352 !word = Text.unsafeIndex array offset
1352− if word == 0x005F {- _ -} && Text.unsafeIndex array (offset + 1) == 0x005F {- _ -} then
1354+ if word == 0x005F {- _ -} && length > 3 && Text.unsafeIndex array (offset + 1) == 0x005F {- _ -} then
1353− (# True, offset, length, row, col #)
1355+ (# Just (toChunkTag (Text.unsafeIndex array (offset + 2))), offset, length, row, col #)
1355 else if word == 0x000A {- \n -} then
1357 else if word == 0x000A {- \n -} then
1356 kernelChunkHelp array (offset + 1) (length - 1) (row + 1) 1
1358 kernelChunkHelp array (offset + 1) (length - 1) (row + 1) 1
@@ -1360,3 +1362,11 @@ kernelChunkHelp array offset length row col =
1362 kernelChunkHelp array (offset + 2) (length - 2) row (col + 1)
1364 kernelChunkHelp array (offset + 2) (length - 2) row (col + 1)
1367+toChunkTag :: Word16 -> ChunkTag
1369+ if isDigit word then
1370+ KernelEnum (fromIntegral (word - 0x0030 {- 0 -}))