summaryrefslogtreecommitdiff
path: root/graphics/asymptote/coenv.cc
blob: e281b6669628527efa28d5137761035e556a770f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/*****
 * coenv.cc
 * Andy Hammerlindl 2004/11/18
 *
 * Bundles the env and coder classes needed in translating the abstract syntax
 * tree.  It also also implements some functions that involve both the env and
 * coder, such as implicitCast().
 *****/

#include "coenv.h"

namespace trans {

// Prints out error messages for the cast methods.
static inline void castError(position pos, ty *target, ty *source)
{
  em.error(pos);
  em << "cannot convert \'" << *source
     << "\' to \'" << *target << "\'";
}

static inline bool accessCast(position pos, ty *target, ty *source,
                              access *a, coder& c)
{
  if (a) {
    a->encode(CALL, pos, c);
    return true;
  }
  else {
    castError(pos, target, source);
    return false;
  }
}

bool coenv::implicitCast(position pos, ty *target, ty *source)
{
  return accessCast(pos, target, source,
                    e.lookupCast(target, source, symbol::castsym), c);
}

bool coenv::explicitCast(position pos, ty *target, ty *source)
{
  return accessCast(pos, target, source,
                    e.lookupCast(target, source, symbol::ecastsym), c);
}

}