/*
$Id: execute.C,v 1.24 2001/02/23 10:17:29 paf Exp $
*/
#include "pa_array.h"
#include "code.h"
#include "pa_request.h"
#include "pa_vstring.h"
#include "pa_vhash.h"
#include "pa_vunknown.h"
#include <stdio.h>
#define PUSH(value) stack.push(value)
#define POP() static_cast<Value *>(stack.pop())
char *opcode_name[]={
"STRING", "CODE_ARRAY",
"WITH_ROOT", "WITH_SELF", "WITH_READ", "WITH_WRITE",
"CONSTRUCT",
"EXPRESSION_EVAL", "MODIFY_EVAL",
"WRITE",
"GET_ELEMENT", "GET_ELEMENT__WRITE",
"CREATE_EWPOOL", "REDUCE_EWPOOL",
"CREATE_RWPOOL", "REDUCE_RWPOOL",
"GET_METHOD_FRAME",
"CREATE_JUNCTION",
"STORE_PARAM",
"CALL"
};
void dump(int level, const Array& ops) {
if(0){
int size=ops.size();
printf("size=%d\n", size);
for(int i=0; i<size; i++) {
Operation op;
op.cast=ops.quick_get(i);
printf("%8X\n", op.cast);
}
}
int size=ops.size();
printf("size=%d\n", size);
for(int i=0; i<size; i++) {
Operation op;
op.cast=ops.quick_get(i);
printf("%*s%s", level*4, "", opcode_name[op.code]);
if(op.code==OP_STRING) {
VString *vstring=static_cast<VString *>(ops.quick_get(++i));
printf(" \"%s\"", vstring->get_string()->cstr());
}
printf("\n");
if(op.code==OP_CODE_ARRAY) {
const Array *local_ops=reinterpret_cast<const Array *>(ops.quick_get(++i));
dump(level+1, *local_ops);
}
}
}
void Request::execute(Array& ops) {
if(0) {
puts("---------------------------");
dump(0, ops);
puts("---------------------------");
}
int size=ops.size();
printf("size=%d\n", size);
for(int i=0; i<size; i++) {
Operation op;
op.cast=ops.quick_get(i);
printf("%d:%s", stack.top(), opcode_name[op.code]);
if(op.code==OP_CODE_ARRAY) {
const Array *local_ops=reinterpret_cast<const Array *>(ops.quick_get(++i));
//dump(level+1, *local_ops);
}
switch(op.code) {
case OP_WITH_WRITE:
{
PUSH(wcontext);
break;
}
case OP_WITH_READ:
{
PUSH(rcontext);
break;
}
case OP_WITH_ROOT:
{
PUSH(root);
break;
}
case OP_WITH_SELF:
{
PUSH(self);
break;
}
case OP_STRING:
{
VString *vstring=static_cast<VString *>(ops.quick_get(++i));
printf(" \"%s\"", vstring->get_string()->cstr());
PUSH(vstring);
break;
}
case OP_CONSTRUCT:
{
Value *value=POP();
Value *name=POP();
Value *ncontext=POP();
ncontext->put_element(*name, value);
break;
}
case OP_WRITE:
{
Value *value=POP();
wcontext->write(value);
break;
}
case OP_GET_ELEMENT:
{
Value *value=get_element();
PUSH(value);
break;
}
case OP_GET_ELEMENT__WRITE:
{
Value *value=get_element();
wcontext->write(value);
break;
}
case OP_CREATE_EWPOOL:
{
PUSH(wcontext);
wcontext=NEW WContext(pool(), 0 /* empty */);
break;
}
case OP_REDUCE_EWPOOL:
{
Value *value=wcontext->value();
wcontext=static_cast<WContext *>(stack.pop());
PUSH(value);
break;
}
default:
printf("\tTODO");
break;
}
printf("\n");
}
}
Value *Request::get_element() {
Value *name=POP();
Value *ncontext=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);
value=NEW VUnknown(pool());
}
return value;
}
E-mail: