aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm.peg6
-rw-r--r--parse.c22
2 files changed, 15 insertions, 13 deletions
diff --git a/asm.peg b/asm.peg
index 8d16458..01bcf04 100644
--- a/asm.peg
+++ b/asm.peg
@@ -445,8 +445,8 @@ r64-or-rip = (
) { $$ = r; }
m =
- d:value ws? sib:opt-scale-index-base { $$ = sib; $$.memarg.disp = d.value; }
- | sib:scale-index-base { $$ = sib; }
+ d:value ws? sib:opt-scale-index-base { $$ = (Parsev){ .memarg=sib.memarg }; $$.memarg.disp = d.value; }
+ | sib:scale-index-base { $$ = (Parsev){ .memarg=sib.memarg }; }
opt-scale-index-base =
sib:scale-index-base { $$ = sib; }
@@ -466,7 +466,7 @@ imm32 = i:imm { i.imm.nbytes = 4; $$ = i; }
imm =
'$' ws? val:value
- { $$.imm = (Imm){ .kind = ASM_IMM, .v = val.value, .nbytes = 0}; }
+ { $$ = (Parsev) { .imm = (Imm){ .kind = ASM_IMM, .v = val.value, .nbytes = 0} }; }
al = "%al" { $$ = REG(ASM_AL); }
cl = "%cl" { $$ = REG(ASM_CL); }
diff --git a/parse.c b/parse.c
index 381c3df..66a1ddf 100644
--- a/parse.c
+++ b/parse.c
@@ -1,6 +1,6 @@
#include "minias.h"
-/* Maintain a direct mapped cache of Parsev* to avoid duplication. */
+/* Maintain a direct mapped cache of Parsev*. */
static const Parsev *internparsev(Parsev *p) {
/* An extremely simple direct mapped cache of *Parsev,
It relies on direct pointer comparison, which
@@ -9,23 +9,24 @@ static const Parsev *internparsev(Parsev *p) {
const Parsev *interned;
static const Parsev *cache[4096] = {0};
- idx = murmurhash64a((char *)p, sizeof(Parsev)) % sizeof(cache)/sizeof(cache[0]);
+ idx = murmurhash64a((char *)p, sizeof(Parsev)) % sizeof(cache) /
+ sizeof(cache[0]);
interned = cache[idx];
if (interned && memcmp(p, interned, sizeof(Parsev)) == 0)
return interned;
- interned = (const Parsev *)xmemdup((char*)p, sizeof(Parsev));
+ interned = (const Parsev *)xmemdup((char *)p, sizeof(Parsev));
cache[idx] = interned;
return interned;
}
-/* Maintain a direct cache of strings to avoid duplication. */
+/* Maintain a direct cache of strings. */
const char *internstring(const char *s) {
size_t idx, len;
const char *interned;
static const char *cache[4096] = {0};
len = strlen(s);
- idx = murmurhash64a(s, len) % sizeof(cache)/sizeof(cache[0]);
+ idx = murmurhash64a(s, len) % sizeof(cache) / sizeof(cache[0]);
interned = cache[idx];
if (interned && strcmp(s, cache[idx]) == 0)
return interned;
@@ -78,21 +79,22 @@ static String decodestring(char *s) {
#define INSTR1(V, A1) \
(Parsev) { \
.instr = (Instr) { \
- .kind = 0, .variant = V, .arg1 = internparsev(&A1), .arg2 = NULL, .arg3 = NULL \
+ .kind = 0, .variant = V, .arg1 = internparsev(&A1), .arg2 = NULL, \
+ .arg3 = NULL \
} \
}
#define INSTR2(V, A1, A2) \
(Parsev) { \
.instr = (Instr) { \
- .kind = 0, .variant = V, .arg1 = internparsev(&A1), .arg2 = internparsev(&A2), \
- .arg3 = NULL \
+ .kind = 0, .variant = V, .arg1 = internparsev(&A1), \
+ .arg2 = internparsev(&A2), .arg3 = NULL \
} \
}
#define INSTR3(V, A1, A2, A3) \
(Parsev) { \
.instr = (Instr) { \
- .kind = 0, .variant = V, .arg1 = internparsev(&A1), .arg2 = internparsev(&A2), \
- .arg3 = internparsev(&A3) \
+ .kind = 0, .variant = V, .arg1 = internparsev(&A1), \
+ .arg2 = internparsev(&A2), .arg3 = internparsev(&A3) \
} \
}