Skip to content

Commit 261ea83

Browse files
committed
Added more test, removed id-function check
1 parent 52ae85f commit 261ea83

11 files changed

+98
-36
lines changed

src/back/CodeGen/CCodeNames.hs

-4
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,6 @@ isEncoreArgT :: CCode Ty -> Bool
6262
isEncoreArgT (Typ "encore_arg_t") = True
6363
isEncoreArgT _ = False
6464

65-
isIdFun :: ID.Name -> Bool
66-
isIdFun (ID.Name "_id_fun_tmp") = True
67-
isIdFun _ = False
68-
6965
ponyMsgT :: CCode Ty
7066
ponyMsgT = Typ "pony_msg_t"
7167

src/back/CodeGen/Closure.hs

+5-14
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,6 @@ translateClosure closure typeVars table
5151
freeVars = map (first ID.qnlocal) $
5252
filter (ID.isLocalQName . fst) $
5353
Util.freeVariables boundVars body
54-
-- freeVarsForwarding = freeVars ++ [(ID.Name "_enc__field_fut", future)]
55-
-- freeVarsForwarding = if freeVars then True else False--freeVars ++ [(future, Var "_enc__field_fut")]
5654
fTypeVars = typeVars `intersect` Util.freeTypeVars body
5755
encEnvNames = map fst freeVars
5856
envNames = map (AsLval . fieldName) encEnvNames
@@ -85,9 +83,7 @@ translateClosure closure typeVars table
8583
[(Ptr (Ptr encoreCtxT), encoreCtxVar),
8684
(Ptr (Ptr ponyTypeT), encoreRuntimeType),
8785
(Typ "value_t", Var "_args[]"),
88-
(Ptr void, envVar)
89-
]
90-
-- ,(future, futVar)]
86+
(Ptr void, envVar)]
9187
(Seq $
9288
dtraceClosureEntry argNames :
9389
extractArguments params ++
@@ -96,16 +92,11 @@ translateClosure closure typeVars table
9692
,dtraceClosureExit
9793
,returnStmnt forwardingBodyName unitType])
9894
in
99-
-- Concat $ [buildEnvironment envName freeVars fTypeVars,
100-
-- tracefunDecl traceName envName freeVars fTypeVars] ++
101-
-- [normalClosureImpl]
102-
-- ++
103-
Concat $ if null $ Util.filter A.isForward body
104-
then [buildEnvironmentForward envName freeVars fTypeVars,
105-
tracefunDecl traceName envName freeVars fTypeVars extractEnvironment,
95+
Concat $ [buildEnvironmentForward envName freeVars fTypeVars] ++
96+
if null $ Util.filter A.isForward body
97+
then [tracefunDecl traceName envName freeVars fTypeVars extractEnvironment,
10698
normalClosureImpl]
107-
else [buildEnvironmentForward envName freeVars fTypeVars,
108-
tracefunDecl traceName envName freeVars fTypeVars extractEnvironmentForward,
99+
else [tracefunDecl traceName envName freeVars fTypeVars extractEnvironmentForward,
109100
forwardingClosureImpl]
110101
| otherwise =
111102
error

src/back/CodeGen/Expr.hs

+5-6
Original file line numberDiff line numberDiff line change
@@ -1020,7 +1020,7 @@ instance Translatable A.Expr (State Ctx.Context (CCode Lval, CCode Stat)) where
10201020
callTheMethodOneway
10211021
ntarget targetType name args typeArguments Ty.unitType
10221022

1023-
let nullCheck = targetNullCheck ntarget target name emeta "."
1023+
let nullCheck = targetNullCheck ntarget target name emeta "!"
10241024
result =
10251025
case eCtx of
10261026
Ctx.ClosureContext clos -> []
@@ -1064,7 +1064,7 @@ instance Translatable A.Expr (State Ctx.Context (CCode Lval, CCode Stat)) where
10641064
Ctx.ClosureContext clos -> []
10651065
_ -> [dtraceExit, Return Skip]
10661066
futureChain =
1067-
if Util.isForwardInClos chain
1067+
if Util.isForwardInExpr chain
10681068
then
10691069
Call futureChainActor
10701070
[AsExpr encoreCtxVar, AsExpr nfuture, ty, AsExpr nchain]
@@ -1154,7 +1154,7 @@ instance Translatable A.Expr (State Ctx.Context (CCode Lval, CCode Stat)) where
11541154
(Call futureChainActor
11551155
[AsExpr encoreCtxVar, AsExpr nfuture, ty, AsExpr nchain]
11561156
))] ++
1157-
if (Util.isForwardInClos chain) then [assignVar futNam (Nam result)]
1157+
if (Util.isForwardInExpr chain) then [assignVar futNam (Nam result)]
11581158
else [])
11591159
where
11601160
metaId = Meta.getMetaId . A.getMeta $ chain
@@ -1169,7 +1169,6 @@ instance Translatable A.Expr (State Ctx.Context (CCode Lval, CCode Stat)) where
11691169
let bound = map (ID.qLocal . A.pname) eparams
11701170
freeVars = filter (ID.isLocalQName . fst) $
11711171
Util.freeVariables bound body
1172-
isIdClosure = not . null $ filter (isIdFun . A.pname) eparams
11731172
ty = runtimeType . A.getType $ body
11741173
futArg = if isAsyncForward
11751174
then futVar
@@ -1179,11 +1178,11 @@ instance Translatable A.Expr (State Ctx.Context (CCode Lval, CCode Stat)) where
11791178
(Var tmp,
11801179
Seq $
11811180
mkEnv envName : fillEnv ++
1182-
(if isIdClosure || isAsyncForward || (not $ Util.isForwardInClos body)
1181+
(if isAsyncForward || (not $ Util.isForwardInExpr body)
11831182
then []
11841183
else [Assign (Decl (future, Var fut))
11851184
(Call futureMkFn [AsExpr encoreCtxVar, ty])]) ++
1186-
(if (not isIdClosure) && (Util.isForwardInClos body)
1185+
(if Util.isForwardInExpr body
11871186
then [assignVar futNam futArg]
11881187
else []) ++
11891188
[Assign (Decl (closure, Var tmp))

src/back/CodeGen/MethodDecl.hs

+2-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ translateGeneral mdecl@(A.Method {A.mbody, A.mlocals})
7777
,parametricMethodTypeVars
7878
,extractTypeVars
7979
,forwardingBody
80-
])
80+
,dtraceMethodExit thisVar mName
81+
,Return Skip])
8182
in
8283
code ++ return (Concat $ locals ++ closures ++
8384
[normalMethodImpl] ++

src/ir/AST/Util.hs

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ module AST.Util(
1919
, markStatsInBody
2020
, isStatement
2121
, isForwardMethod
22-
, isForwardInClos
22+
, isForwardInExpr
2323
) where
2424

2525
import qualified Data.List as List
@@ -482,5 +482,5 @@ mark asParent s =
482482
isForwardMethod :: MethodDecl -> Bool
483483
isForwardMethod mdecl = not . null . (filter isForward) . mbody $ mdecl
484484

485-
isForwardInClos :: Expr -> Bool
486-
isForwardInClos e = not . null $ filter isForward e
485+
isForwardInExpr :: Expr -> Bool
486+
isForwardInExpr e = not . null $ filter isForward e
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
-- Test with polymorphic type
2+
active class Base[t]
3+
var v : t
4+
def init(v : t) : unit
5+
this.v = v
6+
end
7+
def base() : t
8+
this.v
9+
end
10+
end
11+
active class Foo[sharable ty]
12+
def foo(arg : Fut[ty]) : ty
13+
get(arg ~~> fun(x : ty) : ty => forward((new Base[ty](x)) ! base()))
14+
end
15+
end
16+
17+
active class Main
18+
def main() : unit
19+
val arg = (new Base[int](42)) ! base()
20+
println("{}", get((new Foo[int]) ! foo(arg)))
21+
end
22+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
local class Rock[sharable t]
2+
def roll(b : bool, v : t, r : t) : Fut[t]
3+
((new Lazy[t]) ! lazyWork(b, v, r))
4+
end
5+
end
6+
7+
active class Worker[t]
8+
val v : t
9+
def init(v : t) : unit
10+
this.v = v
11+
end
12+
def work() : t
13+
this.v
14+
end
15+
end
16+
17+
active class Lazy[sharable t]
18+
def lazyWork(b : bool, v : t, r : t) : t
19+
if b then
20+
forward((new Worker[t](v)) ! work())
21+
else
22+
r
23+
end
24+
println("This should never run!")
25+
r
26+
end
27+
end
28+
29+
active class Main
30+
def main() : unit
31+
println(get((new Lazy[String]) ! lazyWork(true, "42.0", "100.0")))
32+
println(get((new Lazy[real]) ! lazyWork(true, 42.0, 100.0)))
33+
println(get((new Lazy[int]) ! lazyWork(true, 42, 100)))
34+
println(get((new Lazy[bool]) ! lazyWork(true, true, false)))
35+
println(get((new Lazy[Maybe[int]]) ! lazyWork(true, Just(42), Just(100))))
36+
-- Tested with passive class
37+
println(get((new Rock[int]).roll(true, 42, 100)))
38+
end
39+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
42.0
2+
42.000000
3+
42
4+
true
5+
Just 42
6+
42

src/types/Typechecker/TypeError.hs

+5
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,7 @@ data Error =
295295
| ForwardInPassiveContext Type
296296
| ForwardInFunction
297297
| ForwardTypeError Type Type
298+
| ForwardTypeClosError Type Type
298299
| CannotHaveModeError Type
299300
| ModelessError Type
300301
| ModeOverrideError Type
@@ -724,6 +725,10 @@ instance Show Error where
724725
printf ("Returned type %s of forward should match with " ++
725726
"the result type of the containing method %s")
726727
(show retType) (show ty)
728+
show (ForwardTypeClosError retType ty) =
729+
printf ("Returned type %s of forward should match with " ++
730+
"the result type of the closure %s")
731+
(show retType) (show ty)
727732
show (ForwardInPassiveContext cname) =
728733
printf "Forward can not be used in passive class '%s'"
729734
(show cname)

src/types/Typechecker/Typechecker.hs

+10-8
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ import Control.Arrow((&&&), second)
2424
import Identifiers
2525
import AST.AST hiding (hasType, getType)
2626
import qualified AST.AST as AST (getType)
27-
import qualified AST.Util as Util (freeVariables, filter, markStatsInBody, isStatement)
27+
import qualified AST.Util as Util (freeVariables, filter, markStatsInBody,
28+
isStatement, isForwardInExpr)
2829
import AST.PrettyPrinter
2930
import AST.Util(extend)
3031
import Types as Ty
@@ -458,7 +459,7 @@ instance Checkable ClassDecl where
458459
typeParameters = getTypeParameters cname
459460
addTypeVars = addTypeParameters typeParameters
460461
addThis = extendEnvironmentImmutable [(thisName, cname)]
461-
isForwardMethod m@Method{mbody} = not . null $ Util.filter isForward mbody
462+
isForwardMethod m@Method{mbody} = Util.isForwardInExpr mbody
462463

463464
checkMethodExtensionAllowed
464465
| isModeless cname = do
@@ -1261,13 +1262,14 @@ instance Checkable Expr where
12611262
context <- asks currentExecutionContext
12621263
case context of
12631264
MethodContext mdecl -> do
1264-
let returnType = methodType mdecl
1265-
unlessM (getResultType ty `subtypeOf` returnType) $
1266-
pushError eExpr $ ForwardTypeError returnType ty
1267-
return $ setType (getResultType ty) forward {forwardExpr = eExpr}
1265+
let returnType = methodType mdecl
1266+
unlessM (getResultType ty `subtypeOf` returnType) $
1267+
pushError eExpr $ ForwardTypeError returnType ty
1268+
return $ setType (getResultType ty) forward {forwardExpr = eExpr}
12681269
ClosureContext (Just mty) -> do
1269-
unlessM (getResultType ty `subtypeOf` mty) $
1270-
pushError eExpr $ ForwardTypeError mty ty
1270+
mty' <- resolveType mty
1271+
unlessM (getResultType ty `subtypeOf` mty') $
1272+
pushError eExpr $ ForwardTypeClosError mty' ty
12711273
return $ setType (getResultType ty) forward {forwardExpr = eExpr}
12721274
ClosureContext Nothing -> tcError ClosureForwardError
12731275
_ -> pushError eExpr ForwardInFunction

0 commit comments

Comments
 (0)