File:  [parser3project] / parser3 / src / main / execute.C
Revision 1.16: download - view: text, annotated - select for diffs - revision graph
Thu Feb 22 12:43:55 2001 UTC (25 years, 4 months ago) by paf
Branches: MAIN
CVS tags: HEAD
more precise parse error line:col

/*
  $Id: execute.C,v 1.16 2001/02/22 12:43:55 paf Exp $
*/

#include "pa_array.h" 
#include "code.h"
#include "pa_request.h"
#include "pa_vstring.h"

#include <stdio.h>


char *opcode_name[]={
	"STRING",  "VSTRING",  "CODE_ARRAY",
	"WITH_ROOT",	"WITH_SELF",	"WITH_READ",	"WITH_WRITE",
	"CONSTRUCT",
	"EXPRESSION_EVAL",	"MODIFY_EVAL",
	"WRITE_STRING",  "WRITE_VALUE",
	"GET_ELEMENT",	"GET_ELEMENT__WRITE_VALUE",
	"CREATE_EWPOOL",	"REDUCE_EWPOOL",
	"CREATE_RWPOOL",	"REDUCE_RWPOOL",
	"GET_METHOD_FRAME",
	"CREATE_JUNCTION",
	"STORE_PARAM",
	"CALL"
};

void dump(int level, const Array& ops) {
	int size=ops.size();
	for(int i=0; i<size; i++) {
		int code=reinterpret_cast<int>(ops.quick_get(i));
		printf("%*s%s", level*4, "", opcode_name[code]);

		if(code==OP_STRING) {
			String *string=static_cast<String *>(ops.quick_get(++i));
			printf(" \"%s\"", string->cstr());
		}
		if(code==OP_VSTRING) {
			Value *value=static_cast<Value *>(ops.quick_get(++i));
			printf(" \"%s\"", value->get_string()->cstr());
		}
		printf("\n");

		if(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();
	for(int i=0; i<size; i++) {
		int code=reinterpret_cast<int>(ops.quick_get(i));
		printf("%s", 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_STRING:
			{
				String *string=static_cast<String *>(ops.quick_get(++i));
				printf(" \"%s\"", string->cstr());
				stack.push(string);
				break;
			}
			
		case OP_VSTRING:
			{
				Value *value=static_cast<Value *>(ops.quick_get(++i));
				printf(" \"%s\"", value->get_string()->cstr());
				stack.push(value);
				break;
			}
			
		case OP_CONSTRUCT:
			{
				Value *value=static_cast<Value *>(stack.pop());
				String *name=static_cast<String *>(stack.pop());
				Value *ncontext=static_cast<Value *>(stack.pop());
				ncontext->put_element(*name, value);
				break;
			}
			
		case OP_WRITE_STRING:
			{
				String *string=static_cast<String *>(stack.pop());
				wcontext->write(string);
				break;
			}
			
		case OP_WRITE_VALUE:
			{
				Value *value=static_cast<Value *>(stack.pop());
				wcontext->write(value);
				break;
			}
			
		case OP_GET_ELEMENT:
			{
				String *name=static_cast<String *>(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, òîãäà èëè îñòàâëÿåò â ïîêîå, èëè âû÷èñëÿåò â çàâèñèìîñòè îò ôëàãà ÀÂÒÎÂÛ×ÈÑËßÒÜ
				stack.push(value);
				break;
			}
			
		default:
			printf("\tTODO");
			break;
		}
		printf("\n");
	}
}

E-mail: