Skip to content

Commit

Permalink
Merge branch 'opt-inject-project'
Browse files Browse the repository at this point in the history
  • Loading branch information
cantora committed Dec 12, 2012
2 parents f85c734 + 49ea40c commit 234f694
Show file tree
Hide file tree
Showing 4 changed files with 118 additions and 12 deletions.
67 changes: 60 additions & 7 deletions pyc_asm_list.py
Expand Up @@ -85,13 +85,6 @@ def set_var_default(self, node, var, var_tbl):
ClosureFVS: ('get_free_vars', 'var'),
DictRef: ('create_dict',),
ListRef: ('create_list', 'size'),
InjectFromInt: ('inject_int', 'arg'),
InjectFromBool: ('inject_bool', 'arg'),
InjectFromBig: ('inject_big', 'arg'),
ProjectToInt: ('project_int', 'arg'),
ProjectToBool: ('project_bool', 'arg'),
ProjectToBig: ('project_big', 'arg'),
Tag: ('tag', 'arg'),
IsTrue: ('is_true', 'arg'),
IsClass: ('is_class', 'arg'),
IsBoundMethod: ('is_bound_method', 'arg'),
Expand All @@ -112,6 +105,66 @@ def set_var_to_ir_fn(self, node, var, var_tbl):
var_tbl
)

def set_var_to_Tag(self, node, var, var_tbl):
op = self.se_to_operand(node.arg, var_tbl)

return [
Mov(op, var),
And(Immed(HexInt(0x03)), var)
]

def set_var_to_ProjectToInt(self, node, var, var_tbl):
return self.set_var_to_project(node, var, var_tbl)

def set_var_to_ProjectToBool(self, node, var, var_tbl):
return self.set_var_to_project(node, var, var_tbl)

def set_var_to_ProjectToBig(self, node, var, var_tbl):
op = self.se_to_operand(node.arg, var_tbl)
return [
Mov(op, var),
And(Immed(HexInt(0xfffffffc)), var)
]

def set_var_to_project(self, node, var, var_tbl):
op = self.se_to_operand(node.arg, var_tbl)
return [
Mov(op, var),
Sarl(Immed(HexInt(2)), var)
]

def set_var_to_InjectFromBig(self, node, var, var_tbl):
op = self.se_to_operand(node.arg, var_tbl)
return [
Mov(op, var),
Or(Immed(HexInt(Tag.big.n)), var)
]

def set_var_to_InjectFromBool(self, node, var, var_tbl):
return self.set_var_to_inject(node, var, var_tbl, Tag.bool.n)

def set_var_to_InjectFromInt(self, node, var, var_tbl):
return self.set_var_to_inject(node, var, var_tbl, Tag.int.n)

def set_var_to_inject(self, node, var, var_tbl, tag):
op = self.se_to_operand(node.arg, var_tbl)

if isinstance(op, Immed):
n = op.node.val
n = n << 2
n = n | tag
return [Mov(Immed(HexInt(n)), var)]

insns = [
Mov(op, var),
Sall(Immed(HexInt(0x02)), var)
]

if tag != 0:
insns.append(Or(Immed(HexInt(tag)), var))

return insns

def set_var_to_HasAttr(self, node, var, var_tbl):
return self.set_var_to_fn_call(
'has_attr',
Expand Down
47 changes: 45 additions & 2 deletions pyc_asm_nodes.py
Expand Up @@ -344,6 +344,42 @@ def __init__(self, operand):
def __str__(self):
return self.inst_join(["pop", str(self.operand)])

class Sall(Inst):
def __init__(self, amt, operand):
Inst.__init__(self)
self.read_operand('amt', amt)
self.read_write_operand('operand', operand)

def __str__(self):
return self.inst_join(["sall", "%s, %s" % (str(self.amt), str(self.operand) ) ])

class Sarl(Inst):
def __init__(self, amt, operand):
Inst.__init__(self)
self.read_operand('amt', amt)
self.read_write_operand('operand', operand)

def __str__(self):
return self.inst_join(["sarl", "%s, %s" % (str(self.amt), str(self.operand) ) ])

class And(Inst):
def __init__(self, left, right):
Inst.__init__(self)
self.read_operand('left', left)
self.read_write_operand('right', right)

def __str__(self):
return self.inst_join(["andl", "%s, %s" % (str(self.left), str(self.right) ) ])

class Or(Inst):
def __init__(self, left, right):
Inst.__init__(self)
self.read_operand('left', left)
self.read_write_operand('right', right)

def __str__(self):
return self.inst_join(["orl", "%s, %s" % (str(self.left), str(self.right) ) ])


class Neg(Inst):
def __init__(self, operand):
Expand Down Expand Up @@ -754,7 +790,7 @@ def _to_gdb(self, offset):
if offset != 0:
off_str = str(offset)

s = "%s%s" % (self.reg.to_gdb(), off_str)
s = "*(int *)(%s%s)" % (self.reg.to_gdb(), off_str)

return s

Expand Down Expand Up @@ -799,7 +835,14 @@ def __init__(self, val):
self.val = val

def __str__(self):
return "0x%02x" % self.val
n = self.val
s = ""
if n < 0:
n = -n
s += "-"

s += "0x%02x" % n
return s

def __repr__(self):
return common_repr(self.__class__.__name__, str(self))
Expand Down
13 changes: 11 additions & 2 deletions pyc_dbg.py
Expand Up @@ -620,8 +620,17 @@ def invoke (self, arg, from_tty):
log("e: %s" % e)
print "not currently executing pyc generated code"
return

self.state.full_context(sys.stdout, src_lines, src_lineno, sir_lines, sir_lineno)

curr_live = self.state.live_map()
self.state.full_context(
sys.stdout,
src_lines,
src_lineno,
sir_lines,
sir_lineno,
curr_live,
self.state.prev_live
)

self.cmds.append(Context(self))

Expand Down
3 changes: 2 additions & 1 deletion pyc_sir.py
Expand Up @@ -332,7 +332,8 @@ def visit_Expr(self, node):
return (None, sir_list)

def visit_Error(self, node):
return (Error(msg=node.msg), [])
n = ast.Str(node.msg.s + " (sir-line %s)" % (self.lineno+1) )
return (Error(msg=n), [])

def visit_Let(self, node):
(rhs_name, rhs_sir_list) = pyc_vis.visit(self, node.rhs)
Expand Down

0 comments on commit 234f694

Please sign in to comment.