diff options
author | Mike Pall <mike> | 2012-08-08 20:35:02 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2012-08-08 20:36:31 +0200 |
commit | e2373c153888ea082c31aa8f7d938c09fbe3f4d6 (patch) | |
tree | 39258b5d04b6fa003d380cc860bccc9e82548d85 | |
parent | 5e227865bc337d355fb635d65c9fca1cbbf83742 (diff) | |
download | luajit-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.c | 7 |
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))); |