From: <bi...@us...> - 2007-12-01 02:34:31
|
Revision: 1357 http://oorexx.svn.sourceforge.net/oorexx/?rev=1357&view=rev Author: bigrixx Date: 2007-11-30 18:34:35 -0800 (Fri, 30 Nov 2007) Log Message: ----------- [ 1816554 ] Implement a stack-based object protection system. And lots, and lots of cleanup of initialization/termination and activity management. Modified Paths: -------------- interpreter-3.x/trunk/Makefile.am interpreter-3.x/trunk/kernel/classes/ArrayClass.cpp interpreter-3.x/trunk/kernel/classes/ClassClass.cpp interpreter-3.x/trunk/kernel/classes/ClassClass.hpp interpreter-3.x/trunk/kernel/classes/DirectoryClass.cpp interpreter-3.x/trunk/kernel/classes/IntegerClass.cpp interpreter-3.x/trunk/kernel/classes/IntegerClass.hpp interpreter-3.x/trunk/kernel/classes/ListClass.cpp interpreter-3.x/trunk/kernel/classes/ListClass.hpp interpreter-3.x/trunk/kernel/classes/MessageClass.cpp interpreter-3.x/trunk/kernel/classes/MethodClass.cpp interpreter-3.x/trunk/kernel/classes/MutableBufferClass.cpp interpreter-3.x/trunk/kernel/classes/NumberStringClass.cpp interpreter-3.x/trunk/kernel/classes/NumberStringClass.hpp interpreter-3.x/trunk/kernel/classes/NumberStringMath.cpp interpreter-3.x/trunk/kernel/classes/NumberStringMath2.cpp interpreter-3.x/trunk/kernel/classes/ObjectClass.cpp interpreter-3.x/trunk/kernel/classes/ObjectClass.hpp interpreter-3.x/trunk/kernel/classes/QueueClass.cpp interpreter-3.x/trunk/kernel/classes/StemClass.cpp interpreter-3.x/trunk/kernel/classes/StringClass.cpp interpreter-3.x/trunk/kernel/classes/StringClass.hpp interpreter-3.x/trunk/kernel/classes/StringClassBit.cpp interpreter-3.x/trunk/kernel/classes/StringClassConversion.cpp interpreter-3.x/trunk/kernel/classes/StringClassMisc.cpp interpreter-3.x/trunk/kernel/classes/StringClassSub.cpp interpreter-3.x/trunk/kernel/classes/StringClassUtil.cpp interpreter-3.x/trunk/kernel/classes/StringClassWord.cpp interpreter-3.x/trunk/kernel/classes/SupplierClass.cpp interpreter-3.x/trunk/kernel/classes/TableClass.cpp interpreter-3.x/trunk/kernel/expression/BuiltinFunctions.cpp interpreter-3.x/trunk/kernel/expression/ExpressionCompoundVariable.cpp interpreter-3.x/trunk/kernel/expression/ExpressionFunction.cpp interpreter-3.x/trunk/kernel/expression/ExpressionMessage.cpp interpreter-3.x/trunk/kernel/expression/ExpressionStack.cpp interpreter-3.x/trunk/kernel/expression/ExpressionStem.cpp interpreter-3.x/trunk/kernel/expression/ExpressionVariable.cpp interpreter-3.x/trunk/kernel/expression/IndirectVariableReference.cpp interpreter-3.x/trunk/kernel/instructions/CallInstruction.cpp interpreter-3.x/trunk/kernel/instructions/CommandInstruction.cpp interpreter-3.x/trunk/kernel/instructions/DoInstruction.cpp interpreter-3.x/trunk/kernel/instructions/EndInstruction.cpp interpreter-3.x/trunk/kernel/instructions/GuardInstruction.cpp interpreter-3.x/trunk/kernel/instructions/MessageInstruction.cpp interpreter-3.x/trunk/kernel/instructions/NumericInstruction.cpp interpreter-3.x/trunk/kernel/instructions/OtherwiseInstruction.cpp interpreter-3.x/trunk/kernel/instructions/ParseInstruction.cpp interpreter-3.x/trunk/kernel/instructions/ParseTarget.cpp interpreter-3.x/trunk/kernel/instructions/QueueInstruction.cpp interpreter-3.x/trunk/kernel/instructions/SayInstruction.cpp interpreter-3.x/trunk/kernel/instructions/SelectInstruction.cpp interpreter-3.x/trunk/kernel/instructions/SignalInstruction.cpp interpreter-3.x/trunk/kernel/instructions/TraceInstruction.cpp interpreter-3.x/trunk/kernel/kernel.mak interpreter-3.x/trunk/kernel/parser/Clause.cpp interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp interpreter-3.x/trunk/kernel/parser/Scanner.cpp interpreter-3.x/trunk/kernel/parser/SourceFile.cpp interpreter-3.x/trunk/kernel/parser/SourceFile.hpp interpreter-3.x/trunk/kernel/platform/unix/ExternalFunctions.cpp interpreter-3.x/trunk/kernel/platform/unix/FileSystem.cpp interpreter-3.x/trunk/kernel/platform/unix/MemorySupport.cpp interpreter-3.x/trunk/kernel/platform/unix/MiscSystem.cpp interpreter-3.x/trunk/kernel/platform/unix/PlatformDefinitions.h interpreter-3.x/trunk/kernel/platform/unix/RexxMain.cpp interpreter-3.x/trunk/kernel/platform/unix/RexxQueues.cpp interpreter-3.x/trunk/kernel/platform/unix/StoredMetaData.cpp interpreter-3.x/trunk/kernel/platform/unix/SystemCommands.cpp interpreter-3.x/trunk/kernel/platform/unix/ThreadSupport.cpp interpreter-3.x/trunk/kernel/platform/unix/TimeSupport.cpp interpreter-3.x/trunk/kernel/platform/unix/ValueFunction.cpp interpreter-3.x/trunk/kernel/platform/unix/VariablePool.cpp interpreter-3.x/trunk/kernel/platform/windows/ExternalFunctions.cpp interpreter-3.x/trunk/kernel/platform/windows/FileSystem.cpp interpreter-3.x/trunk/kernel/platform/windows/MemorySupport.cpp interpreter-3.x/trunk/kernel/platform/windows/MiscSystem.cpp interpreter-3.x/trunk/kernel/platform/windows/PlatformDefinitions.h interpreter-3.x/trunk/kernel/platform/windows/RexxMain.cpp interpreter-3.x/trunk/kernel/platform/windows/RexxQueues.cpp interpreter-3.x/trunk/kernel/platform/windows/StoredMetaData.cpp interpreter-3.x/trunk/kernel/platform/windows/SystemCommands.cpp interpreter-3.x/trunk/kernel/platform/windows/TimeSupport.cpp interpreter-3.x/trunk/kernel/platform/windows/UseridFunction.cpp interpreter-3.x/trunk/kernel/platform/windows/ValueFunction.cpp interpreter-3.x/trunk/kernel/platform/windows/VariablePool.cpp interpreter-3.x/trunk/kernel/platform/windows/wrexx.def interpreter-3.x/trunk/kernel/runtime/GlobalData.cpp interpreter-3.x/trunk/kernel/runtime/GlobalNames.cpp interpreter-3.x/trunk/kernel/runtime/Initialization.cpp interpreter-3.x/trunk/kernel/runtime/MemorySegment.cpp interpreter-3.x/trunk/kernel/runtime/Numerics.cpp interpreter-3.x/trunk/kernel/runtime/Numerics.hpp interpreter-3.x/trunk/kernel/runtime/PrimitiveClasses.h interpreter-3.x/trunk/kernel/runtime/RexxActivation.cpp interpreter-3.x/trunk/kernel/runtime/RexxActivation.hpp interpreter-3.x/trunk/kernel/runtime/RexxActivationStack.cpp interpreter-3.x/trunk/kernel/runtime/RexxActivity.cpp interpreter-3.x/trunk/kernel/runtime/RexxActivity.hpp interpreter-3.x/trunk/kernel/runtime/RexxBehaviour.cpp interpreter-3.x/trunk/kernel/runtime/RexxBuffer.cpp interpreter-3.x/trunk/kernel/runtime/RexxCompoundTail.cpp interpreter-3.x/trunk/kernel/runtime/RexxCore.h interpreter-3.x/trunk/kernel/runtime/RexxEnvelope.cpp interpreter-3.x/trunk/kernel/runtime/RexxHashTable.cpp interpreter-3.x/trunk/kernel/runtime/RexxListTable.cpp interpreter-3.x/trunk/kernel/runtime/RexxLocalVariables.hpp interpreter-3.x/trunk/kernel/runtime/RexxMemory.cpp interpreter-3.x/trunk/kernel/runtime/RexxMemory.hpp interpreter-3.x/trunk/kernel/runtime/RexxMisc.cpp interpreter-3.x/trunk/kernel/runtime/RexxNativeAPI.h interpreter-3.x/trunk/kernel/runtime/RexxNativeActivation.cpp interpreter-3.x/trunk/kernel/runtime/RexxNativeActivation.hpp interpreter-3.x/trunk/kernel/runtime/RexxNativeMethod.cpp interpreter-3.x/trunk/kernel/runtime/RexxStartup.cpp interpreter-3.x/trunk/kernel/runtime/RexxVariable.cpp interpreter-3.x/trunk/kernel/runtime/RexxVariableDictionary.cpp interpreter-3.x/trunk/kernel/runtime/Setup.cpp interpreter-3.x/trunk/kernel/runtime/Utilities.cpp interpreter-3.x/trunk/lib/LocalProcessData.cpp interpreter-3.x/trunk/lib/RexxLibrary.h interpreter-3.x/trunk/lib/RexxPlatformInterface.h interpreter-3.x/trunk/platform/unix/rexx.cpp interpreter-3.x/trunk/platform/windows/rexx.c interpreter-3.x/trunk/platform/windows/rexxc.c interpreter-3.x/trunk/platform/windows/rexxpaws.c interpreter-3.x/trunk/rexxapi/unix/RexxAPIManager.cpp Added Paths: ----------- interpreter-3.x/trunk/kernel/runtime/ActivityManager.cpp interpreter-3.x/trunk/kernel/runtime/ActivityManager.hpp interpreter-3.x/trunk/kernel/runtime/ProtectedObject.hpp Removed Paths: ------------- interpreter-3.x/trunk/kernel/platform/common/ActivityTable.cpp interpreter-3.x/trunk/kernel/platform/common/ActivityTable.hpp Modified: interpreter-3.x/trunk/Makefile.am =================================================================== --- interpreter-3.x/trunk/Makefile.am 2007-12-01 02:19:03 UTC (rev 1356) +++ interpreter-3.x/trunk/Makefile.am 2007-12-01 02:34:35 UTC (rev 1357) @@ -185,7 +185,7 @@ $(kernel_platform_unix_dir)/SystemCommands.h \ $(kernel_platform_unix_dir)/SystemSemaphores.h \ $(kernel_platform_unix_dir)/ThreadSupport.hpp -platformcommonHeaders = $(kernel_platform_common_dir)/ActivityTable.hpp +platformcommonHeaders = runtimeHeaders = $(runtime_dir)/DeadObject.hpp \ $(runtime_dir)/GlobalNames.h \ $(runtime_dir)/MemorySegment.hpp \ @@ -196,6 +196,8 @@ $(runtime_dir)/RexxActivation.hpp \ $(runtime_dir)/RexxActivationStack.hpp \ $(runtime_dir)/RexxActivity.hpp \ + $(runtime_dir)/ActivityManager.hpp \ + $(runtime_dir)/ProtectedObject.hpp \ $(runtime_dir)/RexxBehaviour.hpp \ $(runtime_dir)/RexxBuffer.hpp \ $(runtime_dir)/RexxBuiltinFunctions.h \ @@ -421,7 +423,7 @@ $(parser_dir)/Scanner.cpp \ $(parser_dir)/SourceFile.cpp \ $(parser_dir)/Token.cpp -kernel_platform_common_sources = $(kernel_platform_common_dir)/ActivityTable.cpp +kernel_platform_common_sources = # SharedMemorySupport.cpp # SystemSemaphores.cpp platform_sources = $(kernel_platform_unix_dir)/ErrorMessages.cpp \ @@ -451,6 +453,7 @@ $(runtime_dir)/RexxActivation.cpp \ $(runtime_dir)/RexxActivationStack.cpp \ $(runtime_dir)/RexxActivity.cpp \ + $(runtime_dir)/ActivityManager.cpp \ $(runtime_dir)/RexxBehaviour.cpp \ $(runtime_dir)/RexxBuffer.cpp \ $(runtime_dir)/RexxCode.cpp \ Modified: interpreter-3.x/trunk/kernel/classes/ArrayClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ArrayClass.cpp 2007-12-01 02:19:03 UTC (rev 1356) +++ interpreter-3.x/trunk/kernel/classes/ArrayClass.cpp 2007-12-01 02:34:35 UTC (rev 1357) @@ -75,10 +75,9 @@ #include "SupplierClass.hpp" #include "ArrayClass.hpp" #include "MutableBufferClass.hpp" +#include "ActivityManager.hpp" +#include "ProtectedObject.hpp" - -extern ACTIVATION_SETTINGS *current_settings; - void RexxArray::init(size_t _size, size_t maxSize) /******************************************************************************/ /* Function: Initialize an array */ @@ -461,8 +460,8 @@ values = new_array(itemCount); /* get the values array */ indexes = new_array(itemCount); /* and an index array */ - save(values); /* save the values array */ - save(indexes); /* save the indexes also */ + ProtectedObject v(values); + ProtectedObject s(indexes); count = 1; /* next place to add */ for (i = 1; i <= slotCount; i++) { /* loop through the array */ @@ -475,9 +474,7 @@ count++; /* step the location */ } } - discard_hold(values); /* release the lock */ - discard_hold(indexes); /* on both items */ - /* create a supplier object */ + return (RexxObject *)new_supplier(values, indexes); } @@ -796,12 +793,11 @@ else { /* real sectioning to do */ /* create a new array */ newArray = (RexxArray *)this->behaviour->getOwningClass()->sendMessage(OREF_NEW, new_integer(_end)); - save(newArray); /* protect the new one */ + ProtectedObject p(newArray); for (i = 1; i <= _end; i++) { /* loop through the elements */ /* copy an element */ newArray->sendMessage(OREF_PUT, this->get(_start + i - 1), new_integer(i)); } - discard_hold(newArray); /* and release the lock on this */ } } return newArray; /* return the new array */ @@ -1032,7 +1028,7 @@ { // get a result array of the appropriate size RexxArray *newArray = (RexxArray *)new_array(this->numItems()); - save(newArray); + ProtectedObject p(newArray); // we need to fill in based on actual items, not the index. arraysize_t count = 0; @@ -1047,7 +1043,6 @@ newArray->put(convertIndex(iterator+1), ++count); } } - discard_hold(newArray); return newArray; } @@ -1084,10 +1079,10 @@ int i_form = 0; /* 1 == line, 2 == char */ mutbuffer = ((RexxMutableBufferClass*) TheMutableBufferClass)->newRexx(NULL, 0); - save(mutbuffer); + ProtectedObject p1(mutbuffer); newArray = this->makeArray(); /* maybe multidimensional, make onedimensional */ - save(newArray); + ProtectedObject p2(newArray); _items = newArray->numItems(); /* and the actual count in the array */ @@ -1136,7 +1131,7 @@ else line_end_string = new_string(line_end); - save(line_end_string); + ProtectedObject p3(line_end_string); bool first = true; for (i = 1; i <= _items; i++) /* loop through the array */ @@ -1157,13 +1152,9 @@ first = false; } } - - discard(line_end_string); } newString = mutbuffer->requestString(); - discard(newArray); - discard(mutbuffer); return newString; } @@ -1406,6 +1397,8 @@ // get an array we fill in as we go RexxArray * _index = new_array(dims); + ProtectedObject p(_index); + for (size_t i = dims; i > 0; i--) { // get the next dimension size @@ -1419,8 +1412,6 @@ // now strip out that portion of the index. idx = (idx - digit) / _dimension; } - // return the array object - discard_hold(_index); return _index; } @@ -1612,7 +1603,7 @@ /* Compute new Size for DimArray */ newDimArraySize = _indexCount; newDimArray = new_array(newDimArraySize); - save(newDimArray); + ProtectedObject p(newDimArray); /* extending from single Dimensio */ /* to a multi Dimensionsal array */ if (this->dimensions == OREF_NULL) { @@ -1682,7 +1673,7 @@ /* Now create the new array for this */ /* dimension. */ newArray = new (newDimArray->data(), newDimArraySize, TheArrayClass) RexxArray; - save(newArray); + ProtectedObject p1(newArray); /* Anything in original? */ if (this->size()) { /* Yes, move values into new arra */ @@ -1742,10 +1733,6 @@ /* keep max Size value in synch */ /* with expansion. */ this->maximumSize = newArray->maximumSize; - /* no longer need to save created */ - /* arrays, they are anchored */ - discard(newDimArray); - discard(newArray); return this; /* All done, return array */ } @@ -1816,9 +1803,8 @@ /* If no argument is passed */ /* create an empty array. */ temp = new ((size_t)0, arrayClass) RexxArray; - save(temp); /* protect new object from GC */ + ProtectedObject p(temp); temp->sendMessage(OREF_INIT); /* call any rexx init's */ - discard(temp); /* protect new object from GC */ return temp; } @@ -1838,7 +1824,7 @@ /* Create new array of approp. size. */ temp = (RexxArray *)new_externalArray(total_size, arrayClass); - save(temp); /* protect new object from GC */ + ProtectedObject p(temp); if (total_size == 0) { /* Creating 0 sized array? */ /* Yup, setup a Dimension array */ /* single Dimension, Mark so */ @@ -1846,7 +1832,6 @@ OrefSet(temp, temp->dimensions, new_array(IntegerZero)); } temp->sendMessage(OREF_INIT); /* call any rexx init's */ - discard(temp); /* protect new object from GC */ return temp; /* Return the new array. */ } /* Working with a multi-dimension */ @@ -1877,9 +1862,8 @@ temp = (RexxArray *)new_externalArray(total_size, arrayClass); /* put dimension array in new arr */ OrefSet(temp, temp->dimensions, dim_array); - save(temp); /* protect new object from GC */ + ProtectedObject p(temp); temp->sendMessage(OREF_INIT); /* call any rexx init's */ - discard(temp); return temp; } @@ -2194,7 +2178,7 @@ reportException(Error_No_result_object_message, OREF_COMPARE); } - wholenumber_t comparison = result->longValue(DEFAULT_DIGITS); + wholenumber_t comparison = result->longValue(Numerics::DEFAULT_DIGITS); if (comparison == (wholenumber_t)NO_LONG) { reportException(Error_Invalid_whole_number_compare, result); @@ -2288,11 +2272,10 @@ // the merge sort requires a temporary scratch area for the sort. RexxArray *working = new_array(count); - save(working); + ProtectedObject p(working); // go do the quick sort mergeSort(working, 1, count); - discard_hold(working); return this; } @@ -2324,11 +2307,10 @@ // the merge sort requires a temporary scratch area for the sort. RexxArray *working = new_array(count); - save(working); + ProtectedObject p(working); // go do the quick sort mergeSort(comparator, working, 1, count); - discard_hold(working); return this; } @@ -2425,10 +2407,9 @@ /* moved _after_ setting hashvalue, otherwise the uninit table will not be*/ /* able to find the new array object again later! */ if (arrayClass->hasUninitDefined()) {/* does object have an UNINT method */ - save(newArray); /* protect from GC - uninit table may*/ + ProtectedObject p(newArray); /* require new REXX objects */ newArray->hasUninit(); /* Make sure everyone is notified. */ - discard(newArray); } return newArray; /* return the new array to caller */ } @@ -2455,7 +2436,7 @@ /* nope, better create properly */ /* send new to actual class. */ newArray = (RexxArray *)this->sendMessage(OREF_NEW, new_integer(argCount)); - save(newArray); + ProtectedObject p(newArray); /* For each argument to of, send a */ /* put message */ for (i = 0; i < argCount; i++) { @@ -2464,7 +2445,6 @@ /* place it in the target array */ newArray->sendMessage(OREF_PUT, item, new_integer(i+1)); } - discard_hold(newArray); return newArray; } else { Modified: interpreter-3.x/trunk/kernel/classes/ClassClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ClassClass.cpp 2007-12-01 02:19:03 UTC (rev 1356) +++ interpreter-3.x/trunk/kernel/classes/ClassClass.cpp 2007-12-01 02:34:35 UTC (rev 1357) @@ -54,9 +54,9 @@ #include "ClassClass.hpp" #include "MethodClass.hpp" #include "RexxActivity.hpp" +#include "ActivityManager.hpp" +#include "ProtectedObject.hpp" -extern RexxObject *ProcessLocalServer; /* local data server object */ -extern RexxDirectory *ProcessLocalEnv; /* local Environment */ void RexxClass::live() /******************************************************************************/ @@ -167,7 +167,7 @@ return this->equal(other); /* this is direct object equality */ } -BOOL RexxClass::isEqual( +bool RexxClass::isEqual( RexxObject *other) /* other comparison object */ /******************************************************************************/ /* Function: Compare two class objects as a strict compare (==) */ @@ -305,7 +305,7 @@ /*****************************************************************************/ { /* return a copy of the list */ - return TheActivityClass->getSubClassTable()->allAt(this); + return memoryObject.getSubClasses(this); } void RexxClass::addSubClass(RexxClass *subClass) @@ -314,7 +314,7 @@ /*****************************************************************************/ { /* just add to the global list */ - TheActivityClass->newSubClass(subClass, this); + memoryObject.newSubClass(subClass, this); } void RexxClass::defmeths( @@ -677,7 +677,7 @@ this->createClassBehaviour(this->behaviour); subClasses = this->getSubClasses(); /* get the subclasses list */ - save(subClasses); /* protect this */ + ProtectedObject p(subClasses); /* loop thru the subclass doing the */ /* same for each of them */ for (index = 1; index <= subClasses->size(); index++) { @@ -685,7 +685,6 @@ /* and recursively update them */ ((RexxClass *)subClasses->get(index))->updateSubClasses(); } - discard_hold(subClasses); /* release the lock */ } void RexxClass::updateInstanceSubClasses() @@ -701,7 +700,7 @@ this->instanceBehaviour->setScopes(OREF_NULL); this->createInstanceBehaviour(this->instanceBehaviour); subClasses = this->getSubClasses(); /* get the subclasses list */ - save(subClasses); /* protect this */ + ProtectedObject p(subClasses); /* loop thru the subclass doing the */ /* same for each of them */ for (index = 1; index <= subClasses->size(); index++) { @@ -709,7 +708,6 @@ /* recursively update these */ ((RexxClass *)subClasses->get(index))->updateInstanceSubClasses(); } - discard_hold(subClasses); /* release the lock */ } void RexxClass::createClassBehaviour( @@ -755,8 +753,8 @@ // from the bottom of the hierarchy down, merge in each of the scope // values. RexxArray *addedScopes = metaclass->behaviour->getScopes()->allAt(TheNilObject); - save(addedScopes); - LONG i; + ProtectedObject p(addedScopes); + size_t i; // these need to be processed in reverse order for (i = addedScopes->size(); i > 0; i--) @@ -764,8 +762,6 @@ RexxClass *scope = (RexxClass *)addedScopes->get(i); target_class_behaviour->mergeScope(scope); } - - discard(addedScopes); } } } @@ -868,11 +864,11 @@ RexxSupplier *supplier; /* working supplier object */ newDictionary = new_table(); /* get a new table for this */ - save(newDictionary); /* and save this */ + ProtectedObject p(newDictionary); /* loop thru the supplier object */ /* obtained from the source mdict */ supplier = (RexxSupplier *)sourceCollection->sendMessage(OREF_SUPPLIERSYM); - save(supplier); /* save the supplier too */ + ProtectedObject p2(supplier); for (; supplier->available() == TheTrueObject; supplier->next()) { /* get the method name (uppercased) */ method_name = REQUEST_STRING(supplier->index())->upper(); @@ -895,8 +891,6 @@ /* add the method to the target mdict */ newDictionary->stringAdd(newMethod, method_name); } - discard(supplier); /* done with the supplier */ - discard_hold(newDictionary); /* and also the dictionary */ return newDictionary; /* and return the new version */ } @@ -1018,7 +1012,7 @@ reportException(Error_Execution_uninherit, this, mixin_class); /* update the mixin class subclass */ /* list to not have this class */ - TheActivityClass->getSubClassTable()->removeItem(mixin_class, this); + memoryObject.removeSubClass(mixin_class, this); /* any subclasses that we have need */ /* to redo their behaviour's */ /* this also updates our own behaviour*/ @@ -1048,7 +1042,7 @@ required_arg(enhanced_instance_mdict, ONE); /* subclass the reciever class */ dummy_subclass = this->subclass(new_string("Enhanced Subclass"), OREF_NULL, OREF_NULL); - save(dummy_subclass); + ProtectedObject p(dummy_subclass); /* turn into a real method dictionary*/ enhanced_instance_mdict = dummy_subclass->methodDictionaryCreate(enhanced_instance_mdict, (RexxClass *)TheNilObject); /* enhance the instance behaviour */ @@ -1068,7 +1062,6 @@ enhanced_object->behaviour->setOwningClass(this); /* remember it was enhanced */ enhanced_object->behaviour->setEnhanced(); - discard(dummy_subclass); /* now the dummy is not needed */ return enhanced_object; /* send back the new improved version*/ } @@ -1120,7 +1113,7 @@ } /* get a copy of the metaclass class */ new_class = (RexxClass *)meta_class->sendMessage(OREF_NEW, class_id); - save(new_class); + ProtectedObject p(new_class); if (this->isMetaClass()) { /* if the superclass is a metaclass */ new_class->setMetaClass(); /* mark the new class as a meta class*/ /* and if the metaclass lists haven't */ @@ -1188,7 +1181,6 @@ if (this->hasUninitDefined() || this->parentHasUninitDefined()) { new_class->setParentHasUninitDefined(); } - discard_hold(new_class); /* be safe */ /* notify activity this object has an UNINIT that needs to be called when collecting the object */ if (new_class->hasUninitDefined()) @@ -1333,7 +1325,7 @@ // attempt putting this into a hash collection. OrefSet(new_class, new_class->id, class_id); /* update cloned hashvalue */ - save(new_class); /* better protect this */ + ProtectedObject p(new_class); /* better protect this */ /* make this into an instance of the */ /* meta class */ OrefSet(new_class, new_class->behaviour, (RexxBehaviour *)new_class->instanceBehaviour->copy()); @@ -1399,7 +1391,6 @@ if (new_class->hasUninitDefined()) { new_class->setHasUninitDefined(); } - discard_hold(new_class); /* remove the protection */ /* go do any inits */ new_class->sendMessage(OREF_INIT, args + 1, argCount - 1); return new_class; /* return the new class */ Modified: interpreter-3.x/trunk/kernel/classes/ClassClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ClassClass.hpp 2007-12-01 02:19:03 UTC (rev 1356) +++ interpreter-3.x/trunk/kernel/classes/ClassClass.hpp 2007-12-01 02:34:35 UTC (rev 1357) @@ -61,7 +61,7 @@ void flatten(RexxEnvelope*); RexxObject *unflatten(RexxEnvelope*); RexxObject *makeProxy(RexxEnvelope*); - BOOL isEqual(RexxObject *); + bool isEqual(RexxObject *); HashCode hash(); HashCode getHashValue(); Modified: interpreter-3.x/trunk/kernel/classes/DirectoryClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/DirectoryClass.cpp 2007-12-01 02:19:03 UTC (rev 1356) +++ interpreter-3.x/trunk/kernel/classes/DirectoryClass.cpp 2007-12-01 02:34:35 UTC (rev 1357) @@ -48,6 +48,7 @@ #include "ArrayClass.hpp" #include "MethodClass.hpp" #include "RexxActivation.hpp" +#include "ProtectedObject.hpp" void RexxDirectory::live() /******************************************************************************/ @@ -168,7 +169,7 @@ HashLink i; /* table index */ result = new_table(); /* get a table for the supplier */ - save(result); /* protect this */ + ProtectedObject p(result); hashTab = this->contents; /* point to the contents */ /* now traverse the entire table */ for (i = hashTab->first(); hashTab->index(i) != OREF_NULL; i = hashTab->next(i)) { @@ -187,11 +188,10 @@ /* get the method */ RexxMethod *method = (RexxMethod *)methodTable->value(i); /* run the method */ - RexxObject *v = method->run(CurrentActivity, this, name, 0, NULL); + RexxObject *v = method->run(ActivityManager::currentActivity, this, name, 0, NULL); result->put(v, name); /* add to the table */ } } - discard_hold(result); /* unlock the result */ return result->supplier(); /* convert this to a supplier */ } @@ -227,7 +227,7 @@ // get a result array of the appropriate size wholenumber_t count = this->items(); RexxArray *result = (RexxArray *)new_array(count); - save(result); + ProtectedObject p(result); arraysize_t out = 1; // we're working directly off of the contents. RexxHashTable *hashTab = this->contents; @@ -248,7 +248,6 @@ result->put(name, out++); } } - discard_hold(result); return result; /* send back the array */ } @@ -269,7 +268,7 @@ count = this->items(); /* get the array size */ /* get result array of correct size */ result = (RexxArray *)new_array(count); - save(result); /* protect this */ + ProtectedObject p(result); i = 1; /* position in array */ hashTab = this->contents; /* now traverse the entire table */ @@ -289,11 +288,10 @@ /* need to extract method values */ RexxMethod *method = (RexxMethod *)methodTable->value(j); /* run the method */ - RexxObject *v = method->run(CurrentActivity, this, name, 0, NULL); + RexxObject *v = method->run(ActivityManager::currentActivity, this, name, 0, NULL); result->put(v, i++); /* add to the array */ } } - discard_hold(result); /* unlock the result */ return result; /* send back the array */ } @@ -542,14 +540,14 @@ method = (RexxMethod *)this->method_table->stringGet(_index); if (method != OREF_NULL) /* have a method? */ /* run the method */ - return method->run(CurrentActivity, this, _index, 0, NULL); + return method->run(ActivityManager::currentActivity, this, _index, 0, NULL); } /* got an unknown method? */ if (this->unknown_method != OREF_NULL) { RexxObject *arg = _index; /* run it */ - return this->unknown_method->run(CurrentActivity, this, OREF_UNKNOWN, 1, (RexxObject **)&arg); + return this->unknown_method->run(ActivityManager::currentActivity, this, OREF_UNKNOWN, 1, (RexxObject **)&arg); } } return result; /* return a result */ @@ -569,13 +567,13 @@ /* get as a string parameter */ _index = REQUIRED_STRING(_index, ARG_ONE); // is this the .local object? - if ((RexxDirectory *)(CurrentActivity->local) == this && - CurrentActivity->currentActivation->hasSecurityManager()) { + if ((RexxDirectory *)(ActivityManager::localEnvironment) == this && + ActivityManager::currentActivity->hasSecurityManager()) { RexxDirectory *securityArgs; /* security check arguments */ securityArgs = new_directory(); securityArgs->put(_index, OREF_NAME); securityArgs->put(TheNilObject, OREF_RESULT); - if (CurrentActivity->currentActivation->callSecurityManager(OREF_LOCAL, securityArgs)) + if (ActivityManager::currentActivity->callSecurityManager(OREF_LOCAL, securityArgs)) /* get the result and return */ return securityArgs->fastAt(OREF_RESULT); } @@ -675,7 +673,7 @@ // we need to run each method, looking for a value that matches RexxString *name = (RexxString *)methodTable->index(i); RexxMethod *method = (RexxMethod *)methodTable->value(i); - RexxObject *v = method->run(CurrentActivity, this, name, 0, NULL); + RexxObject *v = method->run(ActivityManager::currentActivity, this, name, 0, NULL); // got a match? if (target->equalValue(v)) { Modified: interpreter-3.x/trunk/kernel/classes/IntegerClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/IntegerClass.cpp 2007-12-01 02:19:03 UTC (rev 1356) +++ interpreter-3.x/trunk/kernel/classes/IntegerClass.cpp 2007-12-01 02:34:35 UTC (rev 1357) @@ -36,7 +36,7 @@ /* */ /*----------------------------------------------------------------------------*/ /******************************************************************************/ -/* REXX Kernel IntegerClass.c */ +/* REXX Kernel IntegerClass.c */ /* */ /* Primitive Integer Class */ /* */ @@ -54,8 +54,6 @@ #include "Numerics.hpp" - /* current global settings */ -extern ACTIVATION_SETTINGS *current_settings; /* define an operator forwarding */ /* method */ @@ -247,17 +245,17 @@ this->setHasReferences(); /* we now have references */ } -BOOL RexxInteger::truthValue( - LONG errorcode ) /* error to raise if not good */ +bool RexxInteger::truthValue( + int errorcode ) /* error to raise if not good */ /******************************************************************************/ /* Function: Determine the truth value of an integer object */ /******************************************************************************/ { if (this->value == 0L) /* have a zero? */ - return FALSE; /* this is false */ + return false; /* this is false */ else if (this->value != 1L) /* how about a one? */ reportException(errorcode, this);/* report the error */ - return TRUE; /* this is true */ + return true; /* this is true */ } /******************************************************************************/ @@ -358,7 +356,7 @@ long tempVal; /* addition result */ /* are we using default digits? */ - if (number_digits() != DEFAULT_DIGITS ) + if (number_digits() != Numerics::DEFAULT_DIGITS ) /* nope, we can't do integer arith */ return integer_forward(this, plus, other); if (other == OREF_NULL) /* unary */ @@ -385,7 +383,7 @@ long tempVal; /* subtraction result */ /* are we using default digits? */ - if (number_digits() != DEFAULT_DIGITS ) + if (number_digits() != Numerics::DEFAULT_DIGITS ) /* nope, then we can do integer arith*/ return integer_forward(this, minus, other); @@ -416,7 +414,7 @@ long tempVal; /* temp result value */ /* are we using default digits? */ - if (number_digits() != DEFAULT_DIGITS ) + if (number_digits() != Numerics::DEFAULT_DIGITS ) /* nope, we can't do integer math */ return integer_forward(this, multiply, other); required_arg(other, ONE); /* make sure the argument is there */ @@ -451,7 +449,7 @@ long tempVal; /* temporary result value */ /* are we using default digits? */ - if (number_digits() != DEFAULT_DIGITS ) + if (number_digits() != Numerics::DEFAULT_DIGITS ) /* nope, we can't do integer arith */ return integer_forward(this, integerDivide, other); required_arg(other, ONE); /* make sure this is really there */ @@ -480,7 +478,7 @@ long tempVal; /* temporary result value */ /* are we using default digits? */ - if (number_digits() != DEFAULT_DIGITS ) + if (number_digits() != Numerics::DEFAULT_DIGITS ) /* nope, we can't do integer arith */ return integer_forward(this, remainder, other); required_arg(other, ONE); /* make sure this is really there */ @@ -509,7 +507,7 @@ return integer_forward(this, power, other); } -BOOL RexxInteger::isEqual( +bool RexxInteger::isEqual( RexxObject *other) /* other comparison object */ /******************************************************************************/ /* Function: Primitive strict equal\not equal method. This determines */ @@ -748,7 +746,7 @@ /******************************************************************************/ { /* working under the default digits? */ - if (number_digits() == DEFAULT_DIGITS) { + if (number_digits() == Numerics::DEFAULT_DIGITS) { /* if we're already positive, this is a quick return */ if (value >= 0) { return this; @@ -766,9 +764,9 @@ { RexxObject *result; /* returned result */ - if (this->value > 0L) /* positive number? */ + if (this->value > 0) /* positive number? */ result = IntegerOne; /* result is "1" */ - else if (this->value < 0L) /* negative number? */ + else if (this->value < 0) /* negative number? */ result = new_integer(-1); /* result is "-1" */ else result = IntegerZero; /* exactly zero */ @@ -789,7 +787,7 @@ /* are we using default digits? */ - if (number_digits() != DEFAULT_DIGITS ) + if (number_digits() != Numerics::DEFAULT_DIGITS ) /* nope, we can't do integer max. */ return this->numberString()->Max(args, argCount); @@ -845,7 +843,7 @@ /* are we using default digits? */ - if (number_digits() != DEFAULT_DIGITS ) + if (number_digits() != Numerics::DEFAULT_DIGITS ) /* nope, we can't do integer max. */ return this->numberString()->Min(args, argCount); Modified: interpreter-3.x/trunk/kernel/classes/IntegerClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/IntegerClass.hpp 2007-12-01 02:19:03 UTC (rev 1356) +++ interpreter-3.x/trunk/kernel/classes/IntegerClass.hpp 2007-12-01 02:34:35 UTC (rev 1357) @@ -44,6 +44,8 @@ #ifndef Included_RexxInteger #define Included_RexxInteger +#include "NumberStringClass.hpp" + void integer_create (void); #define INTEGERCACHELOW -10 #define INTEGERCACHESIZE 100 @@ -69,21 +71,18 @@ RexxInteger *hasMethod(RexxString *); RexxString *primitiveMakeString(); RexxString *stringValue(); - BOOL truthValue(LONG); + bool truthValue(int); bool isInstanceOf(RexxClass *); RexxMethod *instanceMethod(RexxString *); RexxSupplier *instanceMethods(RexxClass *); - BOOL isEqual(RexxObject *); + bool isEqual(RexxObject *); long strictComp(RexxObject *); inline int comp(RexxObject *other) { - /* current global settings */ - extern ACTIVATION_SETTINGS *current_settings; - required_arg(other, ONE); /* make sure this is really there */ /* able to compare here? */ - if (this->isSameType(other) && number_digits() == DEFAULT_DIGITS) + if (this->isSameType(other) && number_digits() == Numerics::DEFAULT_DIGITS) /* just return the difference */ return this->value - ((RexxInteger *)other)->value; else /* do a numberstring compare */ Modified: interpreter-3.x/trunk/kernel/classes/ListClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ListClass.cpp 2007-12-01 02:19:03 UTC (rev 1356) +++ interpreter-3.x/trunk/kernel/classes/ListClass.cpp 2007-12-01 02:34:35 UTC (rev 1357) @@ -36,7 +36,7 @@ /* */ /*----------------------------------------------------------------------------*/ /******************************************************************************/ -/* REXX Kernel ListClass.c */ +/* REXX Kernel ListClass.c */ /* */ /* Primitive List Class */ /* */ @@ -46,6 +46,8 @@ #include "ListClass.hpp" #include "ArrayClass.hpp" #include "SupplierClass.hpp" +#include "ActivityManager.hpp" +#include "ProtectedObject.hpp" void RexxList::init(void) /******************************************************************************/ @@ -206,6 +208,30 @@ return element; /* return this */ } + +/** + * Resolve a low-level index into a list entry value. + * + * @param item_index The target index. + * + * @return A LISTENTRY value, or NULL if not found. + */ +LISTENTRY * RexxList::getEntry(size_t item_index) +{ + if (item_index >= this->size) /* out of possible range? */ + { + return NULL; /* not found */ + } + LISTENTRY *element = ENTRY_POINTER(item_index); /* point to the item */ + if (element->previous != NOT_ACTIVE) /* got a real item? */ + { + return element; // go for it + } + return NULL; // not found +} + + + RexxObject *RexxList::value( RexxObject *_index) /* list index item */ /******************************************************************************/ @@ -225,6 +251,29 @@ return result; /* return this item */ } + + +/** + * Primitive level getValue() for a list item. + * + * @param _index The decoded index item. + * + * @return The value associated with the index. Returns OREF_NULL if not + * there. + */ +RexxObject *RexxList::getValue(size_t _index) +{ + /* locate this entry */ + LISTENTRY *element = this->getEntry(_index); + // return a real NULL if this isn't there + if (element == NULL) + { + return OREF_NULL; + } + return element->value; // return whatever is in this position +} + + RexxObject *RexxList::put( RexxObject *_value, /* new value for the item */ RexxObject *_index ) /* index of item to replace */ @@ -271,7 +320,7 @@ /* need to do this the slow way */ return this->sectionSubclass(element, counter); result = new RexxList; /* create a new list */ - save(result); /* protect this */ + ProtectedObject p(result); /* while still more to go and not at */ /* the end of the list */ while (counter--> 0) { /* while still more items */ @@ -282,7 +331,6 @@ /* step to the next item */ element = ENTRY_POINTER(element->next); } - discard_hold(result); /* release the save lock */ return result; /* return the sectioned list */ } @@ -297,7 +345,7 @@ /* create a new list */ newList = (RexxList *)this->behaviour->getOwningClass()->sendMessage(OREF_NEW); - save(newList); /* protect this */ + ProtectedObject p(newList); /* while still more to go and not at */ /* the end of the list */ while (counter-- > 0) { /* while still more items */ @@ -308,7 +356,6 @@ /* step to the next item */ element = ENTRY_POINTER(element->next); } - discard_hold(newList); /* release the save lock */ return newList; /* return the sectioned list */ } @@ -675,6 +722,58 @@ } } + +/** + * A low-level next() method for internal usage. This works + * directly off the index values without needing to create + * object instances. This is critical for some of the internal + * data structures implemented as lists. + * + * @param _index The target item index. + * + * @return The index of the next item, or LIST_END if there is no next item. + */ +size_t RexxList::nextIndex(size_t _index) +{ + LISTENTRY *element = this->getEntry(_index); + // we're a little less strict when dealing with internal lists. Just return + // the end of list marker here + if (element == NULL) + { + return LIST_END; + } + // we can just return this value directly...if there is no previous element, + // the next field contains LIST_END; + return element->next; +} + + +/** + * A low-level previous() method for internal usage. This works + * directly off the index values without needing to create + * object instances. This is critical for some of the internal + * data structures implemented as lists. + * + * @param _index The target item index. + * + * @return The index of the previous item, or LIST_END if there + * is no previous item. + */ +size_t RexxList::previousIndex(size_t _index) +{ + LISTENTRY *element = this->getEntry(_index); + // we're a little less strict when dealing with internal lists. Just return + // the end of list marker here + if (element == NULL) + { + return LIST_END; + } + // we can just return this value directly...if there is no previous element, + // the previous field contains LIST_END; + return element->previous; +} + + RexxObject *RexxList::hasIndex( RexxObject *_index) /* index of the target item */ /******************************************************************************/ @@ -772,7 +871,7 @@ RexxArray *array = (RexxArray *)new_array(this->count); // this requires protecting, since we're going to be creating new // integer objects. - save(array); + ProtectedObject p(array); size_t nextEntry = this->first; for (size_t i = 1; i <= this->count; i++) { @@ -780,7 +879,6 @@ array->put((RexxObject *)new_integer(nextEntry), i); nextEntry = element->next; } - discard_hold(array); return array; } @@ -915,7 +1013,7 @@ /* allocate proper sized array */ array = (RexxArray *)new_array(this->count); - save(array); /* lock the array */ + ProtectedObject p(array); nextEntry = this->first; /* point to the first element */ for (i = 1; i <= this->count; i++) { /* step through the array elements */ element = ENTRY_POINTER(nextEntry);/* get the next item */ @@ -923,7 +1021,6 @@ array->put((RexxObject *)new_integer(nextEntry), i); nextEntry = element->next; /* get the next pointer */ } - discard_hold(array); /* release the GC lock */ return array; /* return the array element */ } @@ -1006,11 +1103,10 @@ if (TheListClass == this ) { /* creating an internel list item? */ size = argCount; /* get the array size */ newList = new RexxList; /* get a new list */ - save(newList); /* protect from garbage collection */ + ProtectedObject p(newList); for (i = 0; i < size; i++) { /* step through the array */ item = args[i]; /* get the next item */ if (item == OREF_NULL) { /* omitted item? */ - discard(newList); /* release the new list */ /* raise an error on this */ reportException(Error_Incorrect_method_noarg, i + 1); } @@ -1022,11 +1118,10 @@ size = argCount; /* get the array size */ /* get a new list */ newList = (RexxList *)this->sendMessage(OREF_NEW); - save(newList); /* protect from garbage collection */ + ProtectedObject p(newList); for (i = 0; i < size; i++) { /* step through the array */ item = args[i]; /* get the next item */ if (item == OREF_NULL) { /* omitted item? */ - discard(newList); /* release the new list */ /* raise an error on this */ reportException(Error_Incorrect_method_noarg, i + 1); } @@ -1034,7 +1129,6 @@ newList->sendMessage(OREF_INSERT, item); } } - discard_hold(newList); /* release the collection lock */ return newList; /* give back the list */ } Modified: interpreter-3.x/trunk/kernel/classes/ListClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ListClass.hpp 2007-12-01 02:19:03 UTC (rev 1356) +++ interpreter-3.x/trunk/kernel/classes/ListClass.hpp 2007-12-01 02:34:35 UTC (rev 1357) @@ -80,6 +80,12 @@ RexxObject *value(RexxObject *); RexxObject *remove(RexxObject *); RexxObject *primitiveRemove(LISTENTRY *); + size_t firstIndex() { return first; } + size_t lastIndex() { return last; } + size_t nextIndex(size_t i); + size_t previousIndex(size_t i); + RexxObject *getValue(size_t i); + RexxObject *firstRexx(); RexxObject *lastRexx(); RexxObject *next(RexxObject *); @@ -101,7 +107,10 @@ RexxObject *add(RexxObject *, RexxObject *); RexxObject *removeFirst() { return (this->first != LIST_END) ? this->primitiveRemove(ENTRY_POINTER(this->first)) : TheNilObject; } RexxObject *removeLast() { return (this->last != LIST_END) ? this->primitiveRemove(ENTRY_POINTER(this->last)) : TheNilObject; } + RexxObject *removeFirstItem() { return (this->first != LIST_END) ? this->primitiveRemove(ENTRY_POINTER(this->first)) : OREF_NULL; } + RexxObject *removeLastItem() { return (this->last != LIST_END) ? this->primitiveRemove(ENTRY_POINTER(this->last)) : OREF_NULL; } LISTENTRY *getEntry(RexxObject *, RexxObject *); + LISTENTRY *getEntry(size_t); RexxObject *indexOfValue(RexxObject *); RexxObject *empty(); RexxObject *isEmpty(); Modified: interpreter-3.x/trunk/kernel/classes/MessageClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/MessageClass.cpp 2007-12-01 02:19:03 UTC (rev 1356) +++ interpreter-3.x/trunk/kernel/classes/MessageClass.cpp 2007-12-01 02:34:35 UTC (rev 1357) @@ -189,7 +189,7 @@ /*condition Yes, we need to raise it */ /*here. */ if (this->raiseError()) { - CurrentActivity->reraiseException(this->condition); + ActivityManager::currentActivity->reraiseException(this->condition); } else { /* Quick test to see if result */ @@ -198,7 +198,7 @@ /* got an activity available? */ if (this->startActivity != OREF_NULL) /* go perform dead lock checks */ - this->startActivity->checkDeadLock(CurrentActivity); + this->startActivity->checkDeadLock(ActivityManager::currentActivity); /* No result yet, now we need to wait*/ /* until we get a result. */ @@ -207,14 +207,14 @@ /* No, Create a waiting list */ OrefSet(this, this->waitingActivities, new_list()); /* add this activity to the list */ - this->waitingActivities->addLast((RexxObject *)CurrentActivity); + this->waitingActivities->addLast((RexxObject *)ActivityManager::currentActivity); /* now go wait to be woken up */ - CurrentActivity->waitReserve((RexxObject *)this); + ActivityManager::currentActivity->waitReserve((RexxObject *)this); if (this->raiseError()) { /* do we need to raise an error. */ /* yes, */ this->setErrorReported(); /* indicate error was reported, and */ /* report and error. */ - CurrentActivity->reraiseException(this->condition); + ActivityManager::currentActivity->reraiseException(this->condition); } } } @@ -234,7 +234,7 @@ reportException(Error_Execution_message_reuse); /* get the activity I'm running under*/ - myActivity = (RexxActivity *)CurrentActivity; + myActivity = (RexxActivity *)ActivityManager::currentActivity; /* If we have a pending start message*/ /* sure this send is a result of */ /*that message dispatch. */ @@ -309,16 +309,13 @@ /* this method is found in OKNMSG.C */ newNMethod = TheMethodClass->newEntry((PFN)message_nstart); /* get the current activity */ - oldActivity = (RexxActivity *)CurrentActivity; + oldActivity = ActivityManager::currentActivity; /* Create the new activity */ - newActivity = (RexxActivity *)new_activity(oldActivity->local); + newActivity = new_activity(); /* propagate system exit trapping */ for (i = 1; i <= LAST_EXIT; i++) /* copy any exit handlers */ /* from old activity to the new one */ newActivity->setSysExit(i, oldActivity->querySysExits(i)); - /* is DEBUG sys exit set */ - if (newActivity->nestedInfo.sysexits[RXDBG - 1] != OREF_NULL) - newActivity->nestedInfo.exitset = TRUE; /* indicate the activity the send */ /*message should come in on. */ @@ -348,7 +345,7 @@ /* no longer care about any error */ /*condition */ - CurrentActivity->current()->setObjNotify(OREF_NULL); + ActivityManager::currentActivity->current()->setObjNotify(OREF_NULL); ... [truncated message content] |