git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Disallow array index and object property updates in blocks.
commit23025940cf06b8c46b8dbc96d2862d0996dc201f authorPhil Freeman <paf31@cantab.net> dateWed 30 Oct 2013, 15:58 (13 years ago) parent6d5d974
6 files changed+14−54
examples/passing/NamedPatterns.ps+1−4 src/PureScript/CodeGen/JS.hs+1−6 src/PureScript/CodeGen/Pretty/Values.hs+2−8 src/PureScript/Parser/Values.hs+1−7 src/PureScript/TypeChecker/Types.hs+7−22 src/PureScript/Values.hs+2−7
examples/passing/NamedPatterns.ps+1−4
@@ -1,6 +1,3 @@
11foo = \x -> case x of
22 y@{ foo = "Foo" } -> y
3− y -> (do
4− var copy = y
5− copy.foo = "Bar"
6− return copy)
3+ y -> y
src/PureScript/CodeGen/JS.hs+1−6
@@ -201,7 +201,7 @@ objectPropertyToJs (key, value) = key ++ ":" ++ valueToJs value
201201
202202statementToJs :: Statement -> String
203203statementToJs (VariableIntroduction ident value) = "var " ++ identToJs ident ++ " = " ++ valueToJs value
204−statementToJs (Assignment target value) = assignmentTargetToJs target ++ " = " ++ valueToJs value
204+statementToJs (Assignment target value) = identToJs target ++ " = " ++ valueToJs value
205205statementToJs (While cond sts) = "while ("
206206 ++ valueToJs cond ++ ") {"
207207 ++ intercalate ";" (map statementToJs sts) ++ "}"
@@ -226,8 +226,3 @@ ifStatementToJs (IfStatement cond thens elst) =
226226elseStatementToJs :: ElseStatement -> String
227227elseStatementToJs (Else sts) = " else {" ++ intercalate ";" (map statementToJs sts) ++ "}"
228228elseStatementToJs (ElseIf ifst) = " else " ++ ifStatementToJs ifst
229−
230−assignmentTargetToJs :: AssignmentTarget -> String
231−assignmentTargetToJs (AssignVariable ident) = identToJs ident
232−assignmentTargetToJs (AssignArrayIndex index tgt) = assignmentTargetToJs tgt ++ "[" ++ valueToJs index ++ "]"
233−assignmentTargetToJs (AssignObjectProperty prop tgt) = assignmentTargetToJs tgt ++ "." ++ prop
src/PureScript/CodeGen/Pretty/Values.hs+2−8
@@ -14,8 +14,7 @@
1414
1515module PureScript.CodeGen.Pretty.Values (
1616 prettyPrintValue,
17− prettyPrintBinder,
18− prettyPrintAssignmentTarget
17+ prettyPrintBinder
1918) where
2019
2120import Data.Char
@@ -155,7 +154,7 @@ prettyPrintObjectProperty key value = key ++ ": " ++ prettyPrintValue value
155154
156155prettyPrintStatement :: Statement -> String
157156prettyPrintStatement (VariableIntroduction ident value) = "var " ++ show ident ++ " = " ++ prettyPrintValue value
158−prettyPrintStatement (Assignment target value) = prettyPrintAssignmentTarget target ++ " = " ++ prettyPrintValue value
157+prettyPrintStatement (Assignment target value) = show target ++ " = " ++ prettyPrintValue value
159158prettyPrintStatement (While cond sts) = "while " ++ prettyPrintValue cond ++ ": {" ++ intercalate ";" (map prettyPrintStatement sts) ++ " }"
160159prettyPrintStatement (For ident start end sts) = "for " ++ show ident
161160 ++ " <- " ++ prettyPrintValue start
@@ -177,8 +176,3 @@ prettyPrintIfStatement (IfStatement cond thens elst) =
177176prettyPrintElseStatement :: ElseStatement -> String
178177prettyPrintElseStatement (Else sts) = "else: {" ++ intercalate "; " (map prettyPrintStatement sts) ++ " }"
179178prettyPrintElseStatement (ElseIf ifst) = "else " ++ prettyPrintIfStatement ifst
180−
181−prettyPrintAssignmentTarget :: AssignmentTarget -> String
182−prettyPrintAssignmentTarget (AssignVariable ident) = identToJs ident
183−prettyPrintAssignmentTarget (AssignArrayIndex index tgt) = prettyPrintAssignmentTarget tgt ++ "[" ++ prettyPrintValue index ++ "]"
184−prettyPrintAssignmentTarget (AssignObjectProperty prop tgt) = prettyPrintAssignmentTarget tgt ++ "." ++ prop
src/PureScript/Parser/Values.hs+1−7
@@ -178,7 +178,7 @@ parseVariableIntroduction = do
178178
179179parseAssignment :: P.Parsec String ParseState Statement
180180parseAssignment = do
181− tgt <- parseAssignmentTarget
181+ tgt <- C.parseIdent
182182 C.lexeme $ C.indented *> P.char '='
183183 value <- parseValue
184184 return $ Assignment tgt value
@@ -279,9 +279,3 @@ parseBinder = P.choice (map P.try
279279
280280parseGuardedBinder :: P.Parsec String ParseState Binder
281281parseGuardedBinder = flip ($) <$> parseBinder <*> P.option id (GuardedBinder <$> (C.indented *> C.lexeme (P.char '|') *> C.indented *> parseValue))
282−
283−parseAssignmentTarget :: P.Parsec String ParseState AssignmentTarget
284−parseAssignmentTarget = buildExpressionParser operators (AssignVariable <$> C.parseIdent)
285− where
286− operators = [ [ Postfix $ AssignArrayIndex <$> (C.indented *> C.squares parseValue)
287− , Postfix $ AssignObjectProperty <$> (C.indented *> C.dot *> C.indented *> C.identifier) ] ]
src/PureScript/TypeChecker/Types.hs+7−22
@@ -48,12 +48,12 @@ import qualified Data.Map as M
4848data TypeConstraintOrigin
4949 = ValueOrigin Value
5050 | BinderOrigin Binder
51− | AssignmentTargetOrigin AssignmentTarget deriving (Show, D.Data, D.Typeable)
51+ | AssignmentTargetOrigin Ident deriving (Show, D.Data, D.Typeable)
5252
5353prettyPrintOrigin :: TypeConstraintOrigin -> String
5454prettyPrintOrigin (ValueOrigin val) = prettyPrintValue val
5555prettyPrintOrigin (BinderOrigin binder) = prettyPrintBinder binder
56−prettyPrintOrigin (AssignmentTargetOrigin assign) = prettyPrintAssignmentTarget assign
56+prettyPrintOrigin (AssignmentTargetOrigin ident) = show ident
5757
5858data TypeConstraint
5959 = TypeConstraint Int Type TypeConstraintOrigin
@@ -428,10 +428,12 @@ typeConstraintsForStatement m mass ret (VariableIntroduction name val) = do
428428 assignVariable name (m `M.union` mass)
429429 (cs1, n1) <- typeConstraints m val
430430 return $ (cs1, False, M.insert name n1 mass)
431−typeConstraintsForStatement m mass ret (Assignment tgt val) = do
431+typeConstraintsForStatement m mass ret (Assignment ident val) = do
432432 (cs1, n1) <- typeConstraints m val
433− cs2 <- typeConstraintsForAssignmentTarget m mass n1 tgt
434− return (cs1 ++ cs2, False, mass)
433+ case M.lookup ident mass of
434+ Nothing -> throwError $ "No local variable with name " ++ show ident
435+ Just ty -> do
436+ return (TypeConstraint n1 (TUnknown ty) (AssignmentTargetOrigin ident) : cs1, False, mass)
435437typeConstraintsForStatement m mass ret (While val inner) = do
436438 (cs1, n1) <- typeConstraints m val
437439 (cs2, allCodePathsReturn, _) <- typeConstraintsForBlock m mass ret inner
@@ -477,23 +479,6 @@ typeConstraintsForElseStatement m mass ret (ElseIf ifst) = do
477479 (cs, allCodePathsReturn) <- typeConstraintsForIfStatement m mass ret ifst
478480 return (cs, allCodePathsReturn)
479481
480−typeConstraintsForAssignmentTarget :: M.Map Ident Int -> M.Map Ident Int -> Int -> AssignmentTarget -> Check [TypeConstraint]
481−typeConstraintsForAssignmentTarget m mass nval a@(AssignVariable var) =
482− case M.lookup var mass of
483− Nothing -> throwError $ "No local variable with name " ++ show var
484− Just ty -> do
485− return [TypeConstraint nval (TUnknown ty) (AssignmentTargetOrigin a)]
486−typeConstraintsForAssignmentTarget m mass nval a@(AssignArrayIndex index tgt) = do
487− arr <- fresh
488− (cs1, n1) <- typeConstraints (m `M.union` mass) index
489− cs2 <- typeConstraintsForAssignmentTarget m mass arr tgt
490− return $ (TypeConstraint arr (Array (TUnknown nval)) (AssignmentTargetOrigin a)) : (TypeConstraint n1 Number (ValueOrigin index)) : cs1 ++ cs2
491−typeConstraintsForAssignmentTarget m mass nval a@(AssignObjectProperty prop tgt) = do
492− obj <- fresh
493− row <- fresh
494− cs <- typeConstraintsForAssignmentTarget m mass obj tgt
495− return $ (TypeConstraint obj (Object (RCons prop (TUnknown nval) $ RUnknown row)) (AssignmentTargetOrigin a)) : cs
496−
497482typeConstraintsForBlock :: M.Map Ident Int -> M.Map Ident Int -> Int -> [Statement] -> Check ([TypeConstraint], Bool, M.Map Ident Int)
498483typeConstraintsForBlock _ mass _ [] = return ([], False, mass)
499484typeConstraintsForBlock m mass ret (s:ss) = do
src/PureScript/Values.hs+2−7
@@ -69,7 +69,7 @@ data Value
6969
7070data Statement
7171 = VariableIntroduction Ident Value
72− | Assignment AssignmentTarget Value
72+ | Assignment Ident Value
7373 | While Value [Statement]
7474 | For Ident Value Value [Statement]
7575 | ForEach Ident Value [Statement]
@@ -91,11 +91,6 @@ data Binder
9191 | NullaryBinder String
9292 | UnaryBinder String Binder
9393 | ObjectBinder [(String, Binder)]
94− | ArrayBinder [Binder] (Maybe Binder)
94+ | ArrayBinder [Binder] (Maybe Binder)
9595 | NamedBinder Ident Binder
9696 | GuardedBinder Value Binder deriving (Show, Data, Typeable)
97−
98−data AssignmentTarget
99− = AssignVariable Ident
100− | AssignObjectProperty String AssignmentTarget
101− | AssignArrayIndex Value AssignmentTarget deriving (Show, Data, Typeable)