summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/stm.cc
diff options
context:
space:
mode:
authorDenis Bitouzé <dbitouze@wanadoo.fr>2021-02-25 18:23:07 +0000
committerDenis Bitouzé <dbitouze@wanadoo.fr>2021-02-25 18:23:07 +0000
commitc6101f91d071883b48b1b4b51e5eba0f36d9a78d (patch)
tree1bf7f5a881d7a4f5c5bf59d0b2821943dd822372 /Build/source/utils/asymptote/stm.cc
parent07ee7222e389b0777456b427a55c22d0e6ffd267 (diff)
French translation for tlmgr updated
git-svn-id: svn://tug.org/texlive/trunk@57912 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/utils/asymptote/stm.cc')
-rw-r--r--Build/source/utils/asymptote/stm.cc504
1 files changed, 0 insertions, 504 deletions
diff --git a/Build/source/utils/asymptote/stm.cc b/Build/source/utils/asymptote/stm.cc
deleted file mode 100644
index 8cd74a0c346..00000000000
--- a/Build/source/utils/asymptote/stm.cc
+++ /dev/null
@@ -1,504 +0,0 @@
-/*****
- * stm.cc
- * Andy Hammerlindl 2002/8/30
- *
- * Statements are everything in the language that do something on their
- * own. Statements are different from declarations in that statements
- * do not modify the environment. Translation of a statement puts the
- * stack code to run it into the instruction stream.
- *****/
-
-#include <fstream>
-#include "errormsg.h"
-#include "settings.h"
-#include "coenv.h"
-#include "exp.h"
-#include "stm.h"
-
-#include "symbol.h"
-#include "opsymbols.h"
-
-namespace absyntax {
-
-using namespace trans;
-using namespace types;
-
-void stm::prettyprint(ostream &out, Int indent)
-{
- prettyname(out,"stm",indent);
-}
-
-
-void emptyStm::prettyprint(ostream &out, Int indent)
-{
- prettyname(out,"emptyStm",indent);
-}
-
-
-void blockStm::prettyprint(ostream &out, Int indent)
-{
- prettyname(out,"blockStm",indent);
-
- base->prettyprint(out, indent+1);
-}
-
-
-void expStm::prettyprint(ostream &out, Int indent)
-{
- prettyname(out,"expStm",indent);
-
- body->prettyprint(out, indent+1);
-}
-
-void baseExpTrans(coenv &e, exp *expr)
-{
- types::ty_kind kind = expr->trans(e)->kind;
- if (kind != types::ty_void)
- // Remove any value it puts on the stack.
- e.c.encodePop();
-}
-
-void expStm::trans(coenv &e) {
- baseExpTrans(e, body);
-}
-
-// For an object such as currentpicture, write 'picture currentpicture' to
-// give some information. Only do this when the object has a name.
-void tryToWriteTypeOfExp(types::ty *t, exp *body)
-{
- symbol name=body->getName();
- if (!name)
- return;
-
- overloaded *set = dynamic_cast<overloaded *>(t);
- if (set)
- for(ty_vector::iterator ot=set->sub.begin(); ot!=set->sub.end(); ++ot)
- tryToWriteTypeOfExp(*ot, body);
- else {
- cout << "<";
- t->printVar(cout, name);
- cout << ">" << endl;
- }
-}
-
-// From dec.cc:
-varEntry *makeVarEntry(position pos, coenv &e, record *r, types::ty *t);
-
-void storeExp(coenv &e, types::ty *t, exp *expr) {
- assert(t->kind != ty_error);
- assert(t->kind != ty_void);
- assert(t->kind != ty_overloaded);
-
- expr->transAsType(e, t);
-
- // Store the value in a new variable of the proper type.
- varEntry *v = makeVarEntry(expr->getPos(), e, 0, t);
- e.e.addVar(symbol::trans("operator answer"), v);
- v->getLocation()->encode(WRITE, expr->getPos(), e.c);
- e.c.encodePop();
-}
-
-void storeAndWriteExp(coenv &e, types::ty *t, exp *expr) {
- storeExp(e, t, expr);
-
- position pos=expr->getPos();
- baseExpTrans(e, new callExp(pos, new nameExp(pos, "write"),
- new nameExp(pos, "operator answer")));
-}
-
-void tryToWriteExp(coenv &e, exp *expr)
-{
- position pos=expr->getPos();
- types::ty *t=expr->cgetType(e);
-
- if(!t) return;
-
- // If the original expression is bad, just print the errors.
- // If it is a function which returns void, just call the function.
- if (t->kind == ty_error || t->kind == ty_void) {
- baseExpTrans(e, expr);
- return;
- }
-
- exp *callee=new nameExp(pos, symbol::trans("write"));
- exp *call=new callExp(pos, callee, expr);
-
- types::ty *ct=call->getType(e);
- if (ct->kind == ty_error || ct->kind == ty_overloaded) {
- if (t->kind == ty_overloaded) {
- // Translate the expr in order to print the ambiguity error first.
- expr->trans(e);
- em.sync();
- assert(em.errors());
-
- // Then, write out all of the types.
- tryToWriteTypeOfExp(t, expr);
- }
- else {
- // Write the type of the expression and, since it is unique, assign it to
- // 'operator answer' even though its value isn't printed.
- tryToWriteTypeOfExp(t, expr);
- storeExp(e, t, expr);
- }
- }
- else if (t->kind == ty_overloaded) {
- // If the exp is overloaded, but the act of writing makes it
- // unambiguous, add a suffix to the output to warn the user of this.
- exp *suffix=new nameExp(pos,
- symbol::trans("overloadedMessage"));
- exp *callWithSuffix=new callExp(pos,
- callee, expr, suffix);
-
- if (callWithSuffix->getType(e)->kind != ty_error)
- baseExpTrans(e, callWithSuffix);
- else
- baseExpTrans(e, call);
- }
- else {
- // Interactive writing can proceed normally.
- storeAndWriteExp(e, t, expr);
- }
-}
-
-void expStm::interactiveTrans(coenv &e)
-{
- // First check if it is the kind of expression that should be written.
- if (body->writtenToPrompt() &&
- settings::getSetting<bool>("interactiveWrite"))
- tryToWriteExp(e, body);
- else
- baseExpTrans(e, body);
-}
-
-
-void ifStm::prettyprint(ostream &out, Int indent)
-{
- prettyname(out,"ifStm",indent);
-
- test->prettyprint(out, indent+1);
- onTrue->prettyprint(out, indent+1);
- if (onFalse)
- onFalse->prettyprint(out, indent+1);
-}
-
-void ifStm::trans(coenv &e)
-{
- label elseLabel = e.c.fwdLabel();
- label end = e.c.fwdLabel();
-
- test->transConditionalJump(e, false, elseLabel);
-
- onTrue->markTrans(e);
-
- if (onFalse) {
- // Encode the jump around the 'else' clause at the end of the 'if' clause
- e.c.useLabel(inst::jmp,end);
-
- e.c.defLabel(elseLabel);
- onFalse->markTrans(e);
- } else {
- e.c.defLabel(elseLabel);
- }
-
-
- e.c.defLabel(end);
-}
-
-
-void transLoopBody(coenv &e, stm *body) {
- // The semantics of the language are defined so that any variable declared
- // inside a loop are new variables for each iteration of the loop. For
- // instance, the code
- //
- // int f();
- // for (int i = 0; i < 10; ++i) {
- // int j=10*i;
- // if (i == 5)
- // f = new int() { return j; };
- // }
- // write(f());
- //
- // will write 50. This is implemented by allocating a new frame for each
- // iteration. However, this can have a big performance hit, so we first
- // translate the code without the frame, check if it needed the closure, and
- // rewrite the code if necessary.
-
- label start = e.c.defNewLabel();
-
- // Encode a no-op, in case we need to jump over the default implementation
- // to a special case.
- e.c.encode(inst::nop);
-
- body->markTrans(e);
-
- // Don't re-translate if there were errors.
- if (em.errors())
- return;
-
- if (e.c.usesClosureSinceLabel(start)){
- // Jump over the old section.
- label end = e.c.defNewLabel();
- e.c.encodePatch(start, end);
-
- // Let coder know that break and continue need to pop the frame.
- e.c.loopPushesFrame();
-
- e.c.encodePushFrame();
- body->markTrans(e);
- e.c.encodePopFrame();
- }
-}
-
-void whileStm::prettyprint(ostream &out, Int indent)
-{
- prettyname(out,"whileStm",indent);
-
- test->prettyprint(out, indent+1);
- body->prettyprint(out, indent+1);
-}
-
-void whileStm::trans(coenv &e)
-{
- label end = e.c.fwdLabel();
- label start = e.c.defNewLabel();
- e.c.pushLoop(start, end);
-
- test->transConditionalJump(e, false, end);
-
- transLoopBody(e,body);
-
- e.c.useLabel(inst::jmp,start);
- e.c.defLabel(end);
-
- e.c.popLoop();
-}
-
-
-void doStm::prettyprint(ostream &out, Int indent)
-{
- prettyname(out,"doStm",indent);
-
- body->prettyprint(out, indent+1);
- test->prettyprint(out, indent+1);
-}
-
-void doStm::trans(coenv &e)
-{
- label testLabel = e.c.fwdLabel();
- label end = e.c.fwdLabel();
- e.c.pushLoop(testLabel, end);
-
- label start = e.c.defNewLabel();
-
- transLoopBody(e,body);
-
- e.c.defLabel(testLabel);
-
- test->transConditionalJump(e, true, start);
-
- e.c.defLabel(end);
-
- e.c.popLoop();
-}
-
-
-void forStm::prettyprint(ostream &out, Int indent)
-{
- prettyname(out,"forStm",indent);
-
- if (init) init->prettyprint(out, indent+1);
- if (test) test->prettyprint(out, indent+1);
- if (update) update->prettyprint(out, indent+1);
- body->prettyprint(out, indent+1);
-}
-
-void forStm::trans(coenv &e)
-{
- // Any vardec in the initializer needs its own scope.
- e.e.beginScope();
- if (init)
- init->markTrans(e);
-
- label ctarget = e.c.fwdLabel();
- label end = e.c.fwdLabel();
- e.c.pushLoop(ctarget, end);
-
- label start = e.c.defNewLabel();
- if(test) {
- test->transConditionalJump(e, false, end);
- }
-
- transLoopBody(e,body);
-
- e.c.defLabel(ctarget);
-
- if (update)
- update->markTrans(e);
- e.c.useLabel(inst::jmp,start);
-
- e.c.defLabel(end);
-
- e.c.popLoop();
-
- e.e.endScope();
-}
-
-void extendedForStm::prettyprint(ostream &out, Int indent)
-{
- prettyindent(out, indent);
- out << "extendedForStm: '" << var << "'\n";
-
- start->prettyprint(out, indent+1);
- set->prettyprint(out, indent+1);
- body->prettyprint(out, indent+1);
-}
-
-void extendedForStm::trans(coenv &e) {
- // Translate into the syntax:
- //
- // start[] a = set;
- // for (int i=0; i < a.length; ++i) {
- // start var=a[i];
- // body
- // }
-
- position pos=getPos();
-
- // Use gensyms for the variable names so as not to pollute the namespace.
- symbol a=symbol::gensym("a");
- symbol i=symbol::gensym("i");
-
- // Get the start type. Handle type inference as a special case.
- types::ty *t = start->trans(e, true);
- if (t->kind == types::ty_inferred) {
-
- // First ensure the array expression is an unambiguous array.
- types::ty *at = set->cgetType(e);
- if (at->kind != ty_array) {
- em.error(set->getPos());
- em << "expression is not an array of inferable type";
-
- // On failure, don't bother trying to translate the loop.
- return;
- }
-
- // var a=set;
- tyEntryTy tet(pos, primInferred());
- decid dec1(pos, new decidstart(pos, a), set);
- vardec(pos, &tet, &dec1).trans(e);
- }
- else {
- // start[] a=set;
- arrayTy at(pos, start, new dimensions(pos));
- decid dec1(pos, new decidstart(pos, a), set);
- vardec(pos, &at, &dec1).trans(e);
- }
-
- // { start var=a[i]; body }
- block b(pos);
- decid dec2(pos,
- new decidstart(pos, var),
- new subscriptExp(pos, new nameExp(pos, a),
- new nameExp(pos, i)));
- b.add(new vardec(pos, start, &dec2));
- b.add(body);
-
- // for (int i=0; i < a.length; ++i)
- // <block>
- forStm(pos,
- new vardec(pos, new tyEntryTy(pos, primInt()),
- new decid(pos,
- new decidstart(pos, i),
- new intExp(pos, 0))),
- new binaryExp(pos,
- new nameExp(pos, i),
- SYM_LT,
- new nameExp(pos,
- new qualifiedName(pos,
- new simpleName(pos, a),
- symbol::trans("length")))),
- new expStm(pos, new prefixExp(pos, new nameExp(pos, i), SYM_PLUS)),
- new blockStm(pos, &b)).trans(e);
-}
-
-
-void breakStm::prettyprint(ostream &out, Int indent)
-{
- prettyname(out,"breakStm",indent);
-}
-
-void breakStm::trans(coenv &e)
-{
- if (!e.c.encodeBreak()) {
- em.error(getPos());
- em << "break statement outside of a loop";
- }
-}
-
-
-void continueStm::prettyprint(ostream &out, Int indent)
-{
- prettyname(out,"continueStm",indent);
-}
-
-void continueStm::trans(coenv &e)
-{
- if (!e.c.encodeContinue()) {
- em.error(getPos());
- em << "continue statement outside of a loop";
- }
-}
-
-
-void returnStm::prettyprint(ostream &out, Int indent)
-{
- prettyname(out, "returnStm",indent);
-
- if (value)
- value->prettyprint(out, indent+1);
-}
-
-void returnStm::trans(coenv &e)
-{
- types::ty *t = e.c.getReturnType();
-
- if (t->kind == ty_void) {
- if (value) {
- em.error(getPos());
- em << "function cannot return a value";
- }
- if (e.c.isRecord())
- e.c.encode(inst::pushclosure);
- }
- else {
- if (value) {
- value->transToType(e, t);
- }
- else {
- em.error(getPos());
- em << "function must return a value";
- }
- }
-
- // NOTE: Currently, a return statement in a module definition will end
- // the initializer. Should this be allowed?
- e.c.encode(inst::ret);
-}
-
-
-void stmExpList::prettyprint(ostream &out, Int indent)
-{
- prettyname(out, "stmExpList",indent);
-
- for (mem::list<stm *>::iterator p = stms.begin(); p != stms.end(); ++p)
- (*p)->prettyprint(out, indent+1);
-}
-
-void stmExpList::trans(coenv &e)
-{
- for (mem::list<stm *>::iterator p = stms.begin(); p != stms.end(); ++p)
- (*p)->markTrans(e);
-}
-
-
-} // namespace absyntax