aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTeddy <ted.sybil@gmail.com>2013-07-31 09:43:53 +0800
committerTeddy <ted.sybil@gmail.com>2013-07-31 09:43:53 +0800
commit6d1534ce62e1466630325a84818c3b4f0cc453db (patch)
tree36b47f315ee5d9ebc5ded78878f397c4d8d29f2b
parent6c7bd6c2fb02e54d185eb329149c52a7530862a3 (diff)
revised the poor fix of cont. exiting to a better one
-rw-r--r--sketch.py79
1 files changed, 39 insertions, 40 deletions
diff --git a/sketch.py b/sketch.py
index 3dc55b4..141d259 100644
--- a/sketch.py
+++ b/sketch.py
@@ -495,51 +495,50 @@ class Evaluator(object):
if pc is None:
- if top > 0 and is_ret_addr(stack[top - 1]) and \
- stack[top - 1].addr is False:
- stack[top - 1] = stack[top]
- top -= 1
+ # print "Poping..."
+ arg_list = list()
+ while not is_ret_addr(stack[top]):
+ arg_list = [stack[top]] + arg_list
+ top -= 1
+ # Top is now pointing to the return address
+ # print "Arg List: " + str(arg_list)
+ opt = arg_list[0]
+ ret_addr = stack[top].addr
+
+ if ret_addr is False: # Fake return
+ stack[top] = arg_list[0]
envt = cont.envt
(pc, otop) = nxt_addr(cont.pc, otop)
cont = cont.old_cont
+ continue
# Revert to the original cont.
- else:
- # print "Poping..."
- arg_list = list()
- while not is_ret_addr(stack[top]):
- arg_list = [stack[top]] + arg_list
- top -= 1
- # Top is now pointing to the return address
- # print "Arg List: " + str(arg_list)
- opt = arg_list[0]
- ret_addr = stack[top].addr
-
- if is_builtin_proc(opt): # Built-in Procedures
- # print "builtin"
- stack[top] = opt.call(arg_list[1:])
- (pc, otop) = nxt_addr(ret_addr, otop)
+
+ if is_builtin_proc(opt): # Built-in Procedures
+ # print "builtin"
+ stack[top] = opt.call(arg_list[1:])
+ (pc, otop) = nxt_addr(ret_addr, otop)
- elif is_special_opt(opt): # Sepecial Operations
- # print "specialopt"
- (res, flag) = opt.call(arg_list[1:], ret_addr, envt, cont)
- if flag: # Need to call again
- # print "AGAIN with the mask: " + str(res)
- # mask_eval(ret_addr, res)
- top += 1
- pc = ret_addr.chd # Again
- else:
- stack[top] = res # Done
- (pc, otop) = nxt_addr(ret_addr, otop)
- elif is_user_defined_proc(opt): # User-defined Procedures
- ncont = Continuation(envt, ret_addr, cont) # Create a new continuation
- cont = ncont # Make chain
- envt = Environment(opt.envt) # New ENV and recover the closure
- #TODO: Compare the arguments to the parameters
- for i in xrange(1, len(arg_list)):
- envt.add_binding(opt.para_list[i - 1],
- arg_list[i]) # Create bindings
- stack[top] = RetAddr(False) # Mark the exit of the continuation
- pc = opt.body # Get to the entry point
+ elif is_special_opt(opt): # Sepecial Operations
+ # print "specialopt"
+ (res, flag) = opt.call(arg_list[1:], ret_addr, envt, cont)
+ if flag: # Need to call again
+ # print "AGAIN with the mask: " + str(res)
+ # mask_eval(ret_addr, res)
+ top += 1
+ pc = ret_addr.chd # Again
+ else:
+ stack[top] = res # Done
+ (pc, otop) = nxt_addr(ret_addr, otop)
+ elif is_user_defined_proc(opt): # User-defined Procedures
+ ncont = Continuation(envt, ret_addr, cont) # Create a new continuation
+ cont = ncont # Make chain
+ envt = Environment(opt.envt) # New ENV and recover the closure
+ #TODO: Compare the arguments to the parameters
+ for i in xrange(1, len(arg_list)):
+ envt.add_binding(opt.para_list[i - 1],
+ arg_list[i]) # Create bindings
+ stack[top] = RetAddr(False) # Mark the exit of the continuation
+ pc = opt.body # Get to the entry point
# print_stack()
# print "Poping done."