diff options
author | Karl Berry <karl@freefriends.org> | 2009-05-16 00:19:13 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2009-05-16 00:19:13 +0000 |
commit | bab45528d65eaafe68a705dbb2a57075c7b7cbd8 (patch) | |
tree | 10b4ae2b5195c8dede153ab89359ec00f55f325f /Build/source/utils/asymptote/refaccess.cc | |
parent | 8643d90372e9c31e0f461c15c596b60a545bd7d3 (diff) |
asymptote 1.72 sources (not integrated into build yet)
git-svn-id: svn://tug.org/texlive/trunk@13110 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/utils/asymptote/refaccess.cc')
-rw-r--r-- | Build/source/utils/asymptote/refaccess.cc | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/Build/source/utils/asymptote/refaccess.cc b/Build/source/utils/asymptote/refaccess.cc new file mode 100644 index 00000000000..32bc6607356 --- /dev/null +++ b/Build/source/utils/asymptote/refaccess.cc @@ -0,0 +1,54 @@ +/***** + * refaccess.cc + * Andy Hammerlindl 2005/11/28 + * + * An access which refers to a variable or other object in C++. + *****/ + +#include "refaccess.h" + +namespace trans { + +using vm::item; +using vm::stack; +using vm::pop; + +/* itemRefAccess */ +void itemPointerRead(stack *s) { + item *p=pop<item *>(s); + s->push(*p); +} + +void itemPointerWrite(stack *s) { + item *p=pop<item *>(s); + item value=pop(s); + *p=value; + s->push(value); +} + +void itemRefAccess::encode(action act, position, coder &e) +{ + e.encode(inst::constpush, (item)ref); + + switch (act) { + case READ: + e.encode(inst::builtin, itemPointerRead); + break; + case WRITE: + e.encode(inst::builtin, itemPointerWrite); + break; + case CALL: + e.encode(inst::builtin, itemPointerRead); + e.encode(inst::popcall); + break; + }; +} + +void itemRefAccess::encode(action act, position pos, coder &e, frame *) +{ + // Get rid of the useless top frame. + e.encode(inst::pop); + encode(act, pos, e); +} + +} |