001: /*=============================================================================
002: * Copyright Texas Instruments 2000-2004. All Rights Reserved.
003: *
004: * This program is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License as published by the Free Software Foundation; either
007: * version 2 of the License, or (at your option) any later version.
008: *
009: * This program is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public
015: * License along with this library; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: *
018: * $ProjectHeader: OSCRIPT 0.155 Fri, 20 Dec 2002 18:34:22 -0800 rclark $
019: */
020:
021: package oscript.data;
022:
023: import oscript.exceptions.*;
024:
025: /**
026: * Each interpreter instance has a single global scope, which serves to
027: * terminate the scope chain.
028: *
029: * @author Rob Clark (rob@ti.com)
030: */
031: public class GlobalScope extends BasicScope {
032: public static final Value TYPE = OSpecial.makeSpecial("(global)");
033:
034: /*=======================================================================*/
035: /**
036: * Class Constructor.
037: */
038: public GlobalScope() {
039: super (null);
040: }
041:
042: /*=======================================================================*/
043: /**
044: * Get the type of this object. The returned type doesn't have to take
045: * into account the possibility of a script type extending a built-in
046: * type, since that is handled by {@link #getType}.
047: *
048: * @return the object's type
049: */
050: protected Value getTypeImpl() {
051: return TYPE;
052: }
053:
054: /*=======================================================================*/
055: /**
056: * In case a scope has any resource allocated from a source which will
057: * no long be valid after a stack frame has returned (ie. resource
058: * allocated from stack), return a copy of the scope that is safe to
059: * keep after the stack frame returns.
060: */
061: public Scope getSafeCopy() {
062: return this ;
063: }
064:
065: /*=======================================================================*/
066: /**
067: * Lookup the "super" within a scope. Within a function body, "super"
068: * is the overriden function (if there is one).
069: *
070: * @return the "this" ScriptObject within this scope
071: */
072: public Value getSuper() {
073: throw PackagedScriptObjectException
074: .makeExceptionWrapper(new OException("no super!"));
075: }
076:
077: /*=======================================================================*/
078: /**
079: * Lookup the "this" within a scope. The "this" is the first scope chain
080: * node that is an object, rather than a regular scope chain node.
081: *
082: * @return the "this" ScriptObject within this scope
083: */
084: public Value getThis() {
085: throw PackagedScriptObjectException
086: .makeExceptionWrapper(new OException("no this!"));
087: }
088:
089: /*=======================================================================*/
090: /**
091: * Lookup the qualified "this" within a scope. The qualified "this" is
092: * the first scope chain node that is an object and an instance of the
093: * specified type, rather than a regular scope chain node.
094: *
095: * @param val the type that the "this" qualifies
096: * @return the qualified "this" ScriptObject within this scope
097: */
098: public Value getThis(Value val) {
099: return getThis();
100: }
101:
102: /*=======================================================================*/
103: /**
104: * Get a member from this scope. This is used to access local variables
105: * and object attributes from methods of the object. If the attribute
106: * isn't in this node in the scope chain, then the <code>previous</code>
107: * node in the scope chain is checked.
108: *
109: * @param id the id of the symbol that maps to the member
110: * @throws PackagedScriptObjectException(NoSuchMemberException)
111: */
112: public Value lookupInScope(int id)
113: throws PackagedScriptObjectException {
114: Value val = getMemberImpl(id);
115:
116: if (val == null)
117: throw noSuchMember(Symbol.getSymbol(id).castToString());
118:
119: return val;
120: }
121: }
122:
123: /*
124: * Local Variables:
125: * tab-width: 2
126: * indent-tabs-mode: nil
127: * mode: java
128: * c-indentation-style: java
129: * c-basic-offset: 2
130: * eval: (c-set-offset 'substatement-open '0)
131: * eval: (c-set-offset 'case-label '+)
132: * eval: (c-set-offset 'inclass '+)
133: * eval: (c-set-offset 'inline-open '0)
134: * End:
135: */
|