File:  [parser3project] / parser3 / src / include / pa_request.h
Revision 1.6: download - view: text, annotated - select for diffs - revision graph
Wed Feb 21 16:11:49 2001 UTC (25 years, 4 months ago) by paf
Branches: MAIN
CVS tags: HEAD
request core methods0

/*
  $Id: pa_request.h,v 1.6 2001/02/21 16:11:49 paf Exp $
*/

#ifndef PA_REQUEST_H
#define PA_REQUEST_H

#include "pa_pool.h"
#include "pa_exception.h"
#include "pa_hash.h"
#include "pa_context.h"
#include "pa_value.h"

class Local_request_exception;

class Request {
	friend Local_request_exception;
public:
	
	Request(Pool& apool, 
		Value *aroot, Value *aself, Value *arcontext, WContext *awcontext) : 
		fpool(apool), 
		root(aroot), self(aself), rcontext(arcontext), wcontext(awcontext),
		fclasses(apool)
		{
	}
	~Request() {}

	// IMPORTANT: don't use pool without  Local_request_exception 
	Pool& pool() { return fpool; }

	Exception& exception() { return *fexception; }
	Hash& classes() { return fclasses; }

	// core request processing
	void core();

protected: // core

	// classes
	Hash fclasses;

	// contexts
	Value *root, *self, *rcontext;
	WContext *wcontext;
	
	Array& load_and_compile_RUN();
	VClass *construct_class(String& name, Array& compiled_methods);
	char *execute_MAIN(Value *class_RUN);

protected:

	// all request' objects are allocated in this pool
	Pool& fpool;

	// exception replacement mechanism is protected from direct usage
	// Local_request_exception object enforces paired set/restore
	Exception *set_exception(Exception *e){
		Exception *r=fexception;
		fexception=e;
		return r;
	}
	void restore_exception(Exception *e) {
		fexception=e;
	}

private:

	// current request's exception object
	Exception *fexception;

};

class Local_request_exception {
	Request request;
	Exception *saved_exception;
public:
	Local_request_exception(Request& arequest, Exception& exception) : 
		request(arequest),
		saved_exception(arequest.set_exception(&exception)) {}
	~Local_request_exception() { request.restore_exception(saved_exception); }
};


#endif

E-mail: