Annotation of parser3/src/main/execute.C, revision 1.25
1.1 paf 1: /*
1.25 ! paf 2: $Id: execute.C,v 1.24 2001/02/23 10:17:29 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.11 paf 158: default:
1.16 paf 159: printf("\tTODO");
1.11 paf 160: break;
161: }
1.16 paf 162: printf("\n");
1.11 paf 163: }
1.1 paf 164: }
1.17 paf 165:
166: Value *Request::get_element() {
1.25 ! paf 167: String& name=POP()->as_string();
1.24 paf 168: Value *ncontext=POP();
1.25 ! paf 169: Value *value=ncontext->get_element(name); // name áûâàåò method, òîãäà âûäà¸ò new junction(ÀÂÒÎÂÛ×ÈÑËßÒÜ=false, root,self,rcontext,wcontext,code)
1.17 paf 170: // name áûâàåò èìÿ junction, òîãäà èëè îñòàâëÿåò â ïîêîå, èëè âû÷èñëÿåò â çàâèñèìîñòè îò ôëàãà ÀÂÒÎÂÛ×ÈÑËßÒÜ
1.21 paf 171:
1.22 paf 172: if(!value) {
1.23 paf 173: // value=NEW VHash(pool());
174: // ncontext->put_element(*name, value);
175: value=NEW VUnknown(pool());
1.25 ! paf 176: value->set_name(name);
1.22 paf 177: }
1.17 paf 178: return value;
179: }
E-mail: