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