Annotation of parser3/src/main/execute.C, revision 1.37
1.1 paf 1: /*
1.37 ! paf 2: $Id: execute.C,v 1.36 2001/02/24 11:46:03 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.34 paf 11: #include "pa_vcframe.h"
12: #include "pa_vmframe.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.32 paf 18: #define POP_NAME() static_cast<Value *>(stack.pop())->as_string()
1.24 paf 19:
1.11 paf 20:
1.1 paf 21: char *opcode_name[]={
1.32 paf 22: "STRING", "CODE",
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: "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.32 paf 59: if(op.code==OP_CODE) {
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.32 paf 66: void Request::execute(const Array& ops) {
1.30 paf 67: if(1) {
1.32 paf 68: puts("source----------------------------");
1.12 paf 69: dump(0, ops);
1.32 paf 70: puts("execution-------------------------");
1.12 paf 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: switch(op.code) {
1.32 paf 81: // param in next instruction
82: case OP_STRING:
83: {
84: VString *vstring=static_cast<VString *>(ops.quick_get(++i));
85: printf(" \"%s\"", vstring->get_string()->cstr());
86: PUSH(vstring);
87: break;
88: }
89: case OP_CODE:
90: {
91: const Array *local_ops=reinterpret_cast<const Array *>(ops.quick_get(++i));
92: printf(" (%d)", local_ops->size());
93: Junction& j=*NEW Junction(pool(),
1.34 paf 94: *self,
1.32 paf 95: 0,
1.34 paf 96: root,rcontext,wcontext,local_ops);
1.32 paf 97:
98: Value *value=NEW VJunction(j);
99: PUSH(value);
100: break;
101: }
102:
103: // OP_WITH
1.37 ! paf 104: case OP_WITH_SELF:
! 105: {
! 106: PUSH(self);
! 107: break;
! 108: }
! 109: case OP_WITH_ROOT:
1.11 paf 110: {
1.37 ! paf 111: PUSH(root);
1.13 paf 112: break;
1.11 paf 113: }
1.15 paf 114: case OP_WITH_READ:
115: {
1.24 paf 116: PUSH(rcontext);
1.20 paf 117: break;
118: }
1.37 ! paf 119: case OP_WITH_WRITE:
1.20 paf 120: {
1.37 ! paf 121: PUSH(wcontext);
1.20 paf 122: break;
123: }
1.37 ! paf 124:
! 125: // ...
! 126: case OP_CONSTRUCT:
1.20 paf 127: {
1.37 ! paf 128: Value *value=POP();
! 129: String& name=POP_NAME();
! 130: Value *ncontext=POP();
! 131: value->set_name(name);
! 132: ncontext->put_element(name, value);
1.15 paf 133: break;
134: }
1.37 ! paf 135: // TODO: OP_EXPRESSION_EVAL, OP_MODIFY_EVAL,
1.18 paf 136: case OP_WRITE:
1.13 paf 137: {
1.24 paf 138: Value *value=POP();
1.14 paf 139: wcontext->write(value);
1.13 paf 140: break;
1.14 paf 141: }
1.13 paf 142:
1.15 paf 143: case OP_GET_ELEMENT:
1.11 paf 144: {
1.17 paf 145: Value *value=get_element();
1.24 paf 146: PUSH(value);
1.17 paf 147: break;
148: }
149:
1.18 paf 150: case OP_GET_ELEMENT__WRITE:
1.17 paf 151: {
152: Value *value=get_element();
153: wcontext->write(value);
154: break;
155: }
156:
1.32 paf 157:
1.17 paf 158: case OP_CREATE_EWPOOL:
159: {
1.24 paf 160: PUSH(wcontext);
1.29 paf 161: wcontext=NEW WWrapper(pool(), 0 /* empty */);
1.17 paf 162: break;
163: }
164: case OP_REDUCE_EWPOOL:
165: {
1.36 paf 166: Value *value=wcontext->result();
1.25 paf 167: wcontext=static_cast<WContext *>(POP());
1.24 paf 168: PUSH(value);
1.13 paf 169: break;
1.15 paf 170: }
1.13 paf 171:
1.26 paf 172: case OP_CREATE_RWPOOL:
173: {
174: Value *ncontext=POP();
175: PUSH(rcontext);
176: rcontext=ncontext;
177: PUSH(wcontext);
1.29 paf 178: wcontext=NEW WWrapper(pool(), ncontext);
1.26 paf 179: break;
180: }
181: case OP_REDUCE_RWPOOL:
182: {
183: String *string=wcontext->get_string();
184: Value *value=NEW VString(string);
185: wcontext=static_cast<WContext *>(POP());
186: rcontext=POP();
187: PUSH(value);
188: break;
189: }
190:
1.37 ! paf 191: // CALL
1.28 paf 192: case OP_GET_METHOD_FRAME:
193: {
1.32 paf 194: Value *value=POP();
1.28 paf 195: // [self/class?;params;local;code/native_code](name)
1.32 paf 196: Junction *junction=value->get_junction();
1.31 paf 197: if(!junction)
1.28 paf 198: THROW(0,0,
1.32 paf 199: value->name(),
200: "is not a method or a junction (it is '%s'), can not call it",
201: value->type());
1.28 paf 202: //unless(method) method=operators.get_method[...;code/native_code](name)
1.34 paf 203: VMethodFrame *frame=NEW VMethodFrame(pool(), *junction);
1.28 paf 204: PUSH(frame);
205: break;
206: }
207: case OP_STORE_PARAM:
208: {
209: Value *value=POP();
1.34 paf 210: VMethodFrame *frame=static_cast<VMethodFrame *>(stack[0]);
1.28 paf 211: frame->store_param(value);
1.29 paf 212: break;
213: }
214:
215: case OP_CALL:
216: {
217: printf("->\n");
1.34 paf 218: VMethodFrame *frame=static_cast<VMethodFrame *>(POP());
219: frame->fill_unspecified_params();
220: PUSH(self); PUSH(root); PUSH(rcontext); PUSH(wcontext);
1.29 paf 221: //left_class=ncontext.get_class()
222: //right_class=frame.self.get_class()
223: //self=f(left_class[thoughts' food], right_self[junction], right_class[static], wcontext.value()[dynamic], new(right_class)[construct])
1.34 paf 224: self=&frame->junction.self; // TODO: не всегда frame..self
1.29 paf 225: frame->set_self(self);
226: root=rcontext=wcontext=frame;
1.31 paf 227: execute(frame->junction.method->code);
1.36 paf 228: Value *value=wcontext->result();
1.32 paf 229: wcontext=static_cast<WContext *>(POP()); rcontext=POP(); root=POP(); self=POP();
1.29 paf 230: wcontext->write(value);
231: printf("<-returned");
1.28 paf 232: break;
233: }
234:
235:
1.11 paf 236: default:
1.16 paf 237: printf("\tTODO");
1.11 paf 238: break;
239: }
1.16 paf 240: printf("\n");
1.11 paf 241: }
1.1 paf 242: }
1.17 paf 243:
244: Value *Request::get_element() {
1.32 paf 245: String& name=POP_NAME();
1.24 paf 246: Value *ncontext=POP();
1.32 paf 247: Value *value=ncontext->get_element(name);
1.21 paf 248:
1.32 paf 249: if(value) {
250: Junction *junction=value->get_junction();
1.36 paf 251: if(junction && junction->code) { // is it a code-junction?
1.32 paf 252: // autocalc it
253: printf("ja->\n");
254: PUSH(self); PUSH(root); PUSH(rcontext); PUSH(wcontext);
1.34 paf 255: // almost plain wwrapper about junction wcontext,
256: // BUT intercepts string writes
257: VCodeFrame frame(pool(), *junction->wcontext); wcontext=&frame;
258: self=&junction->self;
1.32 paf 259: root=junction->root;
260: rcontext=junction->rcontext;
261: execute(*junction->code);
1.35 paf 262: // CodeFrame soul:
1.36 paf 263: // string writes were intercepted
264: // returning them as the result of getting code-junction
1.35 paf 265: value=NEW VString(frame.get_string());
1.32 paf 266: wcontext=static_cast<WContext *>(POP()); rcontext=POP(); root=POP(); self=POP();
267: printf("<-ja returned");
268: }
269: } else {
1.23 paf 270: value=NEW VUnknown(pool());
1.25 paf 271: value->set_name(name);
1.22 paf 272: }
1.17 paf 273: return value;
1.34 paf 274: }
E-mail: