summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/runbacktrace.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/asymptote/runbacktrace.cc')
-rw-r--r--Build/source/utils/asymptote/runbacktrace.cc51
1 files changed, 46 insertions, 5 deletions
diff --git a/Build/source/utils/asymptote/runbacktrace.cc b/Build/source/utils/asymptote/runbacktrace.cc
index 7e25c6be058..8d8c8ff0447 100644
--- a/Build/source/utils/asymptote/runbacktrace.cc
+++ b/Build/source/utils/asymptote/runbacktrace.cc
@@ -32,6 +32,7 @@
using vm::stack;
using vm::error;
using vm::array;
+using vm::read;
using vm::callable;
using types::formal;
using types::function;
@@ -50,12 +51,52 @@ array *copyArray(array *a);
array *copyArray2(array *a);
array *copyArray3(array *a);
-double *copyArrayC(const array *a, size_t dim=0, GCPlacement placement=NoGC);
-double *copyArray2C(const array *a, bool square=true, size_t dim2=0,
- GCPlacement placement=NoGC);
+inline size_t checkdimension(const array *a, size_t dim)
+{
+ size_t size=checkArray(a);
+ if(dim && size != dim) {
+ ostringstream buf;
+ buf << "array of length " << dim << " expected";
+ error(buf);
+ }
+ return size;
+}
+
+template<class T>
+void copyArrayC(T* &dest, const array *a, size_t dim=0,
+ GCPlacement placement=NoGC)
+{
+ size_t size=checkdimension(a,dim);
+ dest=(placement == NoGC) ? new T[size] : new(placement) T[size];
+ for(size_t i=0; i < size; i++)
+ dest[i]=read<T>(a,i);
+}
+
+template<class T>
+void copyArray2C(T* &dest, const array *a, bool square=true, size_t dim2=0,
+ GCPlacement placement=NoGC)
+{
+ size_t n=checkArray(a);
+ size_t m=(square || n == 0) ? n : checkArray(read<array*>(a,0));
+ if(n > 0 && dim2 && m != dim2) {
+ ostringstream buf;
+ buf << "second matrix dimension must be " << dim2;
+ error(buf);
+ }
+
+ dest=(placement == NoGC) ? new T[n*m] : new(placement) T[n*m];
+ for(size_t i=0; i < n; i++) {
+ array *ai=read<array*>(a,i);
+ size_t aisize=checkArray(ai);
+ if(aisize == m) {
+ T *desti=dest+i*m;
+ for(size_t j=0; j < m; j++)
+ desti[j]=read<T>(ai,j);
+ } else
+ error(square ? "matrix must be square" : "matrix must be rectangular");
+ }
+}
-triple *copyTripleArrayC(const array *a, size_t dim=0);
-triple *copyTripleArray2C(const array *a, bool square=true, size_t dim2=0);
double *copyTripleArray2Components(array *a, bool square=true, size_t dim2=0,
GCPlacement placement=NoGC);
}