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;