def infer(bytecode, name=None): inputs = [] surplus = [] type_vars = {} for i,tok in enumerate(bytecode): if tok == 'if': if_block = bytecode[i-2] else_block = bytecode[i-1] decl = infer(if_block.bytecode) surplus.pop() surplus.pop() surplus.pop() elif vm.words.has_key(tok): decl = vm.words[tok][1:] if len(decl) == 0: decl = infer(vm.words[tok][0].bytecode) elif block(tok): decl = ((), ('block',)) else: decl = [[], [typeof(tok),]] new_inputs, _, type_vars = match_types(list(decl[0]), surplus, tok) inputs.extend(new_inputs) surplus.extend(decl[1]) inputs = replace(type_vars, inputs) surplus = replace(type_vars, surplus) return (tuple(inputs), tuple(surplus))
def typecheck(tok, typecode): if vm.words.has_key(tok): inputs = list(vm.words[tok][1]) products = list(vm.words[tok][2]) if len(inputs) > len(typecode): raise CompileError("%s tok expects %s items on stack, %s given" % (tok, len(inputs), len(typecode))) match_types(inputs, typecode, tok) typecode.extend(products) else: typecode.append(typeof(tok))