Skip to content

Commit 324b4e9

Browse files
authored
feat(#500): generalise _ to ancestors (#534)
* fix(test): lazy * feat(#500): generalise _ to ancestors * fix: use rootmodspec when normalising submodules * test(#500): generalised _
1 parent 838e004 commit 324b4e9

File tree

5 files changed

+255
-7
lines changed

5 files changed

+255
-7
lines changed

src/AST.hs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ import Crypto.Hash
138138
import qualified Data.Binary
139139
import qualified Data.ByteString.Lazy as BL
140140
import Data.List as List
141-
import Data.List.Extra (nubOrd,splitOn, disjoint)
141+
import Data.List.Extra (nubOrd,splitOn, disjoint, dropEnd)
142142
import Data.Map as Map
143143
import Data.Maybe
144144
import Data.Set as Set
@@ -1466,10 +1466,9 @@ refersTo :: Ord b => ModSpec -> Ident ->
14661466
(b -> ModSpec) -> Compiler (Set b)
14671467
refersTo modspec name implMapFn specModFn = do
14681468
currMod <- getModuleSpec
1469-
let modspec' = if not (List.null modspec)
1470-
&& head modspec == currentModuleAlias
1471-
then currMod ++ tail modspec
1472-
else modspec
1469+
let modspec' = case span (== currentModuleAlias) modspec of
1470+
([], _) -> modspec
1471+
(prefix, unaliased) -> dropEnd (length prefix - 1) currMod ++ unaliased
14731472
logAST $ "Finding visible symbol " ++ maybeModPrefix modspec' ++
14741473
name ++ " from module " ++ showModSpec currMod
14751474
defined <- getModuleImplementationField

src/Normalise.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,9 @@ normaliseSubmodule name vis pos items = do
162162
alreadyExists <- isJust <$> getLoadingModule subModSpec
163163
if alreadyExists
164164
then reenterModule subModSpec
165-
else enterModule parentOrigin subModSpec (Just parentModSpec)
165+
else do
166+
root <- getModule modRootModSpec
167+
enterModule parentOrigin subModSpec root
166168
-- submodule always imports parent module
167169
updateImplementation $ \i -> i { modNestedIn = Just parentModSpec }
168170
addImport parentModSpec (importSpec Nothing Private)
Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
1+
======================================================================
2+
AFTER EVERYTHING:
3+
4+
5+
--------------------------------------------------
6+
Module ancestor_alias
7+
representation : (not a type)
8+
public submods : a -> ancestor_alias.a
9+
b -> ancestor_alias.b
10+
c -> ancestor_alias.b.c
11+
public resources:
12+
public procs : ancestor_alias.<0>
13+
ancestor_alias.a.<0>
14+
ancestor_alias.a.foo<0>
15+
ancestor_alias.b.<0>
16+
ancestor_alias.b.a.foo<0>
17+
ancestor_alias.b.c.<0>
18+
ancestor_alias.b.c.foo<0>
19+
imports : public use ancestor_alias.a
20+
public use ancestor_alias.b
21+
use wybe
22+
resources :
23+
submodules : ancestor_alias.a, ancestor_alias.b
24+
procs :
25+
26+
module top-level code > public {inline,semipure} (0 calls)
27+
0: ancestor_alias.<0>
28+
()<{}; {}; {}>:
29+
AliasPairs: []
30+
InterestingCallProperties: []
31+
ancestor_alias.b.a.foo<0> #0 @ancestor_alias:nn:nn
32+
ancestor_alias.b.a.foo<0> #1 @ancestor_alias:nn:nn
33+
ancestor_alias.a.foo<0> #2 @ancestor_alias:nn:nn
34+
35+
LLVM code :
36+
37+
;; FILE GENERATED BY wybemk 0.2 -- see https://github.com/pschachte/wybe
38+
; ModuleID = 'ancestor_alias'
39+
40+
source_filename = "!ROOT!/final-dump/ancestor_alias.wybe"
41+
target triple ????
42+
43+
44+
declare external ccc void @llvm.memcpy.p0.p0.i64(ptr, ptr, i64, i1)
45+
46+
define external fastcc void @"ancestor_alias.<0>"() {
47+
tail call fastcc void @"ancestor_alias.b.a.foo<0>"()
48+
tail call fastcc void @"ancestor_alias.b.a.foo<0>"()
49+
tail call fastcc void @"ancestor_alias.a.foo<0>"()
50+
ret void
51+
}
52+
53+
--------------------------------------------------
54+
Module ancestor_alias.a
55+
representation : (not a type)
56+
public submods :
57+
public resources:
58+
public procs : ancestor_alias.a.<0>
59+
ancestor_alias.a.foo<0>
60+
imports : use ancestor_alias
61+
use wybe
62+
resources :
63+
procs :
64+
65+
module top-level code > public {inline,semipure} (0 calls)
66+
0: ancestor_alias.a.<0>
67+
()<{}; {}; {}>:
68+
AliasPairs: []
69+
InterestingCallProperties: []
70+
ancestor_alias.b.c.foo<0> #0 @ancestor_alias:nn:nn
71+
ancestor_alias.a.foo<0> #1 @ancestor_alias:nn:nn
72+
73+
74+
proc foo > public {noinline,impure} (1 calls)
75+
0: ancestor_alias.a.foo<0>
76+
foo()<{}; {}; {}>:
77+
AliasPairs: []
78+
InterestingCallProperties: []
79+
80+
LLVM code :
81+
82+
;; FILE GENERATED BY wybemk 0.2 -- see https://github.com/pschachte/wybe
83+
; ModuleID = 'ancestor_alias.a'
84+
85+
source_filename = "!ROOT!/final-dump/ancestor_alias.wybe"
86+
target triple ????
87+
88+
89+
declare external ccc void @llvm.memcpy.p0.p0.i64(ptr, ptr, i64, i1)
90+
91+
define external fastcc void @"ancestor_alias.a.<0>"() {
92+
tail call fastcc void @"ancestor_alias.b.c.foo<0>"()
93+
tail call fastcc void @"ancestor_alias.a.foo<0>"()
94+
ret void
95+
}
96+
97+
define external fastcc void @"ancestor_alias.a.foo<0>"() {
98+
ret void
99+
}
100+
101+
--------------------------------------------------
102+
Module ancestor_alias.b
103+
representation : (not a type)
104+
public submods : a -> ancestor_alias.b.a
105+
c -> ancestor_alias.b.c
106+
public resources:
107+
public procs : ancestor_alias.b.<0>
108+
ancestor_alias.b.a.foo<0>
109+
ancestor_alias.b.c.<0>
110+
ancestor_alias.b.c.foo<0>
111+
imports : use ancestor_alias
112+
public use ancestor_alias.b.a
113+
public use ancestor_alias.b.c
114+
use wybe
115+
resources :
116+
submodules : ancestor_alias.b.a, ancestor_alias.b.c
117+
procs :
118+
119+
module top-level code > public {inline,semipure} (0 calls)
120+
0: ancestor_alias.b.<0>
121+
()<{}; {}; {}>:
122+
AliasPairs: []
123+
InterestingCallProperties: []
124+
ancestor_alias.b.a.foo<0> #0 @ancestor_alias:nn:nn
125+
ancestor_alias.a.foo<0> #1 @ancestor_alias:nn:nn
126+
127+
LLVM code :
128+
129+
;; FILE GENERATED BY wybemk 0.2 -- see https://github.com/pschachte/wybe
130+
; ModuleID = 'ancestor_alias.b'
131+
132+
source_filename = "!ROOT!/final-dump/ancestor_alias.wybe"
133+
target triple ????
134+
135+
136+
declare external ccc void @llvm.memcpy.p0.p0.i64(ptr, ptr, i64, i1)
137+
138+
define external fastcc void @"ancestor_alias.b.<0>"() {
139+
tail call fastcc void @"ancestor_alias.b.a.foo<0>"()
140+
tail call fastcc void @"ancestor_alias.a.foo<0>"()
141+
ret void
142+
}
143+
144+
--------------------------------------------------
145+
Module ancestor_alias.b.a
146+
representation : (not a type)
147+
public submods :
148+
public resources:
149+
public procs : ancestor_alias.b.a.foo<0>
150+
imports : use ancestor_alias.b
151+
use wybe
152+
resources :
153+
procs :
154+
155+
proc foo > public {noinline,impure} (0 calls)
156+
0: ancestor_alias.b.a.foo<0>
157+
foo()<{}; {}; {}>:
158+
AliasPairs: []
159+
InterestingCallProperties: []
160+
161+
LLVM code :
162+
163+
;; FILE GENERATED BY wybemk 0.2 -- see https://github.com/pschachte/wybe
164+
; ModuleID = 'ancestor_alias.b.a'
165+
166+
source_filename = "!ROOT!/final-dump/ancestor_alias.wybe"
167+
target triple ????
168+
169+
170+
declare external ccc void @llvm.memcpy.p0.p0.i64(ptr, ptr, i64, i1)
171+
172+
define external fastcc void @"ancestor_alias.b.a.foo<0>"() {
173+
ret void
174+
}
175+
176+
--------------------------------------------------
177+
Module ancestor_alias.b.c
178+
representation : (not a type)
179+
public submods :
180+
public resources:
181+
public procs : ancestor_alias.b.c.<0>
182+
ancestor_alias.b.c.foo<0>
183+
imports : use ancestor_alias.b
184+
use wybe
185+
resources :
186+
procs :
187+
188+
module top-level code > public {inline,semipure} (0 calls)
189+
0: ancestor_alias.b.c.<0>
190+
()<{}; {}; {}>:
191+
AliasPairs: []
192+
InterestingCallProperties: []
193+
ancestor_alias.b.c.foo<0> #0 @ancestor_alias:nn:nn
194+
ancestor_alias.b.a.foo<0> #1 @ancestor_alias:nn:nn
195+
ancestor_alias.a.foo<0> #2 @ancestor_alias:nn:nn
196+
197+
198+
proc foo > public {noinline,impure} (1 calls)
199+
0: ancestor_alias.b.c.foo<0>
200+
foo()<{}; {}; {}>:
201+
AliasPairs: []
202+
InterestingCallProperties: []
203+
204+
LLVM code :
205+
206+
;; FILE GENERATED BY wybemk 0.2 -- see https://github.com/pschachte/wybe
207+
; ModuleID = 'ancestor_alias.b.c'
208+
209+
source_filename = "!ROOT!/final-dump/ancestor_alias.wybe"
210+
target triple ????
211+
212+
213+
declare external ccc void @llvm.memcpy.p0.p0.i64(ptr, ptr, i64, i1)
214+
215+
define external fastcc void @"ancestor_alias.b.c.<0>"() {
216+
tail call fastcc void @"ancestor_alias.b.c.foo<0>"()
217+
tail call fastcc void @"ancestor_alias.b.a.foo<0>"()
218+
tail call fastcc void @"ancestor_alias.a.foo<0>"()
219+
ret void
220+
}
221+
222+
define external fastcc void @"ancestor_alias.b.c.foo<0>"() {
223+
ret void
224+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
pub module a {
2+
pub def {noinline, impure} foo() { pass }
3+
!_._.b.c.foo
4+
!_.foo
5+
}
6+
7+
pub module b {
8+
pub module a {
9+
pub def {noinline, impure} foo { pass }
10+
}
11+
pub module c {
12+
pub def {noinline, impure} foo() { pass }
13+
!_.foo
14+
!_._.a.foo
15+
!_._._.a.foo
16+
}
17+
!_.a.foo
18+
!_._.a.foo
19+
}
20+
21+
!_.b.a.foo
22+
!b.a.foo
23+
!_.a.foo

test-cases/final-dump/lazy.exp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ define external fastcc i64 @"lazy.#anon#1<0>"() {
102102
ret i64 42
103103
}
104104

105-
define external fastcc i64 @"lazy.#anon#1<1>"(i64 %"#env##0") {
105+
define external fastcc i64 @"lazy.#anon#1<1>"(ptr %"#env##0") {
106106
%"tmp#0##0" = tail call fastcc i64 @"wybe.string.c_string<0>"(i64 ptrtoint( ptr @"string#5" to i64 ))
107107
call ccc void @log_string(i64 %"tmp#0##0")
108108
call ccc void @sleep(i64 1)

0 commit comments

Comments
 (0)