Nand2Tetris Jack compiler generating duplicate labels for ifs

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Nand2Tetris Jack compiler generating duplicate labels for ifs

stansbuj
Can a single vm file have duplicate labels in it?

The following code fragment was generated by the Nand2Tetris compiler for the PongGame.jack file. Note there are duplicate labels in it. I indented the sequence of code that is duplicated.

function PongGame.run 1
push argument 0
pop pointer 0
label WHILE_EXP0
push this 3
not
not
if-goto WHILE_END0
label WHILE_EXP1
push local 0
push constant 0
eq
push this 3
not
and
not
if-goto WHILE_END1
call Keyboard.keyPressed 0
pop local 0
push this 0
call Bat.move 1
pop temp 0
push pointer 0
call PongGame.moveBall 1
pop temp 0
goto WHILE_EXP1
label WHILE_END1
push local 0
push constant 130
eq
               if-goto IF_TRUE0
               goto IF_FALSE0
               label IF_TRUE0
push this 0
push constant 1
call Bat.setDirection 2
pop temp 0
goto IF_END0
               label IF_FALSE0
push local 0
push constant 132
eq
if-goto IF_TRUE1
goto IF_FALSE1
label IF_TRUE1
push this 0
push constant 2
call Bat.setDirection 2
pop temp 0
goto IF_END1
label IF_FALSE1
push local 0
push constant 140
eq
if-goto IF_TRUE2
goto IF_FALSE2
label IF_TRUE2
push constant 0
not
pop this 3
label IF_FALSE2
label IF_END1
label IF_END0
label WHILE_EXP2
push local 0
push constant 0
eq
not
push this 3
not
and
not
if-goto WHILE_END2
call Keyboard.keyPressed 0
pop local 0
push this 0
call Bat.move 1
pop temp 0
push pointer 0
call PongGame.moveBall 1
pop temp 0
goto WHILE_EXP2
label WHILE_END2
goto WHILE_EXP0
label WHILE_END0
push this 3
if-goto IF_TRUE3
goto IF_FALSE3
label IF_TRUE3
push constant 10
push constant 27
call Output.moveCursor 2
pop temp 0
push constant 9
call String.new 1
push constant 71
call String.appendChar 2
push constant 97
call String.appendChar 2
push constant 109
call String.appendChar 2
push constant 101
call String.appendChar 2
push constant 32
call String.appendChar 2
push constant 79
call String.appendChar 2
push constant 118
call String.appendChar 2
push constant 101
call String.appendChar 2
push constant 114
call String.appendChar 2
call Output.printString 1
pop temp 0
label IF_FALSE3
push constant 0
return


function PongGame.moveBall 5
push argument 0
pop pointer 0
push this 1
call Ball.move 1
pop this 2
push this 2
push constant 0
gt
push this 2
push this 5
eq
not
and
             if-goto IF_TRUE0
             goto IF_FALSE0
             label IF_TRUE0
push this 2
pop this 5
push constant 0
pop local 0
push this 0
call Bat.getLeft 1
pop local 1
push this 0
call Bat.getRight 1
pop local 2
push this 1
call Ball.getLeft 1
pop local 3
push this 1
call Ball.getRight 1
pop local 4
push this 2
push constant 4
eq
if-goto IF_TRUE1
goto IF_FALSE1
label IF_TRUE1
push local 1
push local 4
gt
push local 2
push local 3
lt
or
pop this 3
push this 3
not
if-goto IF_TRUE2
goto IF_FALSE2
label IF_TRUE2
push local 4
push local 1
push constant 10
add
lt
if-goto IF_TRUE3
goto IF_FALSE3
label IF_TRUE3
push constant 1
neg
pop local 0
goto IF_END3
label IF_FALSE3
push local 3
push local 2
push constant 10
sub
gt
if-goto IF_TRUE4
goto IF_FALSE4
label IF_TRUE4
push constant 1
pop local 0
label IF_FALSE4
label IF_END3
push this 6
push constant 2
sub
pop this 6
push this 0
push this 6
call Bat.setWidth 2
pop temp 0
push this 4
push constant 1
add
pop this 4
push constant 22
push constant 7
call Output.moveCursor 2
pop temp 0
push this 4
call Output.printInt 1
pop temp 0
label IF_FALSE2
label IF_FALSE1
push this 1
push local 0
call Ball.bounce 2
pop temp 0
                     label IF_FALSE0
push constant 0
return
Reply | Threaded
Open this post in threaded view
|

Re: Nand2Tetris Jack compiler generating duplicate labels for ifs

cadet1620
Administrator
stansbuj wrote
Can a single vm file have duplicate labels in it?

The following code fragment was generated by the Nand2Tetris compiler for the PongGame.jack file. Note there are duplicate labels in it. I indented the sequence of code that is duplicated.

function PongGame.run 1
...
               if-goto IF_TRUE0
               goto IF_FALSE0
               label IF_TRUE0
...
function PongGame.moveBall 5
...
             if-goto IF_TRUE0
             goto IF_FALSE0
             label IF_TRUE0
This is not a bug.

The VM language specification (8.2.1) says that labels have function scope, thus PongGame.run.IF_TRUE0 and PongGame.moveBall.IF_TRUE0 are unique labels.

--Mark
Reply | Threaded
Open this post in threaded view
|

Re: Nand2Tetris Jack compiler generating duplicate labels for ifs

ybakos
This post was updated on .
In reply to this post by stansbuj
Keep in mind that your translator, however, would generate unique labels in the assembly language that results from translating the vm code you provided. It's a challenge (and fun) to keep the responsibilities and aspects of each layer separate and organized in one's mind!

Reply | Threaded
Open this post in threaded view
|

Re: Nand2Tetris Jack compiler generating duplicate labels for ifs

stansbuj
This post was updated on .
Thanks to both of you. I guess I was thinking of assembly language labels that have to be unique.

I'll reset my label counter for each new subroutine in my compiler.

(That worked for Pong! Cool! Identical vm files now.)

Jack