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