diff options
author | Mike Pall <mike> | 2013-05-16 14:48:47 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2013-05-16 14:48:47 +0200 |
commit | a946f678d553494ee23a29a10cced1d5cc11ab7e (patch) | |
tree | 401432100e96d560aaebe7640f0c578dde7dd848 | |
parent | 2b94827e1d7f053e7ff0d724644f59a5b8ccff13 (diff) | |
parent | 1c7650f782c4e6482cf496699af9136c89fe22b2 (diff) | |
download | luajit-a946f678d553494ee23a29a10cced1d5cc11ab7e.tar.gz luajit-a946f678d553494ee23a29a10cced1d5cc11ab7e.tar.bz2 luajit-a946f678d553494ee23a29a10cced1d5cc11ab7e.zip |
Merge branch 'master' into v2.1
-rw-r--r-- | src/lj_ccall.c | 8 |
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; |