Mercurial > pub > dyncall > dyncall
changeset 10:8523a2e08738
- merge
author | cslag |
---|---|
date | Sun, 19 Jul 2015 23:57:57 +0200 |
parents | a996f29affdf (current diff) d2a8d50a59b6 (diff) |
children | 0911112a8630 |
files | |
diffstat | 1 files changed, 58 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/dyncall/dyncall_callvm_arm64_apple.c Sun Jul 19 23:57:18 2015 +0200 +++ b/dyncall/dyncall_callvm_arm64_apple.c Sun Jul 19 23:57:57 2015 +0200 @@ -71,6 +71,29 @@ } } +static void var_i64 (DCCallVM* in_p, DClonglong x) +{ + DCCallVM_arm64* p = (DCCallVM_arm64*)in_p; + dcVecAlign(&p->mVecHead, sizeof(DClonglong)); + dcVecAppend(&p->mVecHead, &x, sizeof(DClonglong)); +} +static void var_bool (DCCallVM* in_p, DCbool x) { var_i64( in_p, ((DClonglong) x) ); } +static void var_char (DCCallVM* in_p, DCchar x) { var_i64( in_p, ((DClonglong) x) ); } +static void var_short (DCCallVM* in_p, DCshort x) { var_i64( in_p, ((DClonglong) x) ); } +static void var_int (DCCallVM* in_p, DCint x) { var_i64( in_p, ((DClonglong) x) ); } +static void var_long (DCCallVM* in_p, DClong x) { var_i64( in_p, ((DClonglong) x) ); } +static void var_double (DCCallVM* in_p, DCdouble in_x) { + DCCallVM_arm64* p = (DCCallVM_arm64*)in_p; + dcVecAlign(&p->mVecHead, sizeof(DCdouble)); + dcVecAppend(&p->mVecHead, &x, sizeof(DCdouble)); +} +static void var_float (DCCallVM* in_p, DCfloat x) { + var_double( in_p, (DCdouble) x ); +} +static void var_pointer (DCCallVM* in_p, DCpointer x) { + var_i64(in_p, (DClonglong) x ); +} + static void a_bool (DCCallVM* in_p, DCbool x) { DCCallVM_arm64* p = (DCCallVM_arm64*)in_p; @@ -191,6 +214,35 @@ , NULL /* callStruct */ }; +DCCallVM_vt vt_arm64_variadic = +{ + &deinit +, &reset +, &mode +, &var_bool +, &var_char +, &var_short +, &var_int +, &var_long +, &var_i64 +, &var_float +, &var_double +, &var_pointer +, NULL /* argStruct */ +, (DCvoidvmfunc*) &call +, (DCboolvmfunc*) &call +, (DCcharvmfunc*) &call +, (DCshortvmfunc*) &call +, (DCintvmfunc*) &call +, (DClongvmfunc*) &call +, (DClonglongvmfunc*) &call +, (DCfloatvmfunc*) &call +, (DCdoublevmfunc*) &call +, (DCpointervmfunc*) &call +, NULL /* callStruct */ +}; + + DCCallVM* dcNewCallVM(DCsize size) { return dc_callvm_new_arm64(&vt_arm64, size); @@ -202,11 +254,15 @@ DCCallVM_vt* vt; switch(mode) { case DC_CALL_C_DEFAULT: - case DC_CALL_C_ELLIPSIS: - case DC_CALL_C_ELLIPSIS_VARARGS: case DC_CALL_C_ARM64: vt = &vt_arm64; break; + case DC_CALL_C_ELLIPSIS: + vt = &vt_arm64; + break; + case DC_CALL_C_ELLIPSIS_VARARGS: + vt = &vt_arm64_variadic; + break; default: in_self->mError = DC_ERROR_UNSUPPORTED_MODE; return;