FOX Garbage Collection FOX / GC Example 1 ex1: garbage at end let - - PowerPoint PPT Presentation

fox garbage collection fox gc example 1 ex1 garbage at end
SMART_READER_LITE
LIVE PREVIEW

FOX Garbage Collection FOX / GC Example 1 ex1: garbage at end let - - PowerPoint PPT Presentation

FOX Garbage Collection FOX / GC Example 1 ex1: garbage at end let x = (1, 2) , y = let tmp = (10, 20) in tmp[0] + tmp[1] , p0 = x[0] + y , p1 = x[1] + y in (p0, p1) ebp 0x00 0x04 0x08 0x0c 0x10 0x14 0x18 0x1c 0x20 0x24 esi


slide-1
SLIDE 1

FOX Garbage Collection

slide-2
SLIDE 2

FOX / GC Example 1

slide-3
SLIDE 3

0x00

let x = (1, 2) , y = let tmp = (10, 20) in tmp[0] + tmp[1] , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

ebp

0x04 0x08 0x0c 0x10 0x14 0x18 0x1c 0x20 0x24

esi

ex1: garbage at end

slide-4
SLIDE 4

1

0x00

let x = (1, 2) , y = let tmp = (10, 20) in tmp[0] + tmp[1] , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

ebp x

2

0x04 0x08 0x0c 0x10 0x14 0x18 0x1c 0x20 0x24 0x01

esi

ex1: garbage at end

slide-5
SLIDE 5

1

0x00

let x = (1, 2) , y = let tmp = (10, 20) in tmp[0] + tmp[1] , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

ebp x

2

0x04 0x08 0x0c 0x10 0x14 0x18 0x1c 0x20 0x24

10 20

0x01

tmp

0x09

esi

ex1: garbage at end

slide-6
SLIDE 6

1

0x00

let x = (1, 2) , y = let tmp = (10, 20) in tmp[0] + tmp[1] , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

ebp x

2

0x04 0x08 0x0c 0x10 0x14 0x18 0x1c 0x20 0x24

10 20

0x01

y

30

esi

ex1: garbage at end

slide-7
SLIDE 7

1

0x00

let x = (1, 2) , y = let tmp = (10, 20) in tmp[0] + tmp[1] , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

ebp x

2

0x04 0x08 0x0c 0x10 0x14 0x18 0x1c 0x20 0x24

10 20

0x01

y

30

esi p0

31

ex1: garbage at end

slide-8
SLIDE 8

1

0x00

let x = (1, 2) , y = let tmp = (10, 20) in tmp[0] + tmp[1] , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

ebp x

2

0x04 0x08 0x0c 0x10 0x14 0x18 0x1c 0x20 0x24

10 20

0x01

y

30

esi p0

31

p1

32

ex1: garbage at end

slide-9
SLIDE 9

1

0x00

let x = (1, 2) , y = let tmp = (10, 20) in tmp[0] + tmp[1] , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

ebp x

2

0x04 0x08 0x0c 0x10 0x14 0x18 0x1c 0x20 0x24

10 20

0x01

y

30

esi p0

31

p1

32

31 32 Result (eax) = 0x11

ex1: garbage at end

slide-10
SLIDE 10

0x00

let x = (1, 2) , y = let tmp = (10, 20) in tmp[0] + tmp[1] , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp esi

ex1: garbage at end

Suppose we had a smaller, 4-word heap

slide-11
SLIDE 11

0x00

let x = (1, 2) , y = let tmp = (10, 20) in tmp[0] + tmp[1] , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp x

0x01

y

30

p0

31

p1

32

1 2 10 20

esi

ex1: garbage at end

slide-12
SLIDE 12

0x00

let x = (1, 2) , y = let tmp = (10, 20) in tmp[0] + tmp[1] , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp x

0x01

y

30

p0

31

p1

32

1 2 10 20

esi

Out of memory! Can’t allocate (p0, p1)

ex1: garbage at end

slide-13
SLIDE 13

0x00

let x = (1, 2) , y = let tmp = (10, 20) in tmp[0] + tmp[1] , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp x

0x01

y

30

p0

31

p1

32

1 2 10 20

esi

(10, 20) is “garbage”

Q: How to determine if cell is garbage?

ex1: garbage at end

slide-14
SLIDE 14

0x00

let x = (1, 2) , y = let tmp = (10, 20) in tmp[0] + tmp[1] , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp x

0x01

y

30

p0

31

p1

32

1 2

esi

(10, 20) is “garbage”

ex1: garbage at end

slide-15
SLIDE 15

0x00

let x = (1, 2) , y = let tmp = (10, 20) in tmp[0] + tmp[1] , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp x

0x01

y

30

p0

31

p1

32

1 2

esi

ex1: garbage at end

slide-16
SLIDE 16

0x00

let x = (1, 2) , y = let tmp = (10, 20) in tmp[0] + tmp[1] , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp x

0x01

y

30

p0

31

p1

32

1 2

esi

31 32 Result (eax) = 0x09

ex1: garbage at end

slide-17
SLIDE 17

FOX / GC Example 2

slide-18
SLIDE 18

0x00

let y = let tmp = (10, 20) in tmp[0] + tmp[1] , x = (1, 2) , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp esi

ex2: garbage in the middle

Start with a 4-word heap

slide-19
SLIDE 19

0x00

let y = let tmp = (10, 20) in tmp[0] + tmp[1] , x = (1, 2) , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp

ex2: garbage in the middle

10 20

esi tmp

0x01

slide-20
SLIDE 20

0x00

let y = let tmp = (10, 20) in tmp[0] + tmp[1] , x = (1, 2) , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp

ex2: garbage in the middle

esi y

30

10 20

slide-21
SLIDE 21

0x00

let y = let tmp = (10, 20) in tmp[0] + tmp[1] , x = (1, 2) , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp

ex2: garbage in the middle

esi y

30

10 20 1 2

x

0x09

slide-22
SLIDE 22

0x00

let y = let tmp = (10, 20) in tmp[0] + tmp[1] , x = (1, 2) , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp

ex2: garbage in the middle

esi y

30

10 20 1 2

x

0x09

p0

31

slide-23
SLIDE 23

0x00

let y = let tmp = (10, 20) in tmp[0] + tmp[1] , x = (1, 2) , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp

ex2: garbage in the middle

esi y

30

10 20 1 2

x

0x09

p0

31

p1

32

slide-24
SLIDE 24

0x00

let y = let tmp = (10, 20) in tmp[0] + tmp[1] , x = (1, 2) , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp

ex2: garbage in the middle

esi y

30

10 20 1 2

x

0x09

p0

31

p1

32

Out of memory! Can’t allocate (p0, p1)

slide-25
SLIDE 25

0x00

let y = let tmp = (10, 20) in tmp[0] + tmp[1] , x = (1, 2) , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp

ex2: garbage in the middle

esi y

30

10 20 1 2

x

0x09

p0

31

p1

32

Lets reclaim & recycle garbage!

slide-26
SLIDE 26

0x00

let y = let tmp = (10, 20) in tmp[0] + tmp[1] , x = (1, 2) , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp

ex2: garbage in the middle

esi y

30

10 20 1 2

x

0x09

p0

31

p1

32

QUIZ: Which cells are garbage?

(A) 0x00, 0x04 (B) 0x04, 0x08 (C) 0x08, 0x0c (D) None (E) All

Lets reclaim & recycle garbage!

slide-27
SLIDE 27

0x00

let y = let tmp = (10, 20) in tmp[0] + tmp[1] , x = (1, 2) , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp

ex2: garbage in the middle

esi y

30

10 20 1 2

x

0x09

p0

31

p1

32

QUIZ: Which cells are garbage? Those that are not reachable from stack

Lets reclaim & recycle garbage!

slide-28
SLIDE 28

0x00

let y = let tmp = (10, 20) in tmp[0] + tmp[1] , x = (1, 2) , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp

ex2: garbage in the middle

esi y

30

10 20 1 2

x

0x09

p0

31

p1

32

QUIZ: Which cells are garbage? Those that are not reachable from stack

Lets reclaim & recycle garbage!

slide-29
SLIDE 29

0x00

let y = let tmp = (10, 20) in tmp[0] + tmp[1] , x = (1, 2) , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp

ex2: garbage in the middle

esi y

30

10 20 1 2

x

0x09

p0

31

p1

32

Q: How to reclaim space? Why is it not enough to rewind esi?

Lets reclaim & recycle garbage!

slide-30
SLIDE 30

0x00

let y = let tmp = (10, 20) in tmp[0] + tmp[1] , x = (1, 2) , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp

ex2: garbage in the middle

esi y

30

10 20 1 2

x

0x09

p0

31

p1

32

Why is it not enough to rewind esi?

Lets reclaim & recycle garbage!

Want free space to be contiguous (i.e. go to end of heap)

slide-31
SLIDE 31

0x00

let y = let tmp = (10, 20) in tmp[0] + tmp[1] , x = (1, 2) , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp

ex2: garbage in the middle

esi y

30

10 20 1 2

x

0x09

p0

31

p1

32

Solution: Compaction

Lets reclaim & recycle garbage!

Copy “live” cells into “garbage” …

slide-32
SLIDE 32

0x00

let y = let tmp = (10, 20) in tmp[0] + tmp[1] , x = (1, 2) , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp

ex2: garbage in the middle

esi y

30

1 2

x

0x09

p0

31

p1

32

Solution: Compaction

Lets reclaim & recycle garbage!

Copy “live” cells into “garbage” …

slide-33
SLIDE 33

0x00

let y = let tmp = (10, 20) in tmp[0] + tmp[1] , x = (1, 2) , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp

ex2: garbage in the middle

esi y

30

1 2

x

0x09

p0

31

p1

32

Solution: Compaction

Lets reclaim & recycle garbage!

Copy “live” cells into “garbage” …

slide-34
SLIDE 34

0x00

let y = let tmp = (10, 20) in tmp[0] + tmp[1] , x = (1, 2) , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp

ex2: garbage in the middle

esi y

30

1 2

x

0x09

p0

31

p1

32

Solution: Compaction

Lets reclaim & recycle garbage!

Copy “live” cells into “garbage” …

slide-35
SLIDE 35

0x00

let y = let tmp = (10, 20) in tmp[0] + tmp[1] , x = (1, 2) , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp

ex2: garbage in the middle

esi y

30

1 2

x

0x09

p0

31

p1

32

Solution: Compaction

Lets reclaim & recycle garbage!

Copy “live” cells into “garbage” … then rewind esi!

slide-36
SLIDE 36

0x00

let y = let tmp = (10, 20) in tmp[0] + tmp[1] , x = (1, 2) , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp

ex2: garbage in the middle

esi y

30

1 2

x

0x09

p0

31

p1

32

Yay! Have space for (p0, p1)

slide-37
SLIDE 37

0x00

let y = let tmp = (10, 20) in tmp[0] + tmp[1] , x = (1, 2) , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp

ex2: garbage in the middle

y

30

1 2

x

0x09

p0

31

p1

32

Yay! Have space for (p0, p1)

esi

31 32

slide-38
SLIDE 38

0x00

let y = let tmp = (10, 20) in tmp[0] + tmp[1] , x = (1, 2) , p0 = x[0] + y , p1 = x[1] + y in (p0, p1)

0x04 0x08 0x0c 0x10

ebp

ex2: garbage in the middle

y

30

1 2

x

0x09

p0

31

p1

32

esi

31 32 Result (eax) = 0x09

slide-39
SLIDE 39

FOX / GC Example 3

slide-40
SLIDE 40

0x00 0x04 0x08 0x0c 0x10

ebp esi

ex3: garbage in the middle (with stack)

esp

3 local vars x,y,z

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + y + z

slide-41
SLIDE 41

0x00 0x04 0x08 0x0c 0x10

esi

ex3: garbage in the middle (with stack)

ebp esp q

20

p

10

retaddr0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + y + z

slide-42
SLIDE 42

0x00 0x04 0x08 0x0c 0x10

esi

ex3: garbage in the middle (with stack)

ebp0 esp q

20

p

10

retaddr0

ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + y + z

slide-43
SLIDE 43

0x00 0x04 0x08 0x0c 0x10

esi

ex3: garbage in the middle (with stack)

ebp0 esp q

20

p

10

retaddr0

ebp ebp0

1 local var (tmp)

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + y + z

slide-44
SLIDE 44

0x00 0x04 0x08 0x0c 0x10

ex3: garbage in the middle (with stack)

ebp0 esp q

20

p

10

retaddr0

ebp ebp0

10 20

esi

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + y + z

slide-45
SLIDE 45

0x00 0x04 0x08 0x0c 0x10

ex3: garbage in the middle (with stack)

ebp0 esp q

20

p

10

retaddr0

ebp ebp0

10 20

esi

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + y + z

tmp

0x01

slide-46
SLIDE 46

0x00 0x04 0x08 0x0c 0x10

ex3: garbage in the middle (with stack)

ebp0 esp q

20

p

10

retaddr0

ebp ebp0

10 20

esi

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + y + z

tmp

0x01

Return (eax) = 30

slide-47
SLIDE 47

0x00 0x04 0x08 0x0c 0x10

ex3: garbage in the middle (with stack)

ebp0

10 20

esi

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

Return (eax) = 30

ebp esp y

30

slide-48
SLIDE 48

0x00 0x04 0x08 0x0c 0x10

ex3: garbage in the middle (with stack)

ebp0

10 20

esi

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

ebp esp y

30

slide-49
SLIDE 49

0x00 0x04 0x08 0x0c 0x10

ex3: garbage in the middle (with stack)

ebp0

10 20

esi

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

ebp esp y

30

30 31

slide-50
SLIDE 50

0x00 0x04 0x08 0x0c 0x10

ex3: garbage in the middle (with stack)

ebp0

10 20

esi

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

ebp esp y

30

30 31

x

0x09

slide-51
SLIDE 51

0x00 0x04 0x08 0x0c 0x10

ex3: garbage in the middle (with stack)

ebp0

10 20

esi

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

ebp esp y

30

30 31

x

0x09

slide-52
SLIDE 52

0x00 0x04 0x08 0x0c 0x10

ex3: garbage in the middle (with stack)

ebp0

10 20

esi

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

ebp y

30

30 31

x

0x09

esp q

200

p

100

retaddr1

slide-53
SLIDE 53

ex3: garbage in the middle (with stack)

ebp0 esp q p

retaddr1

ebp ebp0

1 local var (tmp)

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x09 0x00 0x04 0x08 0x0c 0x10

10 20

esi

30 31

200 100

slide-54
SLIDE 54

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x09 0x00 0x04 0x08 0x0c 0x10

10 20

esi

30 31

retaddr1

200 100

slide-55
SLIDE 55

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x09 0x00 0x04 0x08 0x0c 0x10

10 20

esi

30 31 Lets reclaim & recycle garbage!

retaddr1

200 100

slide-56
SLIDE 56

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x09 0x00 0x04 0x08 0x0c 0x10

10 20

esi

30 31 Lets reclaim & recycle garbage!

QUIZ: Which cells are garbage?

(A) 0x00, 0x04 (B) 0x04, 0x08 (C) 0x08, 0x0c (D) None (E) All

retaddr1

200 100

slide-57
SLIDE 57

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x09 0x00 0x04 0x08 0x0c 0x10

10 20

esi

30 31 Lets reclaim & recycle garbage!

Those that are not reachable from any stack frame QUIZ: Which cells are garbage?

retaddr1

200 100

slide-58
SLIDE 58

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x09 0x00 0x04 0x08 0x0c 0x10

10 20

esi

30 31 Lets reclaim & recycle garbage!

Those that are not reachable from any stack frame QUIZ: Which cells are garbage?

Traverse Stack from top (esp) to bottom (ebp0) to mark reachable cells.

retaddr1

200 100

slide-59
SLIDE 59

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x09 0x00 0x04 0x08 0x0c 0x10

10 20

esi

30 31 Lets reclaim & recycle garbage!

QUIZ: Which cells are garbage?

Traverse Stack from top (esp) to bottom (ebp0) to mark reachable cells.

retaddr1

200 100

slide-60
SLIDE 60

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x09 0x00 0x04 0x08 0x0c 0x10

esi

30 31

Compact the live cells

retaddr1

200 100

slide-61
SLIDE 61

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x09 0x00 0x04 0x08 0x0c 0x10

esi

31

Compact the live cells

retaddr1

200 100

30

slide-62
SLIDE 62

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x09 0x00 0x04 0x08 0x0c 0x10

esi

31

Compact the live cells

retaddr1

200 100

30

slide-63
SLIDE 63

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x09 0x00 0x04 0x08 0x0c 0x10

esi

31

Compact the live cells

retaddr1

200 100

30

slide-64
SLIDE 64

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x09 0x00 0x04 0x08 0x0c 0x10

31

Compact the live cells … then rewind esi

retaddr1

200 100

30

esi

slide-65
SLIDE 65

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x09 0x00 0x04 0x08 0x0c 0x10

esi

31

Compact the live cells … then rewind esi

retaddr1

200 100

30

slide-66
SLIDE 66

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x09 0x00 0x04 0x08 0x0c 0x10

esi

31

retaddr1

200 100

30

Problem???

slide-67
SLIDE 67

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x09 0x00 0x04 0x08 0x0c 0x10

esi

31

retaddr1

200 100

30

Problem! Have to REDIRECT existing pointers

slide-68
SLIDE 68

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x09

retaddr1

200 100 0x00 0x04 0x08 0x0c 0x10

esi

30 31

slide-69
SLIDE 69

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x09

retaddr1

200 100 0x00 0x04 0x08 0x0c 0x10

esi

30 31

  • 1. Compute FORWARD addrs

(i.e. new compacted addrs)

slide-70
SLIDE 70

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x09

retaddr1

200 100

  • 1. Compute FORWARD addrs

e.g. 0x09 —> 0x01

0x00 0x04 0x08 0x0c 0x10

esi

30 31

slide-71
SLIDE 71

0x09 0x01

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

retaddr1

200 100

  • 1. Compute FORWARD addrs

e.g. 0x09 —> 0x01

  • 2. REDIRECT addrs on stack

0x00 0x04 0x08 0x0c 0x10

esi

30 31

slide-72
SLIDE 72

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x01

retaddr1

200 100

  • 1. Compute FORWARD addrs

e.g. 0x09 —> 0x01

  • 2. REDIRECT addrs on stack
  • 3. COMPACT cells on heap

0x00 0x04 0x08 0x0c 0x10

esi

30 31

slide-73
SLIDE 73

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x01

retaddr1

200 100

  • 1. Compute FORWARD addrs

e.g. 0x09 —> 0x01

  • 2. REDIRECT addrs on stack
  • 3. COMPACT cells on heap

0x00 0x04 0x08 0x0c 0x10

esi

30 31

slide-74
SLIDE 74

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x01

retaddr1

200 100 0x00 0x04 0x08 0x0c 0x10

esi

30 31 Yay! Have space for (p, q)

slide-75
SLIDE 75

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x01 0x00 0x04 0x08 0x0c 0x10

esi

31

retaddr1

200 100

30 Yay! Have space for (p, q) 200 100

slide-76
SLIDE 76

ex3: garbage in the middle (with stack)

ebp0 esp q p ebp ebp0

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x01 0x00 0x04 0x08 0x0c 0x10

esi

31

retaddr1

200 100

30 200 100

tmp

0x09

Return (eax) = 300

slide-77
SLIDE 77

ex3: garbage in the middle (with stack)

esp ebp

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x01 0x00 0x04 0x08 0x0c 0x10

esi

31 30 200 100 Return (eax) = 300

z

300

slide-78
SLIDE 78

ex3: garbage in the middle (with stack)

esp ebp

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x01 0x00 0x04 0x08 0x0c 0x10

esi

31 30 200 100

z

300

slide-79
SLIDE 79

ex3: garbage in the middle (with stack)

esp ebp

def foo(p, q): let tmp = (p, q) in tmp[0] + tmp[1] let y = foo(10, 20) , x = (y, y + 1) , z = foo(100, 200) in x[0] + z

y

30

x

0x01 0x00 0x04 0x08 0x0c 0x10

esi

31 30 200 100

z

300

Return (eax) = 30+300 = 330

slide-80
SLIDE 80

FOX / GC Example 4

slide-81
SLIDE 81

ex4: recursive data

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

slide-82
SLIDE 82

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

call range(0, 3)

ex4: recursive data

slide-83
SLIDE 83

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

1 2

false

0x09 0x11

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

2 1

false

0x09 0x01

QUIZ: What is heap when range(0,3) returns? (A) (B)

ex4: recursive data

slide-84
SLIDE 84

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

2 1

false

0x09 0x01

l1

0x11

ex4: recursive data

slide-85
SLIDE 85

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

2 1

false

0x09 0x01

t1

3

Result sum(0x11) = 3

ex4: recursive data

slide-86
SLIDE 86

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

2 1

false

0x09 0x01

t1

3

ex4: recursive data

slide-87
SLIDE 87

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

2 1

false

0x09 0x01

t1

3

call range(3,6)

ex4: recursive data

slide-88
SLIDE 88

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

2 1

false

0x09 0x01

t1

3

call range(3,6)

5 4 3

false

0x21 0x19

QUIZ: What is the value of l? (A) 0x18 (B) 0x19 (C) 0x28 (D) 0x29 (E) 0x30

l

???

ex4: recursive data

slide-89
SLIDE 89

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

2 1

false

0x09 0x01

t1

3 5 4 3

false

0x21 0x19

l

0x29

Yikes! Out of Memory!

ex4: recursive data

slide-90
SLIDE 90

esp ebp

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

2 1

false

0x09 0x01

t1

3 5 4 3

false

0x21 0x19

l

0x29

QUIZ: Which cells are “live” on the heap? (A) 0x00 (B) 0x08 (C) 0x10 (D) 0x18 (E) 0x20 (F) 0x28

ex4: recursive data

slide-91
SLIDE 91

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

2 1

false

0x09 0x01

t1

3 5 4 3

false

0x21 0x19

l

0x29

  • 2. Compute FORWARD addrs
  • 3. REDIRECT addrs on stack
  • 4. COMPACT cells on heap
  • 1. MARK live addrs

ex4: recursive data

slide-92
SLIDE 92

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

2 1

false

0x09 0x01

t1

3 5 4 3

false

0x21 0x19

l

0x29

1.MARK live addrs

reachable from stack ex4: recursive data

slide-93
SLIDE 93

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

2 1

false

0x09 0x01

t1

3 5 4 3

false

0x21 0x19

l

1.MARK live addrs

reachable from stack

0x29

ex4: recursive data

slide-94
SLIDE 94

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x21 0x19

l

0x29

2.Compute FORWARD addrs

fwd

  • rig

ex4: recursive data

slide-95
SLIDE 95

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x21 0x19

l

0x29

2.Compute FORWARD addrs

fwd

  • rig

ex4: recursive data

slide-96
SLIDE 96

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x21 0x19

l

0x29

2.Compute FORWARD addrs

fwd

  • rig

ex4: recursive data

slide-97
SLIDE 97

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x21 0x19

l

0x29

2.Compute FORWARD addrs

fwd

  • rig

ex4: recursive data

slide-98
SLIDE 98

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x21 0x19

l

0x29

2.Compute FORWARD addrs

fwd

  • rig

ex4: recursive data

slide-99
SLIDE 99

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x21 0x19

l

0x29

2.Compute FORWARD addrs

fwd

  • rig

ex4: recursive data

slide-100
SLIDE 100

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x21 0x19

l

0x29

2.Compute FORWARD addrs

fwd

  • rig

ex4: recursive data

slide-101
SLIDE 101

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x21 0x19

l

0x29

2.Compute FORWARD addrs

fwd

  • rig

ex4: recursive data

slide-102
SLIDE 102

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x21 0x19

l

0x29

2.Compute FORWARD addrs

fwd

  • rig

ex4: recursive data

slide-103
SLIDE 103

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x21 0x19

l

0x29

2.Compute FORWARD addrs

fwd

  • rig

ex4: recursive data

slide-104
SLIDE 104

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x21 0x19

l

0x29

2.Compute FORWARD addrs

Where should we store the forward addrs? ex4: recursive data

slide-105
SLIDE 105

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x21 0x19

l

0x29

3.REDIRECT addrs on stack

ex4: recursive data

slide-106
SLIDE 106

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x21 0x19

l

0x29

3.REDIRECT addrs on stack

ex4: recursive data

slide-107
SLIDE 107

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x21 0x19

l

0x11

3.REDIRECT addrs on stack

ex4: recursive data

slide-108
SLIDE 108

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x21 0x19

l

0x11

3.REDIRECT addrs on stack and heap!

ex4: recursive data

slide-109
SLIDE 109

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x21 0x19

l

0x11

3.REDIRECT addrs on stack and heap!

ex4: recursive data

slide-110
SLIDE 110

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x21 0x01

l

0x11

3.REDIRECT addrs on stack and heap!

ex4: recursive data

slide-111
SLIDE 111

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x21 0x01

l

0x11

3.REDIRECT addrs on stack and heap!

ex4: recursive data

slide-112
SLIDE 112

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x09 0x01

l

0x11

4.COMPACT cells on heap

Copy cell to forward addr! ex4: recursive data

slide-113
SLIDE 113

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x09 0x01

l

0x11

4.COMPACT cells on heap

Copy cell to forward addr! ex4: recursive data

slide-114
SLIDE 114

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x09 0x01

l

0x11

4.COMPACT cells on heap

Copy cell to forward addr! ex4: recursive data

slide-115
SLIDE 115

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x09 0x01

l

0x11

4.COMPACT cells on heap

Copy cell to forward addr! ex4: recursive data

slide-116
SLIDE 116

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x09 0x01

l

0x11

4.COMPACT cells on heap

Copy cell to forward addr! ex4: recursive data

slide-117
SLIDE 117

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x09 0x01

l

0x11

4.COMPACT cells on heap

Copy cell to forward addr! ex4: recursive data

slide-118
SLIDE 118

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x09 0x01

l

0x11

4.COMPACT cells on heap

Copy cell to forward addr! ex4: recursive data

slide-119
SLIDE 119

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x09 0x01

l

0x11

GC Complete!

Have space for (1000, l)

ex4: recursive data

slide-120
SLIDE 120

esp ebp

def range(i, j): if (j <= i): false else: (i,range(i+1, j)) def sum(l): if l == false: 0 else: l[0] + sum(l[1]) let t1 = let l1 = range(0, 3) in sum(l1) , l = range(t1, t1 + 3) in (1000, l)

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

t1

3 5 4 3

false

0x09 0x01

l

0x11

GC Complete!

Have space for (1000, l)

1000 0x11

ex4: recursive data

slide-121
SLIDE 121

esp ebp

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

2 1

0x09 0x01

t1

3 5 4 3

false

0x21 0x19

l

0x29

QUIZ: What should print(0x11) show? (A) (0, (1, (2, false))) (B) (3, (4, (5, false))) (C) (0, (1, (2, (3, (4, (5, false)))))) (D) (3, (4, (5, (0, (1, (2, false)))))) (E) (2, (1, (0, (3, (4, (5, false))))))

0x29

ex4: recursive data

slide-122
SLIDE 122

esp ebp

0x00 0x04 0x08 0x0c 0x10

esi

0x14 0x18 0x1c 0x20 0x24 0x28 0x2c 0x30

2 1

0x09 0x01

t1

3 5 4 3

false

0x21 0x19

l

0x29

QUIZ: Which cells are “live” on the heap? (A) 0x00 (B) 0x08 (C) 0x10 (D) 0x18 (E) 0x20 (F) 0x28

0x29

ex4: recursive data