diff options
Diffstat (limited to 'Build/source/utils/asymptote/builtin.cc')
-rw-r--r-- | Build/source/utils/asymptote/builtin.cc | 50 |
1 files changed, 36 insertions, 14 deletions
diff --git a/Build/source/utils/asymptote/builtin.cc b/Build/source/utils/asymptote/builtin.cc index b5066061384..acb84eb2bd0 100644 --- a/Build/source/utils/asymptote/builtin.cc +++ b/Build/source/utils/asymptote/builtin.cc @@ -395,6 +395,24 @@ void addCasts(venv &ve) addCast(ve, pairArray2(), realArray2(), array2ToArray2<double,pair>); } +void addTupleOperators(venv &ve) +{ + addFunc(ve, realRealToPair, primPair(), SYM_TUPLE, + formal(primReal(), SYM(x)), + formal(primReal(), SYM(y))); + addFunc(ve, realRealRealToTriple, primTriple(), SYM_TUPLE, + formal(primReal(), SYM(x)), + formal(primReal(), SYM(y)), + formal(primReal(), SYM(z))); + addFunc(ve, real6ToTransform, primTransform(), SYM_TUPLE, + formal(primReal(), SYM(x)), + formal(primReal(), SYM(y)), + formal(primReal(), SYM(xx)), + formal(primReal(), SYM(xy)), + formal(primReal(), SYM(yx)), + formal(primReal(), SYM(yy))); +} + void addGuideOperators(venv &ve) { // The guide operators .. and -- take an array of guides, and turn them @@ -599,35 +617,38 @@ void addArrayOps(venv &ve, types::array *t) // which may not be known at runtime. Therefore, the depth, which is known // here at compile-time, is pushed on the stack beforehand by use of a // thunk. - callable *copyFunc = new thunk(new vm::bfunc(run::copyArray),(Int) depth-1); - addFunc(ve, new callableAccess(copyFunc), + callable *copyValueFunc = new thunk(new vm::bfunc(run::copyArrayValue),(Int) depth-1); + addFunc(ve, new callableAccess(copyValueFunc), t, SYM(array), formal(primInt(), SYM(n)), formal(ct, SYM(value)), formal(primInt(), SYM(depth), true)); + + callable *copyFunc = new thunk(new vm::bfunc(run::copyArray),(Int) depth); + addFunc(ve, new callableAccess(copyFunc), + t, SYM(copy), formal(t, SYM(a)), formal(primInt(), SYM(depth), true)); + addFunc(ve, run::arrayFunction, + t, SYM(map), formal(new function(ct, ct), SYM(f)), formal(t, SYM(a))); + + addFunc(ve, run::arraySequence, + t, SYM(sequence), formal(new function(ct, primInt()), SYM(f)), + formal(primInt(), SYM(n))); + + addFunc(ve, run::arraySort, + t, SYM(sort), formal(t, SYM(a)), + formal(new function(primBoolean(), ct, ct), SYM(less))); + switch (depth) { case 1: - addFunc(ve, run::arrayCopy, t, SYM(copy), formal(t, SYM(a))); addRestFunc(ve, run::arrayConcat, t, SYM(concat), new types::array(t)); - addFunc(ve, run::arraySequence, - t, SYM(sequence), formal(new function(ct, primInt()), SYM(f)), - formal(primInt(), SYM(n))); - addFunc(ve, run::arrayFunction, - t, SYM(map), formal(new function(ct, ct), SYM(f)), - formal(t, SYM(a))); - addFunc(ve, run::arraySort, - t, SYM(sort), formal(t, SYM(a)), - formal(new function(primBoolean(), ct, ct), SYM(less))); addFunc(ve, run::arraySearch, primInt(), SYM(search), formal(t, SYM(a)), formal(ct, SYM(key)), formal(new function(primBoolean(), ct, ct), SYM(less))); break; case 2: - addFunc(ve, run::array2Copy, t, SYM(copy), formal(t, SYM(a))); addFunc(ve, run::array2Transpose, t, SYM(transpose), formal(t, SYM(a))); break; case 3: - addFunc(ve, run::array3Copy, t, SYM(copy), formal(t, SYM(a))); addFunc(ve, run::array3Transpose, t, SYM(transpose), formal(t, SYM(a)), formal(IntArray(),SYM(perm))); break; @@ -789,6 +810,7 @@ void base_venv(venv &ve) addInitializers(ve); addCasts(ve); addOperators(ve); + addTupleOperators(ve); addGuideOperators(ve); addRealFunc(sin,SYM(sin)); |