private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
   scriptRefQueue = new ReferenceQueue<Script>();
   scripts = new ConcurrentHashMap<String, ScriptReference>();
   final Map<String, CachedModuleScript> serScripts = (Map) in.readObject();
   for (Map.Entry<String, CachedModuleScript> entry : serScripts.entrySet()) {
     final CachedModuleScript cachedModuleScript = entry.getValue();
     putLoadedModule(
         entry.getKey(), cachedModuleScript.getModule(), cachedModuleScript.getValidator());
   }
 }
 public ModuleScript getModuleScript(Context cx, String moduleId, URI moduleUri, Scriptable paths)
     throws Exception {
   final CachedModuleScript cachedModule1 = getLoadedModule(moduleId);
   final Object validator1 = getValidator(cachedModule1);
   final ModuleSource moduleSource =
       (moduleUri == null)
           ? moduleSourceProvider.loadSource(moduleId, paths, validator1)
           : moduleSourceProvider.loadSource(moduleUri, validator1);
   if (moduleSource == ModuleSourceProvider.NOT_MODIFIED) {
     return cachedModule1.getModule();
   }
   if (moduleSource == null) {
     return null;
   }
   final Reader reader = moduleSource.getReader();
   try {
     final int idHash = moduleId.hashCode();
     synchronized (loadLocks[(idHash >>> loadLockShift) & loadLockMask]) {
       final CachedModuleScript cachedModule2 = getLoadedModule(moduleId);
       if (cachedModule2 != null) {
         if (!equal(validator1, getValidator(cachedModule2))) {
           return cachedModule2.getModule();
         }
       }
       final URI sourceUri = moduleSource.getUri();
       final ModuleScript moduleScript =
           new ModuleScript(
               cx.compileReader(reader, sourceUri.toString(), 1, moduleSource.getSecurityDomain()),
               sourceUri,
               moduleSource.getBase());
       putLoadedModule(moduleId, moduleScript, moduleSource.getValidator());
       return moduleScript;
     }
   } finally {
     reader.close();
   }
 }
 private static Object getValidator(CachedModuleScript cachedModule) {
   return cachedModule == null ? null : cachedModule.getValidator();
 }