def wrap(): traverser.function_collection.append([]) traverser._debug("THIS_PUSH") # Allow references to "this" traverser.this_stack.append(JSObject(traverser=traverser)) # inherit contexts from the current scope traverser.contexts = current_contexts params = {} for param in node["params"]: if param["type"] == "Identifier": params[param["name"]] = lambda: JSObject(traverser=traverser) else: # TODO: Support array and object destructuring. pass context = JSContext(data=params, traverser=traverser) traverser.contexts.append(context) traverser.traverse_node(node["body"]) # Call all of the function collection's members to traverse all of the # child functions. func_coll = traverser.function_collection.pop() for func in func_coll: func() traverser.contexts.pop() # Since we need to manually manage the "this" stack, pop off that # context. traverser._debug("THIS_POP") traverser.this_stack.pop()
def _define_with(traverser, node): 'Handles `with` statements' object_ = traverser._traverse_node(node['object']) if isinstance(object_, JSWrapper) and isinstance(object_.value, JSObject): traverser.contexts[-1] = object_.value traverser.contexts.append(JSContext('block')) return
def BlockStatement(traverser, node): traverser.contexts.append(JSContext("block", traverser=traverser)) for child in node["body"]: traverser.traverse_node(child) traverser.contexts.pop() return False