#ifndef _SqueakVM_H
#define _SqueakVM_H
/* We expect interp.h to define VM_PROXY_MAJOR & VM_PROXY_MINOR appropriately
for the VM generated with it.
sqMemoryAccess.h includes config.h followed by interp.h */
#include "sqMemoryAccess.h"
#ifndef VM_PROXY_MAJOR
/* Increment the following number if you change the order of
functions listed or if you remove functions */
# define VM_PROXY_MAJOR 1
#endif
#ifndef VM_PROXY_MINOR
/* Increment the following number if you add functions at the end */
# define VM_PROXY_MINOR 12
#endif
#if VM_PROXY_MINOR > 8
# define PrimNoErr 0
# define PrimErrGenericFailure 1
# define PrimErrBadReceiver 2
# define PrimErrBadArgument 3
# define PrimErrBadIndex 4
# define PrimErrBadNumArgs 5
# define PrimErrInappropriate 6
# define PrimErrUnsupported 7
# define PrimErrNoModification 8
# define PrimErrNoMemory 9
# define PrimErrNoCMemory 10
# define PrimErrNotFound 11
# define PrimErrBadMethod 12
# define PrimErrNamedInternal 13
# define PrimErrObjectMayMove 14
/* VMCallbackContext opaque type avoids all including setjmp.h & vmCallback.h */
typedef struct _VMCallbackContext *vmccp;
#endif
typedef sqInt (*CompilerHook)();
struct VirtualMachine* sqGetInterpreterProxy(void);
typedef struct VirtualMachine {
sqInt (*minorVersion)(void);
sqInt (*majorVersion)(void);
/* InterpreterProxy methodsFor: 'stack access' */
sqInt (*pop)(sqInt nItems);
sqInt (*popthenPush)(sqInt nItems, sqInt oop);
sqInt (*push)(sqInt object);
sqInt (*pushBool)(sqInt trueOrFalse);
sqInt (*pushFloat)(double f);
sqInt (*pushInteger)(sqInt integerValue);
double (*stackFloatValue)(sqInt offset);
sqInt (*stackIntegerValue)(sqInt offset);
sqInt (*stackObjectValue)(sqInt offset);
sqInt (*stackValue)(sqInt offset);
/* InterpreterProxy methodsFor: 'object access' */
sqInt (*argumentCountOf)(sqInt methodPointer);
void *(*arrayValueOf)(sqInt oop);
sqInt (*byteSizeOf)(sqInt oop);
void *(*fetchArrayofObject)(sqInt fieldIndex, sqInt objectPointer);
sqInt (*fetchClassOf)(sqInt oop);
double (*fetchFloatofObject)(sqInt fieldIndex, sqInt objectPointer);
sqInt (*fetchIntegerofObject)(sqInt fieldIndex, sqInt objectPointer);
sqInt (*fetchPointerofObject)(sqInt fieldIndex, sqInt oop);
/* sqInt (*fetchWordofObject)(sqInt fieldFieldIndex, sqInt oop); *
* has been rescinded as of VMMaker 3.8 and the 64bitclean VM *
* work. To support old plugins we keep a valid function in *
* the same location in the VM struct but rename it to *
* something utterly horrible to scare off the natives. A new *
* equivalent but 64 bit valid function is added as *
* 'fetchLong32OfObject' */
sqInt (*obsoleteDontUseThisFetchWordofObject)(sqInt fieldFieldIndex, sqInt oop);
void *(*firstFixedField)(sqInt oop);
void *(*firstIndexableField)(sqInt oop);
sqInt (*literalofMethod)(sqInt offset, sqInt methodPointer);
sqInt (*literalCountOf)(sqInt methodPointer);
sqInt (*methodArgumentCount)(void);
sqInt (*methodPrimitiveIndex)(void);
sqInt (*primitiveIndexOf)(sqInt methodPointer);
sqInt (*sizeOfSTArrayFromCPrimitive)(void *cPtr);
sqInt (*slotSizeOf)(sqInt oop);
sqInt (*stObjectat)(sqInt array, sqInt fieldIndex);
sqInt (*stObjectatput)(sqInt array, sqInt fieldIndex, sqInt value);
sqInt (*stSizeOf)(sqInt oop);
sqInt (*storeIntegerofObjectwithValue)(sqInt fieldIndex, sqInt oop, sqInt integer);
sqInt (*storePointerofObjectwithValue)(sqInt fieldIndex, sqInt oop, sqInt valuePointer);
/* InterpreterProxy methodsFor: 'testing' */
sqInt (*isKindOf)(sqInt oop, char *aString);
sqInt (*isMemberOf)(sqInt oop, char *aString);
sqInt (*isBytes)(sqInt oop);
sqInt (*isFloatObject)(sqInt oop);
sqInt (*isIndexable)(sqInt oop);
sqInt (*isIntegerObject)(sqInt objectPointer);
sqInt (*isIntegerValue)(sqInt intValue);
sqInt (*isPointers)(sqInt oop);
sqInt (*isWeak)(sqInt oop);
sqInt (*isWords)(sqInt oop);
sqInt (*isWordsOrBytes)(sqInt oop);
/* InterpreterProxy methodsFor: 'converting' */
sqInt (*booleanValueOf)(sqInt obj);
sqInt (*checkedIntegerValueOf)(sqInt intOop);
sqInt (*floatObjectOf)(double aFloat);
double (*floatValueOf)(sqInt oop);
sqInt (*integerObjectOf)(sqInt value);
sqInt (*integerValueOf)(sqInt oop);
sqInt (*positive32BitIntegerFor)(sqInt integerValue);
sqInt (*positive32BitValueOf)(sqInt oop);
/* InterpreterProxy methodsFor: 'special objects' */
sqInt (*characterTable)(void);
sqInt (*displayObject)(void);
sqInt (*falseObject)(void);
sqInt (*nilObject)(void);
sqInt (*trueObject)(void);
/* InterpreterProxy methodsFor: 'special classes' */
sqInt (*classArray)(void);
sqInt (*classBitmap)(void);
sqInt (*classByteArray)(void);
sqInt (*classCharacter)(void);
sqInt (*classFloat)(void);
sqInt (*classLargePositiveInteger)(void);
sqInt (*classPoint)(void);
sqInt (*classSemaphore)(void);
sqInt (*classSmallInteger)(void);
sqInt (*classString)(void);
/* InterpreterProxy methodsFor: 'instance creation' */
sqInt (*clone)(sqInt oop);
sqInt (*instantiateClassindexableSize)(sqInt classPointer, sqInt size);
sqInt (*makePointwithxValueyValue)(sqInt xValue, sqInt yValue);
sqInt (*popRemappableOop)(void);
sqInt (*pushRemappableOop)(sqInt oop);
/* InterpreterProxy methodsFor: 'other' */
sqInt (*becomewith)(sqInt array1, sqInt array2);
sqInt (*byteSwapped)(sqInt w);
sqInt (*failed)(void);
sqInt (*fullDisplayUpdate)(void);
sqInt (*fullGC)(void);
sqInt (*incrementalGC)(void);
sqInt (*primitiveFail)(void);
sqInt (*showDisplayBitsLeftTopRightBottom)(sqInt aForm, sqInt l, sqInt t, sqInt r, sqInt b);
sqInt (*signalSemaphoreWithIndex)(sqInt semaIndex);
sqInt (*success)(sqInt aBoolean);
sqInt (*superclassOf)(sqInt classPointer);
/* InterpreterProxy methodsFor: 'compiler' */
CompilerHook *(*compilerHookVector)(void);
sqInt (*setCompilerInitialized)(sqInt initFlag);
#if VM_PROXY_MINOR > 1
/* InterpreterProxy methodsFor: 'BitBlt support' */
sqInt (*loadBitBltFrom)(sqInt bbOop);
sqInt (*copyBits)(void);
sqInt (*copyBitsFromtoat)(sqInt leftX, sqInt rightX, sqInt yValue);
#endif
#if VM_PROXY_MINOR > 2
sqInt (*classLargeNegativeInteger)(void);
sqInt (*signed32BitIntegerFor)(sqInt integerValue);
sqInt (*signed32BitValueOf)(sqInt oop);
sqInt (*includesBehaviorThatOf)(sqInt aClass, sqInt aSuperClass);
sqInt (*primitiveMethod)(void);
/* InterpreterProxy methodsFor: 'FFI support' */
sqInt (*classExternalAddress)(void);
sqInt (*classExternalData)(void);
sqInt (*classExternalFunction)(void);
sqInt (*classExternalLibrary)(void);
sqInt (*classExternalStructure)(void);
sqInt (*ioLoadModuleOfLength)(sqInt modIndex, sqInt modLength);
sqInt (*ioLoadSymbolOfLengthFromModule)(sqInt fnIndex, sqInt fnLength, sqInt handle);
sqInt (*isInMemory)(sqInt address);
#endif
#if VM_PROXY_MINOR > 3
void *(*ioLoadFunctionFrom)(char *fnName, char *modName);
sqInt (*ioMicroMSecs)(void);
#endif
#if VM_PROXY_MINOR > 4
# if !defined(sqLong)
# if _MSC_VER
# define sqLong __int64
# define usqLong unsigned __int64
# else
# define sqLong long long
# define usqLong unsigned long long
# endif
# endif
sqInt (*positive64BitIntegerFor)(sqLong integerValue);
sqLong (*positive64BitValueOf)(sqInt oop);
sqInt (*signed64BitIntegerFor)(sqLong integerValue);
sqLong (*signed64BitValueOf)(sqInt oop);
#endif
#if VM_PROXY_MINOR > 5
sqInt (*isArray)(sqInt oop);
sqInt (*forceInterruptCheck)(void);
#endif
#if VM_PROXY_MINOR > 6
sqInt (*fetchLong32ofObject)(sqInt fieldFieldIndex, sqInt oop);
sqInt (*getThisSessionID)(void);
sqInt (*ioFilenamefromStringofLengthresolveAliases)(char* aCharBuffer, char* filenameIndex, sqInt filenameLength, sqInt resolveFlag);
sqInt (*vmEndianness)(void);
#endif
#if VM_PROXY_MINOR > 7
/* New methods for proxy version 1.8 */
/* callbackEnter: Re-enter the interpreter loop for a callback.
Arguments:
callbackID: Pointer to a location receiving the callback ID
used in callbackLeave
Returns: True if successful, false otherwise */
sqInt (*callbackEnter)(sqInt *callbackID);
/* callbackLeave: Leave the interpreter from a previous callback
Arguments:
callbackID: The ID of the callback received from callbackEnter()
Returns: True if succcessful, false otherwise. */
sqInt (*callbackLeave)(sqInt callbackID);
/* addGCRoot: Add a variable location to the garbage collector.
The contents of the variable location will be updated accordingly.
Arguments:
varLoc: Pointer to the variable location
Returns: True if successful, false otherwise. */
sqInt (*addGCRoot)(sqInt *varLoc);
/* removeGCRoot: Remove a variable location from the garbage collector.
Arguments:
varLoc: Pointer to the variable location
Returns: True if successful, false otherwise.
*/
sqInt (*removeGCRoot)(sqInt *varLoc);
#endif
#if VM_PROXY_MINOR > 8
/* See interp.h and above for standard error codes. */
sqInt (*primitiveFailFor)(sqInt code);
void (*(*setInterruptCheckChain)(void (*aFunction)(void)))();
sqInt (*classAlien)(void);
sqInt (*classUnsafeAlien)(void);
sqInt (*sendInvokeCallbackStackRegistersJmpbuf)(sqInt thunkPtrAsInt, sqInt stackPtrAsInt, sqInt regsPtrAsInt, sqInt jmpBufPtrAsInt);
sqInt (*reestablishContextPriorToCallback)(sqInt callbackContext);
sqInt *(*getStackPointer)(void);
sqInt (*internalIsImmutable)(sqInt oop);
sqInt (*internalIsMutable)(sqInt oop);
#endif
#if VM_PROXY_MINOR > 9
sqInt (*methodArg) (sqInt index);
sqInt (*objectArg) (sqInt index);
sqInt (*integerArg) (sqInt index);
double (*floatArg) (sqInt index);
sqInt (*methodReturnValue) (sqInt oop);
sqInt (*topRemappableOop) (void);
#endif
#if VM_PROXY_MINOR > 10
# define DisownVMLockOutFullGC 1
sqInt (*disownVM)(sqInt flags);
sqInt (*ownVM) (sqInt threadIdAndFlags);
void (*addHighPriorityTickee)(void (*ticker)(void), unsigned periodms);
void (*addSynchronousTickee)(void (*ticker)(void), unsigned periodms, unsigned roundms);
usqLong (*utcMicroseconds)(void);
sqInt (*tenuringIncrementalGC)(void);
sqInt (*isYoung) (sqInt anOop);
sqInt (*isKindOfClass)(sqInt oop, sqInt aClass);
sqInt (*primitiveErrorTable)(void);
sqInt (*primitiveFailureCode)(void);
sqInt (*instanceSizeOf)(sqInt aClass);
#endif
#if VM_PROXY_MINOR > 11
/* VMCallbackContext opaque type avoids all including setjmp.h & vmCallback.h */
sqInt (*sendInvokeCallbackContext)(vmccp);
sqInt (*returnAsThroughCallbackContext)(int, vmccp, sqInt);
long (*signedMachineIntegerValueOf)(sqInt);
long (*stackSignedMachineIntegerValue)(sqInt);
unsigned long (*positiveMachineIntegerValueOf)(sqInt);
unsigned long (*stackPositiveMachineIntegerValue)(sqInt);
sqInt (*getInterruptPending)(void);
char *(*cStringOrNullFor)(sqInt);
void *(*startOfAlienData)(sqInt);
usqInt (*sizeOfAlienData)(sqInt);
sqInt (*signalNoResume)(sqInt);
#endif
} VirtualMachine;
#endif /* _SqueakVM_H */
|