ooRexx
4.2.0-source
About: ooRexx (Open Object Rexx) is a free implementation of Object Rexx. Object Rexx is an enhancement of the classic Rexx interpreter; a full-featured programming language with a human-oriented syntax. Fossies Dox: ooRexx-4.2.0-source.tar.gz ("inofficial" and yet experimental doxygen-generated source code documentation) 
|
Go to the documentation of this file. 78 #define RESTORE_CLASS(name, className) The##name##Class = (className *)RexxBehaviour::getPrimitiveBehaviour(T_##name)->restoreClass(); 86 #define LiveStackSize 16370 88 #define SaveStackSize 10 89 #define SaveStackAllocSize 500 91 #define MaxImageSize 1800000 108 va_start(args, message);
109 vprintf(message, args);
110 if (outfile != NULL) {
111 vfprintf(outfile, message, args);
223 if (!_restoringImage)
243 outFile = fopen(
"memory.prf",
"wb");
262 ObjEnd = (
void **)((
char *)objectRef + objectRef->
getObjectSize());
263 for (dmpPtr = (
void **)objectRef; dmpPtr <= ObjEnd ; dmpPtr++)
265 logMemoryCheck(outfile,
" >Parent Dump -->%p %p %p %p \n", *dmpPtr, *(dmpPtr+1), *(dmpPtr+2), *(dmpPtr+3));
371 markObject->
live(liveMark);
552 activity->
run(dispatcher);
727 printf(
"Allocating a new segment of %d bytes\n", requestedBytes);
733 printf(
"Allocating boundary a new segment of %d bytes\n", requestedBytes);
770 printf(
"Allocating large boundary new segment of %d bytes for request of %d\n", allocationBytes, requestedBytes);
804 char *objectPointer, *endPointer;
807 size_t primitiveTypeNum;
821 while (objectPointer < endPointer)
848 primitiveTypeNum = ((
RexxObject *)objectPointer)->behaviour->getClassType();
1162 totalSize = objSize * count;
1220 prototype = largeObject;
1228 for (i=1 ;i < count ; i++ )
1234 arrayOfObjects->
put(largeObject, i);
1236 largeObject = (
RexxObject *)((
char *)largeObject + objSize);
1240 arrayOfObjects->
put(largeObject, i);
1245 return arrayOfObjects;
1269 size_t deadObjectSize = shrinkObj->
getObjectSize() - newSize;
1272 newDeadObj =
new ((
void *)((
char *)shrinkObj + newSize))
DeadObject (deadObjectSize);
1280 if (deadObjectSize != 0)
1295 size_t allocationLength)
1330 if (largeObject != NULL)
1505 memcpy(bufferReference, markObject, size);
1548 const char *outFileName;
1552 const char *objectClassName;
1560 outfile = fopen(outFileName,
"wb");
1561 logMemoryCheck(outfile,
"Found non Object at %p, being marked from %p\n",markObject, pMarkObject);
1569 logMemoryCheck(outfile,
" non-Object dump -->%8.8X %8.8X %8.8X %8.8X \n", *(int32_t *)markObject, *((int32_t *)markObject+1) , *((int32_t *)markObject+2) , *((int32_t *)markObject+3));
1570 logMemoryCheck(outfile,
" non-Object dump -->%8.8X %8.8X %8.8X %8.8X \n", *((int32_t *)markObject+4) , *((int32_t *)markObject+5) , *((int32_t *)markObject+6) , *((int32_t *)markObject+7));
1571 logMemoryCheck(outfile,
" non-Object dump -->%8.8X %8.8X %8.8X %8.8X \n", *((int32_t *)markObject+8) , *((int32_t *)markObject+9) , *((int32_t *)markObject+10), *((int32_t *)markObject+11));
1572 logMemoryCheck(outfile,
" non-Object dump -->%8.8X %8.8X %8.8X %8.8X \n", *((int32_t *)markObject+12), *((int32_t *)markObject+13), *((int32_t *)markObject+14), *((int32_t *)markObject+15));
1587 className = markObject->
id();
1589 objectClassName =
"";
1594 printf(
"-->Parent node was marking offset '%u'x \n", (
char *)pMarkObject - (
char *)markObject);
1597 logMemoryCheck(outfile,
"Parent node is at %p, of type %s(%d) \n",
1598 markObject, objectClassName, markObject->behaviour->getClassType());
1609 printf(
"All data has been captured in file %s \n", outFileName);
1673 _imageStats.
clear();
1765 printf(
"Object stats for this image save are \n");
1767 printf(
"\n\n Total bytes for this image %d bytes \n",
image_offset);
1789 printf(
"Dumping object memory to orexdump.dmp\n");
1791 dumpfile = fopen(
"orexdump.dmp",
"wb");
1794 printf(
"Creating dump key file in orexdump.key\n");
1796 keyfile = fopen(
"orexdump.key",
"w");
1797 fprintf(keyfile,
"/* Object REXX dump key file */\n");
1798 fprintf(keyfile,
"memoryaddr = %p\n",
this);
1799 fprintf(keyfile,
"marker = %d\n",
markWord);
1810 fprintf(keyfile,
"Pool addr.%d = %p\n", i,
currentPool);
1852 bool restoreimagesave;
1860 printf(
"Comparing old2new with the current system.\n");
1885 printf(
"object: %p, type: %d, is extra in old2new.\n\n",
1894 if (count != testcount)
1896 printf(
"object: %p, type: %d, has an incorrect refcount.\n",
1898 printf(
"Refcount for object is %d, should be %d.\n\n", count, testcount);
1901 tempold2new->
remove(index);
1908 for (j = tempold2new->
first();
1910 j = tempold2new->
next(j))
1912 printf(
"object: %p, type: %d, is missing from old2new.\n\n",
1919 printf(
"Dumping object memory.\n");
2031 printf(
"******** error in memory_setoref, unable to decrement refcount\n");
2032 printf(
"Naughty object reference is from: %p\n", oldValueLoc);
2033 printf(
"Naughty object reference is at: %p\n", index);
2062 return *oldValueLoc = value;
2070 const char *fileName,
2080 const char *outFileName;
2089 outfile = fopen(outFileName,
"wb");
2090 logMemoryCheck(outfile,
"The Setter object at %p is invalid...\n");
2098 outfile = fopen(outFileName,
"wb");
2099 logMemoryCheck(outfile,
"The Setter object at %p attempted to put a non object %p, at offset %p\n",setter, value, (
char *)index - (
char *)setter);
2100 logMemoryCheck(outfile,
" A dump of the Setting object follows: \n");
2108 outfile = fopen(outFileName,
"wb");
2109 logMemoryCheck(outfile,
"The Setter object at %p has tried to store at offset, which is outside his object range\n",setter, (
char *)index - (
char *)setter);
2110 logMemoryCheck(outfile,
" A dump of the Setting object follows: \n");
2119 logMemoryCheck(outfile,
" The error occurred in line %u of file %s\n", lineNum, fileName);
2120 printf(
"The dump data has been written to file %s \n",outFileName);
2125 return(setter->
isOldSpace() ? (this->
setOref(index, value)) : (*index = value));
2165 _imageStats.
clear();
2196 while (pool != NULL)
RexxVariable * variableCache
static RexxDirectory * globalStrings
void dumpObject(RexxObject *objectRef, FILE *outfile)
bool inSharedObjectStorage(RexxObject *obj)
RexxArray * new_array(size_t s)
RexxBehaviour * getSavedPrimitiveBehaviour()
void checkWeakReferences()
RexxObject * index(HashLink pos)
void logObjectStats(RexxObject *obj)
void dumpSegments(FILE *keyfile, FILE *dumpfile)
HashLink next(HashLink pos)
RexxObject * handleAllocationFailure(size_t allocationLength)
bool SysAccessPool(MemorySegmentPool **pool)
virtual MemorySegment * donateSegment(size_t allocationLength)
void initializeNewObject(size_t size, size_t mark, void *vft, RexxBehaviour *b)
static void loadImage(char **imageBuffer, size_t *imageSize)
RexxBehaviour * getObjectType()
GlobalProtectedObject * protectedObjects
RexxObject * newObject(size_t size)
void memoryPoolAdded(MemorySegmentPool *)
RexxString * new_proxy(const char *name)
void verboseMessage(const char *message)
void logVerboseOutput(const char *message, void *sub1, void *sub2)
RexxInteger * new_integer(wholenumber_t v)
#define memory_mark_general(oref)
#define RESTORE_CLASS(name, className)
RexxBehaviour * behaviour
static void createInstance()
#define TheCommonRetrievers
wholenumber_t incrementValue()
void collectAndUninit(bool clearStack)
#define SaveStackAllocSize
LargeSegmentSet newSpaceLargeSegments
RexxObject * temporaryObject(size_t size)
static RexxBehaviour primitiveBehaviours[]
static RexxDirectory * system
virtual void addDeadObject(DeadObject *object)
RexxObject * dumpImageStats()
static void createLocks()
void initialize(bool restoringImage)
void addUninitObject(RexxObject *obj)
virtual RexxObject * put(RexxObject *, RexxObject *)
MemorySegment * newSegment(size_t requestLength, size_t minLength)
MemorySegmentPool * currentPool
void copyEntries(RexxStack *other)
RexxObject * at(RexxString *)
static void * virtualFunctionTable[]
void reportException(wholenumber_t error)
#define TheObjectBehaviour
RexxArray * newObjects(size_t size, size_t count, size_t objectType)
size_t roundObjectBoundary(size_t n)
bool isInSegmentSet(RexxObject *object)
RexxObject * allocateObject(size_t allocationLength)
bool objectReferenceOK(RexxObject *o)
const char * getStringData()
virtual RexxObject * get(RexxObject *key)
RexxObject * saveObject(RexxInternalObject *saveObj)
void pushSaveStack(RexxObject *obj)
static void live(size_t liveMark)
bool isObjectDead(size_t mark)
static MemorySegmentPool * createPool()
#define MemorySegmentOverhead
#define ObjectNeedsMarking(oref)
RexxObject * get(size_t pos)
RexxIdentityTable * new_identity_table()
static RexxBehaviour * getPrimitiveBehaviour(size_t index)
static void logMemoryCheck(FILE *outfile, const char *message,...)
static void liveGeneral(int reason)
char * allocateImageBuffer(size_t size)
static void buildVirtualFunctionTable()
static void liveGeneral(int reason)
size_t roundSegmentBoundary(size_t n)
wholenumber_t decrementValue()
static SysMutex unflattenMutex
RexxObject * holdObject(RexxInternalObject *obj)
void setObjectSize(size_t s)
void unflattenMark(RexxObject *markObject, RexxObject **pMarkObject)
RexxString * new_string(const char *s, stringsize_t l)
static RexxArray * saveStrings()
static RexxDirectory * environment
RexxObject * value(HashLink pos)
RexxObject * getValue(RexxActivation *)
void put(RexxObject *eref, size_t pos)
#define Error_System_resources
void setBehaviour(RexxBehaviour *b)
static RexxDirectory * functionsDir
RexxIdentityTable * uninitTable
void restoreObjectMark(RexxObject *markObject, RexxObject **pMarkObject)
GlobalProtectedObject * next
WeakReference * weakReferenceList
static void restoreStrings(RexxArray *stringArray)
RexxObject * setParms(RexxObject *, RexxObject *)
void liveGeneral(int reason)
static void createInstance()
RexxStack * originalLiveStack
RexxSaveStack * saveStack
void markOldSpaceObjects()
MemorySegment * newLargeSegment(size_t requestLength, size_t minLength)
static void liveGeneral(int reason)
void discardHoldObject(RexxInternalObject *obj)
static void createImage()
MemorySegment * newLargeSegment(size_t minSize)
void killOrphans(RexxObject *)
void setUpMemoryTables(RexxIdentityTable *old2newTable)
RexxObject * popLiveStack()
RexxObject * put(RexxObject *, RexxString *)
virtual RexxObject * remove(RexxObject *key)
OldSpaceSegmentSet oldSpaceSegments
RexxIdentityTable * old2new
#define memory_mark(oref)
void saveImageMark(RexxObject *markObject, RexxObject **pMarkObject)
virtual void dumpMemoryProfile(FILE *outfile)
static void liveGeneral(int reason)
MemorySegmentPool * firstPool
#define TheStackBehaviour
RexxObject * referentObject
virtual DeadObject * donateObject(size_t allocationLength)
#define TheFunctionsDirectory
#define MinimumObjectSize
#define TheMemoryBehaviour
RexxObject * push(RexxObject *obj)
MemorySegmentPool * nextPool()
MemorySegment * newSegment(size_t minSize)
RexxObject * setOref(void *index, RexxObject *value)
static RexxDirectory * kernel
void setEnvelope(RexxEnvelope *)
void setObjectLive(size_t markword)
void orphanCheckMark(RexxObject *markObject, RexxObject **pMarkObject)
RexxObject * replace(RexxObject *newValue, HashLink pos)
static RexxString * getGlobalName(const char *value)
void markObjectsMain(RexxObject *)
size_t roundObjectResize(size_t n)
void setObjectOffset(size_t offset)
static SysMutex envelopeMutex
static RexxDirectory * commonRetrievers
RexxObject * oldObject(size_t size)
RexxObject * allocateObject(size_t allocationLength)
static RexxActivity *volatile currentActivity
RexxIdentityTable * saveTable
void restore(RexxBehaviour *)
RexxObject * allocateObject(size_t allocationLength)
void restoreMark(RexxObject *markObject, RexxObject **pMarkObject)
#define Error_Logical_value_method
bool isPendingUninit(RexxObject *obj)
WeakReference * nextReferenceList
RexxObject * checkSetOref(RexxObject *, RexxObject **, RexxObject *, const char *, int)
size_t roundLargeObjectAllocation(size_t n)
bool inObjectStorage(RexxObject *obj)
#define LargeBlockThreshold
void scavengeSegmentSets(MemorySegmentSet *requester, size_t allocationLength)
RexxStack * getFlattenStack()
void liveGeneral(int reason)
RexxObject * handleAllocationFailure(size_t allocationLength)
NormalSegmentSet newSpaceNormalSegments
static RexxBehaviour * restoreSavedPrimitiveBehaviour(RexxBehaviour *b)
static void initializeThreadContext()
#define TheBehaviourBehaviour
void gatherStats(MemoryStats *memStats, SegmentStats *stats)
static void logicError(const char *desc)
RexxObject * makeProxy(RexxEnvelope *)
static RexxArray * getImageData()
void flatten(RexxEnvelope *)
virtual RexxString * stringValue()
void pushLiveStack(RexxObject *obj)
static const char * getTempFileName()
RexxObject * setDump(RexxObject *)
bool isObjectLive(size_t mark)
virtual void dumpMemoryProfile(FILE *outfile)
void reSize(RexxObject *, size_t)
void addSegment(MemorySegment *segment, bool createDeadObject=1)
RexxObject * protectedObject
static SysMutex flattenMutex
void addWeakReference(WeakReference *ref)
void removeUninitObject(RexxObject *obj)
void returnFlattenStack()
void printSavedImageStats()