MCPcopy Create free account
hub / github.com/GJDuck/e9patch / parseMemOp

Function parseMemOp

src/e9tool/e9action.cpp:114–286  ·  view source on GitHub ↗

* Parse a memory operand. */

Source from the content-addressed store, hash-verified

112 * Parse a memory operand.
113 */
114static MemOp parseMemOp(Parser &parser, int t)
115{
116 MemOp memop;
117 switch (t)
118 {
119 case TOKEN_MEM8:
120 memop.size = sizeof(int8_t); break;
121 case TOKEN_MEM16:
122 memop.size = sizeof(int16_t); break;
123 case TOKEN_MEM32:
124 memop.size = sizeof(int32_t); break;
125 case TOKEN_MEM64:
126 memop.size = sizeof(int64_t); break;
127 default:
128 parser.unexpectedToken();
129 }
130
131 intptr_t disp64 = 0x0;
132 intptr_t scale64 = 1;
133 memop.seg = REGISTER_NONE;
134 memop.disp = 0x0;
135 memop.base = REGISTER_NONE;
136 memop.index = REGISTER_NONE;
137 memop.scale = 1;
138
139 parser.expectToken('<');
140 if (parser.peekToken() == TOKEN_REGISTER)
141 {
142 parser.getToken();
143 memop.seg = (Register)parser.i;
144 parser.expectToken(':');
145 }
146 bool neg = false;
147 switch (parser.peekToken())
148 {
149 case '-':
150 neg = true;
151 // Fallthrough:
152 case '+':
153 parser.getToken();
154 // Fallthrough:
155 case TOKEN_INTEGER:
156 parser.expectToken(TOKEN_INTEGER);
157 disp64 = (neg? -parser.i: parser.i);
158 break;
159 default:
160 break;
161 }
162
163 if (parser.peekToken() != '(')
164 goto memop_validate;
165 parser.getToken();
166
167 switch (parser.getToken())
168 {
169 case ',':
170 break;
171 case TOKEN_NIL: case TOKEN_REGISTER:

Callers 2

parseMatchArgFunction · 0.85
parsePatchArgFunction · 0.85

Calls 5

errorFunction · 0.85
unexpectedTokenMethod · 0.80
expectTokenMethod · 0.80
peekTokenMethod · 0.80
getTokenMethod · 0.80

Tested by

no test coverage detected