aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lj_cdata.c12
-rw-r--r--src/lj_crecord.c12
2 files changed, 15 insertions, 9 deletions
diff --git a/src/lj_cdata.c b/src/lj_cdata.c
index 29380cbc..a763908d 100644
--- a/src/lj_cdata.c
+++ b/src/lj_cdata.c
@@ -78,6 +78,7 @@ CType *lj_cdata_index(CTState *cts, GCcdata *cd, cTValue *key, uint8_t **pp,
78 ct = ctype_child(cts, ct); 78 ct = ctype_child(cts, ct);
79 } 79 }
80 80
81collect_attrib:
81 /* Skip attributes and collect qualifiers. */ 82 /* Skip attributes and collect qualifiers. */
82 while (ctype_isattrib(ct->info)) { 83 while (ctype_isattrib(ct->info)) {
83 if (ctype_attrib(ct->info) == CTA_QUAL) *qual |= ct->size; 84 if (ctype_attrib(ct->info) == CTA_QUAL) *qual |= ct->size;
@@ -102,17 +103,14 @@ CType *lj_cdata_index(CTState *cts, GCcdata *cd, cTValue *key, uint8_t **pp,
102 } else if (tvisstr(key)) { /* String key. */ 103 } else if (tvisstr(key)) { /* String key. */
103 GCstr *name = strV(key); 104 GCstr *name = strV(key);
104 if (ctype_isptr(ct->info)) { /* Automatically perform '->'. */ 105 if (ctype_isptr(ct->info)) { /* Automatically perform '->'. */
105 CType *cct = ctype_child(cts, ct); 106 if (ctype_isstruct(ctype_rawchild(cts, ct)->info)) {
106 if (ctype_isstruct(cct->info)) {
107 p = (uint8_t *)cdata_getptr(p, ct->size); 107 p = (uint8_t *)cdata_getptr(p, ct->size);
108 ct = cct; 108 ct = ctype_child(cts, ct);
109 goto index_struct; 109 goto collect_attrib;
110 } 110 }
111 } if (ctype_isstruct(ct->info)) { 111 } if (ctype_isstruct(ct->info)) {
112 CTSize ofs; 112 CTSize ofs;
113 CType *fct; 113 CType *fct = lj_ctype_getfield(cts, ct, name, &ofs);
114 index_struct:
115 fct = lj_ctype_getfield(cts, ct, name, &ofs);
116 if (fct) { 114 if (fct) {
117 *pp = p + ofs; 115 *pp = p + ofs;
118 return fct; 116 return fct;
diff --git a/src/lj_crecord.c b/src/lj_crecord.c
index 0d8c02a5..3ee39ece 100644
--- a/src/lj_crecord.c
+++ b/src/lj_crecord.c
@@ -363,9 +363,17 @@ void LJ_FASTCALL recff_cdata_index(jit_State *J, RecordFFData *rd)
363 GCstr *name = strV(&rd->argv[1]); 363 GCstr *name = strV(&rd->argv[1]);
364 /* Always specialize to the field name. */ 364 /* Always specialize to the field name. */
365 emitir(IRTG(IR_EQ, IRT_STR), idx, lj_ir_kstr(J, name)); 365 emitir(IRTG(IR_EQ, IRT_STR), idx, lj_ir_kstr(J, name));
366 if (ctype_isstruct(ct->info)) { 366 if (ctype_isptr(ct->info)) { /* Automatically perform '->'. */
367 CType *cct = ctype_rawchild(cts, ct);
368 if (ctype_isstruct(cct->info)) {
369 ct = cct;
370 goto index_struct;
371 }
372 } else if (ctype_isstruct(ct->info)) {
367 CTSize fofs; 373 CTSize fofs;
368 CType *fct = lj_ctype_getfield(cts, ct, name, &fofs); 374 CType *fct;
375index_struct:
376 fct = lj_ctype_getfield(cts, ct, name, &fofs);
369 if (fct) { 377 if (fct) {
370 if (ctype_isconstval(fct->info)) { 378 if (ctype_isconstval(fct->info)) {
371 if (fct->size >= 0x80000000u && 379 if (fct->size >= 0x80000000u &&