diff dyncallback/dyncall_args_x64.c @ 544:111236b31c75

- C++ non-trivial aggregate-by-value handling: * dyncallback support for dcbArgAggr() * better doc
author Tassilo Philipp
date Tue, 31 May 2022 18:25:13 +0200
parents 804df3409b51
children 0455834d29a1
line wrap: on
line diff
--- a/dyncallback/dyncall_args_x64.c	Tue May 31 16:47:57 2022 +0200
+++ b/dyncallback/dyncall_args_x64.c	Tue May 31 18:25:13 2022 +0200
@@ -74,15 +74,14 @@
 DCdouble    dcbArgDouble   (DCArgs* p) { return *arg_f64(p); }
 DCfloat     dcbArgFloat    (DCArgs* p) { return *(float*)arg_f64(p); }
 
-void        dcbArgAggr     (DCArgs* p, DCpointer target)
+DCpointer   dcbArgAggr     (DCArgs* p, DCpointer target)
 {
   int i;
   DCaggr *ag = *(p->aggrs++);
 
   if(!ag) {
     /* non-trivial aggr: retrieve as ptr, user is supposed to make copy */
-    target = dcbArgPointer(p);
-    return;
+    return dcbArgPointer(p);
   }
 
 #if defined(DC_UNIX)
@@ -102,21 +101,23 @@
   {
      memcpy(target, p->stack_ptr, ag->size);
      p->stack_ptr = p->stack_ptr + ((ag->size + (sizeof(DClonglong)-1)) >> 3); // advance to next full stack slot
-     return;
+  }
+  else
+  {
+    for(i=0; ag->sysv_classes[i] && i<DC_SYSV_MAX_NUM_CLASSES; ++i)
+    {
+      switch (ag->sysv_classes[i])
+      {
+        case SYSVC_INTEGER: ((DClonglong*)target)[i] = dcbArgLongLong(p); break;
+        case SYSVC_SSE:     ((DCdouble  *)target)[i] = dcbArgDouble  (p); break;
+        /* @@@AGGR implement when implementing x87 types */
+        default:
+            assert(DC_FALSE && "Should never be reached because we check for unupported classes earlier");
+      }
+    }
   }
 
-
-  for(i=0; ag->sysv_classes[i] && i<DC_SYSV_MAX_NUM_CLASSES; ++i)
-  {
-    switch (ag->sysv_classes[i])
-    {
-      case SYSVC_INTEGER: ((DClonglong*)target)[i] = dcbArgLongLong(p); break;
-      case SYSVC_SSE:     ((DCdouble  *)target)[i] = dcbArgDouble  (p); break;
-      /* @@@AGGR implement when implementing x87 types */
-      default:
-          assert(DC_FALSE && "Should never be reached because we check for unupported classes earlier");
-    }
-  }
+  return target;
 
 #else
 
@@ -145,7 +146,7 @@
 
   if(!ag) {
     /* non-trivial aggr: all we can do is to provide the ptr to the output space, user has to make copy */
-    result->p = args->reg_data.i[0];
+    result->p = (DCpointer) args->reg_data.i[0];
     return;
   }