Mercurial > pub > dyncall > dyncall
changeset 8:d2a8d50a59b6
added callvm for varargs
author | Daniel Adler |
---|---|
date | Sun, 19 Jul 2015 22:31:09 +0200 |
parents | 7ca57dbefed4 |
children | 8523a2e08738 |
files | dyncall/dyncall_callvm_arm64_apple.c |
diffstat | 1 files changed, 58 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/dyncall/dyncall_callvm_arm64_apple.c Sun Jul 19 13:05:34 2015 +0200 +++ b/dyncall/dyncall_callvm_arm64_apple.c Sun Jul 19 22:31:09 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;