[Vm-dev] [commit] r2429 - Merge the Cog sqVirtualMachine.[ch].

commits at squeakvm.org commits at squeakvm.org
Fri Jun 17 04:47:57 UTC 2011


Author: eliot
Date: 2011-06-16 21:47:57 -0700 (Thu, 16 Jun 2011)
New Revision: 2429

Removed:
   trunk/platforms/Cross/plugins/IA32ABI/sqVirtualMachine.c
   trunk/platforms/Cross/plugins/IA32ABI/sqVirtualMachine.h
Modified:
   trunk/platforms/Cross/plugins/IA32ABI/dabusiness.h
   trunk/platforms/Cross/vm/sqVirtualMachine.c
   trunk/platforms/Cross/vm/sqVirtualMachine.h
Log:
Merge the Cog sqVirtualMachine.[ch].
See http://lists.squeakfoundation.org/pipermail/vm-dev/2011-June/008460.html.
Cleanup ifdefs in sqMacSound.c.
Fix stack pointer in alien callouts on linux.

Modified: trunk/platforms/Cross/plugins/IA32ABI/dabusiness.h
===================================================================
--- trunk/platforms/Cross/plugins/IA32ABI/dabusiness.h	2011-06-15 21:53:40 UTC (rev 2428)
+++ trunk/platforms/Cross/plugins/IA32ABI/dabusiness.h	2011-06-17 04:47:57 UTC (rev 2429)
@@ -45,10 +45,11 @@
 	argstart = argvec;
 #else
 	argvec = alloca(moduloPOT(sizeof(long),size));
-# if defined(__MINGW32__) && (__GNUC__ >= 3)
+# if (defined(__MINGW32__) && (__GNUC__ >= 3)) || defined(__linux__)
 	/*
 	 * cygwin & MinGW's gcc 3.4.x's alloca is a library routine that answers
 	 * %esp + 4, so the outgoing stack is offset by one word if uncorrected.
+	 * Apparently the same can be said for 4.x linux implementations.
 	 * Grab the actual stack pointer to correct.
 	 */
 	argvec = getsp();

Deleted: trunk/platforms/Cross/plugins/IA32ABI/sqVirtualMachine.c
===================================================================
--- trunk/platforms/Cross/plugins/IA32ABI/sqVirtualMachine.c	2011-06-15 21:53:40 UTC (rev 2428)
+++ trunk/platforms/Cross/plugins/IA32ABI/sqVirtualMachine.c	2011-06-17 04:47:57 UTC (rev 2429)
@@ -1,376 +0,0 @@
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include "sqVirtualMachine.h"
-
-/*** Function prototypes ***/
-
-/* 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);
-
-/*** variables ***/
-
-extern sqInt (*compilerHooks[])();
-extern sqInt setCompilerInitialized(sqInt flagValue);
-
-/* 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 index, sqInt oop);
-/* sqInt  fetchWordofObject(sqInt fieldIndex, 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 index, sqInt oop);
-sqInt  fetchLong32ofObject(sqInt index, 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  primitiveMethod(void);
-sqInt  primitiveIndexOf(sqInt methodPointer);
-sqInt  sizeOfSTArrayFromCPrimitive(void *cPtr);
-sqInt  slotSizeOf(sqInt oop);
-sqInt  stObjectat(sqInt array, sqInt index);
-sqInt  stObjectatput(sqInt array, sqInt index, sqInt value);
-sqInt  stSizeOf(sqInt oop);
-sqInt  storeIntegerofObjectwithValue(sqInt index, sqInt oop, sqInt integer);
-sqInt  storePointerofObjectwithValue(sqInt index, 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);
-sqInt includesBehaviorThatOf(sqInt aClass, sqInt aSuperClass);
-sqInt isArray(sqInt oop);
-sqInt internalIsMutable(sqInt oop);
-sqInt internalIsImmutable(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);
-sqInt  signed32BitIntegerFor(sqInt integerValue);
-sqInt  signed32BitValueOf(sqInt oop);
-sqInt  positive64BitIntegerFor(sqLong integerValue);
-sqLong positive64BitValueOf(sqInt oop);
-sqInt  signed64BitIntegerFor(sqLong integerValue);
-sqLong signed64BitValueOf(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 classLargeNegativeInteger(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 primitiveFailFor(sqInt reasonCode);
-sqInt showDisplayBitsLeftTopRightBottom(sqInt aForm, sqInt l, sqInt t, sqInt r, sqInt b);
-sqInt signalSemaphoreWithIndex(sqInt semaIndex);
-sqInt success(sqInt aBoolean);
-sqInt superclassOf(sqInt classPointer);
-sqInt ioMicroMSecs(void);
-sqInt forceInterruptCheck(void);
-sqInt getThisSessionID(void);
-sqInt ioFilenamefromStringofLengthresolveAliases(char* aCharBuffer, char* filenameIndex, sqInt filenameLength, sqInt resolveFlag);
-sqInt  vmEndianness(void);	
-
-/* InterpreterProxy methodsFor: 'BitBlt support' */
-sqInt loadBitBltFrom(sqInt bbOop);
-sqInt copyBits(void);
-sqInt copyBitsFromtoat(sqInt leftX, sqInt rightX, sqInt yValue);
-
-/* InterpreterProxy methodsFor: 'FFI support' */
-sqInt classExternalAddress(void); /* Old Squeak FFI */
-sqInt classExternalData(void);
-sqInt classExternalFunction(void);
-sqInt classExternalLibrary(void);
-sqInt classExternalStructure(void);
-sqInt classAlien(void); /* Newsqueak FFI */
-sqInt classUnsafeAlien(void); /* Newsqueak FFI */
-sqInt getStackPointer(void);  /* Newsqueak FFI */
-sqInt sendInvokeCallbackStackRegistersJmpbuf(sqInt thunkPtrAsInt, sqInt stackPtrAsInt, sqInt regsPtrAsInt, sqInt jmpBufPtrAsInt); /* Newsqueak FFI */
-sqInt reestablishContextPriorToCallback(sqInt callbackContext); /* Newsqueak FFI */
-sqInt ioLoadModuleOfLength(sqInt moduleNameIndex, sqInt moduleNameLength);
-sqInt ioLoadSymbolOfLengthFromModule(sqInt functionNameIndex, sqInt functionNameLength, sqInt moduleHandle);
-sqInt isInMemory(sqInt address);
-
-void *ioLoadFunctionFrom(char *fnName, char *modName);
-
-
-/* Proxy declarations for v1.8 */
-sqInt callbackEnter(sqInt *callbackID);
-sqInt callbackLeave(sqInt  callbackID);
-sqInt addGCRoot(sqInt *varLoc);
-sqInt removeGCRoot(sqInt *varLoc);
-
-struct VirtualMachine *VM = NULL;
-
-static sqInt majorVersion(void) {
-	return VM_PROXY_MAJOR;
-}
-
-static sqInt minorVersion(void) {
-	return VM_PROXY_MINOR;
-}
-
-static CompilerHook *compilerHookVector(void) {
-  return compilerHooks;
-}
-
-
-struct VirtualMachine* sqGetInterpreterProxy(void)
-{
-	if(VM) return VM;
-	VM = (struct VirtualMachine *)calloc(1, sizeof(VirtualMachine));
-	/* Initialize Function pointers */
-	VM->majorVersion = majorVersion;
-	VM->minorVersion = minorVersion;
-
-	/* InterpreterProxy methodsFor: 'stack access' */
-	VM->pop = pop;
-	VM->popthenPush = popthenPush;
-	VM->push = push;
-	VM->pushBool = pushBool;
-	VM->pushFloat = pushFloat;
-	VM->pushInteger = pushInteger;
-	VM->stackFloatValue = stackFloatValue;
-	VM->stackIntegerValue = stackIntegerValue;
-	VM->stackObjectValue = stackObjectValue;
-	VM->stackValue = stackValue;
-	
-	/* InterpreterProxy methodsFor: 'object access' */
-	VM->argumentCountOf = argumentCountOf;
-	VM->arrayValueOf = arrayValueOf;
-	VM->byteSizeOf = byteSizeOf;
-	VM->fetchArrayofObject = fetchArrayofObject;
-	VM->fetchClassOf = fetchClassOf;
-	VM->fetchFloatofObject = fetchFloatofObject;
-	VM->fetchIntegerofObject = fetchIntegerofObject;
-	VM->fetchPointerofObject = fetchPointerofObject;
-	VM->obsoleteDontUseThisFetchWordofObject = obsoleteDontUseThisFetchWordofObject;
-	VM->firstFixedField = firstFixedField;
-	VM->firstIndexableField = firstIndexableField;
-	VM->literalofMethod = literalofMethod;
-	VM->literalCountOf = literalCountOf;
-	VM->methodArgumentCount = methodArgumentCount;
-	VM->methodPrimitiveIndex = methodPrimitiveIndex;
-	VM->primitiveIndexOf = primitiveIndexOf;
-	VM->primitiveMethod = primitiveMethod;
-	VM->sizeOfSTArrayFromCPrimitive = sizeOfSTArrayFromCPrimitive;
-	VM->slotSizeOf = slotSizeOf;
-	VM->stObjectat = stObjectat;
-	VM->stObjectatput = stObjectatput;
-	VM->stSizeOf = stSizeOf;
-	VM->storeIntegerofObjectwithValue = storeIntegerofObjectwithValue;
-	VM->storePointerofObjectwithValue = storePointerofObjectwithValue;
-	
-	/* InterpreterProxy methodsFor: 'testing' */
-	VM->isKindOf = isKindOf;
-	VM->isMemberOf = isMemberOf;
-	VM->isBytes = isBytes;
-	VM->isFloatObject = isFloatObject;
-	VM->isIndexable = isIndexable;
-	VM->isIntegerObject = isIntegerObject;
-	VM->isIntegerValue = isIntegerValue;
-	VM->isPointers = isPointers;
-	VM->isWeak = isWeak;
-	VM->isWords = isWords;
-	VM->isWordsOrBytes = isWordsOrBytes;
-
-	/* InterpreterProxy methodsFor: 'converting' */
-	VM->booleanValueOf = booleanValueOf;
-	VM->checkedIntegerValueOf = checkedIntegerValueOf;
-	VM->floatObjectOf = floatObjectOf;
-	VM->floatValueOf = floatValueOf;
-	VM->integerObjectOf = integerObjectOf;
-	VM->integerValueOf = integerValueOf;
-	VM->positive32BitIntegerFor = positive32BitIntegerFor;
-	VM->positive32BitValueOf = positive32BitValueOf;
-
-	/* InterpreterProxy methodsFor: 'special objects' */
-	VM->characterTable = characterTable;
-	VM->displayObject = displayObject;
-	VM->falseObject = falseObject;
-	VM->nilObject = nilObject;
-	VM->trueObject = trueObject;
-	
-	/* InterpreterProxy methodsFor: 'special classes' */
-	VM->classArray = classArray;
-	VM->classBitmap = classBitmap;
-	VM->classByteArray = classByteArray;
-	VM->classCharacter = classCharacter;
-	VM->classFloat = classFloat;
-	VM->classLargePositiveInteger = classLargePositiveInteger;
-	VM->classPoint = classPoint;
-	VM->classSemaphore = classSemaphore;
-	VM->classSmallInteger = classSmallInteger;
-	VM->classString = classString;
-	
-	/* InterpreterProxy methodsFor: 'instance creation' */
-	VM->clone = clone;
-	VM->instantiateClassindexableSize = instantiateClassindexableSize;
-	VM->makePointwithxValueyValue = makePointwithxValueyValue;
-	VM->popRemappableOop = popRemappableOop;
-	VM->pushRemappableOop = pushRemappableOop;
-
-	/* InterpreterProxy methodsFor: 'other' */
-	VM->becomewith = becomewith;
-	VM->byteSwapped = byteSwapped;
-	VM->failed = failed;
-	VM->fullDisplayUpdate = fullDisplayUpdate;
-	VM->fullGC = fullGC;
-	VM->incrementalGC = incrementalGC;
-	VM->primitiveFail = primitiveFail;
-	VM->showDisplayBitsLeftTopRightBottom = showDisplayBitsLeftTopRightBottom;
-	VM->signalSemaphoreWithIndex = signalSemaphoreWithIndex;
-	VM->success = success;
-	VM->superclassOf = superclassOf;
-
-	VM->compilerHookVector= compilerHookVector;
-	VM->setCompilerInitialized= setCompilerInitialized;
-
-#if VM_PROXY_MINOR > 1
-
-	/* InterpreterProxy methodsFor: 'BitBlt support' */
-	VM->loadBitBltFrom = loadBitBltFrom;
-	VM->copyBits = copyBits;
-	VM->copyBitsFromtoat = copyBitsFromtoat;
-
-#endif
-
-#if VM_PROXY_MINOR > 2
-
-	/* InterpreterProxy methodsFor: 'FFI support' */
-	VM->classExternalAddress = classExternalAddress;
-	VM->classExternalData = classExternalData;
-	VM->classExternalFunction = classExternalFunction;
-	VM->classExternalLibrary = classExternalLibrary;
-	VM->classExternalStructure = classExternalStructure;
-	VM->ioLoadModuleOfLength = ioLoadModuleOfLength;
-	VM->ioLoadSymbolOfLengthFromModule = ioLoadSymbolOfLengthFromModule;
-	VM->isInMemory = isInMemory;
-	VM->signed32BitIntegerFor = signed32BitIntegerFor;
-	VM->signed32BitValueOf = signed32BitValueOf;
-	VM->includesBehaviorThatOf = includesBehaviorThatOf;
-	VM->classLargeNegativeInteger = classLargeNegativeInteger;
-
-#endif
-
-#if VM_PROXY_MINOR > 3
-
-	VM->ioLoadFunctionFrom = ioLoadFunctionFrom;
-	VM->ioMicroMSecs = ioMicroMSecs;
-
-#endif
-
-#if VM_PROXY_MINOR > 4
-
-	VM->positive64BitIntegerFor = positive64BitIntegerFor;
-	VM->positive64BitValueOf = positive64BitValueOf;
-	VM->signed64BitIntegerFor = signed64BitIntegerFor;
-	VM->signed64BitValueOf = signed64BitValueOf;
-
-#endif
-
-#if VM_PROXY_MINOR > 5
-	VM->isArray = isArray;
-	VM->forceInterruptCheck = forceInterruptCheck;
-#endif
-
-#if VM_PROXY_MINOR > 6
-
-	VM->fetchLong32ofObject = fetchLong32ofObject;
-	VM->getThisSessionID = getThisSessionID;
-	VM->ioFilenamefromStringofLengthresolveAliases = ioFilenamefromStringofLengthresolveAliases;
-	VM->vmEndianness = vmEndianness;
-
-#endif
-
-#if VM_PROXY_MINOR > 7
-
-	VM->internalIsImmutable = internalIsImmutable;
-	VM->internalIsMutable   = internalIsMutable;
-	VM->primitiveFailFor    = primitiveFailFor;
-	VM->classAlien          = classAlien;
-	VM->getStackPointer     = (sqInt *(*)(void))getStackPointer;
-	VM->sendInvokeCallbackStackRegistersJmpbuf = sendInvokeCallbackStackRegistersJmpbuf;
-	VM->reestablishContextPriorToCallback = reestablishContextPriorToCallback;
-	VM->classUnsafeAlien    = classUnsafeAlien;
-
-#endif
-
-#if VM_PROXY_MINOR > 7
-	VM->callbackEnter = callbackEnter;
-	VM->callbackLeave = callbackLeave;
-	VM->addGCRoot = addGCRoot;
-	VM->removeGCRoot = removeGCRoot;
-#endif
-	return VM;
-}

Deleted: trunk/platforms/Cross/plugins/IA32ABI/sqVirtualMachine.h
===================================================================
--- trunk/platforms/Cross/plugins/IA32ABI/sqVirtualMachine.h	2011-06-15 21:53:40 UTC (rev 2428)
+++ trunk/platforms/Cross/plugins/IA32ABI/sqVirtualMachine.h	2011-06-17 04:47:57 UTC (rev 2429)
@@ -1,270 +0,0 @@
-#ifndef _SqueakVM_H
-#define _SqueakVM_H
-
-/* Increment the following number if you change the order of
-   functions listed or if you remove functions */
-#define VM_PROXY_MAJOR 1
-
-/* Note: You can define a different VM_PROXY_MINOR if the plugin
-   should work with older VMs. */
-#ifndef VM_PROXY_MINOR
-/* Increment the following number if you add functions at the end */
-#define VM_PROXY_MINOR 8
-#endif
-
-#include "sqMemoryAccess.h"
-
-#if VM_PROXY_MINOR > 7
-# define PrimErrNoErr 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
-#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
-#   else
-#     define sqLong 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
-	sqInt  (*internalIsImmutable)(sqInt oop);
-	sqInt  (*internalIsMutable)(sqInt oop);
-	sqInt  (*primitiveFailFor)(sqInt code);
-	sqInt  (*classAlien)(void);
-	sqInt *(*getStackPointer)(void);
-	sqInt  (*sendInvokeCallbackStackRegistersJmpbuf)(sqInt thunkPtrAsInt, sqInt stackPtrAsInt, sqInt regsPtrAsInt, sqInt jmpBufPtrAsInt);
-	sqInt  (*reestablishContextPriorToCallback)(sqInt callbackContext);
-	sqInt  (*classUnsafeAlien)(void);
-	/* 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
-#endif
-
-} VirtualMachine;
-
-#endif /* _SqueakVM_H */

Modified: trunk/platforms/Cross/vm/sqVirtualMachine.c
===================================================================
--- trunk/platforms/Cross/vm/sqVirtualMachine.c	2011-06-15 21:53:40 UTC (rev 2428)
+++ trunk/platforms/Cross/vm/sqVirtualMachine.c	2011-06-17 04:47:57 UTC (rev 2429)
@@ -3,8 +3,11 @@
 #include <stdlib.h>
 #include <string.h>
 #include <time.h>
+#include <setjmp.h>
+
 #include "sqVirtualMachine.h"
 
+
 /*** Function prototypes ***/
 
 /* InterpreterProxy methodsFor: 'stack access' */
@@ -21,9 +24,6 @@
 
 /*** variables ***/
 
-extern sqInt (*compilerHooks[])();
-extern sqInt setCompilerInitialized(sqInt flagValue);
-
 /* InterpreterProxy methodsFor: 'object access' */
 sqInt  argumentCountOf(sqInt methodPointer);
 void  *arrayValueOf(sqInt oop);
@@ -72,9 +72,18 @@
 sqInt isWords(sqInt oop);
 sqInt isWordsOrBytes(sqInt oop);
 sqInt includesBehaviorThatOf(sqInt aClass, sqInt aSuperClass);
+#if VM_PROXY_MINOR > 10
+sqInt isKindOfClass(sqInt oop, sqInt aClass);
+sqInt primitiveErrorTable(void);
+sqInt primitiveFailureCode(void);
+sqInt instanceSizeOf(sqInt aClass);
+sqInt tenuringIncrementalGC(void);
+#endif
 sqInt isArray(sqInt oop);
+#if IMMUTABILITY
 sqInt internalIsMutable(sqInt oop);
 sqInt internalIsImmutable(sqInt oop);
+#endif
 
 /* InterpreterProxy methodsFor: 'converting' */
 sqInt  booleanValueOf(sqInt obj);
@@ -91,6 +100,10 @@
 sqLong positive64BitValueOf(sqInt oop);
 sqInt  signed64BitIntegerFor(sqLong integerValue);
 sqLong signed64BitValueOf(sqInt oop);
+long  signedMachineIntegerValueOf(sqInt);
+long  stackSignedMachineIntegerValue(sqInt);
+unsigned long  positiveMachineIntegerValueOf(sqInt);
+unsigned long  stackPositiveMachineIntegerValue(sqInt);
 
 /* InterpreterProxy methodsFor: 'special objects' */
 sqInt characterTable(void);
@@ -136,10 +149,12 @@
 sqInt success(sqInt aBoolean);
 sqInt superclassOf(sqInt classPointer);
 sqInt ioMicroMSecs(void);
+usqLong ioUTCMicroseconds(void);
 sqInt forceInterruptCheck(void);
 sqInt getThisSessionID(void);
 sqInt ioFilenamefromStringofLengthresolveAliases(char* aCharBuffer, char* filenameIndex, sqInt filenameLength, sqInt resolveFlag);
-sqInt  vmEndianness(void);	
+sqInt vmEndianness(void);	
+sqInt getInterruptPending(void);
 
 /* InterpreterProxy methodsFor: 'BitBlt support' */
 sqInt loadBitBltFrom(sqInt bbOop);
@@ -147,29 +162,53 @@
 sqInt copyBitsFromtoat(sqInt leftX, sqInt rightX, sqInt yValue);
 
 /* InterpreterProxy methodsFor: 'FFI support' */
-sqInt classExternalAddress(void); /* Old Squeak FFI */
+sqInt classExternalAddress(void);
 sqInt classExternalData(void);
 sqInt classExternalFunction(void);
 sqInt classExternalLibrary(void);
 sqInt classExternalStructure(void);
-sqInt classAlien(void); /* Newsqueak FFI */
-sqInt classUnsafeAlien(void); /* Newsqueak FFI */
-sqInt getStackPointer(void);  /* Newsqueak FFI */
-sqInt sendInvokeCallbackStackRegistersJmpbuf(sqInt thunkPtrAsInt, sqInt stackPtrAsInt, sqInt regsPtrAsInt, sqInt jmpBufPtrAsInt); /* Newsqueak FFI */
-sqInt reestablishContextPriorToCallback(sqInt callbackContext); /* Newsqueak FFI */
 sqInt ioLoadModuleOfLength(sqInt moduleNameIndex, sqInt moduleNameLength);
 sqInt ioLoadSymbolOfLengthFromModule(sqInt functionNameIndex, sqInt functionNameLength, sqInt moduleHandle);
 sqInt isInMemory(sqInt address);
+sqInt classAlien(void); /* Alien FFI */
+sqInt classUnsafeAlien(void); /* Alien FFI */
+sqInt getStackPointer(void);  /* Newsqueak FFI */
+void *startOfAlienData(sqInt);
+usqInt sizeOfAlienData(sqInt);
+sqInt signalNoResume(sqInt);
+#if VM_PROXY_MINOR > 8
+sqInt getStackPointer(void);  /* Alien FFI */
+sqInt sendInvokeCallbackStackRegistersJmpbuf(sqInt thunkPtrAsInt, sqInt stackPtrAsInt, sqInt regsPtrAsInt, sqInt jmpBufPtrAsInt); /* Alien FFI */
+sqInt reestablishContextPriorToCallback(sqInt callbackContext); /* Alien FFI */
+sqInt sendInvokeCallbackContext(vmccp);
+sqInt returnAsThroughCallbackContext(int, vmccp, sqInt);
+#endif /* VM_PROXY_MINOR > 8 */
+char *cStringOrNullFor(sqInt);
 
 void *ioLoadFunctionFrom(char *fnName, char *modName);
 
 
 /* Proxy declarations for v1.8 */
+#if NewspeakVM
+static sqInt
+callbackEnter(sqInt *callbackID) { return 0; }
+static sqInt
+callbackLeave(sqInt *callbackID) { return 0; }
+#else
 sqInt callbackEnter(sqInt *callbackID);
 sqInt callbackLeave(sqInt  callbackID);
+#endif
 sqInt addGCRoot(sqInt *varLoc);
 sqInt removeGCRoot(sqInt *varLoc);
 
+/* Proxy declarations for v1.10 */
+sqInt methodArg(sqInt index);
+sqInt objectArg(sqInt index);
+sqInt integerArg(sqInt index);
+double floatArg(sqInt index);
+sqInt methodReturnValue(sqInt oop);
+sqInt topRemappableOop(void);
+
 struct VirtualMachine *VM = NULL;
 
 static sqInt majorVersion(void) {
@@ -180,11 +219,36 @@
 	return VM_PROXY_MINOR;
 }
 
-static CompilerHook *compilerHookVector(void) {
-  return compilerHooks;
+#if !IMMUTABILITY
+static sqInt isNonIntegerObject(sqInt objectPointer)
+{
+	return !isIntegerObject(objectPointer);
 }
+#endif
 
+#if STACKVM
+void (*setInterruptCheckChain(void (*aFunction)(void)))();
+#else
+void (*setInterruptCheckChain(void (*aFunction)(void)))() { return 0; }
+#endif
 
+#if COGMTVM
+sqInt disownVM(sqInt flags);
+sqInt ownVM(sqInt threadIdAndFlags);
+#else
+sqInt disownVM(sqInt flags) { return 1; }
+sqInt ownVM(sqInt threadIdAndFlags)
+{
+	extern sqInt amInVMThread(void);
+	return amInVMThread() ? 0 : -1;
+}
+#endif
+extern sqInt isYoung(sqInt);
+
+/* High-priority and synchronous ticker function support. */
+void addHighPriorityTickee(void (*ticker)(void), unsigned periodms);
+void addSynchronousTickee(void (*ticker)(void), unsigned periodms, unsigned roundms);
+
 struct VirtualMachine* sqGetInterpreterProxy(void)
 {
 	if(VM) return VM;
@@ -204,7 +268,7 @@
 	VM->stackIntegerValue = stackIntegerValue;
 	VM->stackObjectValue = stackObjectValue;
 	VM->stackValue = stackValue;
-	
+
 	/* InterpreterProxy methodsFor: 'object access' */
 	VM->argumentCountOf = argumentCountOf;
 	VM->arrayValueOf = arrayValueOf;
@@ -230,7 +294,7 @@
 	VM->stSizeOf = stSizeOf;
 	VM->storeIntegerofObjectwithValue = storeIntegerofObjectwithValue;
 	VM->storePointerofObjectwithValue = storePointerofObjectwithValue;
-	
+
 	/* InterpreterProxy methodsFor: 'testing' */
 	VM->isKindOf = isKindOf;
 	VM->isMemberOf = isMemberOf;
@@ -272,7 +336,7 @@
 	VM->classSemaphore = classSemaphore;
 	VM->classSmallInteger = classSmallInteger;
 	VM->classString = classString;
-	
+
 	/* InterpreterProxy methodsFor: 'instance creation' */
 	VM->clone = clone;
 	VM->instantiateClassindexableSize = instantiateClassindexableSize;
@@ -293,8 +357,8 @@
 	VM->success = success;
 	VM->superclassOf = superclassOf;
 
-	VM->compilerHookVector= compilerHookVector;
-	VM->setCompilerInitialized= setCompilerInitialized;
+	VM->compilerHookVector= 0;
+	VM->setCompilerInitialized= 0;
 
 #if VM_PROXY_MINOR > 1
 
@@ -340,36 +404,157 @@
 #endif
 
 #if VM_PROXY_MINOR > 5
-
 	VM->isArray = isArray;
 	VM->forceInterruptCheck = forceInterruptCheck;
-
 #endif
 
 #if VM_PROXY_MINOR > 6
-
 	VM->fetchLong32ofObject = fetchLong32ofObject;
 	VM->getThisSessionID = getThisSessionID;
 	VM->ioFilenamefromStringofLengthresolveAliases = ioFilenamefromStringofLengthresolveAliases;
 	VM->vmEndianness = vmEndianness;
-
 #endif
 
 #if VM_PROXY_MINOR > 7
+	VM->callbackEnter = callbackEnter;
+	VM->callbackLeave = callbackLeave;
+	VM->addGCRoot = addGCRoot;
+	VM->removeGCRoot = removeGCRoot;
+#endif
 
-	VM->internalIsImmutable = internalIsImmutable;
-	VM->internalIsMutable   = internalIsMutable;
+#if VM_PROXY_MINOR > 8
 	VM->primitiveFailFor    = primitiveFailFor;
+	VM->setInterruptCheckChain = setInterruptCheckChain;
 	VM->classAlien          = classAlien;
-	VM->getStackPointer     = (sqInt *(*)(void))getStackPointer;
+	VM->classUnsafeAlien    = classUnsafeAlien;
 	VM->sendInvokeCallbackStackRegistersJmpbuf = sendInvokeCallbackStackRegistersJmpbuf;
 	VM->reestablishContextPriorToCallback = reestablishContextPriorToCallback;
-	VM->classUnsafeAlien    = classUnsafeAlien;
-	VM->callbackEnter = callbackEnter;
-	VM->callbackLeave = callbackLeave;
-	VM->addGCRoot = addGCRoot;
-	VM->removeGCRoot = removeGCRoot;
+	VM->getStackPointer     = (sqInt *(*)(void))getStackPointer;
+# if IMMUTABILITY
+	VM->internalIsImmutable = internalIsImmutable;
+	VM->internalIsMutable   = internalIsMutable;
+# else
+	VM->internalIsImmutable = isIntegerObject;
+	VM->internalIsMutable   = isNonIntegerObject;
+# endif
+#endif
 
+#if VM_PROXY_MINOR > 9
+	VM->methodArg = methodArg;
+	VM->objectArg = objectArg;
+	VM->integerArg = integerArg;
+	VM->floatArg = floatArg;
+	VM->methodReturnValue = methodReturnValue;
+	VM->topRemappableOop = topRemappableOop;
 #endif
+
+#if VM_PROXY_MINOR > 10
+	VM->disownVM = disownVM;
+	VM->ownVM = ownVM;
+	VM->addHighPriorityTickee = addHighPriorityTickee;
+	VM->addSynchronousTickee = addSynchronousTickee;
+	VM->utcMicroseconds = ioUTCMicroseconds;
+	VM->tenuringIncrementalGC = tenuringIncrementalGC;
+	VM->isYoung = isYoung;
+	VM->isKindOfClass = isKindOfClass;
+	VM->primitiveErrorTable = primitiveErrorTable;
+	VM->primitiveFailureCode = primitiveFailureCode;
+	VM->instanceSizeOf = instanceSizeOf;
+#endif
+
+#if VM_PROXY_MINOR > 11
+	VM->sendInvokeCallbackContext = sendInvokeCallbackContext;
+	VM->returnAsThroughCallbackContext = returnAsThroughCallbackContext;
+	VM->signedMachineIntegerValueOf = signedMachineIntegerValueOf;
+	VM->stackSignedMachineIntegerValue = stackSignedMachineIntegerValue;
+	VM->positiveMachineIntegerValueOf = positiveMachineIntegerValueOf;
+	VM->stackPositiveMachineIntegerValue = stackPositiveMachineIntegerValue;
+	VM->getInterruptPending = getInterruptPending;
+	VM->cStringOrNullFor = cStringOrNullFor;
+	VM->startOfAlienData = startOfAlienData;
+	VM->sizeOfAlienData = sizeOfAlienData;
+	VM->signalNoResume = signalNoResume;
+#endif
+
 	return VM;
 }
+
+
+/* This lives here for now but belongs somewhere else.
+ * platforms/Cross/vm/sqStuff.c??
+ */
+#define STDOUT_STACK_SZ 5
+static int stdoutStackIdx = -1;
+static FILE stdoutStack[STDOUT_STACK_SZ];
+
+/* N.B. As of cygwin 1.5.25 fopen("crash.dmp","a") DOES NOT WORK!  crash.dmp
+ * contains garbled output as if the file pointer gets set to the start of the
+ * file, not the end.  So we synthesize our own append mode.
+ */
+#if __MINGW32__
+# include <io.h>
+static FILE *
+fopen_for_append(char *filename)
+{
+	FILE *f = !access(filename, F_OK) /* access is bass ackwards */
+		? fopen(filename,"r+")
+		: fopen(filename,"w+");
+	if (f)
+		fseek(f,0,SEEK_END);
+	return f;
+}
+#elif defined(WIN32)
+# define fopen_for_append(filename) fopen(filename,"a+t")
+#else
+# define fopen_for_append(filename) fopen(filename,"a+")
+#endif
+
+void
+pushOutputFile(char *filenameOrStdioIndex)
+{
+#ifndef STDOUT_FILENO
+# define STDOUT_FILENO 1
+# define STDERR_FILENO 2
+#endif
+
+	FILE *output;
+
+	if (stdoutStackIdx + 2 >= STDOUT_STACK_SZ) {
+		fprintf(stderr,"output file stack is full.\n");
+		return;
+	}
+	switch ((unsigned)filenameOrStdioIndex) {
+	case STDOUT_FILENO: output = stdout; break;
+	case STDERR_FILENO: output = stderr; break;
+	default:
+		if (!(output = fopen_for_append(filenameOrStdioIndex))) {
+			fprintf(stderr,
+					"could not open \"%s\" for writing.\n",
+					filenameOrStdioIndex);
+			return;
+		}
+	}
+	stdoutStack[++stdoutStackIdx] = *stdout;
+	*stdout = *output;
+}
+
+void
+popOutputFile()
+{
+	if (stdoutStackIdx < 0) {
+		fprintf(stderr,"output file stack is empty.\n");
+		return;
+	}
+	fflush(stdout);
+	if (fileno(stdout) > STDERR_FILENO) {
+		/* as of Feb 2011 with fclose@@GLIBC_2.1 under e.g. CentOS 5.3, fclose
+		 * hangs in _IO_un_link_internal.  This hack avoids that.
+		 */
+#if __linux__
+		close(fileno(stdout));
+#else
+		fclose(stdout);
+#endif
+	}
+	*stdout = stdoutStack[stdoutStackIdx--];
+}

Modified: trunk/platforms/Cross/vm/sqVirtualMachine.h
===================================================================
--- trunk/platforms/Cross/vm/sqVirtualMachine.h	2011-06-15 21:53:40 UTC (rev 2428)
+++ trunk/platforms/Cross/vm/sqVirtualMachine.h	2011-06-17 04:47:57 UTC (rev 2429)
@@ -1,21 +1,26 @@
 #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.
+ */
+#include "interp.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
+# define VM_PROXY_MAJOR 1
+#endif
 
-/* Note: You can define a different VM_PROXY_MINOR if the plugin
-   should work with older VMs. */
 #ifndef VM_PROXY_MINOR
 /* Increment the following number if you add functions at the end */
-#define VM_PROXY_MINOR 8
+# define VM_PROXY_MINOR 12
 #endif
 
 #include "sqMemoryAccess.h"
 
-#if VM_PROXY_MINOR > 7
-# define PrimErrNoErr 0
+#if VM_PROXY_MINOR > 8
+# define PrimNoErr 0
 # define PrimErrGenericFailure 1
 # define PrimErrBadReceiver 2
 # define PrimErrBadArgument 3
@@ -27,6 +32,12 @@
 # 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)();
@@ -199,8 +210,10 @@
 #  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
 
@@ -219,52 +232,92 @@
 #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	  (*ioFilenamefromStringofLengthresolveAliases)(char* aCharBuffer, char* filenameIndex, sqInt filenameLength, sqInt resolveFlag);
 	sqInt  (*vmEndianness)(void);	
 #endif
 
 #if VM_PROXY_MINOR > 7
-	sqInt  (*internalIsImmutable)(sqInt oop);
-	sqInt  (*internalIsMutable)(sqInt oop);
+  /* 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 *(*getStackPointer)(void);
+	sqInt  (*classUnsafeAlien)(void);
 	sqInt  (*sendInvokeCallbackStackRegistersJmpbuf)(sqInt thunkPtrAsInt, sqInt stackPtrAsInt, sqInt regsPtrAsInt, sqInt jmpBufPtrAsInt);
 	sqInt  (*reestablishContextPriorToCallback)(sqInt callbackContext);
-	sqInt  (*classUnsafeAlien)(void);
-	/* 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);
+	sqInt *(*getStackPointer)(void);
+	sqInt  (*internalIsImmutable)(sqInt oop);
+	sqInt  (*internalIsMutable)(sqInt oop);
 #endif
 
-#if VM_PROXY_MINOR > 8
+#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 */



More information about the Vm-dev mailing list