diff options
Diffstat (limited to '')
-rw-r--r-- | src/lj_strfmt.c | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/src/lj_strfmt.c b/src/lj_strfmt.c index 5826b539..7b073470 100644 --- a/src/lj_strfmt.c +++ b/src/lj_strfmt.c | |||
@@ -16,6 +16,9 @@ | |||
16 | #include "lj_state.h" | 16 | #include "lj_state.h" |
17 | #include "lj_char.h" | 17 | #include "lj_char.h" |
18 | #include "lj_strfmt.h" | 18 | #include "lj_strfmt.h" |
19 | #if LJ_HASFFI | ||
20 | #include "lj_ctype.h" | ||
21 | #endif | ||
19 | #include "lj_lib.h" | 22 | #include "lj_lib.h" |
20 | 23 | ||
21 | /* -- Format parser ------------------------------------------------------- */ | 24 | /* -- Format parser ------------------------------------------------------- */ |
@@ -392,15 +395,34 @@ int lj_strfmt_putarg(lua_State *L, SBuf *sb, int arg, int retry) | |||
392 | lj_strfmt_putint(sb, k); /* Shortcut for plain %d. */ | 395 | lj_strfmt_putint(sb, k); /* Shortcut for plain %d. */ |
393 | else | 396 | else |
394 | lj_strfmt_putfxint(sb, sf, k); | 397 | lj_strfmt_putfxint(sb, sf, k); |
395 | } else { | 398 | break; |
396 | lj_strfmt_putfnum_int(sb, sf, lj_lib_checknum(L, arg)); | 399 | } |
400 | #if LJ_HASFFI | ||
401 | if (tviscdata(o)) { | ||
402 | GCcdata *cd = cdataV(o); | ||
403 | if (cd->ctypeid == CTID_INT64 || cd->ctypeid == CTID_UINT64) { | ||
404 | lj_strfmt_putfxint(sb, sf, *(uint64_t *)cdataptr(cd)); | ||
405 | break; | ||
406 | } | ||
397 | } | 407 | } |
408 | #endif | ||
409 | lj_strfmt_putfnum_int(sb, sf, lj_lib_checknum(L, arg)); | ||
398 | break; | 410 | break; |
399 | case STRFMT_UINT: | 411 | case STRFMT_UINT: |
400 | if (tvisint(o)) | 412 | if (tvisint(o)) { |
401 | lj_strfmt_putfxint(sb, sf, intV(o)); | 413 | lj_strfmt_putfxint(sb, sf, intV(o)); |
402 | else | 414 | break; |
403 | lj_strfmt_putfnum_uint(sb, sf, lj_lib_checknum(L, arg)); | 415 | } |
416 | #if LJ_HASFFI | ||
417 | if (tviscdata(o)) { | ||
418 | GCcdata *cd = cdataV(o); | ||
419 | if (cd->ctypeid == CTID_INT64 || cd->ctypeid == CTID_UINT64) { | ||
420 | lj_strfmt_putfxint(sb, sf, *(uint64_t *)cdataptr(cd)); | ||
421 | break; | ||
422 | } | ||
423 | } | ||
424 | #endif | ||
425 | lj_strfmt_putfnum_uint(sb, sf, lj_lib_checknum(L, arg)); | ||
404 | break; | 426 | break; |
405 | case STRFMT_NUM: | 427 | case STRFMT_NUM: |
406 | lj_strfmt_putfnum(sb, sf, lj_lib_checknum(L, arg)); | 428 | lj_strfmt_putfnum(sb, sf, lj_lib_checknum(L, arg)); |