Annotation of parser3/src/main/execute.C, revision 1.32
1.1 paf 1: /*
1.32 ! paf 2: $Id: execute.C,v 1.31 2001/02/23 21:59:07 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.32 ! paf 13: #include "pa_vjunction.h"
1.1 paf 14:
15: #include <stdio.h>
16:
1.24 paf 17: #define PUSH(value) stack.push(value)
18: #define POP() static_cast<Value *>(stack.pop())
1.32 ! paf 19: #define POP_NAME() static_cast<Value *>(stack.pop())->as_string()
1.24 paf 20:
1.11 paf 21:
1.1 paf 22: char *opcode_name[]={
1.32 ! paf 23: "STRING", "CODE",
1.1 paf 24: "WITH_ROOT", "WITH_SELF", "WITH_READ", "WITH_WRITE",
25: "CONSTRUCT",
26: "EXPRESSION_EVAL", "MODIFY_EVAL",
1.18 paf 27: "WRITE",
28: "GET_ELEMENT", "GET_ELEMENT__WRITE",
1.1 paf 29: "CREATE_EWPOOL", "REDUCE_EWPOOL",
30: "CREATE_RWPOOL", "REDUCE_RWPOOL",
31: "GET_METHOD_FRAME",
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.32 ! paf 60: if(op.code==OP_CODE) {
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.32 ! paf 67: void Request::execute(const Array& ops) {
1.30 paf 68: if(1) {
1.32 ! paf 69: puts("source----------------------------");
1.12 paf 70: dump(0, ops);
1.32 ! paf 71: puts("execution-------------------------");
1.12 paf 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: switch(op.code) {
1.32 ! paf 82: // param in next instruction
! 83: case OP_STRING:
! 84: {
! 85: VString *vstring=static_cast<VString *>(ops.quick_get(++i));
! 86: printf(" \"%s\"", vstring->get_string()->cstr());
! 87: PUSH(vstring);
! 88: break;
! 89: }
! 90: case OP_CODE:
! 91: {
! 92: const Array *local_ops=reinterpret_cast<const Array *>(ops.quick_get(++i));
! 93: printf(" (%d)", local_ops->size());
! 94: Junction& j=*NEW Junction(pool(),
! 95: 0,
! 96: root,self,rcontext,local_ops);
! 97:
! 98: Value *value=NEW VJunction(j);
! 99: PUSH(value);
! 100: break;
! 101: }
! 102:
! 103: // OP_WITH
1.11 paf 104: case OP_WITH_WRITE:
105: {
1.24 paf 106: PUSH(wcontext);
1.13 paf 107: break;
1.11 paf 108: }
1.15 paf 109: case OP_WITH_READ:
110: {
1.24 paf 111: PUSH(rcontext);
1.20 paf 112: break;
113: }
114: case OP_WITH_ROOT:
115: {
1.24 paf 116: PUSH(root);
1.20 paf 117: break;
118: }
119: case OP_WITH_SELF:
120: {
1.24 paf 121: PUSH(self);
1.15 paf 122: break;
123: }
1.13 paf 124:
1.32 ! 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:
1.32 ! paf 147: case OP_CONSTRUCT:
! 148: {
! 149: Value *value=POP();
! 150: String& name=POP_NAME();
! 151: Value *ncontext=POP();
! 152: value->set_name(name);
! 153: ncontext->put_element(name, value);
! 154: break;
! 155: }
! 156:
1.17 paf 157: case OP_CREATE_EWPOOL:
158: {
1.24 paf 159: PUSH(wcontext);
1.29 paf 160: wcontext=NEW WWrapper(pool(), 0 /* empty */);
1.17 paf 161: break;
162: }
163: case OP_REDUCE_EWPOOL:
164: {
165: Value *value=wcontext->value();
1.25 paf 166: wcontext=static_cast<WContext *>(POP());
1.24 paf 167: PUSH(value);
1.13 paf 168: break;
1.15 paf 169: }
1.13 paf 170:
1.26 paf 171: case OP_CREATE_RWPOOL:
172: {
173: Value *ncontext=POP();
174: PUSH(rcontext);
175: rcontext=ncontext;
176: PUSH(wcontext);
1.29 paf 177: wcontext=NEW WWrapper(pool(), ncontext);
1.26 paf 178: break;
179: }
180: case OP_REDUCE_RWPOOL:
181: {
182: String *string=wcontext->get_string();
183: Value *value=NEW VString(string);
184: wcontext=static_cast<WContext *>(POP());
185: rcontext=POP();
186: PUSH(value);
187: break;
188: }
189:
1.28 paf 190: case OP_GET_METHOD_FRAME:
191: {
1.32 ! paf 192: Value *value=POP();
1.28 paf 193: // [self/class?;params;local;code/native_code](name)
1.32 ! paf 194: Junction *junction=value->get_junction();
1.31 paf 195: if(!junction)
1.28 paf 196: THROW(0,0,
1.32 ! paf 197: value->name(),
! 198: "is not a method or a junction (it is '%s'), can not call it",
! 199: value->type());
1.28 paf 200: //unless(method) method=operators.get_method[...;code/native_code](name)
1.31 paf 201: VFrame *frame=NEW VFrame(pool(), *junction);
1.28 paf 202: PUSH(frame);
203: break;
204: }
205: case OP_STORE_PARAM:
206: {
207: Value *value=POP();
208: VFrame *frame=static_cast<VFrame *>(stack[0]);
209: frame->store_param(value);
1.29 paf 210: break;
211: }
212:
213: case OP_CALL:
214: {
215: printf("->\n");
216: VFrame *frame=static_cast<VFrame *>(POP());
1.32 ! paf 217: frame->fill_empty_params();
! 218: PUSH(self); PUSH(root); PUSH(rcontext); PUSH(wcontext);
1.29 paf 219: //left_class=ncontext.get_class()
220: //right_class=frame.self.get_class()
221: //self=f(left_class[thoughts' food], right_self[junction], right_class[static], wcontext.value()[dynamic], new(right_class)[construct])
1.32 ! paf 222: self=frame->junction.self; // TODO: не всегда frame..self
1.29 paf 223: frame->set_self(self);
224: root=rcontext=wcontext=frame;
1.31 paf 225: execute(frame->junction.method->code);
1.29 paf 226: Value *value=wcontext->value();
1.32 ! paf 227: wcontext=static_cast<WContext *>(POP()); rcontext=POP(); root=POP(); self=POP();
1.29 paf 228: wcontext->write(value);
229: printf("<-returned");
1.28 paf 230: break;
231: }
232:
233:
1.11 paf 234: default:
1.16 paf 235: printf("\tTODO");
1.11 paf 236: break;
237: }
1.16 paf 238: printf("\n");
1.11 paf 239: }
1.1 paf 240: }
1.17 paf 241:
242: Value *Request::get_element() {
1.32 ! paf 243: String& name=POP_NAME();
1.24 paf 244: Value *ncontext=POP();
1.32 ! paf 245: Value *value=ncontext->get_element(name);
1.21 paf 246:
1.32 ! paf 247: if(value) {
! 248: Junction *junction=value->get_junction();
! 249: if(junction && junction->code) { // is it a code junction?
! 250: // autocalc it
! 251: printf("ja->\n");
! 252: VFrame frame(pool(), *junction);
! 253: PUSH(self); PUSH(root); PUSH(rcontext); PUSH(wcontext);
! 254: frame.set_self(self=junction->self);
! 255: root=junction->root;
! 256: rcontext=junction->rcontext;
! 257: wcontext=&frame;
! 258: execute(*junction->code);
! 259: value=wcontext->value();
! 260: //value=wcontext->get_string();
! 261: wcontext=static_cast<WContext *>(POP()); rcontext=POP(); root=POP(); self=POP();
! 262: printf("<-ja returned");
! 263: }
! 264: } else {
1.23 paf 265: value=NEW VUnknown(pool());
1.25 paf 266: value->set_name(name);
1.22 paf 267: }
1.17 paf 268: return value;
269: }
E-mail: