|
@@ -8,6 +8,8 @@ class KnownRequestHandled(Exception):
|
|
|
|
|
|
class GeneratorStackEntry(object):
|
|
|
"""An entry in the generator stack of a request handles."""
|
|
|
+ __slots__ = ["generator", "function_name", "source_map", "function_origin", "pending_requests", "finished_requests", "replies"]
|
|
|
+
|
|
|
def __init__(self, generator):
|
|
|
self.generator = generator
|
|
|
self.function_name = None
|
|
@@ -17,30 +19,8 @@ class GeneratorStackEntry(object):
|
|
|
self.finished_requests = True
|
|
|
self.replies = None
|
|
|
|
|
|
- def append_reply(self, new_reply):
|
|
|
- """Appends a reply to the this entry's list of pending replies."""
|
|
|
- if self.replies is None:
|
|
|
- self.replies = [new_reply]
|
|
|
- else:
|
|
|
- self.replies.append(new_reply)
|
|
|
-
|
|
|
- def extend_replies(self, new_replies):
|
|
|
- """Appends a list of replies to this entry's list of pending replies."""
|
|
|
- if new_replies is not None:
|
|
|
- if self.replies is None:
|
|
|
- self.replies = new_replies
|
|
|
- else:
|
|
|
- self.replies.extend(new_replies)
|
|
|
-
|
|
|
- def step(self):
|
|
|
- """Performs a single step: accumulated replies are fed to the generator,
|
|
|
- which then produces requests."""
|
|
|
- # Send the replies to the generator, and ask for new requests.
|
|
|
- self.pending_requests = self.generator.send(self.replies)
|
|
|
-
|
|
|
- # Reset some data structures.
|
|
|
- self.finished_requests = False
|
|
|
- self.replies = None
|
|
|
+ def __getattr__(self, varname):
|
|
|
+ return None
|
|
|
|
|
|
def format_stack_trace(stack_trace):
|
|
|
"""Formats a list of (function name, debug info, origin) triples."""
|
|
@@ -92,13 +72,21 @@ class RequestHandler(object):
|
|
|
raise ValueError('handle_request cannot be called with an empty generator stack.')
|
|
|
|
|
|
# Append the server's replies to the list of replies.
|
|
|
- self.extend_replies(reply)
|
|
|
+ if reply is not None:
|
|
|
+ if self.generator_stack[-1].replies is None:
|
|
|
+ self.generator_stack[-1].replies = reply
|
|
|
+ else:
|
|
|
+ self.generator_stack[-1].replies.extend(reply)
|
|
|
+
|
|
|
while 1:
|
|
|
# Silence pylint's warning about catching Exception.
|
|
|
# pylint: disable=I0011,W0703
|
|
|
try:
|
|
|
while self.generator_stack[-1].finished_requests:
|
|
|
- self.generator_stack[-1].step()
|
|
|
+ gen = self.generator_stack[-1]
|
|
|
+ gen.pending_requests = gen.generator.send(gen.replies)
|
|
|
+ gen.finished_requests = False
|
|
|
+ gen.replies = None
|
|
|
else:
|
|
|
return self.pop_requests()
|
|
|
|
|
@@ -166,11 +154,10 @@ class RequestHandler(object):
|
|
|
|
|
|
def append_reply(self, new_reply):
|
|
|
"""Appends a reply to the top-of-stack generator's list of pending replies."""
|
|
|
- self.generator_stack[-1].append_reply(new_reply)
|
|
|
-
|
|
|
- def extend_replies(self, new_replies):
|
|
|
- """Appends a list of replies to the top-of-stack generator's list of pending replies."""
|
|
|
- self.generator_stack[-1].extend_replies(new_replies)
|
|
|
+ if self.generator_stack[-1].replies is None:
|
|
|
+ self.generator_stack[-1].replies = [new_reply]
|
|
|
+ else:
|
|
|
+ self.generator_stack[-1].replies.append(new_reply)
|
|
|
|
|
|
def handle_exception(self, exception):
|
|
|
"""Handles the given exception. A Boolean is returned that tells if
|
|
@@ -406,5 +393,5 @@ class RequestHandler(object):
|
|
|
# Format: ("DEBUG_INFO", [function_name, source_map])
|
|
|
top_entry = self.generator_stack[-1]
|
|
|
top_entry.function_name, top_entry.source_map, top_entry.function_origin = request_args
|
|
|
- top_entry.append_reply(None)
|
|
|
+ self.append_reply(None)
|
|
|
|