Skip to content

Commit 3e2d104

Browse files
author
whitequark
committedJun 13, 2015
Make typing.Inferencer idempotent.
1 parent c89bf6f commit 3e2d104

File tree

3 files changed

+38
-21
lines changed

3 files changed

+38
-21
lines changed
 

‎artiq/py2llvm/asttyped.py

+2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class ClassDefT(ast.ClassDef, scoped):
2929
pass
3030
class FunctionDefT(ast.FunctionDef, scoped):
3131
pass
32+
class ModuleT(ast.Module, scoped):
33+
pass
3234

3335
class AttributeT(ast.Attribute, commontyped):
3436
pass

‎artiq/py2llvm/types.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,11 @@ def is_var(typ):
184184
return isinstance(typ, TVar)
185185

186186
def is_mono(typ, name, **params):
187+
params_match = True
188+
for param in params:
189+
params_match = params_match and typ.params[param] == params[param]
187190
return isinstance(typ, TMono) and \
188-
typ.name == name and typ.params == params
191+
typ.name == name and params_match
189192

190193
def is_numeric(typ):
191194
return isinstance(typ, TMono) and \

‎artiq/py2llvm/typing.py

+32-20
Original file line numberDiff line numberDiff line change
@@ -190,43 +190,35 @@ def _find_name(self, name, loc):
190190
"name '{name}' is not bound to anything", {"name":name}, loc)
191191
self.engine.process(diag)
192192

193-
def visit_root(self, node):
193+
# Visitors that replace node with a typed node
194+
#
195+
def visit_Module(self, node):
194196
extractor = LocalExtractor(env_stack=self.env_stack, engine=self.engine)
195197
extractor.visit(node)
196-
self.env_stack.append(extractor.typing_env)
197198

199+
node = asttyped.ModuleT(
200+
typing_env=extractor.typing_env, globals_in_scope=extractor.global_,
201+
body=node.body, loc=node.loc)
198202
return self.visit(node)
199203

200-
# Visitors that replace node with a typed node
201-
#
202-
def visit_arg(self, node):
203-
return asttyped.argT(type=self._find_name(node.arg, node.loc),
204-
arg=node.arg, annotation=self.visit(node.annotation),
205-
arg_loc=node.arg_loc, colon_loc=node.colon_loc, loc=node.loc)
206-
207204
def visit_FunctionDef(self, node):
208205
extractor = LocalExtractor(env_stack=self.env_stack, engine=self.engine)
209206
extractor.visit(node)
210207

211-
self.env_stack.append(extractor.typing_env)
212-
213208
node = asttyped.FunctionDefT(
214209
typing_env=extractor.typing_env, globals_in_scope=extractor.global_,
215210
return_type=types.TVar(),
216-
217211
name=node.name, args=node.args, returns=node.returns,
218212
body=node.body, decorator_list=node.decorator_list,
219213
keyword_loc=node.keyword_loc, name_loc=node.name_loc,
220214
arrow_loc=node.arrow_loc, colon_loc=node.colon_loc, at_locs=node.at_locs,
221215
loc=node.loc)
216+
return self.visit(node)
222217

223-
old_function, self.function = self.function, node
224-
self.generic_visit(node)
225-
self.function = old_function
226-
227-
self.env_stack.pop()
228-
229-
return node
218+
def visit_arg(self, node):
219+
return asttyped.argT(type=self._find_name(node.arg, node.loc),
220+
arg=node.arg, annotation=self.visit(node.annotation),
221+
arg_loc=node.arg_loc, colon_loc=node.colon_loc, loc=node.loc)
230222

231223
def visit_Num(self, node):
232224
if isinstance(node.n, int):
@@ -346,6 +338,26 @@ def visit_UnaryOpT(self, node):
346338
self.engine.process(diag)
347339
return node
348340

341+
def visit_ModuleT(self, node):
342+
self.env_stack.append(node.typing_env)
343+
344+
node = self.generic_visit(node)
345+
346+
self.env_stack.pop()
347+
348+
return node
349+
350+
def visit_FunctionDefT(self, node):
351+
self.env_stack.append(node.typing_env)
352+
old_function, self.function = self.function, node
353+
354+
node = self.generic_visit(node)
355+
356+
self.function = old_function
357+
self.env_stack.pop()
358+
359+
return node
360+
349361
def visit_Assign(self, node):
350362
node = self.generic_visit(node)
351363
if len(node.targets) > 1:
@@ -455,7 +467,7 @@ def process_diagnostic(diag):
455467

456468
buf = source.Buffer("".join(fileinput.input()), os.path.basename(fileinput.filename()))
457469
parsed, comments = parse_buffer(buf, engine=engine)
458-
typed = Inferencer(engine=engine).visit_root(parsed)
470+
typed = Inferencer(engine=engine).visit(parsed)
459471
printer = Printer(buf)
460472
printer.visit(typed)
461473
for comment in comments:

0 commit comments

Comments
 (0)
Please sign in to comment.