RexxVariable.hpp
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 Kernel RexxVariable.hpp */
40 /* */
41 /* Primitive Variable Class Definition */
42 /* */
43 /******************************************************************************/
44 #ifndef Included_RexxVariable
45 #define Included_RexxVariable
46 
47 #include "StringClass.hpp"
48 
50  public:
51  inline void *operator new(size_t size, void *ptr) { return ptr; }
52  inline void operator delete(void *) { }
53  inline void operator delete(void *, void *) { }
54 
55  inline RexxVariable() {;};
56  inline RexxVariable(RESTORETYPE restoreType) { ; };
57 
58  void live(size_t);
59  void liveGeneral(int reason);
60  void flatten(RexxEnvelope *);
61  void inform(RexxActivity *);
62  void drop();
63  void notify();
64  void uninform(RexxActivity *);
65 
66 
67  inline void set(RexxObject *value) {
68  OrefSet(this, this->variableValue, value);
69  if (this->dependents != OREF_NULL)
70  this->notify(); };
71 
72  inline RexxObject *getVariableValue() { return this->variableValue; };
74  inline RexxString *getName() { return variable_name; }
75  inline void setName(RexxString *name) { OrefSet(this, this->variable_name, name); }
76 
77  inline void reset(RexxString *name)
78  {
79  creator = OREF_NULL; /* this is unowned */
80  variableValue = OREF_NULL; /* clear out the hash value */
81  variable_name = name; /* fill in the name */
82  dependents = OREF_NULL; /* and the dependents */
83  }
84 
85  /* Note: This does not use OrefSet since it will only occur with */
86  /* local variables that can never be part of oldspace; */
87  inline void setCreator(RexxActivation *creatorActivation) { this->creator = creatorActivation; }
89  inline void cache(RexxVariable *next) { reset(OREF_NULL); variableValue = (RexxObject *)next; }
90  inline bool isLocal(RexxActivation *act) { return act == creator; }
91  inline bool isStem() { return variable_name->endsWith('.'); }
92 
93  static RexxVariable *newInstance(RexxString *name);
94 
95 protected:
96 
97  RexxString *variable_name; /* the name of the variable */
98  RexxObject *variableValue; // the assigned value of the variable.
99  RexxActivation *creator; /* the activation that created this variable */
100  RexxIdentityTable *dependents; /* guard expression dependents */
101 };
102 
103 
105 
106 #endif
RESTORETYPE
Definition: ObjectClass.hpp:80
#define OREF_NULL
Definition: RexxCore.h:60
#define OrefSet(o, r, v)
Definition: RexxCore.h:94
RexxVariable * new_variable(RexxString *n)
bool endsWith(codepoint_t c)
void cache(RexxVariable *next)
void liveGeneral(int reason)
void reset(RexxString *name)
static RexxVariable * newInstance(RexxString *name)
bool isLocal(RexxActivation *act)
RexxObject * variableValue
void uninform(RexxActivity *)
void set(RexxObject *value)
RexxVariable(RESTORETYPE restoreType)
RexxString * getName()
void flatten(RexxEnvelope *)
RexxObject * getResolvedValue()
RexxActivation * creator
RexxObject * getVariableValue()
void inform(RexxActivity *)
void setCreator(RexxActivation *creatorActivation)
void live(size_t)
RexxString * variable_name
void setName(RexxString *name)
RexxVariable * getNext()
RexxIdentityTable * dependents