Annotation of parser3/src/main/execute.C, revision 1.21
1.1 paf 1: /*
1.21 ! paf 2: $Id: execute.C,v 1.20 2001/02/22 14:14:07 paf Exp $
1.1 paf 3: */
4:
1.8 paf 5: #include "pa_array.h"
1.1 paf 6: #include "code.h"
1.11 paf 7: #include "pa_request.h"
1.15 paf 8: #include "pa_vstring.h"
1.1 paf 9:
10: #include <stdio.h>
11:
1.11 paf 12:
1.1 paf 13: char *opcode_name[]={
1.19 paf 14: "STRING", "CODE_ARRAY",
1.1 paf 15: "WITH_ROOT", "WITH_SELF", "WITH_READ", "WITH_WRITE",
16: "CONSTRUCT",
17: "EXPRESSION_EVAL", "MODIFY_EVAL",
1.18 paf 18: "WRITE",
19: "GET_ELEMENT", "GET_ELEMENT__WRITE",
1.1 paf 20: "CREATE_EWPOOL", "REDUCE_EWPOOL",
21: "CREATE_RWPOOL", "REDUCE_RWPOOL",
22: "GET_METHOD_FRAME",
23: "CREATE_JUNCTION",
24: "STORE_PARAM",
25: "CALL"
26: };
27:
1.9 paf 28: void dump(int level, const Array& ops) {
29: int size=ops.size();
1.1 paf 30: for(int i=0; i<size; i++) {
1.10 paf 31: int code=reinterpret_cast<int>(ops.quick_get(i));
1.1 paf 32: printf("%*s%s", level*4, "", opcode_name[code]);
33:
1.19 paf 34: if(code==OP_STRING) {
35: VString *vstring=static_cast<VString *>(ops.quick_get(++i));
36: printf(" \"%s\"", vstring->get_string()->cstr());
1.15 paf 37: }
1.1 paf 38: printf("\n");
39:
40: if(code==OP_CODE_ARRAY) {
1.10 paf 41: const Array *local_ops=reinterpret_cast<const Array *>(ops.quick_get(++i));
1.9 paf 42: dump(level+1, *local_ops);
1.1 paf 43: }
44: }
45: }
46:
1.11 paf 47: void Request::execute(Array& ops) {
1.16 paf 48: if(0) {
1.12 paf 49: puts("---------------------------");
50: dump(0, ops);
51: puts("---------------------------");
52: }
53:
1.11 paf 54: int size=ops.size();
55: for(int i=0; i<size; i++) {
56: int code=reinterpret_cast<int>(ops.quick_get(i));
1.17 paf 57: printf("%d:%s", stack.top(), opcode_name[code]);
1.11 paf 58:
59: if(code==OP_CODE_ARRAY) {
60: const Array *local_ops=reinterpret_cast<const Array *>(ops.quick_get(++i));
61: //dump(level+1, *local_ops);
62: }
1.13 paf 63:
1.11 paf 64: switch(code) {
65: case OP_WITH_WRITE:
66: {
1.13 paf 67: stack.push(wcontext);
68: break;
1.11 paf 69: }
1.15 paf 70: case OP_WITH_READ:
71: {
72: stack.push(rcontext);
1.20 paf 73: break;
74: }
75: case OP_WITH_ROOT:
76: {
77: stack.push(root);
78: break;
79: }
80: case OP_WITH_SELF:
81: {
82: stack.push(self);
1.15 paf 83: break;
84: }
1.13 paf 85:
1.19 paf 86: case OP_STRING:
1.15 paf 87: {
1.19 paf 88: VString *vstring=static_cast<VString *>(ops.quick_get(++i));
89: printf(" \"%s\"", vstring->get_string()->cstr());
90: stack.push(vstring);
1.15 paf 91: break;
92: }
93:
1.11 paf 94: case OP_CONSTRUCT:
95: {
1.13 paf 96: Value *value=static_cast<Value *>(stack.pop());
1.18 paf 97: VString *name=static_cast<VString *>(stack.pop());
1.13 paf 98: Value *ncontext=static_cast<Value *>(stack.pop());
99: ncontext->put_element(*name, value);
100: break;
1.11 paf 101: }
1.13 paf 102:
1.18 paf 103: case OP_WRITE:
1.13 paf 104: {
105: Value *value=static_cast<Value *>(stack.pop());
1.14 paf 106: wcontext->write(value);
1.13 paf 107: break;
1.14 paf 108: }
1.13 paf 109:
1.15 paf 110: case OP_GET_ELEMENT:
1.11 paf 111: {
1.17 paf 112: Value *value=get_element();
113: stack.push(value);
114: break;
115: }
116:
1.18 paf 117: case OP_GET_ELEMENT__WRITE:
1.17 paf 118: {
119: Value *value=get_element();
120: wcontext->write(value);
121: break;
122: }
123:
124: case OP_CREATE_EWPOOL:
125: {
126: stack.push(wcontext);
127: wcontext=NEW WContext(pool(), 0 /* empty */);
128: break;
129: }
130: case OP_REDUCE_EWPOOL:
131: {
132: Value *value=wcontext->value();
133: wcontext=static_cast<WContext *>(stack.pop());
1.13 paf 134: stack.push(value);
135: break;
1.15 paf 136: }
1.13 paf 137:
1.11 paf 138: default:
1.16 paf 139: printf("\tTODO");
1.11 paf 140: break;
141: }
1.16 paf 142: printf("\n");
1.11 paf 143: }
1.1 paf 144: }
1.17 paf 145:
146: Value *Request::get_element() {
1.18 paf 147: VString *name=static_cast<VString *>(stack.pop());
1.17 paf 148: Value *ncontext=static_cast<Value *>(stack.pop());
149: Value *value=ncontext->get_element(*name); // name áûâàåò method, òîãäà âûäà¸ò new junction(ÀÂÒÎÂÛ×ÈÑËßÒÜ=false, root,self,rcontext,wcontext,code)
150: // name áûâàåò èìÿ junction, òîãäà èëè îñòàâëÿåò â ïîêîå, èëè âû÷èñëÿåò â çàâèñèìîñòè îò ôëàãà ÀÂÒÎÂÛ×ÈÑËßÒÜ
1.21 ! paf 151:
! 152: if(!value)
! 153: value=NEW VString(pool());
1.17 paf 154: return value;
155: }
E-mail: