From: <bi...@us...> - 2007-09-12 00:25:05
|
Revision: 748 http://oorexx.svn.sourceforge.net/oorexx/?rev=748&view=rev Author: bigrixx Date: 2007-09-11 17:25:08 -0700 (Tue, 11 Sep 2007) Log Message: ----------- [ 1792831 ] Add dynamic environment symbols. Modified Paths: -------------- interpreter-3.x/trunk/kernel/expression/BuiltinFunctions.cpp interpreter-3.x/trunk/kernel/expression/ExpressionDotVariable.cpp interpreter-3.x/trunk/kernel/expression/ExpressionDotVariable.hpp interpreter-3.x/trunk/kernel/runtime/RexxActivation.cpp Modified: interpreter-3.x/trunk/kernel/expression/BuiltinFunctions.cpp =================================================================== --- interpreter-3.x/trunk/kernel/expression/BuiltinFunctions.cpp 2007-09-11 23:13:32 UTC (rev 747) +++ interpreter-3.x/trunk/kernel/expression/BuiltinFunctions.cpp 2007-09-12 00:25:08 UTC (rev 748) @@ -2222,12 +2222,19 @@ newvalue = optional_argument(VALUE, newValue); /* and the selector */ selector = optional_string(VALUE, selector); + // get the variable type + int variableType = variable->isSymbol(); + bool assignable = variableType == STRING_NAME || variableType == STRING_STEM || variableType == STRING_COMPOUND_NAME; + if (selector == OREF_NULL) { /* have a selector? */ /* get a variable retriever */ retriever = context->getVariableRetriever(variable); - if ((retriever == OREF_NULL) || - ((newvalue != OREF_NULL) && (variable->isSymbol() == STRING_NUMERIC))) /* invalid variable name? */ - report_exception3(Error_Incorrect_call_symbol, new_cstring(CHAR_VALUE), IntegerOne, variable); + // this could an invalid name, or we might be trying to assign a value to a non-variable + // symbol. + if (retriever == OREF_NULL || (newvalue != OREF_NULL && !assignable)) + { + report_exception3(Error_Incorrect_call_symbol, new_cstring(CHAR_VALUE), IntegerOne, variable); + } else { /* need to perform lookup */ /* get the variable value */ result = retriever->getValue(context); Modified: interpreter-3.x/trunk/kernel/expression/ExpressionDotVariable.cpp =================================================================== --- interpreter-3.x/trunk/kernel/expression/ExpressionDotVariable.cpp 2007-09-11 23:13:32 UTC (rev 747) +++ interpreter-3.x/trunk/kernel/expression/ExpressionDotVariable.cpp 2007-09-12 00:25:08 UTC (rev 748) @@ -114,6 +114,27 @@ return result; /* also return the result */ } + +RexxObject * RexxDotVariable::getValue( + RexxActivation *context) +/****************************************************************************/ +/* Function: Evaluate a REXX dot variable */ +/****************************************************************************/ +{ + RexxObject *result; /* dot variable value */ + + /* get this from the source */ + result = context->getSource()->resolveClass(this->variableName, context); + if (result == OREF_NULL) /* not there? */ + /* try for a REXX defined name */ + result = context->rexxVariable(this->variableName); + if (result == OREF_NULL) { /* not there? */ + /* add a period to the name */ + result = this->variableName->concatToCstring(CHAR_PERIOD); + } + return result; /* also return the result */ +} + void * RexxDotVariable::operator new(size_t size) /******************************************************************************/ /* Function: Create a new translator object */ Modified: interpreter-3.x/trunk/kernel/expression/ExpressionDotVariable.hpp =================================================================== --- interpreter-3.x/trunk/kernel/expression/ExpressionDotVariable.hpp 2007-09-11 23:13:32 UTC (rev 747) +++ interpreter-3.x/trunk/kernel/expression/ExpressionDotVariable.hpp 2007-09-12 00:25:08 UTC (rev 748) @@ -36,7 +36,7 @@ /* */ /*----------------------------------------------------------------------------*/ /******************************************************************************/ -/* REXX Kernel ExpressionDotVariable.hpp */ +/* REXX Kernel ExpressionDotVariable.hpp */ /* */ /* Primitive Expression Dot Variable Class Definitions */ /* */ @@ -56,6 +56,7 @@ void liveGeneral(); void flatten(RexxEnvelope *); RexxObject *evaluate(RexxActivation *, RexxExpressionStack *); + RexxObject *getValue(RexxActivation *); /* name of the variable is in hash */ }; Modified: interpreter-3.x/trunk/kernel/runtime/RexxActivation.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxActivation.cpp 2007-09-11 23:13:32 UTC (rev 747) +++ interpreter-3.x/trunk/kernel/runtime/RexxActivation.cpp 2007-09-12 00:25:08 UTC (rev 748) @@ -67,6 +67,7 @@ #include "DoBlock.hpp" #include "DoInstruction.hpp" #include "ExpressionBaseVariable.hpp" +#include "ExpressionDotVariable.hpp" #include "ExpressionVariable.hpp" #include "ExpressionStem.hpp" #include "ExpressionCompoundVariable.hpp" @@ -3290,11 +3291,16 @@ break; case STRING_LITERAL_DOT: /* if is is a literal */ - case STRING_LITERAL: case STRING_NUMERIC: /* these are literals */ retriever = (RexxVariableBase *)variable; break; + + // Dot variables retrieve from the environment + case STRING_LITERAL: + retriever = (RexxVariableBase *)new RexxDotVariable(variable->extract(1, variable->getLength() - 1)); + break; + /* if it is a stem */ case STRING_STEM: /* create a new stem retriever */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |