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