on master help sign in
Introduce Elm.Name.fromForeignPtr

This way when the Elm.Name implementation gets optimized, there won’t be any unneeded allocation of a ByteString wrapper.

commit1e6121ab79f82a98d504d88cdfbd29377863ba13 authorEvan Czaplicki <evancz@users.noreply.github.com> dateWed 10 Jan 2018, 01:50 (9 years ago) parent84a9cdf
4 files changed+31−10
src/Elm/Name.hs+25−2 src/Parse/Primitives/Kernel.hs+2−3 src/Parse/Primitives/Shader.hs+2−3 src/Parse/Primitives/Symbol.hs+2−2
src/Elm/Name.hs+25−2
@@ -8,22 +8,26 @@ module Elm.Name
88 , toShort
99 , addIndex
1010 , toCompositeName
11+ , fromForeignPtr
1112 , int, float, bool, char, string
12− , maybe, list, array, tuple
13+ , maybe, list, array, tuple, jsArray
1314 , task, router, cmd, sub, platform, browser
1415 , shader, debug, bitwise, basics
1516 , utils, negate, value
16− , node, program, main, dollar
17+ , node, program, main, dollar, identity
1718 )
1819 where
1920
2021
2122import Prelude hiding (length, maybe, negate)
2223import qualified Data.ByteString.Builder as B
24+import qualified Data.ByteString.Internal as B
2325import qualified Data.ByteString.Short as S
2426import qualified Data.Set as Set
2527import qualified Data.Text as Text
2628import qualified Data.Text.Encoding as Text
29+import Data.Word (Word8)
30+import Foreign.ForeignPtr (ForeignPtr)
2731
2832
2933
@@ -64,6 +68,15 @@ toCompositeName names =
6468
6569
6670
71+-- FROM PARSER
72+
73+
74+fromForeignPtr :: ForeignPtr Word8 -> Int -> Int -> Name
75+fromForeignPtr fptr offset len =
76+ Text.decodeUtf8 (B.PS fptr offset len)
77+
78+
79+
6780-- COMMON NAMES
6881
6982
@@ -112,6 +125,11 @@ tuple :: Name
112125tuple = "Tuple"
113126
114127
128+{-# NOINLINE jsArray #-}
129+jsArray :: Name
130+jsArray = "JsArray"
131+
132+
115133{-# NOINLINE task #-}
116134task :: Name
117135task = "Task"
@@ -195,3 +213,8 @@ main = "main"
195213{-# NOINLINE dollar #-}
196214dollar :: Name
197215dollar = "$"
216+
217+
218+{-# NOINLINE identity #-}
219+identity :: Name
220+identity = "identity"
src/Parse/Primitives/Kernel.hs+2−3
@@ -9,7 +9,6 @@ module Parse.Primitives.Kernel
99
1010import Prelude hiding (length)
1111import qualified Data.ByteString.Internal as B
12−import qualified Data.Text.Encoding as Text
1312import Data.Text (Text)
1413import Data.Word (Word8)
1514import Foreign.ForeignPtr (ForeignPtr)
@@ -96,10 +95,10 @@ chompSpecial fp offset terminal row col jsOffset =
9695
9796 !special =
9897 if word == 0x24 {- $ -} then
99− ElmField (Text.decodeUtf8 (B.PS fp offset (newOffset - offset)))
98+ ElmField (N.fromForeignPtr fp offset (newOffset - offset))
10099
101100 else
102− let !name = Text.decodeUtf8 (B.PS fp tagOffset (newOffset - tagOffset)) in
101+ let !name = N.fromForeignPtr fp tagOffset (newOffset - tagOffset) in
103102 if 0x30 <= word && word <= 0x39 then
104103 Enum (fromIntegral (word - 0x30)) name
105104
src/Parse/Primitives/Shader.hs+2−3
@@ -7,12 +7,11 @@ module Parse.Primitives.Shader
77 where
88
99
10−import qualified Data.ByteString.Internal as B
1110import qualified Data.Text as Text
12−import qualified Data.Text.Encoding as Text
1311import Foreign.ForeignPtr (ForeignPtr)
1412import GHC.Word (Word8)
1513
14+import qualified Elm.Name as N
1615import Parse.Primitives.Internals (Parser(..), State(..), noError)
1716import qualified Parse.Primitives.Internals as I
1817import qualified Parse.Primitives.Symbol as Symbol
@@ -40,7 +39,7 @@ block =
4039 Ok newOffset newRow newCol ->
4140 let
4241 !size = newOffset - offset
43− !shader = Text.decodeUtf8 (B.PS fp offset size)
42+ !shader = N.fromForeignPtr fp offset size
4443 !newState = State fp (newOffset + 2) terminal indent newRow newCol ctx
4544 in
4645 cok shader newState noError
src/Parse/Primitives/Symbol.hs+2−2
@@ -19,10 +19,10 @@ import qualified Data.Map as Map
1919import qualified Data.IntSet as IntSet
2020import qualified Data.Vector as Vector
2121import Data.Text (Text)
22−import qualified Data.Text.Encoding as Text
2322import Foreign.ForeignPtr (ForeignPtr)
2423import GHC.Word (Word8)
2524
25+import qualified Elm.Name as N
2626import Parse.Primitives.Internals (Parser(..), State(..), expect, noError, oneOf)
2727import qualified Parse.Primitives.Internals as I
2828import qualified Parse.Primitives.Variable as Var
@@ -65,7 +65,7 @@ binop =
6565
6666 else
6767 let !length = newOffset - offset in
68− case Text.decodeUtf8 (B.PS fp offset length) of
68+ case N.fromForeignPtr fp offset length of
6969 "." -> cerr (E.ParseError row col (E.BadOp Dot ctx))
7070 "|" -> cerr (E.ParseError row col (E.BadOp Pipe ctx))
7171 "->" -> cerr (E.ParseError row col (E.BadOp Arrow ctx))