aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2013-05-16 14:48:47 +0200
committerMike Pall <mike>2013-05-16 14:48:47 +0200
commita946f678d553494ee23a29a10cced1d5cc11ab7e (patch)
tree401432100e96d560aaebe7640f0c578dde7dd848
parent2b94827e1d7f053e7ff0d724644f59a5b8ccff13 (diff)
parent1c7650f782c4e6482cf496699af9136c89fe22b2 (diff)
downloadluajit-a946f678d553494ee23a29a10cced1d5cc11ab7e.tar.gz
luajit-a946f678d553494ee23a29a10cced1d5cc11ab7e.tar.bz2
luajit-a946f678d553494ee23a29a10cced1d5cc11ab7e.zip
Merge branch 'master' into v2.1
-rw-r--r--src/lj_ccall.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/lj_ccall.c b/src/lj_ccall.c
index a3ad1974..995729b0 100644
--- a/src/lj_ccall.c
+++ b/src/lj_ccall.c
@@ -583,22 +583,26 @@ static unsigned int ccall_classify_struct(CTState *cts, CType *ct, CType *ctf)
583 unsigned int r = 0, n = 0, isu = (ct->info & CTF_UNION); 583 unsigned int r = 0, n = 0, isu = (ct->info & CTF_UNION);
584 if ((ctf->info & CTF_VARARG)) goto noth; 584 if ((ctf->info & CTF_VARARG)) goto noth;
585 while (ct->sib) { 585 while (ct->sib) {
586 CType *sct;
586 ct = ctype_get(cts, ct->sib); 587 ct = ctype_get(cts, ct->sib);
587 if (ctype_isfield(ct->info)) { 588 if (ctype_isfield(ct->info)) {
588 CType *sct = ctype_rawchild(cts, ct); 589 sct = ctype_rawchild(cts, ct);
589 if (ctype_isfp(sct->info)) { 590 if (ctype_isfp(sct->info)) {
590 r |= sct->size; 591 r |= sct->size;
591 if (!isu) n++; else if (n == 0) n = 1; 592 if (!isu) n++; else if (n == 0) n = 1;
592 } else if (ctype_iscomplex(sct->info)) { 593 } else if (ctype_iscomplex(sct->info)) {
593 r |= (sct->size >> 1); 594 r |= (sct->size >> 1);
594 if (!isu) n += 2; else if (n < 2) n = 2; 595 if (!isu) n += 2; else if (n < 2) n = 2;
596 } else if (ctype_isstruct(sct->info)) {
597 goto substruct;
595 } else { 598 } else {
596 goto noth; 599 goto noth;
597 } 600 }
598 } else if (ctype_isbitfield(ct->info)) { 601 } else if (ctype_isbitfield(ct->info)) {
599 goto noth; 602 goto noth;
600 } else if (ctype_isxattrib(ct->info, CTA_SUBTYPE)) { 603 } else if (ctype_isxattrib(ct->info, CTA_SUBTYPE)) {
601 CType *sct = ctype_rawchild(cts, ct); 604 sct = ctype_rawchild(cts, ct);
605 substruct:
602 if (sct->size > 0) { 606 if (sct->size > 0) {
603 unsigned int s = ccall_classify_struct(cts, sct, ctf); 607 unsigned int s = ccall_classify_struct(cts, sct, ctf);
604 if (s <= 1) goto noth; 608 if (s <= 1) goto noth;