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