|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||
java.lang.Objectcom.sun.tools.javac.util.Context
public class Context
Support for an abstract context, modelled loosely after ThreadLocal but using a user-provided context instead of the current thread.
Within the compiler, a single Context is used for each invocation of the compiler. The context is then used to ensure a single copy of each compiler phase exists per compiler invocation.
The context can be used to assist in extending the compiler by extending its components. To do that, the extended component must be registered before the base component. We break initialization cycles by (1) registering a factory for the component rather than the component itself, and (2) a convention for a pattern of usage in which each base component registers itself by calling an instance method that is overridden in extended components. A base phase supporting extension would look something like this:
public class Phase {
protected static final Context.Key phaseKey =
new Context.Key();
public static Phase instance(Context context) {
Phase instance = context.get(phaseKey);
if (instance == null)
// the phase has not been overridden
instance = new Phase(context);
return instance;
}
protected Phase(Context context) {
context.put(phaseKey, this);
// other intitialization follows...
}
}
In the compiler, we simply use Phase.instance(context) to get the reference to the phase. But in extensions of the compiler, we must register extensions of the phases to replace the base phase, and this must be done before any reference to the phase is accessed using Phase.instance(). An extended phase might be declared thus:
public class NewPhase extends Phase {
protected NewPhase(Context context) {
super(context);
}
public static void preRegister(final Context context) {
context.put(phaseKey, new Context.Factory() {
public Phase make() {
return new NewPhase(context);
}
});
}
}
And is registered early in the extended compiler like this
NewPhase.preRegister(context);
This is NOT part of any API supported by Sun Microsystems. If you write code that depends on this, you do so at your own risk. This code and its internal interfaces are subject to change or deletion without notice.
| Nested Class Summary | |
|---|---|
static interface |
Context.Factory<T>
The client can register a factory for lazy creation of the instance. |
static class |
Context.Key<T>
The client creates an instance of this class for each key. |
| Field Summary | |
|---|---|
private java.util.Map<Context.Key<?>,java.lang.Object> |
ht
The underlying map storing the data. |
private java.util.Map<java.lang.Class<?>,Context.Key<?>> |
kt
|
| Constructor Summary | |
|---|---|
Context()
|
|
| Method Summary | ||
|---|---|---|
private static void |
checkState(java.util.Map<?,?> t)
|
|
void |
clear()
|
|
void |
dump()
|
|
|
get(java.lang.Class<T> clazz)
|
|
|
get(Context.Key<T> key)
Get the value for the key in this context. |
|
private
|
key(java.lang.Class<T> clss)
|
|
|
put(java.lang.Class<T> clazz,
Context.Factory<T> fac)
|
|
|
put(java.lang.Class<T> clazz,
T data)
|
|
|
put(Context.Key<T> key,
Context.Factory<T> fac)
Set the factory for the key in this context. |
|
|
put(Context.Key<T> key,
T data)
Set the value for the key in this context. |
|
private static
|
uncheckedCast(java.lang.Object o)
TODO: This method should be removed and Context should be made type safe. |
|
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Field Detail |
|---|
private java.util.Map<Context.Key<?>,java.lang.Object> ht
private java.util.Map<java.lang.Class<?>,Context.Key<?>> kt
| Constructor Detail |
|---|
public Context()
| Method Detail |
|---|
public <T> void put(Context.Key<T> key,
Context.Factory<T> fac)
public <T> void put(Context.Key<T> key,
T data)
public <T> T get(Context.Key<T> key)
private <T> Context.Key<T> key(java.lang.Class<T> clss)
public <T> T get(java.lang.Class<T> clazz)
public <T> void put(java.lang.Class<T> clazz,
T data)
public <T> void put(java.lang.Class<T> clazz,
Context.Factory<T> fac)
private static <T> T uncheckedCast(java.lang.Object o)
public void dump()
public void clear()
private static void checkState(java.util.Map<?,?> t)
|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||