1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
main:
PUSHARG
PUSH 0 # [n, 0]
LT
BR_COND negative
positive:
NEW value,accumulate=add
PICK 0
PUSH 0
SETATTR value
PUSHARG # [obj, n]
PUSH 1
BR_COND loop
negative:
NEW value,accumulate=count
PICK 0
PUSH 0
SETATTR value # [obj]
PUSH 0 # [obj, 0]
PUSHARG # [obj, 0, n]
SUB # [obj, -n]
loop: # [obj, n]
PICK 0 # [obj, n, n]
BR_COND continue
exit: # [obj, n]
POP
GETATTR value
RETURN
continue: # [obj, n]
PUSH 1
SUB # [obj, n-1]
PICK 1 # [obj, n-1, obj]
PICK 1 # [obj, n-1, obj, n-1]
SEND accumulate/1 # [obj, n-1]
PUSH 1
BR_COND loop
add: # (x)
PUSHARG # [self]
PUSHARG # [self, self]
GETATTR value # [self, self.value]
PUSHARGN 1 # [self, self.value, x]
ADD # [self, self.value+x]
SETATTR value # []
RETURN
count: # (x)
PUSHARG # [self]
PUSHARG # [self, self]
GETATTR value # [self, self.value]
PUSH 1
ADD # [self, self.value+1]
SETATTR value # []
RETURN
|