1
1
import core.thread ;
2
2
import core.sys.posix.sys.mman ;
3
3
4
+ version (LDC ) import ldc.attributes;
5
+ else struct optStrategy { string a; }
6
+
4
7
// this should be true for most architectures
5
8
// (taken from core.thread)
6
9
version = StackGrowsDown;
7
10
8
11
enum stackSize = 4096 ;
9
12
10
13
// Simple method that causes a stack overflow
14
+ @optStrategy(" none" )
11
15
void stackMethod ()
12
16
{
13
17
// Over the stack size, so it overflows the stack
@@ -21,18 +25,15 @@ void main()
21
25
// allocate a page below (above) the fiber's stack to make stack overflows possible (w/o segfaulting)
22
26
version (StackGrowsDown)
23
27
{
24
- static assert (__traits(identifier, test_fiber.tupleof[8 ]) == " m_pmem" );
25
- auto stackBottom = test_fiber.tupleof[8 ];
28
+ auto stackBottom = __traits(getMember, test_fiber, " m_pmem" );
26
29
auto p = mmap(stackBottom - 8 * stackSize, 8 * stackSize,
27
30
PROT_READ | PROT_WRITE , MAP_PRIVATE | MAP_ANON , - 1 , 0 );
28
31
assert (p ! is null , " failed to allocate page" );
29
32
}
30
33
else
31
34
{
32
- auto m_sz = test_fiber.tupleof[7 ];
33
- auto m_pmem = test_fiber.tupleof[8 ];
34
- static assert (__traits(identifier, test_fiber.tupleof[7 ]) == " m_size" );
35
- static assert (__traits(identifier, test_fiber.tupleof[8 ]) == " m_pmem" );
35
+ auto m_sz = __traits(getMember, test_fiber, " m_sz" );
36
+ auto m_pmem = __traits(getMember, test_fiber, " m_pmem" );
36
37
37
38
auto stackTop = m_pmem + m_sz;
38
39
auto p = mmap(stackTop, 8 * stackSize,
0 commit comments