From: <bi...@us...> - 2007-04-04 18:01:32
|
Revision: 221 http://svn.sourceforge.net/oorexx/?rev=221&view=rev Author: bigrixx Date: 2007-04-04 11:01:33 -0700 (Wed, 04 Apr 2007) Log Message: ----------- [ 1665251 ] Remove restriction on indirect call targets. Modified Paths: -------------- interpreter-3.x/trunk/kernel/instructions/CallInstruction.cpp interpreter-3.x/trunk/kernel/instructions/CallInstruction.hpp interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp Modified: interpreter-3.x/trunk/kernel/instructions/CallInstruction.cpp =================================================================== --- interpreter-3.x/trunk/kernel/instructions/CallInstruction.cpp 2007-04-04 06:17:43 UTC (rev 220) +++ interpreter-3.x/trunk/kernel/instructions/CallInstruction.cpp 2007-04-04 18:01:33 UTC (rev 221) @@ -144,10 +144,13 @@ { if (this->name == OREF_NULL) /* not a name target form? */ return; /* just return */ + if (i_flags&call_dynamic) { // can't resolve now + return; // + } if (!(i_flags&call_nointernal)) { /* internal routines allowed? */ if (labels != OREF_NULL) /* have a labels table? */ /* check the label table */ - OrefSet(this, this->target, (RexxInstruction *)labels->at(this->name)); + OrefSet(this, this->target, (RexxInstruction *)labels->at((RexxString *)this->name)); i_flags |= call_internal; /* this is an internal call */ } if (this->target == OREF_NULL) { /* not found yet? */ @@ -213,7 +216,7 @@ } else { /* set up for a normal call */ target = this->target; /* copy the target */ - name = this->name; /* the name value */ + name = (RexxString *)this->name; /* the name value */ /* and the builtin index */ builtin_index = call_builtin_index; type = i_flags&call_type_mask; /* just copy the type info */ @@ -289,7 +292,7 @@ case call_external: /* need to call externally */ /* go process the externnl call */ - result = context->externalCall(this->name, 0, &context->stack, OREF_ROUTINENAME); + result = context->externalCall((RexxString *)this->name, 0, &context->stack, OREF_ROUTINENAME); if (result != OREF_NULL) discard(result); break; } Modified: interpreter-3.x/trunk/kernel/instructions/CallInstruction.hpp =================================================================== --- interpreter-3.x/trunk/kernel/instructions/CallInstruction.hpp 2007-04-04 06:17:43 UTC (rev 220) +++ interpreter-3.x/trunk/kernel/instructions/CallInstruction.hpp 2007-04-04 18:01:33 UTC (rev 221) @@ -68,7 +68,7 @@ virtual void resolve(RexxDirectory *) { ; }; virtual void trap(RexxActivation *, RexxDirectory *) { ; }; - RexxString * name; /* name to call */ + RexxObject * name; /* name to call */ RexxInstruction * target; /* routine to call */ RexxString * condition; /* condition trap name */ }; Modified: interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp =================================================================== --- interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp 2007-04-04 06:17:43 UTC (rev 220) +++ interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp 2007-04-04 18:01:33 UTC (rev 221) @@ -184,7 +184,7 @@ RexxObject *newObject; /* newly created object */ LONG argCount; /* call arguments */ RexxToken *token; /* current working token */ - RexxString *name; /* call name */ + RexxObject *name; /* call name */ INT keyword; /* call subkeyword */ RexxString *condition; /* created USER condition */ CHAR flags; /* final CALL flags */ @@ -242,10 +242,10 @@ } else { /* language defined condition */ name = token->value; /* set the default target */ + condition = token->value; /* condition is the same as target */ /* set the builtin index for later */ /* resolution step */ builtin_index = this->builtin(token); - condition = name; /* condition is the same as target */ } token = nextReal(); /* get the next token */ /* anything real here? */ @@ -336,18 +336,7 @@ /* indirect call case? */ else if (token->classId == TOKEN_LEFT) { flags |= call_dynamic; /* going to be indirect */ - token = nextReal(); /* step to the next token */ - if (token->classId != TOKEN_SYMBOL)/* not a symbol? */ - /* error */ - report_error(Error_Symbol_expected_varref); - this->needVariable(token); /* need a variable token here */ - /* get a variable retriever */ - name = (RexxString *)this->addText(token); - token = nextReal(); /* step to next real token */ - /* must be a right paren here */ - if (token->classId != TOKEN_RIGHT) - /* this is an error */ - report_error_token(Error_Variable_reference_extra, token); + name = this->parenExpression(token); // this is a full expression /* process the argument list */ argCount = this->argList(OREF_NULL, TERM_EOC); /* NOTE: this call is not added to */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |