aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2012-08-08 20:35:02 +0200
committerMike Pall <mike>2012-08-08 20:36:31 +0200
commite2373c153888ea082c31aa8f7d938c09fbe3f4d6 (patch)
tree39258b5d04b6fa003d380cc860bccc9e82548d85
parent5e227865bc337d355fb635d65c9fca1cbbf83742 (diff)
downloadluajit-e2373c153888ea082c31aa8f7d938c09fbe3f4d6.tar.gz
luajit-e2373c153888ea082c31aa8f7d938c09fbe3f4d6.tar.bz2
luajit-e2373c153888ea082c31aa8f7d938c09fbe3f4d6.zip
FFI: Compile assignments from enums.
Thanks to Robert G. Jakabosky.
-rw-r--r--src/lj_crecord.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/lj_crecord.c b/src/lj_crecord.c
index 2a475035..dbd0b83b 100644
--- a/src/lj_crecord.c
+++ b/src/lj_crecord.c
@@ -422,6 +422,7 @@ static TRef crec_ct_tv(jit_State *J, CType *d, TRef dp, TRef sp, cTValue *sval)
422 if (ctype_isref(s->info)) { 422 if (ctype_isref(s->info)) {
423 svisnz = *(void **)svisnz; 423 svisnz = *(void **)svisnz;
424 s = ctype_rawchild(cts, s); 424 s = ctype_rawchild(cts, s);
425 if (ctype_isenum(s->info)) s = ctype_child(cts, s);
425 t = crec_ct2irt(cts, s); 426 t = crec_ct2irt(cts, s);
426 } else { 427 } else {
427 goto doconv; 428 goto doconv;
@@ -431,6 +432,7 @@ static TRef crec_ct_tv(jit_State *J, CType *d, TRef dp, TRef sp, cTValue *sval)
431 lj_needsplit(J); 432 lj_needsplit(J);
432 goto doconv; 433 goto doconv;
433 } else if (t == IRT_INT || t == IRT_U32) { 434 } else if (t == IRT_INT || t == IRT_U32) {
435 if (ctype_isenum(s->info)) s = ctype_child(cts, s);
434 sp = emitir(IRT(IR_FLOAD, t), sp, IRFL_CDATA_INT); 436 sp = emitir(IRT(IR_FLOAD, t), sp, IRFL_CDATA_INT);
435 goto doconv; 437 goto doconv;
436 } else { 438 } else {
@@ -691,14 +693,15 @@ static void crec_alloc(jit_State *J, RecordFFData *rd, CTypeID id)
691 setintV(&tv, 0); 693 setintV(&tv, 0);
692 if (!gcref(df->name)) continue; /* Ignore unnamed fields. */ 694 if (!gcref(df->name)) continue; /* Ignore unnamed fields. */
693 dc = ctype_rawchild(cts, df); /* Field type. */ 695 dc = ctype_rawchild(cts, df); /* Field type. */
694 if (!(ctype_isnum(dc->info) || ctype_isptr(dc->info))) 696 if (!(ctype_isnum(dc->info) || ctype_isptr(dc->info) ||
697 ctype_isenum(dc->info)))
695 lj_trace_err(J, LJ_TRERR_NYICONV); /* NYI: init aggregates. */ 698 lj_trace_err(J, LJ_TRERR_NYICONV); /* NYI: init aggregates. */
696 if (J->base[i]) { 699 if (J->base[i]) {
697 sp = J->base[i]; 700 sp = J->base[i];
698 sval = &rd->argv[i]; 701 sval = &rd->argv[i];
699 i++; 702 i++;
700 } else { 703 } else {
701 sp = ctype_isnum(dc->info) ? lj_ir_kint(J, 0) : TREF_NIL; 704 sp = ctype_isptr(dc->info) ? TREF_NIL : lj_ir_kint(J, 0);
702 } 705 }
703 dp = emitir(IRT(IR_ADD, IRT_PTR), trcd, 706 dp = emitir(IRT(IR_ADD, IRT_PTR), trcd,
704 lj_ir_kintp(J, df->size + sizeof(GCcdata))); 707 lj_ir_kintp(J, df->size + sizeof(GCcdata)));