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
-~----------~----~----~----~------~----~------~--~---

Reply via email to