|
|
| version 1.3, 2001/02/21 06:21:20 | version 1.22, 2001/02/22 16:21:49 |
|---|---|
| Line 2 | Line 2 |
| $Id$ | $Id$ |
| */ | */ |
| #include "pa_array.h" | #include "pa_array.h" |
| #include "code.h" | #include "code.h" |
| #include "pa_request.h" | |
| #include "pa_vstring.h" | |
| #include "pa_vhash.h" | |
| #include <stdio.h> | #include <stdio.h> |
| char *opcode_name[]={ | char *opcode_name[]={ |
| "STRING", | "STRING", "CODE_ARRAY", |
| "CODE_ARRAY", | |
| "WITH_ROOT", "WITH_SELF", "WITH_READ", "WITH_WRITE", | "WITH_ROOT", "WITH_SELF", "WITH_READ", "WITH_WRITE", |
| "CONSTRUCT", | "CONSTRUCT", |
| "EXPRESSION_EVAL", "MODIFY_EVAL", | "EXPRESSION_EVAL", "MODIFY_EVAL", |
| Line 23 char *opcode_name[]={ | Line 26 char *opcode_name[]={ |
| "CALL" | "CALL" |
| }; | }; |
| void dump(int level, const Array *ops) { | void dump(int level, const Array& ops) { |
| if(!ops) | int size=ops.size(); |
| return; | |
| int size=ops->size(); | |
| for(int i=0; i<size; i++) { | for(int i=0; i<size; i++) { |
| int code=reinterpret_cast<int>(ops->raw_get(i)); | int code=reinterpret_cast<int>(ops.quick_get(i)); |
| printf("%*s%s", level*4, "", opcode_name[code]); | printf("%*s%s", level*4, "", opcode_name[code]); |
| if(code==OP_STRING) { | if(code==OP_STRING) { |
| printf(" \"%s\"", static_cast<const String *>(ops->raw_get(++i))->cstr()); | VString *vstring=static_cast<VString *>(ops.quick_get(++i)); |
| printf(" \"%s\"", vstring->get_string()->cstr()); | |
| } | } |
| printf("\n"); | printf("\n"); |
| if(code==OP_CODE_ARRAY) { | if(code==OP_CODE_ARRAY) { |
| const Array *local_ops=reinterpret_cast<const Array *>(ops->raw_get(++i)); | const Array *local_ops=reinterpret_cast<const Array *>(ops.quick_get(++i)); |
| dump(level+1, local_ops); | dump(level+1, *local_ops); |
| } | } |
| } | } |
| } | } |
| void execute(Pool *pool, const Array *ops) { | void Request::execute(Array& ops) { |
| if(!ops) | if(0) { |
| return; | puts("---------------------------"); |
| dump(0, ops); | |
| puts("---------------------------"); | puts("---------------------------"); |
| dump(0, ops); | } |
| puts("---------------------------"); | |
| int size=ops.size(); | |
| for(int i=0; i<size; i++) { | |
| int code=reinterpret_cast<int>(ops.quick_get(i)); | |
| printf("%d:%s", stack.top(), opcode_name[code]); | |
| if(code==OP_CODE_ARRAY) { | |
| const Array *local_ops=reinterpret_cast<const Array *>(ops.quick_get(++i)); | |
| //dump(level+1, *local_ops); | |
| } | |
| switch(code) { | |
| case OP_WITH_WRITE: | |
| { | |
| stack.push(wcontext); | |
| break; | |
| } | |
| case OP_WITH_READ: | |
| { | |
| stack.push(rcontext); | |
| break; | |
| } | |
| case OP_WITH_ROOT: | |
| { | |
| stack.push(root); | |
| break; | |
| } | |
| case OP_WITH_SELF: | |
| { | |
| stack.push(self); | |
| break; | |
| } | |
| case OP_STRING: | |
| { | |
| VString *vstring=static_cast<VString *>(ops.quick_get(++i)); | |
| printf(" \"%s\"", vstring->get_string()->cstr()); | |
| stack.push(vstring); | |
| break; | |
| } | |
| case OP_CONSTRUCT: | |
| { | |
| Value *value=static_cast<Value *>(stack.pop()); | |
| VString *name=static_cast<VString *>(stack.pop()); | |
| Value *ncontext=static_cast<Value *>(stack.pop()); | |
| ncontext->put_element(*name, value); | |
| break; | |
| } | |
| case OP_WRITE: | |
| { | |
| Value *value=static_cast<Value *>(stack.pop()); | |
| wcontext->write(value); | |
| break; | |
| } | |
| case OP_GET_ELEMENT: | |
| { | |
| Value *value=get_element(); | |
| stack.push(value); | |
| break; | |
| } | |
| case OP_GET_ELEMENT__WRITE: | |
| { | |
| Value *value=get_element(); | |
| wcontext->write(value); | |
| break; | |
| } | |
| case OP_CREATE_EWPOOL: | |
| { | |
| stack.push(wcontext); | |
| wcontext=NEW WContext(pool(), 0 /* empty */); | |
| break; | |
| } | |
| case OP_REDUCE_EWPOOL: | |
| { | |
| Value *value=wcontext->value(); | |
| wcontext=static_cast<WContext *>(stack.pop()); | |
| stack.push(value); | |
| break; | |
| } | |
| default: | |
| printf("\tTODO"); | |
| break; | |
| } | |
| printf("\n"); | |
| } | |
| } | } |
| Value *Request::get_element() { | |
| VString *name=static_cast<VString *>(stack.pop()); | |
| Value *ncontext=static_cast<Value *>(stack.pop()); | |
| Value *value=ncontext->get_element(*name); // name áûâàåò method, òîãäà âûäà¸ò new junction(ÀÂÒÎÂÛ×ÈÑËßÒÜ=false, root,self,rcontext,wcontext,code) | |
| // name áûâàåò èìÿ junction, òîãäà èëè îñòàâëÿåò â ïîêîå, èëè âû÷èñëÿåò â çàâèñèìîñòè îò ôëàãà ÀÂÒÎÂÛ×ÈÑËßÒÜ | |
| if(!value) { | |
| value=NEW VHash(pool()); | |
| ncontext->put_element(*name, value); | |
| } | |
| return value; | |
| } | |