diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lj_cdata.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/lj_cdata.c b/src/lj_cdata.c index 1d0aea85..9033d492 100644 --- a/src/lj_cdata.c +++ b/src/lj_cdata.c | |||
| @@ -71,6 +71,7 @@ CType *lj_cdata_index(CTState *cts, GCcdata *cd, cTValue *key, uint8_t **pp, | |||
| 71 | { | 71 | { |
| 72 | uint8_t *p = (uint8_t *)cdataptr(cd); | 72 | uint8_t *p = (uint8_t *)cdataptr(cd); |
| 73 | CType *ct = ctype_get(cts, cd->typeid); | 73 | CType *ct = ctype_get(cts, cd->typeid); |
| 74 | ptrdiff_t idx; | ||
| 74 | 75 | ||
| 75 | /* Resolve reference for cdata object. */ | 76 | /* Resolve reference for cdata object. */ |
| 76 | if (ctype_isref(ct->info)) { | 77 | if (ctype_isref(ct->info)) { |
| @@ -88,8 +89,8 @@ collect_attrib: | |||
| 88 | lua_assert(!ctype_isref(ct->info)); /* Interning rejects refs to refs. */ | 89 | lua_assert(!ctype_isref(ct->info)); /* Interning rejects refs to refs. */ |
| 89 | 90 | ||
| 90 | if (tvisnum(key)) { /* Numeric key. */ | 91 | if (tvisnum(key)) { /* Numeric key. */ |
| 91 | ptrdiff_t idx = LJ_64 ? (ptrdiff_t)numV(key) : | 92 | idx = LJ_64 ? (ptrdiff_t)numV(key) : (ptrdiff_t)lj_num2int(numV(key)); |
| 92 | (ptrdiff_t)lj_num2int(numV(key)); | 93 | integer_key: |
| 93 | if (ctype_ispointer(ct->info)) { | 94 | if (ctype_ispointer(ct->info)) { |
| 94 | CTSize sz = lj_ctype_size(cts, ctype_cid(ct->info)); /* Element size. */ | 95 | CTSize sz = lj_ctype_size(cts, ctype_cid(ct->info)); /* Element size. */ |
| 95 | if (sz != CTSIZE_INVALID) { | 96 | if (sz != CTSIZE_INVALID) { |
| @@ -101,6 +102,15 @@ collect_attrib: | |||
| 101 | return ct; | 102 | return ct; |
| 102 | } | 103 | } |
| 103 | } | 104 | } |
| 105 | } else if (tviscdata(key)) { /* Integer cdata key. */ | ||
| 106 | GCcdata *cdk = cdataV(key); | ||
| 107 | CType *ctk = ctype_raw(cts, cdk->typeid); | ||
| 108 | if (ctype_isenum(ctk->info)) ctk = ctype_child(cts, ctk); | ||
| 109 | if (ctype_isinteger(ctk->info)) { | ||
| 110 | lj_cconv_ct_ct(cts, ctype_get(cts, CTID_INT_PSZ), ctk, | ||
| 111 | (uint8_t *)&idx, cdataptr(cdk), 0); | ||
| 112 | goto integer_key; | ||
| 113 | } | ||
| 104 | } else if (tvisstr(key)) { /* String key. */ | 114 | } else if (tvisstr(key)) { /* String key. */ |
| 105 | GCstr *name = strV(key); | 115 | GCstr *name = strV(key); |
| 106 | if (ctype_isptr(ct->info)) { /* Automatically perform '->'. */ | 116 | if (ctype_isptr(ct->info)) { /* Automatically perform '->'. */ |
