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