MCPcopy Create free account
hub / github.com/Vector35/binaryninja-api / BetterNode

Class BetterNode

arch/armv7/thumb2_disasm/arm_pcode_parser/codegencpp.py:43–366  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

41###############################################################################
42
43class BetterNode(object):
44 def __init__(self, name, children=[], semicolon=False):
45 self.name = name
46 self.children = children
47 self.semicolon = semicolon
48
49 def gen(self, extra=''):
50 # leaf nodes (no possible descent)
51 if self.name == 'ident':
52 tmp = (self.children[0] + extra).replace('.', '_')
53 if not tmp.startswith('FIELD_'):
54 tmp = 'FIELD_' + tmp
55 code = 'res->fields[%s]' % tmp
56 elif self.name == 'rawtext':
57 code = self.children[0]
58 elif self.name == 'number':
59 code = self.children[0]
60 elif self.name == 'bits':
61 code = '0x%X' % int(self.children[0], 2)
62 elif self.name == 'see':
63 code = '\nmemset(res, 0, sizeof(*res));'
64 code = '\nreturn %s(req, res);' % self.children[0]
65 self.semicolon = 0
66 else:
67 subCode = map(lambda x: x.gen(), self.children)
68 subCode = tuple(subCode)
69
70 # binary operations translate directly to C
71 if self.name == 'xor':
72 assert len(self.children) == 2
73 code = '(%s) ^ (%s)' % subCode
74 elif self.name == 'add':
75 assert len(self.children) == 2
76 code = '(%s) + (%s)' % subCode
77 elif self.name == 'sub':
78 assert len(self.children) == 2
79 code = '(%s) - (%s)' % subCode
80 elif self.name == 'less_than':
81 assert len(self.children) == 2
82 code = '(%s) < (%s)' % subCode
83 elif self.name == 'greater_than':
84 assert len(self.children) == 2
85 code = '(%s) > (%s)' % subCode
86 elif self.name == 'log_and':
87 assert len(self.children) == 2
88 code = '(%s) && (%s)' % subCode
89 elif self.name == 'log_or':
90 assert len(self.children) == 2
91 code = '(%s) || (%s)' % subCode
92 elif self.name == 'log_not':
93 assert len(self.children) == 1
94 code = '!(%s)' % subCode
95 elif self.name == 'equals':
96 assert len(self.children) == 2
97 code = '(%s) == (%s)' % subCode
98 elif self.name == 'not_equals':
99 assert len(self.children) == 2
100 code = '(%s) != (%s)' % subCode

Callers 11

statementMethod · 0.85
tupleMethod · 0.85
expr0Method · 0.85
expr1Method · 0.85
expr3Method · 0.85
numberMethod · 0.85
bitsMethod · 0.85
identMethod · 0.85
sliceableMethod · 0.85
builtin_valueMethod · 0.85
func_callMethod · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected