# HG changeset patch # User cslag # Date 1437343077 -7200 # Node ID 8523a2e087388f39402020a4ad3e886ff67f7cae # Parent a996f29affdf382a24579b7e849b2c13dd60c689# Parent d2a8d50a59b6ce84f7f80d21cd8ffbce491099c8 - merge diff -r a996f29affdf -r 8523a2e08738 dyncall/dyncall_callvm_arm64_apple.c --- 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;