corda/src/processor.h

188 lines
4.3 KiB
C
Raw Normal View History

/* Copyright (c) 2008, Avian Contributors
Permission to use, copy, modify, and/or distribute this software
for any purpose with or without fee is hereby granted, provided
that the above copyright notice and this permission notice appear
in all copies.
There is NO WARRANTY for this software. See license.txt for
details. */
#ifndef PROCESSOR_H
#define PROCESSOR_H
#include "common.h"
#include "system.h"
#include "heap.h"
2008-11-23 23:58:01 +00:00
#include "bootimage.h"
#include "heapwalk.h"
#include "zone.h"
#include "assembler.h"
namespace vm {
class Processor {
public:
class StackWalker;
class StackVisitor {
public:
virtual bool visit(StackWalker* walker) = 0;
};
class StackWalker {
public:
virtual void walk(StackVisitor* v) = 0;
virtual object method() = 0;
virtual int ip() = 0;
virtual unsigned count() = 0;
};
virtual Thread*
makeThread(Machine* m, object javaThread, Thread* parent) = 0;
2007-11-02 14:15:06 +00:00
virtual object
makeMethod(Thread* t,
uint8_t vmFlags,
uint8_t returnCode,
uint8_t parameterCount,
uint8_t parameterFootprint,
uint16_t flags,
uint16_t offset,
object name,
object spec,
object addendum,
object class_,
object code) = 0;
2007-09-25 23:53:11 +00:00
2007-11-02 14:15:06 +00:00
virtual object
makeClass(Thread* t,
uint16_t flags,
uint16_t vmFlags,
uint16_t fixedSize,
uint8_t arrayElementSize,
uint8_t arrayDimensions,
object objectMask,
object name,
object sourceFile,
object super,
object interfaceTable,
object virtualTable,
object fieldTable,
object methodTable,
object addendum,
object staticTable,
object loader,
unsigned vtableLength) = 0;
2007-12-11 21:26:59 +00:00
virtual void
initVtable(Thread* t, object c) = 0;
virtual void
visitObjects(Thread* t, Heap::Visitor* v) = 0;
virtual void
walkStack(Thread* t, StackVisitor* v) = 0;
2007-09-24 13:46:48 +00:00
2007-10-04 22:41:19 +00:00
virtual int
lineNumber(Thread* t, object method, int ip) = 0;
2007-10-04 22:41:19 +00:00
2007-09-24 13:46:48 +00:00
virtual object*
makeLocalReference(Thread* t, object o) = 0;
virtual void
disposeLocalReference(Thread* t, object* r) = 0;
virtual object
invokeArray(Thread* t, object method, object this_, object arguments) = 0;
virtual object
invokeList(Thread* t, object method, object this_, bool indirectObjects,
va_list arguments) = 0;
virtual object
invokeList(Thread* t, object loader, const char* className,
const char* methodName, const char* methodSpec,
object this_, va_list arguments) = 0;
2007-12-11 21:26:59 +00:00
virtual void
dispose(Thread* t) = 0;
virtual void
dispose() = 0;
virtual object
getStackTrace(Thread* t, Thread* target) = 0;
2008-11-23 23:58:01 +00:00
virtual void
2009-06-01 03:16:58 +00:00
initialize(BootImage* image, uint8_t* code, unsigned capacity) = 0;
2008-11-23 23:58:01 +00:00
virtual void
compileMethod(Thread* t, Zone* zone, object* constants, object* calls,
DelayedPromise** addresses, object method) = 0;
2008-11-23 23:58:01 +00:00
virtual void
2009-06-01 03:16:58 +00:00
visitRoots(HeapWalker* w) = 0;
2008-11-23 23:58:01 +00:00
2008-12-02 02:38:00 +00:00
virtual unsigned*
2009-06-01 03:16:58 +00:00
makeCallTable(Thread* t, HeapWalker* w) = 0;
2008-12-02 02:38:00 +00:00
virtual void
2008-12-02 02:38:00 +00:00
boot(Thread* t, BootImage* image) = 0;
2009-05-03 20:57:11 +00:00
virtual void
2009-05-06 00:29:05 +00:00
callWithCurrentContinuation(Thread* t, object receiver) = 0;
2009-05-03 20:57:11 +00:00
virtual void
dynamicWind(Thread* t, object before, object thunk, object after) = 0;
2009-05-03 20:57:11 +00:00
virtual void
2009-05-06 00:29:05 +00:00
feedResultToContinuation(Thread* t, object continuation, object result) = 0;
virtual void
feedExceptionToContinuation(Thread* t, object continuation,
object exception) = 0;
2009-05-03 20:57:11 +00:00
virtual void
2009-05-05 01:04:17 +00:00
walkContinuationBody(Thread* t, Heap::Walker* w, object o, unsigned start)
2009-05-03 20:57:11 +00:00
= 0;
object
invoke(Thread* t, object method, object this_, ...)
{
va_list a;
va_start(a, this_);
object r = invokeList(t, method, this_, false, a);
va_end(a);
return r;
}
object
invoke(Thread* t, object loader, const char* className,
const char* methodName, const char* methodSpec, object this_, ...)
{
va_list a;
va_start(a, this_);
object r = invokeList
(t, loader, className, methodName, methodSpec, this_, a);
va_end(a);
return r;
}
};
Processor*
makeProcessor(System* system, Allocator* allocator, bool useNativeFeatures);
} // namespace vm
#endif//PROCESSOR_H