Package gw.lang.parser
Class ThreadSafeSymbolTable
- java.lang.Object
-
- gw.lang.parser.ThreadSafeSymbolTable
-
- All Implemented Interfaces:
IStackProvider
,ISymbolTable
- Direct Known Subclasses:
CompiledGosuClassSymbolTable
public abstract class ThreadSafeSymbolTable extends Object implements ISymbolTable
-
-
Field Summary
-
Fields inherited from interface gw.lang.parser.IStackProvider
START_POS, SUPER_POS, THIS_POS
-
-
Constructor Summary
Constructors Constructor Description ThreadSafeSymbolTable(boolean bDefineCommonSymbols)
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description void
clearDefaultSymbolTable()
ISymbolTable
copy()
Perform a semi-deep copy of this symbol table.void
defineCommonSymbols()
Define symbols that are considered ubiquitous.protected ISymbolTable
getDefaultSymbolTable()
int
getNextStackIndex()
For compile-time assignment of stack indexes.int
getNextStackIndexForScope(IScope scope)
For compile-time assignment of stack indexes at a particular scope.int
getPrivateGlobalScopeCount()
int
getScopeCount()
ISymbol
getSymbol(CharSequence name)
Map
getSymbols()
Map
getSymbols(int iScopeOffset, int iPrivateGlobalIndex)
ISymbolTable
getTargetSymbolTable()
ISymbol
getThisSymbolFromStackOrMap()
Get the 'this' symbol from either the stack or the table.protected abstract ISymbolTable
getThreadLocalSymbolTable()
Get a thread-local symbol table.int
getTotalSymbolCount()
boolean
hasIsolatedScope()
For compile-time use.boolean
isSymbolWithinScope(ISymbol sym, IScope scope)
IScope
peekIsolatedScope()
IScope
peekScope()
IScope
peekScope(int iPos)
void
popGlobalScope(IScope scope)
Pops a global scope previously pushed viapushGlobalScope( IScope )
orpushPrivateGlobalScope( IScope )
.IScope
popScope()
Pop a local scope context from the symbol table.IScope
popScope(IScope scope)
IScope
pushIsolatedScope(IActivationContext activationCtx)
Push a scope that demarcates an activation record.void
pushPrivateGlobalScope(IScope scope)
Push a global scope you specify onto the private global scope space.IScope
pushScope()
Push a local scope context onto the symbol table.IScope
pushScope(IScope scope)
Push a local scope context onto the symbol table.void
putSymbol(ISymbol symbol)
Maps a name to a symbol in the table.ISymbol
removeSymbol(CharSequence name)
Removes a previously mapped symbol.
-
-
-
Method Detail
-
copy
public ISymbolTable copy()
Description copied from interface:ISymbolTable
Perform a semi-deep copy of this symbol table. Symbols need not be cloned.- Specified by:
copy
in interfaceISymbolTable
- Returns:
- A semi-deep copy of this symbol table.
-
getSymbol
public ISymbol getSymbol(CharSequence name)
- Specified by:
getSymbol
in interfaceISymbolTable
- Returns:
- The symbol mapped to the specified name.
-
putSymbol
public void putSymbol(ISymbol symbol)
Description copied from interface:ISymbolTable
Maps a name to a symbol in the table.- Specified by:
putSymbol
in interfaceISymbolTable
-
removeSymbol
public ISymbol removeSymbol(CharSequence name)
Description copied from interface:ISymbolTable
Removes a previously mapped symbol.- Specified by:
removeSymbol
in interfaceISymbolTable
- Parameters:
name
- The name mapped to the symbol to remove.
-
getSymbols
public Map getSymbols()
- Specified by:
getSymbols
in interfaceISymbolTable
- Returns:
- A list of currently mapped ISymbols e.g., the values in a hash table based implementation.
-
getSymbols
public Map getSymbols(int iScopeOffset, int iPrivateGlobalIndex)
- Specified by:
getSymbols
in interfaceISymbolTable
- Parameters:
iScopeOffset
- Scopes positioned on the stack at an index greater than this number are not included. Very useful for examining a specific scope e.g., for a debugger. Note an index < 0 indicates that all scopes are included.- Returns:
- A list of currently mapped ISymbols e.g., the values in a hash table based implementation.
-
getTotalSymbolCount
public int getTotalSymbolCount()
- Specified by:
getTotalSymbolCount
in interfaceISymbolTable
- Returns:
- the number of symbols exist in this table.
-
getScopeCount
public int getScopeCount()
- Specified by:
getScopeCount
in interfaceISymbolTable
- Returns:
- The number of scopes on the stack. These include all scopes: global, isolated, and local. Useful for recording a specific offset in the symbol table e.g., a debugger needs this to jump to a position in a call stack.
- See Also:
ISymbolTable.getSymbols(int,int)
-
getPrivateGlobalScopeCount
public int getPrivateGlobalScopeCount()
- Specified by:
getPrivateGlobalScopeCount
in interfaceISymbolTable
- Returns:
- The number of scopes on the private global stack. Useful for recording a specific offset in the symbol table e.g., a debugger needs this to jump to a position in a call stack.
- See Also:
ISymbolTable.getSymbols(int,int)
-
pushScope
public IScope pushScope()
Description copied from interface:ISymbolTable
Push a local scope context onto the symbol table.- Specified by:
pushScope
in interfaceISymbolTable
- Returns:
- The pushed scope.
-
pushScope
public IScope pushScope(IScope scope)
Description copied from interface:ISymbolTable
Push a local scope context onto the symbol table.- Specified by:
pushScope
in interfaceISymbolTable
- Parameters:
scope
- the scope to push- Returns:
- The pushed scope.
-
pushPrivateGlobalScope
public void pushPrivateGlobalScope(IScope scope)
Description copied from interface:ISymbolTable
Push a global scope you specify onto the private global scope space. Useful for handling private global scopes for libraries, namespaces, etc. As this functionality is primarily for Gosu runtime, you'll likely never need to call this. If you need to push a scope with restricted visibility, consider callingpushIsolatedScope()
instead.- Specified by:
pushPrivateGlobalScope
in interfaceISymbolTable
- See Also:
ISymbolTable.pushScope()
,ISymbolTable.pushIsolatedScope(IActivationContext)
-
popGlobalScope
public void popGlobalScope(IScope scope)
Description copied from interface:ISymbolTable
Pops a global scope previously pushed viapushGlobalScope( IScope )
orpushPrivateGlobalScope( IScope )
. You probably shouldn't call this method.- Specified by:
popGlobalScope
in interfaceISymbolTable
- See Also:
ISymbolTable.pushPrivateGlobalScope(IScope)
,ISymbolTable.popScope()
-
popScope
public IScope popScope()
Description copied from interface:ISymbolTable
Pop a local scope context from the symbol table. See pushScope() for implementation suggestions.- Specified by:
popScope
in interfaceISymbolTable
- Returns:
- The popped scope.
-
peekScope
public IScope peekScope()
- Specified by:
peekScope
in interfaceISymbolTable
- Returns:
- the currently active scope
-
peekScope
public IScope peekScope(int iPos)
- Specified by:
peekScope
in interfaceISymbolTable
-
popScope
public IScope popScope(IScope scope)
- Specified by:
popScope
in interfaceISymbolTable
-
pushIsolatedScope
public IScope pushIsolatedScope(IActivationContext activationCtx)
Description copied from interface:ISymbolTable
Push a scope that demarcates an activation record. The behavior is nearly identical to pushScope(), the [big] difference is that activation record scopes cannot access symbols from other activation record scopes. Use popScope() to pop a scope pushed via this method.- Specified by:
pushIsolatedScope
in interfaceISymbolTable
- Parameters:
activationCtx
- The context for the activation record.- Returns:
- The isolated scope (aka the activation record).
-
defineCommonSymbols
public void defineCommonSymbols()
Description copied from interface:ISymbolTable
Define symbols that are considered ubiquitous. There may be none.- Specified by:
defineCommonSymbols
in interfaceISymbolTable
-
getNextStackIndex
public int getNextStackIndex()
Description copied from interface:IStackProvider
For compile-time assignment of stack indexes.- Specified by:
getNextStackIndex
in interfaceIStackProvider
-
getNextStackIndexForScope
public int getNextStackIndexForScope(IScope scope)
Description copied from interface:IStackProvider
For compile-time assignment of stack indexes at a particular scope.- Specified by:
getNextStackIndexForScope
in interfaceIStackProvider
-
hasIsolatedScope
public boolean hasIsolatedScope()
Description copied from interface:IStackProvider
For compile-time use. Returns true iff an isolated scope is visible.- Specified by:
hasIsolatedScope
in interfaceIStackProvider
-
getThisSymbolFromStackOrMap
public ISymbol getThisSymbolFromStackOrMap()
Description copied from interface:ISymbolTable
Get the 'this' symbol from either the stack or the table.- Specified by:
getThisSymbolFromStackOrMap
in interfaceISymbolTable
-
getTargetSymbolTable
public ISymbolTable getTargetSymbolTable()
-
isSymbolWithinScope
public boolean isSymbolWithinScope(ISymbol sym, IScope scope)
- Specified by:
isSymbolWithinScope
in interfaceISymbolTable
- Returns:
- true if the given symbol is within the given scope
-
peekIsolatedScope
public IScope peekIsolatedScope()
- Specified by:
peekIsolatedScope
in interfaceISymbolTable
- Returns:
- the top-most isolated scope
-
getDefaultSymbolTable
protected ISymbolTable getDefaultSymbolTable()
-
clearDefaultSymbolTable
public void clearDefaultSymbolTable()
-
getThreadLocalSymbolTable
protected abstract ISymbolTable getThreadLocalSymbolTable()
Get a thread-local symbol table. This is typically an instance of StandardSymbol table you maintain in a simple ThreadLocal.
-
-