EndIf.cpp
Go to the documentation of this file.
1 /*----------------------------------------------------------------------------*/
2 /* */
3 /* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */
4 /* Copyright (c) 2005-2009 Rexx Language Association. All rights reserved. */
5 /* */
6 /* This program and the accompanying materials are made available under */
7 /* the terms of the Common Public License v1.0 which accompanies this */
8 /* distribution. A copy is also available at the following address: */
9 /* http://www.oorexx.org/license.html */
10 /* */
11 /* Redistribution and use in source and binary forms, with or */
12 /* without modification, are permitted provided that the following */
13 /* conditions are met: */
14 /* */
15 /* Redistributions of source code must retain the above copyright */
16 /* notice, this list of conditions and the following disclaimer. */
17 /* Redistributions in binary form must reproduce the above copyright */
18 /* notice, this list of conditions and the following disclaimer in */
19 /* the documentation and/or other materials provided with the distribution. */
20 /* */
21 /* Neither the name of Rexx Language Association nor the names */
22 /* of its contributors may be used to endorse or promote products */
23 /* derived from this software without specific prior written permission. */
24 /* */
25 /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */
26 /* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */
27 /* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */
28 /* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */
29 /* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
30 /* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */
31 /* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */
32 /* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */
33 /* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */
34 /* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */
35 /* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
36 /* */
37 /*----------------------------------------------------------------------------*/
38 /******************************************************************************/
39 /* REXX Translator */
40 /* */
41 /* Primitive End-If Parse Class */
42 /* */
43 /******************************************************************************/
44 #include <stdlib.h>
45 #include "RexxCore.h"
46 #include "RexxActivation.hpp"
47 #include "IfInstruction.hpp"
48 #include "Token.hpp"
49 
50 
52  RexxInstructionIf *_parent) /* base parent instruction (IF/WHEN) */
53 /******************************************************************************/
54 /* Function: Complete initialization of a PARSE ENDIF object */
55 /******************************************************************************/
56 {
57  this->setType(KEYWORD_ENDTHEN); /* set the default type */
58  OrefSet(this, this->parent, _parent);/* remember parent IF/WHEN/ELSE */
59  parent->setEndInstruction(this); /* hook up with the parent object */
60  /* is this the ELSE end? */
62  {
63 
64  this->setType(KEYWORD_ENDELSE); /* change this into an ELSE end */
65  }
66  /* is this the ELSE end? */
68  {
69  this->setType(KEYWORD_ENDWHEN); /* change this into an WHEN end */
70  }
71 }
72 
74  RexxInstructionEndIf *end_clause) /* target end point */
75 /******************************************************************************/
76 /* Function: Set the END skip point for the instruction */
77 /******************************************************************************/
78 {
79  /* set the new location */
80  OrefSet(this, this->else_end, end_clause);
81 }
82 
83 void RexxInstructionEndIf::live(size_t liveMark)
84 /******************************************************************************/
85 /* Function: Normal garbage collection live marking */
86 /******************************************************************************/
87 {
88  memory_mark(this->nextInstruction); /* must be first one marked */
89  memory_mark(this->else_end);
90  memory_mark(this->parent);
91 }
92 
94 /******************************************************************************/
95 /* Function: Generalized object marking */
96 /******************************************************************************/
97 {
98  /* must be first one marked */
102 }
103 
104 
106 /******************************************************************************/
107 /* Function: Flatten an object */
108 /******************************************************************************/
109 {
111 
112  flatten_reference(newThis->nextInstruction, envelope);
113  flatten_reference(newThis->else_end, envelope);
114  flatten_reference(newThis->parent, envelope);
115 
117 }
118 
120  RexxActivation *context, /* current activation context */
121  RexxExpressionStack *stack) /* evaluation stack */
122 /****************************************************************************/
123 /* Function: Execute a REXX ENDIF instruction */
124 /****************************************************************************/
125 {
126  /* this the end of a WHEN block? */
127  if (this->instructionType == KEYWORD_ENDWHEN)
128  {
129  // remove the select block and reset the indent
130  context->terminateBlock();
131  /* set the restart point */
132  context->setNext((this->else_end)->nextInstruction);
133  }
134  else
135  {
136  context->unindent(); /* unindent the context */
137  context->unindent(); /* unindent for the total */
138  if (this->else_end != OREF_NULL) /* have to jump around an else? */
139  {
140  /* set the restart point */
141  context->setNext((this->else_end)->nextInstruction);
142  }
143  }
144 }
145 
#define OREF_NULL
Definition: RexxCore.h:61
#define OrefSet(o, r, v)
Definition: RexxCore.h:101
#define memory_mark(oref)
Definition: RexxMemory.hpp:450
#define flatten_reference(oref, envel)
Definition: RexxMemory.hpp:498
#define memory_mark_general(oref)
Definition: RexxMemory.hpp:451
#define cleanUpFlatten
Definition: RexxMemory.hpp:484
#define setUpFlatten(type)
Definition: RexxMemory.hpp:478
#define KEYWORD_ENDTHEN
Definition: Token.hpp:193
#define KEYWORD_WHENTHEN
Definition: Token.hpp:182
#define KEYWORD_ELSE
Definition: Token.hpp:177
#define KEYWORD_ENDELSE
Definition: Token.hpp:192
#define KEYWORD_ENDWHEN
Definition: Token.hpp:194
void terminateBlock(size_t _indent)
void setNext(RexxInstruction *v)
void liveGeneral(int reason)
Definition: EndIf.cpp:93
RexxInstructionIf * parent
Definition: EndIf.hpp:65
RexxInstructionEndIf(RexxInstructionIf *)
Definition: EndIf.cpp:51
RexxInstruction * else_end
Definition: EndIf.hpp:64
void setEndInstruction(RexxInstructionEndIf *)
Definition: EndIf.cpp:73
void execute(RexxActivation *, RexxExpressionStack *)
Definition: EndIf.cpp:119
void live(size_t)
Definition: EndIf.cpp:83
void flatten(RexxEnvelope *)
Definition: EndIf.cpp:105
uint16_t instructionType
void setType(size_t type)
RexxInstruction * nextInstruction
void setEndInstruction(RexxInstructionEndIf *)