Author: limpbizkit
Date: Mon Jun 22 17:29:43 2009
New Revision: 1032
Modified:
trunk/src/com/google/inject/internal/InjectorBuilder.java
trunk/src/com/google/inject/internal/InjectorImpl.java
trunk/src/com/google/inject/internal/InternalContext.java
trunk/src/com/google/inject/internal/SingleFieldInjector.java
trunk/src/com/google/inject/internal/SingleParameterInjector.java
trunk/src/com/google/inject/spi/Dependency.java
trunk/test/com/google/inject/ScopesTest.java
Log:
Fixing a old bug wherein calling "Provider.get()" inside of an existing
scope would kill the internal context and leave the injector in an
inconsistent state.
Modified: trunk/src/com/google/inject/internal/InjectorBuilder.java
==============================================================================
--- trunk/src/com/google/inject/internal/InjectorBuilder.java (original)
+++ trunk/src/com/google/inject/internal/InjectorBuilder.java Mon Jun 22
17:29:43 2009
@@ -195,14 +195,14 @@
injector.callInContext(new ContextualCallable<Void>() {
Dependency<?> dependency = Dependency.get(binding.getKey());
public Void call(InternalContext context) {
- context.setDependency(dependency);
+ Dependency previous = context.setDependency(dependency);
Errors errorsForBinding = errors.withSource(dependency);
try {
binding.getInternalFactory().get(errorsForBinding,
context, dependency);
} catch (ErrorsException e) {
errorsForBinding.merge(e.getErrors());
} finally {
- context.setDependency(null);
+ context.setDependency(previous);
}
return null;
Modified: trunk/src/com/google/inject/internal/InjectorImpl.java
==============================================================================
--- trunk/src/com/google/inject/internal/InjectorImpl.java (original)
+++ trunk/src/com/google/inject/internal/InjectorImpl.java Mon Jun 22
17:29:43 2009
@@ -727,11 +727,11 @@
try {
T t = callInContext(new ContextualCallable<T>() {
public T call(InternalContext context) throws ErrorsException {
- context.setDependency(dependency);
+ Dependency previous = context.setDependency(dependency);
try {
return factory.get(errors, context, dependency);
} finally {
- context.setDependency(null);
+ context.setDependency(previous);
}
}
});
Modified: trunk/src/com/google/inject/internal/InternalContext.java
==============================================================================
--- trunk/src/com/google/inject/internal/InternalContext.java (original)
+++ trunk/src/com/google/inject/internal/InternalContext.java Mon Jun 22
17:29:43 2009
@@ -45,7 +45,9 @@
return dependency;
}
- public void setDependency(Dependency dependency) {
+ public Dependency setDependency(Dependency dependency) {
+ Dependency previous = dependency;
this.dependency = dependency;
+ return previous;
}
}
Modified: trunk/src/com/google/inject/internal/SingleFieldInjector.java
==============================================================================
--- trunk/src/com/google/inject/internal/SingleFieldInjector.java
(original)
+++ trunk/src/com/google/inject/internal/SingleFieldInjector.java Mon Jun
22 17:29:43 2009
@@ -47,7 +47,7 @@
public void inject(Errors errors, InternalContext context, Object o) {
errors = errors.withSource(dependency);
- context.setDependency(dependency);
+ Dependency previous = context.setDependency(dependency);
try {
Object value = factory.get(errors, context, dependency);
field.set(o, value);
@@ -56,7 +56,7 @@
} catch (IllegalAccessException e) {
throw new AssertionError(e); // a security manager is blocking us,
we're hosed
} finally {
- context.setDependency(null);
+ context.setDependency(previous);
}
}
}
Modified: trunk/src/com/google/inject/internal/SingleParameterInjector.java
==============================================================================
--- trunk/src/com/google/inject/internal/SingleParameterInjector.java
(original)
+++ trunk/src/com/google/inject/internal/SingleParameterInjector.java Mon
Jun 22 17:29:43 2009
@@ -33,11 +33,11 @@
}
private T inject(Errors errors, InternalContext context) throws
ErrorsException {
- context.setDependency(dependency);
+ Dependency previous = context.setDependency(dependency);
try {
return factory.get(errors.withSource(dependency), context,
dependency);
} finally {
- context.setDependency(null);
+ context.setDependency(previous);
}
}
Modified: trunk/src/com/google/inject/spi/Dependency.java
==============================================================================
--- trunk/src/com/google/inject/spi/Dependency.java (original)
+++ trunk/src/com/google/inject/spi/Dependency.java Mon Jun 22 17:29:43 2009
@@ -20,6 +20,7 @@
import com.google.inject.internal.ImmutableSet;
import com.google.inject.internal.Lists;
import com.google.inject.internal.Objects;
+import static com.google.inject.internal.Preconditions.checkNotNull;
import java.util.List;
import java.util.Set;
@@ -39,10 +40,9 @@
private final boolean nullable;
private final int parameterIndex;
- Dependency(InjectionPoint injectionPoint, Key<T> key,
- boolean nullable, int parameterIndex) {
+ Dependency(InjectionPoint injectionPoint, Key<T> key, boolean nullable,
int parameterIndex) {
this.injectionPoint = injectionPoint;
- this.key = key;
+ this.key = checkNotNull(key, "key");
this.nullable = nullable;
this.parameterIndex = parameterIndex;
}
Modified: trunk/test/com/google/inject/ScopesTest.java
==============================================================================
--- trunk/test/com/google/inject/ScopesTest.java (original)
+++ trunk/test/com/google/inject/ScopesTest.java Mon Jun 22 17:29:43 2009
@@ -415,4 +415,31 @@
return new ProvidedBySingleton();
}
}
+
+ public void testScopeThatGetsAnUnrelatedObject() {
+ Injector injector = Guice.createInjector(new AbstractModule() {
+ protected void configure() {
+ bind(B.class);
+ bind(C.class);
+ ProviderGetScope providerGetScope = new ProviderGetScope();
+ requestInjection(providerGetScope);
+ bindScope(CustomScoped.class, providerGetScope);
+ }
+ });
+
+ injector.getInstance(C.class);
+ }
+
+ class ProviderGetScope implements Scope {
+ @Inject Provider<B> bProvider;
+
+ public <T> Provider<T> scope(Key<T> key, final Provider<T> unscoped) {
+ return new Provider<T>() {
+ public T get() {
+ bProvider.get();
+ return unscoped.get();
+ }
+ };
+ }
+ }
}
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"google-guice-dev" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/google-guice-dev?hl=en
-~----------~----~----~----~------~----~------~--~---