From: <bi...@us...> - 2009-08-24 23:17:06
|
Revision: 5103 http://oorexx.svn.sourceforge.net/oorexx/?rev=5103&view=rev Author: bigrixx Date: 2009-08-24 23:17:00 +0000 (Mon, 24 Aug 2009) Log Message: ----------- Change how CSELF lookups work to respect the CSELF chain Modified Paths: -------------- main/trunk/interpreter/classes/ObjectClass.cpp main/trunk/interpreter/classes/ObjectClass.hpp main/trunk/interpreter/execution/RexxNativeActivation.cpp Modified: main/trunk/interpreter/classes/ObjectClass.cpp =================================================================== --- main/trunk/interpreter/classes/ObjectClass.cpp 2009-08-24 19:39:19 UTC (rev 5102) +++ main/trunk/interpreter/classes/ObjectClass.cpp 2009-08-24 23:17:00 UTC (rev 5103) @@ -2524,6 +2524,43 @@ /** + * Attempt to get a CSELF value from an object instance, + * starting from a given scope value and checking each of the + * super scopes for the class + * + * @param scope The starting scope for the search. + * + * @return An unwrappered CSELF value, if one can be found. + */ +void *RexxObject::getCSelf(RexxObject *scope) +{ + while (scope != TheNilObject) + { + // try for the variable value + RexxObject *C_self = getObjectVariable(OREF_CSELF, scope); + // if we found one, validate for unwrappering + if (C_self != OREF_NULL) + { + // if this is a pointer, then unwrapper the value + if (C_self->isInstanceOf(ThePointerClass)) + { + return ((RexxPointer *)C_self)->pointer(); + } + // this could be a containing buffer instance as well + else if (C_self->isInstanceOf(TheBufferClass)) + { + // return a pointer to the buffer beginning + return(void *)((RexxBuffer *)C_self)->getData(); + } + } + // step to the next scope + scope = this->superScope(scope); + } + return NULL; /* no object available */ +} + + +/** * new operator for creating a RexxNilObject */ void *RexxNilObject::operator new(size_t size) Modified: main/trunk/interpreter/classes/ObjectClass.hpp =================================================================== --- main/trunk/interpreter/classes/ObjectClass.hpp 2009-08-24 19:39:19 UTC (rev 5102) +++ main/trunk/interpreter/classes/ObjectClass.hpp 2009-08-24 23:17:00 UTC (rev 5103) @@ -490,6 +490,7 @@ RexxObject *unknownRexx(RexxString *, RexxArray *); RexxObject *hasMethodRexx(RexxString *); void *getCSelf(); + void *getCSelf(RexxObject *scope); // compare 2 values for equality, potentially falling back on the // "==" method for the test. bool inline equalValue(RexxObject *other) Modified: main/trunk/interpreter/execution/RexxNativeActivation.cpp =================================================================== --- main/trunk/interpreter/execution/RexxNativeActivation.cpp 2009-08-24 19:39:19 UTC (rev 5102) +++ main/trunk/interpreter/execution/RexxNativeActivation.cpp 2009-08-24 23:17:00 UTC (rev 5103) @@ -1938,7 +1938,7 @@ // this is necessary to get turn on a guard lock if the method // is guarded. Failure to do this can cause multithreading problems. methodVariables(); - return receiver->getCSelf(); + return receiver->getCSelf(((RexxMethod *)executable)->getScope()); } // nope, call context doesn't allow this return OREF_NULL; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |