diff --git a/src/main/java/org/apache/commons/jexl3/internal/Engine.java b/src/main/java/org/apache/commons/jexl3/internal/Engine.java
index 837a66d..0dc1341 100644
--- a/src/main/java/org/apache/commons/jexl3/internal/Engine.java
+++ b/src/main/java/org/apache/commons/jexl3/internal/Engine.java
@@ -209,7 +209,7 @@
         options.setMathContext(arithmetic.getMathContext());
         options.setMathScale(arithmetic.getMathScale());
         options.setStrictArithmetic(arithmetic.isStrict());
-        this.functions = conf.namespaces() == null ? Collections.<String, Object>emptyMap() : conf.namespaces();
+        this.functions = conf.namespaces() == null ? Collections.emptyMap() : conf.namespaces();
         // parsing & features:
         final JexlFeatures features = conf.features() == null? DEFAULT_FEATURES : conf.features();
         this.expressionFeatures = new JexlFeatures(features).script(false);
diff --git a/src/main/java/org/apache/commons/jexl3/internal/introspection/ArrayListWrapper.java b/src/main/java/org/apache/commons/jexl3/internal/introspection/ArrayListWrapper.java
index fb31742..65177ec 100644
--- a/src/main/java/org/apache/commons/jexl3/internal/introspection/ArrayListWrapper.java
+++ b/src/main/java/org/apache/commons/jexl3/internal/introspection/ArrayListWrapper.java
@@ -83,4 +83,4 @@
     public boolean contains(final Object o) {
         return indexOf(o) != -1;
     }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/org/apache/commons/jexl3/internal/introspection/Permissions.java b/src/main/java/org/apache/commons/jexl3/internal/introspection/Permissions.java
index aac052e..5cac080 100644
--- a/src/main/java/org/apache/commons/jexl3/internal/introspection/Permissions.java
+++ b/src/main/java/org/apache/commons/jexl3/internal/introspection/Permissions.java
@@ -42,7 +42,7 @@
      * @return true if JEXL is allowed to introspect, false otherwise
      */
     public boolean allow(final Package pack) {
-        if (pack != null && pack.getAnnotation(NoJexl.class) != null) {
+        if (pack == null || pack.getAnnotation(NoJexl.class) != null) {
             return false;
         }
         return true;
diff --git a/src/test/java/org/apache/commons/jexl3/internal/introspection/MiscIntrospectionTest.java b/src/test/java/org/apache/commons/jexl3/internal/introspection/MiscIntrospectionTest.java
new file mode 100644
index 0000000..1afafcc
--- /dev/null
+++ b/src/test/java/org/apache/commons/jexl3/internal/introspection/MiscIntrospectionTest.java
@@ -0,0 +1,201 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.jexl3.internal.introspection;
+
+import org.apache.commons.jexl3.JexlEngine;
+import org.apache.commons.jexl3.annotations.NoJexl;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.NoSuchElementException;
+
+/**
+ * Checks the CacheMap.MethodKey implementation
+ */
+
+public class MiscIntrospectionTest {
+    @Test
+    public void testEmptyContext() {
+        try {
+            JexlEngine.EMPTY_CONTEXT.set("nope", 42);
+            Assert.fail("empty context should be readonly");
+        } catch(UnsupportedOperationException xun) {
+            Assert.assertNotNull(xun);
+        }
+    }
+    @Test
+    public void testArrayIterator() {
+        // not on lists
+        try {
+            new ArrayIterator(new ArrayList<>());
+        } catch(IllegalArgumentException xill) {
+            Assert.assertNotNull(xill);
+        }
+        // wih null?
+        ArrayIterator ai0 = new ArrayIterator(null);
+        Assert.assertFalse(ai0.hasNext());
+        try {
+            ai0.next();
+            Assert.fail("should have failed");
+        } catch(NoSuchElementException no) {
+            Assert.assertNotNull(no);
+        }
+        // an array
+        ai0 = new ArrayIterator(new int[]{42});
+        Assert.assertTrue(ai0.hasNext());
+        Assert.assertEquals(42, ai0.next());
+        Assert.assertFalse(ai0.hasNext());
+        try {
+            ai0.next();
+            Assert.fail("iterator on null?");
+        } catch(NoSuchElementException no) {
+            Assert.assertNotNull(no);
+        }
+        // no remove
+        try {
+            ai0.remove();
+            Assert.fail("should have failed");
+        } catch(UnsupportedOperationException no) {
+            Assert.assertNotNull(no);
+        }
+    }
+
+    @Test
+    public void testArrayListWrapper() {
+        ArrayListWrapper alw ;
+        try {
+            new ArrayListWrapper(1);
+            Assert.fail("non-array wrap?");
+        } catch(IllegalArgumentException xil) {
+            Assert.assertNotNull(xil);
+        }
+        Integer[] ai = new Integer[]{1, 2};
+        alw = new ArrayListWrapper(ai);
+        Assert.assertEquals(1, alw.indexOf(2));
+        Assert.assertEquals(-1, alw.indexOf(null));
+    }
+
+    public static class A {
+        public int i;
+        public A() {}
+        public int method() { return 0; }
+    }
+
+    @NoJexl
+    public interface InterNoJexl0 {
+        int method();
+    }
+
+    public interface InterNoJexl1 {
+        @NoJexl
+        int method();
+    }
+
+
+    public static class A0 extends A implements InterNoJexl0 {
+        @NoJexl public int i0;
+        @NoJexl public A0() {}
+        @Override public int method() { return 1; }
+    }
+
+    public static class A1 extends A implements InterNoJexl1 {
+        private int i1;
+        @NoJexl public A1() {}
+        @Override public int method() { return 2; }
+    }
+
+    @NoJexl
+    public static class A2 extends A  {
+        public A2() {}
+        @Override public int method() { return 3; }
+    }
+
+    protected static class A3 {
+        protected int i3;
+        protected A3() {}
+        int method() { return 4; }
+    }
+
+    public static class A5 implements InterNoJexl5 {
+        public A5() {}
+        @Override public int method() { return 0; }
+    }
+
+    @NoJexl
+    public interface InterNoJexl5 {
+        int method();
+    }
+
+    @Test
+    public void testPermissions() throws Exception {
+        Permissions p = Permissions.DEFAULT;
+        Assert.assertFalse(p.allow((Field) null));
+        Assert.assertFalse(p.allow((Package) null));
+        Assert.assertFalse(p.allow((Method) null));
+        Assert.assertFalse(p.allow((Constructor<?>) null));
+        Assert.assertFalse(p.allow((Class<?>) null));
+
+        Assert.assertTrue(p.allow(A2.class));
+        Assert.assertFalse(p.allow(A3.class));
+        Assert.assertFalse(p.allow(A5.class));
+
+        Method mA = A.class.getMethod("method");
+        Assert.assertNotNull(mA);
+        Method mA0 = A0.class.getMethod("method");
+        Assert.assertNotNull(mA0);
+        Method mA1 = A1.class.getMethod("method");
+        Assert.assertNotNull(mA1);
+        Method mA2 = A2.class.getMethod("method");
+        Assert.assertNotNull(mA1);
+        Method mA3 = A2.class.getDeclaredMethod("method");
+        Assert.assertNotNull(mA1);
+
+        Assert.assertTrue(p.allow(mA));
+        Assert.assertFalse(p.allow(mA0));
+        Assert.assertFalse(p.allow(mA1));
+        Assert.assertFalse(p.allow(mA2));
+        Assert.assertFalse(p.allow(mA3));
+
+        Field fA = A.class.getField("i");
+        Assert.assertNotNull(fA);
+        Assert.assertTrue(p.allow(fA));
+
+        Field fA0 = A0.class.getField("i0");
+        Assert.assertNotNull(fA0);
+        Assert.assertFalse(p.allow(fA0));
+        Field fA1 = A1.class.getDeclaredField("i1");
+        Assert.assertNotNull(fA1);
+        Assert.assertFalse(p.allow(fA0));
+
+        Constructor<?> cA = A.class.getConstructor();
+        Assert.assertNotNull(cA);
+        Assert.assertTrue(p.allow(cA));
+
+        Constructor<?> cA0 = A0.class.getConstructor();
+        Assert.assertNotNull(cA0);
+        Assert.assertFalse(p.allow(cA0));
+
+        Constructor<?> cA3 = A3.class.getDeclaredConstructor();
+        Assert.assertNotNull(cA3);
+        Assert.assertFalse(p.allow(cA3));
+    }
+}
