|
14 | 14 | #include <float.h> |
15 | 15 | #include <fenv.h> |
16 | 16 |
|
17 | | -#define ESIL_MACRO 0 |
18 | 17 | // TODO: replace esil->verbose with R_LOG_DEBUG |
19 | 18 | #define IFDBG if (esil->verbose > 1) |
20 | 19 |
|
@@ -209,46 +208,48 @@ R_API REsil *r_esil_new_simple(ut32 addrsize, void *reg, void *iob) { |
209 | 208 | return r_esil_new_ex (4096, false, addrsize, &simple_reg_if, &simple_mem_if); |
210 | 209 | } |
211 | 210 |
|
212 | | -R_API st32 r_esil_add_voyeur(REsil *esil, void *user, void *vfn, REsilVoyeurType vt) { |
213 | | - R_RETURN_VAL_IF_FAIL (esil && vfn, -1); |
| 211 | +R_API ut32 r_esil_add_voyeur(REsil *esil, void *user, void *vfn, REsilVoyeurType vt) { |
| 212 | + R_RETURN_VAL_IF_FAIL (esil && vfn, R_ESIL_VOYEUR_ERR); |
214 | 213 | switch (vt) { |
215 | 214 | case R_ESIL_VOYEUR_REG_READ: |
216 | 215 | case R_ESIL_VOYEUR_REG_WRITE: |
217 | 216 | case R_ESIL_VOYEUR_MEM_READ: |
218 | 217 | case R_ESIL_VOYEUR_MEM_WRITE: |
| 218 | + case R_ESIL_VOYEUR_OP: |
219 | 219 | break; |
220 | 220 | default: |
221 | 221 | r_warn_if_reached (); |
222 | | - return -1; |
| 222 | + return R_ESIL_VOYEUR_ERR; |
223 | 223 | } |
224 | 224 | REsilVoyeur *voyeur = R_NEW (REsilVoyeur); |
225 | 225 | if (!voyeur) { |
226 | | - return -1; |
| 226 | + return R_ESIL_VOYEUR_ERR; |
227 | 227 | } |
228 | 228 | ut32 id; |
229 | 229 | if (!r_id_storage_add (&esil->voyeur[vt], voyeur, &id)) { |
230 | 230 | free (voyeur); |
231 | | - return -1; |
| 231 | + return R_ESIL_VOYEUR_ERR; |
232 | 232 | } |
233 | 233 | voyeur->user = user; |
234 | 234 | voyeur->vfn = vfn; |
235 | | - return (st32)(id | (vt << 29)); |
| 235 | + return id | (vt << VOYEUR_SHIFT_LEFT); |
236 | 236 | } |
237 | 237 |
|
238 | | -R_API void r_esil_del_voyeur(REsil *esil, st32 vid) { |
| 238 | +R_API void r_esil_del_voyeur(REsil *esil, ut32 vid) { |
239 | 239 | R_RETURN_IF_FAIL (esil); |
240 | | - const ut32 vt = (vid & (0x7 << 29)) >> 29; |
| 240 | + const ut32 vt = (vid & VOYEUR_TYPE_MASK) >> VOYEUR_SHIFT_LEFT; |
241 | 241 | switch (vt) { |
242 | 242 | case R_ESIL_VOYEUR_REG_READ: |
243 | 243 | case R_ESIL_VOYEUR_REG_WRITE: |
244 | 244 | case R_ESIL_VOYEUR_MEM_READ: |
245 | 245 | case R_ESIL_VOYEUR_MEM_WRITE: |
| 246 | + case R_ESIL_VOYEUR_OP: |
246 | 247 | break; |
247 | 248 | default: |
248 | 249 | r_warn_if_reached (); |
249 | 250 | return; |
250 | 251 | } |
251 | | - const ut32 id = vid & ~(0x7 << 29); |
| 252 | + const ut32 id = vid & ~VOYEUR_TYPE_MASK; |
252 | 253 | free (r_id_storage_take (&esil->voyeur[vt], id)); |
253 | 254 | } |
254 | 255 |
|
@@ -3758,11 +3759,21 @@ static bool runword(REsil *esil, const char *word) { |
3758 | 3759 | op = r_esil_get_op (esil, word); |
3759 | 3760 | if (op) { |
3760 | 3761 | // run action |
| 3762 | +#if USE_NEW_ESIL |
| 3763 | + ut32 i; |
| 3764 | + if (r_id_storage_get_lowest (&esil->voyeur[R_ESIL_VOYEUR_OP], &i)) { |
| 3765 | + do { |
| 3766 | + REsilVoyeur *voy = r_id_storage_get (&esil->voyeur[R_ESIL_VOYEUR_OP], i); |
| 3767 | + voy->op (voy->user, word); |
| 3768 | + } while (r_id_storage_get_next (&esil->voyeur[R_ESIL_VOYEUR_OP], &i)); |
| 3769 | + } |
| 3770 | +#else |
3761 | 3771 | if (esil->cb.hook_command) { |
3762 | 3772 | if (esil->cb.hook_command (esil, word)) { |
3763 | 3773 | return 1; // XXX cannot return != 1 |
3764 | 3774 | } |
3765 | 3775 | } |
| 3776 | +#endif |
3766 | 3777 | esil->current_opstr = strdup (word); |
3767 | 3778 | // so this is basically just sharing what's the |
3768 | 3779 | // operation with the operation useful for wrappers |
|
0 commit comments