Annotation of parser3/src/main/execute.C, revision 1.24
1.1 paf 1: /*
1.24 ! paf 2: $Id: execute.C,v 1.23 2001/02/23 09:43:14 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();
! 116: Value *name=POP();
! 117: Value *ncontext=POP();
1.13 paf 118: ncontext->put_element(*name, value);
119: break;
1.11 paf 120: }
1.13 paf 121:
1.18 paf 122: case OP_WRITE:
1.13 paf 123: {
1.24 ! paf 124: Value *value=POP();
1.14 paf 125: wcontext->write(value);
1.13 paf 126: break;
1.14 paf 127: }
1.13 paf 128:
1.15 paf 129: case OP_GET_ELEMENT:
1.11 paf 130: {
1.17 paf 131: Value *value=get_element();
1.24 ! paf 132: PUSH(value);
1.17 paf 133: break;
134: }
135:
1.18 paf 136: case OP_GET_ELEMENT__WRITE:
1.17 paf 137: {
138: Value *value=get_element();
139: wcontext->write(value);
140: break;
141: }
142:
143: case OP_CREATE_EWPOOL:
144: {
1.24 ! paf 145: PUSH(wcontext);
1.17 paf 146: wcontext=NEW WContext(pool(), 0 /* empty */);
147: break;
148: }
149: case OP_REDUCE_EWPOOL:
150: {
151: Value *value=wcontext->value();
152: wcontext=static_cast<WContext *>(stack.pop());
1.24 ! paf 153: PUSH(value);
1.13 paf 154: break;
1.15 paf 155: }
1.13 paf 156:
1.11 paf 157: default:
1.16 paf 158: printf("\tTODO");
1.11 paf 159: break;
160: }
1.16 paf 161: printf("\n");
1.11 paf 162: }
1.1 paf 163: }
1.17 paf 164:
165: Value *Request::get_element() {
1.24 ! paf 166: Value *name=POP();
! 167: Value *ncontext=POP();
1.17 paf 168: Value *value=ncontext->get_element(*name); // name áûâàåò method, òîãäà âûäà¸ò new junction(ÀÂÒÎÂÛ×ÈÑËßÒÜ=false, root,self,rcontext,wcontext,code)
169: // name áûâàåò èìÿ junction, òîãäà èëè îñòàâëÿåò â ïîêîå, èëè âû÷èñëÿåò â çàâèñèìîñòè îò ôëàãà ÀÂÒÎÂÛ×ÈÑËßÒÜ
1.21 paf 170:
1.22 paf 171: if(!value) {
1.23 paf 172: // value=NEW VHash(pool());
173: // ncontext->put_element(*name, value);
174: value=NEW VUnknown(pool());
1.22 paf 175: }
1.17 paf 176: return value;
177: }
E-mail: