--- a/.hgtags Fri Aug 26 13:11:39 2016 +0300
+++ b/.hgtags Fri Aug 26 10:14:15 2016 -0700
@@ -374,3 +374,4 @@
e8373543a3f0f60589b7d72b1f9b172721124caf jdk-9+129
e613affb88d178dc7c589f1679db113d589bddb4 jdk-9+130
4d2a15091124488080d65848b704e25599b2aaeb jdk-9+131
+2e83d21d78cd9c1d52e6cd2599e9c8aa36ea1f52 jdk-9+132
--- a/.hgtags-top-repo Fri Aug 26 13:11:39 2016 +0300
+++ b/.hgtags-top-repo Fri Aug 26 10:14:15 2016 -0700
@@ -374,3 +374,4 @@
f5902d3841b82cac6e7716a20c24e8e916fb14a8 jdk-9+129
d94d54a3192fea79234c3ac55cd0b4052d45e954 jdk-9+130
8728756c2f70a79a90188f4019cfd6b9a275765c jdk-9+131
+a24702d4d5ab0015a5c553ed57f66fce7d85155e jdk-9+132
--- a/common/autoconf/spec.gmk.in Fri Aug 26 13:11:39 2016 +0300
+++ b/common/autoconf/spec.gmk.in Fri Aug 26 10:14:15 2016 -0700
@@ -251,8 +251,6 @@
# Legacy support
USE_NEW_HOTSPOT_BUILD:=@USE_NEW_HOTSPOT_BUILD@
-MACOSX_UNIVERSAL=@MACOSX_UNIVERSAL@
-
# JDK_OUTPUTDIR specifies where a working jvm is built.
# You can run $(JDK_OUTPUTDIR)/bin/java
# Though the layout of the contents of $(JDK_OUTPUTDIR) is not
--- a/corba/.hgtags Fri Aug 26 13:11:39 2016 +0300
+++ b/corba/.hgtags Fri Aug 26 10:14:15 2016 -0700
@@ -374,3 +374,4 @@
c3e83ccab3bb1733ae903d681879a33f85ed465c jdk-9+129
77f9692d5976ae155773dd3e07533616bb95bae1 jdk-9+130
f7e1d5337c2e550fe553df7a3886bbed80292ecd jdk-9+131
+1ab4b9399c4cba584f66c1c088188f2f565fbf9c jdk-9+132
--- a/corba/src/java.corba/share/classes/module-info.java Fri Aug 26 13:11:39 2016 +0300
+++ b/corba/src/java.corba/share/classes/module-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -23,6 +23,9 @@
* questions.
*/
+/**
+ * Defines the Java binding of the OMG CORBA APIs, and the RMI-IIOP API.
+ */
module java.corba {
requires public java.desktop;
requires public java.rmi;
--- a/hotspot/.hgtags Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/.hgtags Fri Aug 26 10:14:15 2016 -0700
@@ -534,3 +534,4 @@
e96b34b76d863ed1fa04e0eeb3f297ac17b490fd jdk-9+129
7d54c7056328b6a2bf4877458b8f4d8cd870f93b jdk-9+130
943bf73b49c33c2d7cbd796f6a4ae3c7a00ae932 jdk-9+131
+713951c08aa26813375175c2ab6cc99ff2a56903 jdk-9+132
--- a/hotspot/make/Dist.gmk Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/make/Dist.gmk Fri Aug 26 10:14:15 2016 -0700
@@ -46,15 +46,6 @@
endif
################################################################################
-# Functions to setup copying of files for variants
-
-# Support macro for SetupDistLibFile
-define macosx_universalize
- $(MKDIR) -p $(@D)
- $(LIPO) -create -output $@ $<
-endef
-
-################################################################################
# Setup make rules to copy a native library and associated data.
#
# Parameter 1 is the name of the rule. This name is used as variable prefix,
@@ -74,16 +65,9 @@
$1_LIB_NAME := $(LIBRARY_PREFIX)$$($1_NAME)
$1_TARGET_DIR := $$(DIST_OUTPUTDIR)/$$(LIB_SUBDIR)/$$($1_VARIANT_TARGET_DIR)
- ifeq ($(OPENJDK_TARGET_OS), macosx)
- # We must use the 'universalize' macro to run lipo on shared libraries, at
- # least until JDK-8069540 is fixed.
- $1_MACRO := macosx_universalize
- endif
-
# Copy the the native library.
$$(eval $$(call SetupCopyFiles, $1_COPY_LIB, \
DEST := $$($1_TARGET_DIR), \
- MACRO := $$($1_MACRO), \
FILES := $$(wildcard \
$$($1_SRC_DIR)/$$($1_LIB_NAME)$(SHARED_LIBRARY_SUFFIX)), \
))
--- a/hotspot/make/test/JtregNative.gmk Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/make/test/JtregNative.gmk Fri Aug 26 10:14:15 2016 -0700
@@ -50,7 +50,6 @@
$(HOTSPOT_TOPDIR)/test/runtime/BoolReturn \
$(HOTSPOT_TOPDIR)/test/compiler/floatingpoint/ \
$(HOTSPOT_TOPDIR)/test/compiler/calls \
- $(HOTSPOT_TOPDIR)/test/compiler/native \
$(HOTSPOT_TOPDIR)/test/serviceability/jvmti/GetNamedModule \
$(HOTSPOT_TOPDIR)/test/testlibrary/jvmti \
$(HOTSPOT_TOPDIR)/test/compiler/jvmci/jdk.vm.ci.code.test \
--- a/hotspot/src/cpu/aarch64/vm/frame_aarch64.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/cpu/aarch64/vm/frame_aarch64.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -110,17 +110,7 @@
// Entry frame checks
if (is_entry_frame()) {
// an entry frame must have a valid fp.
-
- if (!fp_safe) return false;
-
- // Validate the JavaCallWrapper an entry frame must have
-
- address jcw = (address)entry_frame_call_wrapper();
-
- bool jcw_safe = (jcw < thread->stack_base()) && ( jcw > fp);
-
- return jcw_safe;
-
+ return fp_safe && is_entry_frame_valid(thread);
}
intptr_t* sender_sp = NULL;
@@ -210,15 +200,8 @@
}
// construct the potential sender
-
frame sender(sender_sp, sender_unextended_sp, saved_fp, sender_pc);
-
- // Validate the JavaCallWrapper an entry frame must have
- address jcw = (address)sender.entry_frame_call_wrapper();
-
- bool jcw_safe = (jcw < thread->stack_base()) && ( jcw > (address)sender.fp());
-
- return jcw_safe;
+ return sender.is_entry_frame_valid(thread);
}
CompiledMethod* nm = sender_blob->as_compiled_method_or_null();
--- a/hotspot/src/cpu/sparc/vm/frame_sparc.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/cpu/sparc/vm/frame_sparc.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -225,19 +225,7 @@
// Entry frame checks
if (is_entry_frame()) {
// an entry frame must have a valid fp.
-
- if (!fp_safe) {
- return false;
- }
-
- // Validate the JavaCallWrapper an entry frame must have
-
- address jcw = (address)entry_frame_call_wrapper();
-
- bool jcw_safe = (jcw <= thread->stack_base()) && ( jcw > _FP);
-
- return jcw_safe;
-
+ return fp_safe && is_entry_frame_valid(thread);
}
intptr_t* younger_sp = sp();
@@ -290,14 +278,8 @@
return false;
}
- if( sender.is_entry_frame()) {
- // Validate the JavaCallWrapper an entry frame must have
-
- address jcw = (address)sender.entry_frame_call_wrapper();
-
- bool jcw_safe = (jcw <= thread->stack_base()) && ( jcw > sender_fp);
-
- return jcw_safe;
+ if (sender.is_entry_frame()) {
+ return sender.is_entry_frame_valid(thread);
}
// If the frame size is 0 something (or less) is bad because every nmethod has a non-zero frame size
@@ -357,12 +339,6 @@
_cb = CodeCache::find_blob(_pc);
}
_deopt_state = unknown;
-#ifdef ASSERT
- if ( _cb != NULL && _cb->is_compiled()) {
- // Without a valid unextended_sp() we can't convert the pc to "original"
- assert(!((CompiledMethod*)_cb)->is_deopt_pc(_pc), "invariant broken");
- }
-#endif // ASSERT
}
frame::frame(intptr_t* sp, unpatchable_t, address pc, CodeBlob* cb) {
@@ -534,6 +510,7 @@
void frame::patch_pc(Thread* thread, address pc) {
+ vmassert(_deopt_state != unknown, "frame is unpatchable");
if(thread == Thread::current()) {
StubRoutines::Sparc::flush_callers_register_windows_func()();
}
--- a/hotspot/src/cpu/x86/vm/frame_x86.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/cpu/x86/vm/frame_x86.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -108,17 +108,7 @@
// Entry frame checks
if (is_entry_frame()) {
// an entry frame must have a valid fp.
-
- if (!fp_safe) return false;
-
- // Validate the JavaCallWrapper an entry frame must have
-
- address jcw = (address)entry_frame_call_wrapper();
-
- bool jcw_safe = (jcw < thread->stack_base()) && ( jcw > fp);
-
- return jcw_safe;
-
+ return fp_safe && is_entry_frame_valid(thread);
}
intptr_t* sender_sp = NULL;
@@ -209,15 +199,8 @@
}
// construct the potential sender
-
frame sender(sender_sp, sender_unextended_sp, saved_fp, sender_pc);
-
- // Validate the JavaCallWrapper an entry frame must have
- address jcw = (address)sender.entry_frame_call_wrapper();
-
- bool jcw_safe = (jcw < thread->stack_base()) && ( jcw > (address)sender.fp());
-
- return jcw_safe;
+ return sender.is_entry_frame_valid(thread);
}
CompiledMethod* nm = sender_blob->as_compiled_method_or_null();
--- a/hotspot/src/cpu/x86/vm/interp_masm_x86.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/cpu/x86/vm/interp_masm_x86.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -1071,6 +1071,9 @@
NOT_LP64(get_thread(rthread);)
+ cmpl(Address(rthread, JavaThread::stack_guard_state_offset()), JavaThread::stack_guard_enabled);
+ jcc(Assembler::equal, no_reserved_zone_enabling);
+
cmpptr(rbx, Address(rthread, JavaThread::reserved_stack_activation_offset()));
jcc(Assembler::lessEqual, no_reserved_zone_enabling);
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/SALauncher.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/SALauncher.java Fri Aug 26 10:14:15 2016 -0700
@@ -255,7 +255,8 @@
}
buildAttachArgs(newArgs, pid, exe, core, false);
- JStack.main(newArgs.toArray(new String[newArgs.size()]));
+ JStack jstack = new JStack(false, false);
+ jstack.runWithArgs(newArgs.toArray(new String[newArgs.size()]));
}
private static void runJMAP(String[] oldArgs) {
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/BreakpointInfo.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/BreakpointInfo.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/MethodCounters.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/MethodCounters.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2016 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/ppc64/PPC64Frame.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/ppc64/PPC64Frame.java Fri Aug 26 10:14:15 2016 -0700
@@ -46,7 +46,6 @@
private static final int SENDER_SP_OFFSET = 0;
// Interpreter frames
- private static final int INTERPRETER_FRAME_MIRROR_OFFSET = -3; // for native calls only
private static final int INTERPRETER_FRAME_SENDER_SP_OFFSET = -4;
private static final int INTERPRETER_FRAME_LAST_SP_OFFSET = INTERPRETER_FRAME_SENDER_SP_OFFSET - 1;
private static final int INTERPRETER_FRAME_MDX_OFFSET = INTERPRETER_FRAME_LAST_SP_OFFSET -1;
@@ -55,7 +54,8 @@
private static final int INTERPRETER_FRAME_CACHE_OFFSET =INTERPRETER_FRAME_BCX_OFFSET - 1;
private static final int INTERPRETER_FRAME_MONITORS_OFFSET = INTERPRETER_FRAME_CACHE_OFFSET - 1;
private static final int INTERPRETER_FRAME_LOCALS_OFFSET = INTERPRETER_FRAME_MONITORS_OFFSET - 1;
- private static final int INTERPRETER_FRAME_METHOD_OFFSET = INTERPRETER_FRAME_LOCALS_OFFSET - 1;
+ private static final int INTERPRETER_FRAME_MIRROR_OFFSET = INTERPRETER_FRAME_LOCALS_OFFSET - 1;
+ private static final int INTERPRETER_FRAME_METHOD_OFFSET = INTERPRETER_FRAME_MIRROR_OFFSET - 1;
private static final int INTERPRETER_FRAME_INITIAL_SP_OFFSET = INTERPRETER_FRAME_BCX_OFFSET - 1; // FIXME: probably wrong, but unused anyway
private static final int INTERPRETER_FRAME_MONITOR_BLOCK_TOP_OFFSET = INTERPRETER_FRAME_INITIAL_SP_OFFSET;
private static final int INTERPRETER_FRAME_MONITOR_BLOCK_BOTTOM_OFFSET = INTERPRETER_FRAME_INITIAL_SP_OFFSET;
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java Fri Aug 26 10:14:15 2016 -0700
@@ -714,11 +714,7 @@
/** 2 words, also used to save float regs across calls to C */
public static final int INTERPRETER_FRAME_D_SCRATCH_FP_OFFSET = -2;
public static final int INTERPRETER_FRAME_L_SCRATCH_FP_OFFSET = -4;
- /** For native calls only */
- public static final int INTERPRETER_FRAME_PADDING_OFFSET = -5;
- /** For native calls only */
- public static final int INTERPRETER_FRAME_MIRROR_OFFSET = -6;
- /** Should be same as above, and should be zero mod 8 */
+ public static final int INTERPRETER_FRAME_MIRROR_OFFSET = -5;
public static final int INTERPRETER_FRAME_VM_LOCALS_FP_OFFSET = -6;
public static final int INTERPRETER_FRAME_VM_LOCAL_WORDS = -INTERPRETER_FRAME_VM_LOCALS_FP_OFFSET;
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java Fri Aug 26 10:14:15 2016 -0700
@@ -48,10 +48,10 @@
private static final int SENDER_SP_OFFSET = 2;
// Interpreter frames
- private static final int INTERPRETER_FRAME_MIRROR_OFFSET = 2; // for native calls only
private static final int INTERPRETER_FRAME_SENDER_SP_OFFSET = -1;
private static final int INTERPRETER_FRAME_LAST_SP_OFFSET = INTERPRETER_FRAME_SENDER_SP_OFFSET - 1;
private static final int INTERPRETER_FRAME_METHOD_OFFSET = INTERPRETER_FRAME_LAST_SP_OFFSET - 1;
+ private static int INTERPRETER_FRAME_MIRROR_OFFSET;
private static int INTERPRETER_FRAME_MDX_OFFSET; // Non-core builds only
private static int INTERPRETER_FRAME_CACHE_OFFSET;
private static int INTERPRETER_FRAME_LOCALS_OFFSET;
@@ -74,7 +74,8 @@
}
private static synchronized void initialize(TypeDataBase db) {
- INTERPRETER_FRAME_MDX_OFFSET = INTERPRETER_FRAME_METHOD_OFFSET - 1;
+ INTERPRETER_FRAME_MIRROR_OFFSET = INTERPRETER_FRAME_METHOD_OFFSET - 1;
+ INTERPRETER_FRAME_MDX_OFFSET = INTERPRETER_FRAME_MIRROR_OFFSET - 1;
INTERPRETER_FRAME_CACHE_OFFSET = INTERPRETER_FRAME_MDX_OFFSET - 1;
INTERPRETER_FRAME_LOCALS_OFFSET = INTERPRETER_FRAME_CACHE_OFFSET - 1;
INTERPRETER_FRAME_BCX_OFFSET = INTERPRETER_FRAME_LOCALS_OFFSET - 1;
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/ObjectReader.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/ObjectReader.java Fri Aug 26 10:14:15 2016 -0700
@@ -26,6 +26,7 @@
import java.lang.reflect.Modifier;
import java.util.*;
+import java.util.stream.*;
import sun.jvm.hotspot.debugger.*;
import sun.jvm.hotspot.oops.*;
import sun.jvm.hotspot.runtime.*;
@@ -204,15 +205,29 @@
}
}
- protected Object getHashtable(Instance oop, boolean isProperties) {
+ private void setPropertiesEntry(java.util.Properties p, Oop oop) {
+ InstanceKlass ik = (InstanceKlass)oop.getKlass();
+ OopField keyField = (OopField)ik.findField("key", "Ljava/lang/Object;");
+ OopField valueField = (OopField)ik.findField("val", "Ljava/lang/Object;");
+
+ try {
+ p.setProperty((String)readObject(keyField.getValue(oop)),
+ (String)readObject(valueField.getValue(oop)));
+ } catch (ClassNotFoundException ce) {
+ if (DEBUG) {
+ debugPrintStackTrace(ce);
+ }
+ }
+ }
+
+ protected Object getHashtable(Instance oop) {
InstanceKlass k = (InstanceKlass)oop.getKlass();
OopField tableField = (OopField)k.findField("table", "[Ljava/util/Hashtable$Entry;");
if (tableField == null) {
debugPrintln("Could not find field of [Ljava/util/Hashtable$Entry;");
return null;
}
- java.util.Hashtable table = (isProperties) ? new java.util.Properties()
- : new java.util.Hashtable();
+ java.util.Hashtable table = new java.util.Hashtable();
ObjArray kvs = (ObjArray)tableField.getValue(oop);
long size = kvs.getLength();
debugPrintln("Hashtable$Entry Size = " + size);
@@ -225,6 +240,39 @@
return table;
}
+ private Properties getProperties(Instance oop) {
+ InstanceKlass k = (InstanceKlass)oop.getKlass();
+ OopField mapField = (OopField)k.findField("map", "Ljava/util/concurrent/ConcurrentHashMap;");
+ if (mapField == null) {
+ debugPrintln("Could not find field of Ljava/util/concurrent/ConcurrentHashMap");
+ return null;
+ }
+
+ Instance mapObj = (Instance)mapField.getValue(oop);
+ if (mapObj == null) {
+ debugPrintln("Could not get map field from java.util.Properties");
+ return null;
+ }
+
+ InstanceKlass mk = (InstanceKlass)mapObj.getKlass();
+ OopField tableField = (OopField)mk.findField("table", "[Ljava/util/concurrent/ConcurrentHashMap$Node;");
+ if (tableField == null) {
+ debugPrintln("Could not find field of [Ljava/util/concurrent/ConcurrentHashMap$Node");
+ return null;
+ }
+
+ java.util.Properties props = new java.util.Properties();
+ ObjArray kvs = (ObjArray)tableField.getValue(mapObj);
+ long size = kvs.getLength();
+ debugPrintln("ConcurrentHashMap$Node Size = " + size);
+ LongStream.range(0, size)
+ .mapToObj(kvs::getObjAt)
+ .filter(o -> o != null)
+ .forEach(o -> setPropertiesEntry(props, o));
+
+ return props;
+ }
+
public Object readInstance(Instance oop) throws ClassNotFoundException {
Object result = getFromObjTable(oop);
if (result == null) {
@@ -240,11 +288,11 @@
}
if (kls.getName().equals(javaUtilHashtable())) {
- return getHashtable(oop, false);
+ return getHashtable(oop);
}
if (kls.getName().equals(javaUtilProperties())) {
- return getHashtable(oop, true);
+ return getProperties(oop);
}
Class clz = readClass(kls);
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java Fri Aug 26 10:14:15 2016 -0700
@@ -265,9 +265,10 @@
native HotSpotResolvedObjectTypeImpl resolveTypeInPool(HotSpotConstantPool constantPool, int cpi) throws LinkageError;
/**
- * Looks up and attempts to resolve the {@code JVM_CONSTANT_Field} entry for at index {@code cpi} in
- * {@code constantPool}. For some opcodes, checks are performed that require the {@code method}
- * that contains {@code opcode} to be specified. The values returned in {@code info} are:
+ * Looks up and attempts to resolve the {@code JVM_CONSTANT_Field} entry for at index
+ * {@code cpi} in {@code constantPool}. For some opcodes, checks are performed that require the
+ * {@code method} that contains {@code opcode} to be specified. The values returned in
+ * {@code info} are:
*
* <pre>
* [(int) flags, // only valid if field is resolved
@@ -556,20 +557,18 @@
native HotSpotResolvedJavaMethodImpl getResolvedJavaMethod(Object base, long displacement);
/**
- * Read a HotSpot ConstantPool* value from the memory location described by {@code base} plus
- * {@code displacement} and return the {@link HotSpotConstantPool} wrapping it. This method does
- * no checking that the memory location actually contains a valid pointer and may crash the VM
- * if an invalid location is provided. If the {@code base} is null then {@code displacement} is
- * used by itself. If {@code base} is a {@link HotSpotResolvedJavaMethodImpl},
- * {@link HotSpotConstantPool} or {@link HotSpotResolvedObjectTypeImpl} then the metaspace
- * pointer is fetched from that object and added to {@code displacement}. Any other non-null
- * object type causes an {@link IllegalArgumentException} to be thrown.
+ * Gets the {@code ConstantPool*} associated with {@code object} and returns a
+ * {@link HotSpotConstantPool} wrapping it.
*
- * @param base an object to read from or null
- * @param displacement
- * @return null or the resolved method for this location
+ * @param object a {@link HotSpotResolvedJavaMethodImpl} or
+ * {@link HotSpotResolvedObjectTypeImpl} object
+ * @return a {@link HotSpotConstantPool} wrapping the {@code ConstantPool*} associated with
+ * {@code object}
+ * @throws NullPointerException if {@code object == null}
+ * @throws IllegalArgumentException if {@code object} is neither a
+ * {@link HotSpotResolvedJavaMethodImpl} nor a {@link HotSpotResolvedObjectTypeImpl}
*/
- native HotSpotConstantPool getConstantPool(Object base, long displacement);
+ native HotSpotConstantPool getConstantPool(Object object);
/**
* Read a HotSpot Klass* value from the memory location described by {@code base} plus
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java Fri Aug 26 10:14:15 2016 -0700
@@ -121,7 +121,7 @@
if (metaspaceConstantPool == holder.getConstantPool().getMetaspaceConstantPool()) {
this.constantPool = holder.getConstantPool();
} else {
- this.constantPool = compilerToVM().getConstantPool(null, constMethod + config.constMethodConstantsOffset);
+ this.constantPool = compilerToVM().getConstantPool(this);
}
final int nameIndex = UNSAFE.getChar(constMethod + config.constMethodNameIndexOffset);
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java Fri Aug 26 10:14:15 2016 -0700
@@ -445,7 +445,7 @@
* operating on the latest one and that HotSpotResolvedJavaMethodImpls will be able to
* use the shared copy instead of creating their own instance.
*/
- constantPool = compilerToVM().getConstantPool(this, config().instanceKlassConstantsOffset);
+ constantPool = compilerToVM().getConstantPool(this);
}
return constantPool;
}
--- a/hotspot/src/os/aix/vm/os_aix.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/os/aix/vm/os_aix.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -2686,7 +2686,8 @@
// - sets target osthread state to continue
// - sends signal to end the sigsuspend loop in the SR_handler
//
-// Note that the SR_lock plays no role in this suspend/resume protocol.
+// Note that the SR_lock plays no role in this suspend/resume protocol,
+// but is checked for NULL in SR_handler as a thread termination indicator.
//
static void resume_clear_context(OSThread *osthread) {
@@ -2718,9 +2719,22 @@
// after sigsuspend.
int old_errno = errno;
- Thread* thread = Thread::current();
+ Thread* thread = Thread::current_or_null_safe();
+ assert(thread != NULL, "Missing current thread in SR_handler");
+
+ // On some systems we have seen signal delivery get "stuck" until the signal
+ // mask is changed as part of thread termination. Check that the current thread
+ // has not already terminated (via SR_lock()) - else the following assertion
+ // will fail because the thread is no longer a JavaThread as the ~JavaThread
+ // destructor has completed.
+
+ if (thread->SR_lock() == NULL) {
+ return;
+ }
+
+ assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
+
OSThread* osthread = thread->osthread();
- assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
os::SuspendResume::State current = osthread->sr.state();
if (current == os::SuspendResume::SR_SUSPEND_REQUEST) {
--- a/hotspot/src/os/bsd/vm/os_bsd.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/os/bsd/vm/os_bsd.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -2716,7 +2716,8 @@
// - sets target osthread state to continue
// - sends signal to end the sigsuspend loop in the SR_handler
//
-// Note that the SR_lock plays no role in this suspend/resume protocol.
+// Note that the SR_lock plays no role in this suspend/resume protocol,
+// but is checked for NULL in SR_handler as a thread termination indicator.
static void resume_clear_context(OSThread *osthread) {
osthread->set_ucontext(NULL);
@@ -2746,9 +2747,22 @@
// after sigsuspend.
int old_errno = errno;
- Thread* thread = Thread::current();
+ Thread* thread = Thread::current_or_null_safe();
+ assert(thread != NULL, "Missing current thread in SR_handler");
+
+ // On some systems we have seen signal delivery get "stuck" until the signal
+ // mask is changed as part of thread termination. Check that the current thread
+ // has not already terminated (via SR_lock()) - else the following assertion
+ // will fail because the thread is no longer a JavaThread as the ~JavaThread
+ // destructor has completed.
+
+ if (thread->SR_lock() == NULL) {
+ return;
+ }
+
+ assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
+
OSThread* osthread = thread->osthread();
- assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
os::SuspendResume::State current = osthread->sr.state();
if (current == os::SuspendResume::SR_SUSPEND_REQUEST) {
--- a/hotspot/src/os/linux/vm/os_linux.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/os/linux/vm/os_linux.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -3971,7 +3971,8 @@
// - sets target osthread state to continue
// - sends signal to end the sigsuspend loop in the SR_handler
//
-// Note that the SR_lock plays no role in this suspend/resume protocol.
+// Note that the SR_lock plays no role in this suspend/resume protocol,
+// but is checked for NULL in SR_handler as a thread termination indicator.
static void resume_clear_context(OSThread *osthread) {
osthread->set_ucontext(NULL);
@@ -4004,8 +4005,20 @@
Thread* thread = Thread::current_or_null_safe();
assert(thread != NULL, "Missing current thread in SR_handler");
+
+ // On some systems we have seen signal delivery get "stuck" until the signal
+ // mask is changed as part of thread termination. Check that the current thread
+ // has not already terminated (via SR_lock()) - else the following assertion
+ // will fail because the thread is no longer a JavaThread as the ~JavaThread
+ // destructor has completed.
+
+ if (thread->SR_lock() == NULL) {
+ return;
+ }
+
+ assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
+
OSThread* osthread = thread->osthread();
- assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
os::SuspendResume::State current = osthread->sr.state();
if (current == os::SuspendResume::SR_SUSPEND_REQUEST) {
--- a/hotspot/src/os/posix/vm/os_posix.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/os/posix/vm/os_posix.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -93,10 +93,6 @@
}
int os::get_native_stack(address* stack, int frames, int toSkip) {
-#ifdef _NMT_NOINLINE_
- toSkip++;
-#endif
-
int frame_idx = 0;
int num_of_frames; // number of frames captured
frame fr = os::current_frame();
--- a/hotspot/src/os/windows/vm/os_windows.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/os/windows/vm/os_windows.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -318,9 +318,6 @@
// only supported on Windows XP or later.
//
int os::get_native_stack(address* stack, int frames, int toSkip) {
-#ifdef _NMT_NOINLINE_
- toSkip++;
-#endif
int captured = RtlCaptureStackBackTrace(toSkip + 1, frames, (PVOID*)stack, NULL);
for (int index = captured; index < frames; index ++) {
stack[index] = NULL;
--- a/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -417,7 +417,15 @@
#else
register intptr_t **ebp __asm__ (SPELL_REG_FP);
#endif
- return (intptr_t*) *ebp; // we want what it points to.
+ // ebp is for this frame (_get_previous_fp). We want the ebp for the
+ // caller of os::current_frame*(), so go up two frames. However, for
+ // optimized builds, _get_previous_fp() will be inlined, so only go
+ // up 1 frame in that case.
+#ifdef _NMT_NOINLINE_
+ return **(intptr_t***)ebp;
+#else
+ return *ebp;
+#endif
}
--- a/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -238,6 +238,28 @@
}
}
+ // Make the signal handler transaction-aware by checking the existence of a
+ // second (transactional) context with MSR TS bits active. If the signal is
+ // caught during a transaction, then just return to the HTM abort handler.
+ // Please refer to Linux kernel document powerpc/transactional_memory.txt,
+ // section "Signals".
+ if (uc && uc->uc_link) {
+ ucontext_t* second_uc = uc->uc_link;
+
+ // MSR TS bits are 29 and 30 (Power ISA, v2.07B, Book III-S, pp. 857-858,
+ // 3.2.1 "Machine State Register"), however note that ISA notation for bit
+ // numbering is MSB 0, so for normal bit numbering (LSB 0) they come to be
+ // bits 33 and 34. It's not related to endianness, just a notation matter.
+ if (second_uc->uc_mcontext.regs->msr & 0x600000000) {
+ if (TraceTraps) {
+ tty->print_cr("caught signal in transaction, "
+ "ignoring to jump to abort handler");
+ }
+ // Return control to the HTM abort handler.
+ return true;
+ }
+ }
+
JavaThread* thread = NULL;
VMThread* vmthread = NULL;
if (os::Linux::signal_handlers_are_installed) {
--- a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -235,7 +235,15 @@
#else
register intptr_t **ebp __asm__ (SPELL_REG_FP);
#endif
- return (intptr_t*) *ebp; // we want what it points to.
+ // ebp is for this frame (_get_previous_fp). We want the ebp for the
+ // caller of os::current_frame*(), so go up two frames. However, for
+ // optimized builds, _get_previous_fp() will be inlined, so only go
+ // up 1 frame in that case.
+#ifdef _NMT_NOINLINE_
+ return **(intptr_t***)ebp;
+#else
+ return *ebp;
+#endif
}
--- a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -292,15 +292,19 @@
frame os::current_frame() {
intptr_t* fp = _get_current_fp(); // it's inlined so want current fp
+ // fp is for os::current_frame. We want the fp for our caller.
frame myframe((intptr_t*)os::current_stack_pointer(),
(intptr_t*)fp,
CAST_FROM_FN_PTR(address, os::current_frame));
- if (os::is_first_C_frame(&myframe)) {
+ frame caller_frame = os::get_sender_for_C_frame(&myframe);
+
+ if (os::is_first_C_frame(&caller_frame)) {
// stack is not walkable
frame ret; // This will be a null useless frame
return ret;
} else {
- return os::get_sender_for_C_frame(&myframe);
+ // return frame for our caller's caller
+ return os::get_sender_for_C_frame(&caller_frame);
}
}
--- a/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -496,7 +496,15 @@
__asm {
mov frameptr, ebp
};
+ // ebp (frameptr) is for this frame (_get_previous_fp). We want the ebp for the
+ // caller of os::current_frame*(), so go up two frames. However, for
+ // optimized builds, _get_previous_fp() will be inlined, so only go
+ // up 1 frame in that case.
+#ifdef _NMT_NOINLINE_
+ return **(intptr_t***)frameptr;
+#else
return *frameptr;
+#endif
}
#endif // !AMD64
--- a/hotspot/src/share/vm/classfile/classLoaderData.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/classfile/classLoaderData.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -126,13 +126,17 @@
// ClassLoaderData, no other non-GC thread has knowledge of the anonymous class while
// it is being defined, therefore _keep_alive is not volatile or atomic.
void ClassLoaderData::inc_keep_alive() {
- assert(_keep_alive >= 0, "Invalid keep alive count");
- _keep_alive++;
+ if (is_anonymous()) {
+ assert(_keep_alive >= 0, "Invalid keep alive increment count");
+ _keep_alive++;
+ }
}
void ClassLoaderData::dec_keep_alive() {
- assert(_keep_alive > 0, "Invalid keep alive count");
- _keep_alive--;
+ if (is_anonymous()) {
+ assert(_keep_alive > 0, "Invalid keep alive decrement count");
+ _keep_alive--;
+ }
}
void ClassLoaderData::oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim) {
@@ -1173,7 +1177,7 @@
if (class_loader() == NULL) {
out->print("NULL class_loader");
} else {
- out->print("class loader " INTPTR_FORMAT, p2i(this));
+ out->print("class loader " INTPTR_FORMAT " ", p2i(this));
class_loader()->print_value_on(out);
}
}
--- a/hotspot/src/share/vm/classfile/classLoaderData.hpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/classfile/classLoaderData.hpp Fri Aug 26 10:14:15 2016 -0700
@@ -176,9 +176,9 @@
Mutex* _metaspace_lock; // Locks the metaspace for allocations and setup.
bool _unloading; // true if this class loader goes away
bool _is_anonymous; // if this CLD is for an anonymous class
- int _keep_alive; // if this CLD is kept alive without a keep_alive_object().
- // Currently used solely for anonymous classes.
- // _keep_alive does not need to be volatile or
+ s2 _keep_alive; // if this CLD is kept alive without a keep_alive_object().
+ // Used for anonymous classes and the boot class
+ // loader. _keep_alive does not need to be volatile or
// atomic since there is one unique CLD per anonymous class.
volatile int _claimed; // true if claimed, for example during GC traces.
// To avoid applying oop closure more than once.
@@ -289,6 +289,8 @@
return _unloading;
}
+ // Used to refcount an anonymous class's CLD in order to
+ // indicate their aliveness without a keep_alive_object().
void inc_keep_alive();
void dec_keep_alive();
--- a/hotspot/src/share/vm/code/dependencies.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/code/dependencies.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -1082,12 +1082,11 @@
if (!(m->is_public() || m->is_protected()))
// The override story is complex when packages get involved.
return true; // Must punt the assertion to true.
- Klass* k = ctxk;
- Method* lm = k->lookup_method(m->name(), m->signature());
- if (lm == NULL && k->is_instance_klass()) {
+ Method* lm = ctxk->lookup_method(m->name(), m->signature());
+ if (lm == NULL && ctxk->is_instance_klass()) {
// It might be an interface method
- lm = InstanceKlass::cast(k)->lookup_method_in_ordered_interfaces(m->name(),
- m->signature());
+ lm = InstanceKlass::cast(ctxk)->lookup_method_in_ordered_interfaces(m->name(),
+ m->signature());
}
if (lm == m)
// Method m is inherited into ctxk.
@@ -1101,11 +1100,19 @@
// Static methods don't override non-static so punt
return true;
}
- if ( !Dependencies::is_concrete_method(lm, k)
- && !Dependencies::is_concrete_method(m, ctxk)
- && lm->method_holder()->is_subtype_of(m->method_holder()))
- // Method m is overridden by lm, but both are non-concrete.
- return true;
+ if (!Dependencies::is_concrete_method(lm, ctxk) &&
+ !Dependencies::is_concrete_method(m, ctxk)) {
+ // They are both non-concrete
+ if (lm->method_holder()->is_subtype_of(m->method_holder())) {
+ // Method m is overridden by lm, but both are non-concrete.
+ return true;
+ }
+ if (lm->method_holder()->is_interface() && m->method_holder()->is_interface() &&
+ ctxk->is_subtype_of(m->method_holder()) && ctxk->is_subtype_of(lm->method_holder())) {
+ // Interface method defined in multiple super interfaces
+ return true;
+ }
+ }
}
ResourceMark rm;
tty->print_cr("Dependency method not found in the associated context:");
--- a/hotspot/src/share/vm/gc/g1/g1Analytics.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/gc/g1/g1Analytics.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -316,8 +316,12 @@
return get_new_size_prediction(_pending_cards_seq);
}
+double G1Analytics::oldest_known_gc_end_time_sec() const {
+ return _recent_prev_end_times_for_all_gcs_sec->oldest();
+}
+
double G1Analytics::last_known_gc_end_time_sec() const {
- return _recent_prev_end_times_for_all_gcs_sec->oldest();
+ return _recent_prev_end_times_for_all_gcs_sec->last();
}
void G1Analytics::update_recent_gc_times(double end_time_sec,
--- a/hotspot/src/share/vm/gc/g1/g1Analytics.hpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/gc/g1/g1Analytics.hpp Fri Aug 26 10:14:15 2016 -0700
@@ -155,6 +155,7 @@
void update_recent_gc_times(double end_time_sec, double elapsed_ms);
void compute_pause_time_ratio(double interval_ms, double pause_time_ms);
+ double oldest_known_gc_end_time_sec() const;
double last_known_gc_end_time_sec() const;
};
--- a/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -28,6 +28,7 @@
#include "classfile/symbolTable.hpp"
#include "code/codeCache.hpp"
#include "code/icBuffer.hpp"
+#include "gc/g1/g1Analytics.hpp"
#include "gc/g1/bufferingOopClosure.hpp"
#include "gc/g1/concurrentG1Refine.hpp"
#include "gc/g1/concurrentG1RefineThread.hpp"
@@ -2473,8 +2474,19 @@
}
jlong G1CollectedHeap::millis_since_last_gc() {
- // assert(false, "NYI");
- return 0;
+ jlong now = os::elapsed_counter() / NANOSECS_PER_MILLISEC;
+ const G1Analytics* analytics = _g1_policy->analytics();
+ double last = analytics->last_known_gc_end_time_sec();
+ jlong ret_val = now - (last * 1000);
+ if (ret_val < 0) {
+ // See the notes in GenCollectedHeap::millis_since_last_gc()
+ // for more information about the implementation.
+ log_warning(gc)("Detected clock going backwards. "
+ "Milliseconds since last GC would be " JLONG_FORMAT
+ ". returning zero instead.", ret_val);
+ return 0;
+ }
+ return ret_val;
}
void G1CollectedHeap::prepare_for_verify() {
--- a/hotspot/src/share/vm/gc/g1/g1DefaultPolicy.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/gc/g1/g1DefaultPolicy.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -604,7 +604,7 @@
_analytics->report_alloc_rate_ms(alloc_rate_ms);
double interval_ms =
- (end_time_sec - _analytics->last_known_gc_end_time_sec()) * 1000.0;
+ (end_time_sec - _analytics->oldest_known_gc_end_time_sec()) * 1000.0;
_analytics->update_recent_gc_times(end_time_sec, pause_time_ms);
_analytics->compute_pause_time_ratio(interval_ms, pause_time_ms);
}
--- a/hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -1256,21 +1256,21 @@
};
jlong GenCollectedHeap::millis_since_last_gc() {
- // We need a monotonically non-decreasing time in ms but
- // os::javaTimeMillis() does not guarantee monotonicity.
+ // javaTimeNanos() is guaranteed to be monotonically non-decreasing
+ // provided the underlying platform provides such a time source
+ // (and it is bug free). So we still have to guard against getting
+ // back a time later than 'now'.
jlong now = os::javaTimeNanos() / NANOSECS_PER_MILLISEC;
GenTimeOfLastGCClosure tolgc_cl(now);
// iterate over generations getting the oldest
// time that a generation was collected
generation_iterate(&tolgc_cl, false);
- // javaTimeNanos() is guaranteed to be monotonically non-decreasing
- // provided the underlying platform provides such a time source
- // (and it is bug free). So we still have to guard against getting
- // back a time later than 'now'.
jlong retVal = now - tolgc_cl.time();
if (retVal < 0) {
- NOT_PRODUCT(log_warning(gc)("time warp: " JLONG_FORMAT, retVal);)
+ log_warning(gc)("Detected clock going backwards. "
+ "Milliseconds since last GC would be " JLONG_FORMAT
+ ". returning zero instead.", retVal);
return 0;
}
return retVal;
--- a/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -461,31 +461,26 @@
return JNIHandles::make_local(THREAD, result);
}
-C2V_VMENTRY(jobject, getConstantPool, (JNIEnv *, jobject, jobject base, jlong offset))
+C2V_VMENTRY(jobject, getConstantPool, (JNIEnv *, jobject, jobject object_handle))
constantPoolHandle cp;
- oop base_object = JNIHandles::resolve(base);
- jlong base_address = 0;
- if (base_object != NULL) {
- if (base_object->is_a(SystemDictionary::HotSpotResolvedJavaMethodImpl_klass())) {
- base_address = HotSpotResolvedJavaMethodImpl::metaspaceMethod(base_object);
- } else if (base_object->is_a(SystemDictionary::HotSpotConstantPool_klass())) {
- base_address = HotSpotConstantPool::metaspaceConstantPool(base_object);
- } else if (base_object->is_a(SystemDictionary::HotSpotResolvedObjectTypeImpl_klass())) {
- base_address = (jlong) CompilerToVM::asKlass(base_object);
- } else {
- THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
- err_msg("Unexpected type: %s", base_object->klass()->external_name()));
- }
+ oop object = JNIHandles::resolve(object_handle);
+ if (object == NULL) {
+ THROW_0(vmSymbols::java_lang_NullPointerException());
}
- cp = *((ConstantPool**) (intptr_t) (base_address + offset));
- if (!cp.is_null()) {
- JavaValue method_result(T_OBJECT);
- JavaCallArguments args;
- args.push_long((jlong) (address) cp());
- JavaCalls::call_static(&method_result, SystemDictionary::HotSpotConstantPool_klass(), vmSymbols::fromMetaspace_name(), vmSymbols::constantPool_fromMetaspace_signature(), &args, CHECK_NULL);
- return JNIHandles::make_local(THREAD, (oop)method_result.get_jobject());
+ if (object->is_a(SystemDictionary::HotSpotResolvedJavaMethodImpl_klass())) {
+ cp = CompilerToVM::asMethod(object)->constMethod()->constants();
+ } else if (object->is_a(SystemDictionary::HotSpotResolvedObjectTypeImpl_klass())) {
+ cp = InstanceKlass::cast(CompilerToVM::asKlass(object))->constants();
+ } else {
+ THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
+ err_msg("Unexpected type: %s", object->klass()->external_name()));
}
- return NULL;
+ assert(!cp.is_null(), "npe");
+ JavaValue method_result(T_OBJECT);
+ JavaCallArguments args;
+ args.push_long((jlong) (address) cp());
+ JavaCalls::call_static(&method_result, SystemDictionary::HotSpotConstantPool_klass(), vmSymbols::fromMetaspace_name(), vmSymbols::constantPool_fromMetaspace_signature(), &args, CHECK_NULL);
+ return JNIHandles::make_local(THREAD, (oop)method_result.get_jobject());
}
C2V_VMENTRY(jobject, getResolvedJavaType, (JNIEnv *, jobject, jobject base, jlong offset, jboolean compressed))
@@ -1522,7 +1517,7 @@
{CC "getMaxCallTargetOffset", CC "(J)J", FN_PTR(getMaxCallTargetOffset)},
{CC "getResolvedJavaMethodAtSlot", CC "(" CLASS "I)" HS_RESOLVED_METHOD, FN_PTR(getResolvedJavaMethodAtSlot)},
{CC "getResolvedJavaMethod", CC "(Ljava/lang/Object;J)" HS_RESOLVED_METHOD, FN_PTR(getResolvedJavaMethod)},
- {CC "getConstantPool", CC "(Ljava/lang/Object;J)" HS_CONSTANT_POOL, FN_PTR(getConstantPool)},
+ {CC "getConstantPool", CC "(Ljava/lang/Object;)" HS_CONSTANT_POOL, FN_PTR(getConstantPool)},
{CC "getResolvedJavaType", CC "(Ljava/lang/Object;JZ)" HS_RESOLVED_KLASS, FN_PTR(getResolvedJavaType)},
{CC "readConfiguration", CC "()[" OBJECT, FN_PTR(readConfiguration)},
{CC "installCode", CC "(" TARGET_DESCRIPTION HS_COMPILED_CODE INSTALLED_CODE HS_SPECULATION_LOG ")I", FN_PTR(installCode)},
--- a/hotspot/src/share/vm/logging/logTagSet.hpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/logging/logTagSet.hpp Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
--- a/hotspot/src/share/vm/oops/methodCounters.hpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/oops/methodCounters.hpp Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2016 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
--- a/hotspot/src/share/vm/opto/arraycopynode.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/opto/arraycopynode.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -630,6 +630,12 @@
}
bool ArrayCopyNode::may_modify_helper(const TypeOopPtr *t_oop, Node* n, PhaseTransform *phase, ArrayCopyNode*& ac) {
+ if (n->Opcode() == Op_StoreCM ||
+ n->Opcode() == Op_StoreB) {
+ // Ignore card mark stores
+ n = n->in(MemNode::Memory);
+ }
+
if (n->is_Proj()) {
n = n->in(0);
if (n->is_Call() && n->as_Call()->may_modify(t_oop, phase)) {
@@ -657,9 +663,6 @@
}
}
}
- } else if (n->Opcode() == Op_StoreCM) {
- // Ignore card mark stores
- return may_modify_helper(t_oop, n->in(MemNode::Memory), phase, ac);
}
}
--- a/hotspot/src/share/vm/opto/cfgnode.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/opto/cfgnode.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -1703,29 +1703,51 @@
}
if (uncasted) {
- // Add a cast node between the phi to be removed and its unique input.
+ // Add cast nodes between the phi to be removed and its unique input.
// Wait until after parsing for the type information to propagate from the casts.
assert(can_reshape, "Invalid during parsing");
const Type* phi_type = bottom_type();
assert(phi_type->isa_int() || phi_type->isa_ptr(), "bad phi type");
- int opcode;
- // Determine the type of cast to be added.
+ // Add casts to carry the control dependency of the Phi that is
+ // going away
+ Node* cast = NULL;
if (phi_type->isa_int()) {
- opcode = Op_CastII;
+ cast = ConstraintCastNode::make_cast(Op_CastII, r, uin, phi_type, true);
} else {
const Type* uin_type = phase->type(uin);
- if ((phi_type->join(TypePtr::NOTNULL) == uin_type->join(TypePtr::NOTNULL)) ||
- (!phi_type->isa_oopptr() && !uin_type->isa_oopptr())) {
- opcode = Op_CastPP;
+ if (!phi_type->isa_oopptr() && !uin_type->isa_oopptr()) {
+ cast = ConstraintCastNode::make_cast(Op_CastPP, r, uin, phi_type, true);
} else {
- opcode = Op_CheckCastPP;
+ // Use a CastPP for a cast to not null and a CheckCastPP for
+ // a cast to a new klass (and both if both null-ness and
+ // klass change).
+
+ // If the type of phi is not null but the type of uin may be
+ // null, uin's type must be casted to not null
+ if (phi_type->join(TypePtr::NOTNULL) == phi_type->remove_speculative() &&
+ uin_type->join(TypePtr::NOTNULL) != uin_type->remove_speculative()) {
+ cast = ConstraintCastNode::make_cast(Op_CastPP, r, uin, TypePtr::NOTNULL, true);
+ }
+
+ // If the type of phi and uin, both casted to not null,
+ // differ the klass of uin must be (check)cast'ed to match
+ // that of phi
+ if (phi_type->join_speculative(TypePtr::NOTNULL) != uin_type->join_speculative(TypePtr::NOTNULL)) {
+ Node* n = uin;
+ if (cast != NULL) {
+ cast = phase->transform(cast);
+ n = cast;
+ }
+ cast = ConstraintCastNode::make_cast(Op_CheckCastPP, r, n, phi_type, true);
+ }
+ if (cast == NULL) {
+ cast = ConstraintCastNode::make_cast(Op_CastPP, r, uin, phi_type, true);
+ }
}
}
- // Add a cast to carry the control dependency of the Phi that is
- // going away
- Node* cast = ConstraintCastNode::make_cast(opcode, r, uin, phi_type, true);
+ assert(cast != NULL, "cast should be set");
cast = phase->transform(cast);
- // set all inputs to the new cast so the Phi is removed by Identity
+ // set all inputs to the new cast(s) so the Phi is removed by Identity
PhaseIterGVN* igvn = phase->is_IterGVN();
for (uint i = 1; i < req(); i++) {
set_req_X(i, cast, igvn);
--- a/hotspot/src/share/vm/prims/unsafe.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/prims/unsafe.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -861,6 +861,13 @@
}
const Klass* host_klass = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(host_class));
+
+ // Make sure it's the real host class, not another anonymous class.
+ while (host_klass != NULL && host_klass->is_instance_klass() &&
+ InstanceKlass::cast(host_klass)->is_anonymous()) {
+ host_klass = InstanceKlass::cast(host_klass)->host_klass();
+ }
+
// Primitive types have NULL Klass* fields in their java.lang.Class instances.
if (host_klass == NULL) {
THROW_0(vmSymbols::java_lang_IllegalArgumentException());
--- a/hotspot/src/share/vm/prims/whitebox.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/prims/whitebox.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -679,7 +679,7 @@
WB_END
WB_ENTRY(jboolean, WB_IsIntrinsicAvailable(JNIEnv* env, jobject o, jobject method, jobject compilation_context, jint compLevel))
- if (compLevel < CompLevel_none || compLevel > CompLevel_highest_tier) {
+ if (compLevel < CompLevel_none || compLevel > MIN2((CompLevel) TieredStopAtLevel, CompLevel_highest_tier)) {
return false; // Intrinsic is not available on a non-existent compilation level.
}
jmethodID method_id, compilation_context_id;
@@ -689,6 +689,7 @@
DirectiveSet* directive;
AbstractCompiler* comp = CompileBroker::compiler((int)compLevel);
+ assert(comp != NULL, "compiler not available");
if (compilation_context != NULL) {
compilation_context_id = reflected_method_to_jmid(thread, env, compilation_context);
CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
@@ -698,7 +699,7 @@
// Calling with NULL matches default directive
directive = DirectivesStack::getDefaultDirective(comp);
}
- bool result = CompileBroker::compiler(compLevel)->is_intrinsic_available(mh, directive);
+ bool result = comp->is_intrinsic_available(mh, directive);
DirectivesStack::release(directive);
return result;
WB_END
--- a/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -55,7 +55,8 @@
// Simple log n seems to grow too slowly for tiered, try something faster: log n * log log n
int log_cpu = log2_intptr(os::active_processor_count());
int loglog_cpu = log2_intptr(MAX2(log_cpu, 1));
- count = MAX2(log_cpu * loglog_cpu, 1) * 3 / 2;
+ count = MAX2(log_cpu * loglog_cpu * 3 / 2, 2);
+ FLAG_SET_ERGO(intx, CICompilerCount, count);
}
#else
// On 32-bit systems, the number of compiler threads is limited to 3.
@@ -67,12 +68,18 @@
/// available to the VM and thus cause the VM to crash.
if (FLAG_IS_DEFAULT(CICompilerCount)) {
count = 3;
+ FLAG_SET_ERGO(intx, CICompilerCount, count);
}
#endif
- set_c1_count(MAX2(count / 3, 1));
- set_c2_count(MAX2(count - c1_count(), 1));
- FLAG_SET_ERGO(intx, CICompilerCount, c1_count() + c2_count());
+ if (TieredStopAtLevel < CompLevel_full_optimization) {
+ // No C2 compiler thread required
+ set_c1_count(count);
+ } else {
+ set_c1_count(MAX2(count / 3, 1));
+ set_c2_count(MAX2(count - c1_count(), 1));
+ }
+ assert(count == c1_count() + c2_count(), "inconsistent compiler thread count");
// Some inlining tuning
#ifdef X86
--- a/hotspot/src/share/vm/runtime/frame.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/runtime/frame.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -225,6 +225,19 @@
return NULL;
}
+bool frame::is_entry_frame_valid(JavaThread* thread) const {
+ // Validate the JavaCallWrapper an entry frame must have
+ address jcw = (address)entry_frame_call_wrapper();
+ bool jcw_safe = (jcw < thread->stack_base()) && (jcw > (address)fp()); // less than stack base
+ if (!jcw_safe) {
+ return false;
+ }
+
+ // Validate sp saved in the java frame anchor
+ JavaFrameAnchor* jfa = entry_frame_call_wrapper()->anchor();
+ return (jfa->last_Java_sp() > sp());
+}
+
bool frame::should_be_deoptimized() const {
if (_deopt_state == is_deoptimized ||
!is_compiled_frame() ) return false;
--- a/hotspot/src/share/vm/runtime/frame.hpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/runtime/frame.hpp Fri Aug 26 10:14:15 2016 -0700
@@ -166,6 +166,8 @@
frame sender_for_interpreter_frame(RegisterMap* map) const;
frame sender_for_native_frame(RegisterMap* map) const;
+ bool is_entry_frame_valid(JavaThread* thread) const;
+
// All frames:
// A low-level interface for vframes:
--- a/hotspot/src/share/vm/runtime/globals.hpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/runtime/globals.hpp Fri Aug 26 10:14:15 2016 -0700
@@ -2411,7 +2411,7 @@
product(intx, CICompilerCount, CI_COMPILER_COUNT, \
"Number of compiler threads to run") \
range(0, max_jint) \
- constraint(CICompilerCountConstraintFunc, AtParse) \
+ constraint(CICompilerCountConstraintFunc, AfterErgo) \
\
product(intx, CompilationPolicyChoice, 0, \
"which compilation policy (0-3)") \
--- a/hotspot/src/share/vm/runtime/reflection.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/runtime/reflection.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -660,11 +660,13 @@
}
const Klass* host_class = current_class;
- while (host_class->is_instance_klass() &&
- InstanceKlass::cast(host_class)->is_anonymous()) {
- const Klass* next_host_class = InstanceKlass::cast(host_class)->host_klass();
- if (next_host_class == NULL) break;
- host_class = next_host_class;
+ if (host_class->is_instance_klass() &&
+ InstanceKlass::cast(host_class)->is_anonymous()) {
+ host_class = InstanceKlass::cast(host_class)->host_klass();
+ assert(host_class != NULL, "Anonymous class has null host class");
+ assert(!(host_class->is_instance_klass() &&
+ InstanceKlass::cast(host_class)->is_anonymous()),
+ "host_class should not be anonymous");
}
if (host_class == field_class) {
return true;
--- a/hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -147,12 +147,18 @@
// performed on 32-bit systems because it can lead to exhaustion
// of the virtual memory address space available to the JVM.
if (CICompilerCountPerCPU) {
- count = MAX2(log2_intptr(os::active_processor_count()), 1) * 3 / 2;
+ count = MAX2(log2_intptr(os::active_processor_count()) * 3 / 2, 2);
+ FLAG_SET_ERGO(intx, CICompilerCount, count);
}
#endif
- set_c1_count(MAX2(count / 3, 1));
- set_c2_count(MAX2(count - c1_count(), 1));
- FLAG_SET_ERGO(intx, CICompilerCount, c1_count() + c2_count());
+ if (TieredStopAtLevel < CompLevel_full_optimization) {
+ // No C2 compiler thread required
+ set_c1_count(count);
+ } else {
+ set_c1_count(MAX2(count / 3, 1));
+ set_c2_count(MAX2(count - c1_count(), 1));
+ }
+ assert(count == c1_count() + c2_count(), "inconsistent compiler thread count");
}
void SimpleThresholdPolicy::set_carry_if_necessary(InvocationCounter *counter) {
--- a/hotspot/src/share/vm/runtime/thread.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/runtime/thread.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -374,11 +374,14 @@
delete handle_area();
delete metadata_handles();
+ // SR_handler uses this as a termination indicator -
+ // needs to happen before os::free_thread()
+ delete _SR_lock;
+ _SR_lock = NULL;
+
// osthread() can be NULL, if creation of thread failed.
if (osthread() != NULL) os::free_thread(osthread());
- delete _SR_lock;
-
// clear Thread::current if thread is deleting itself.
// Needed to ensure JNI correctly detects non-attached threads.
if (this == Thread::current()) {
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -2643,7 +2643,7 @@
/* DEFAULT_CACHE_LINE_SIZE (globalDefinitions.hpp) */ \
/***************************************************/ \
\
- declare_constant(DEFAULT_CACHE_LINE_SIZE) \
+ declare_preprocessor_constant("DEFAULT_CACHE_LINE_SIZE", DEFAULT_CACHE_LINE_SIZE) \
\
declare_constant(Deoptimization::Unpack_deopt) \
declare_constant(Deoptimization::Unpack_exception) \
--- a/hotspot/src/share/vm/utilities/nativeCallStack.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/src/share/vm/utilities/nativeCallStack.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -33,6 +33,19 @@
_hash_value(0) {
if (fillStack) {
+ // We need to skip the NativeCallStack::NativeCallStack frame if a tail call is NOT used
+ // to call os::get_native_stack. A tail call is used if _NMT_NOINLINE_ is not defined
+ // (which means this is not a slowdebug build), and we are on 64-bit (except Windows).
+ // This is not necessarily a rule, but what has been obvserved to date.
+#define TAIL_CALL (!defined(_NMT_NOINLINE_) && !defined(WINDOWS) && defined(_LP64))
+#if !TAIL_CALL
+ toSkip++;
+#if (defined(_NMT_NOINLINE_) && defined(BSD) && defined(_LP64))
+ // Mac OS X slowdebug builds have this odd behavior where NativeCallStack::NativeCallStack
+ // appears as two frames, so we need to skip an extra frame.
+ toSkip++;
+#endif
+#endif
os::get_native_stack(_stack, NMT_TrackingStackDepth, toSkip);
} else {
for (int index = 0; index < NMT_TrackingStackDepth; index ++) {
--- a/hotspot/test/Makefile Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/test/Makefile Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -226,6 +226,9 @@
( \
jtregExitCode=$$? && \
_summary="$(SUMMARY_TXT)"; \
+ if [ $${jtregExitCode} = 1 ] ; then \
+ jtregExitCode=0; \
+ fi; \
$(RM) -f $(STATS_TXT) $(RUNLIST) $(PASSLIST) $(FAILLIST) $(EXITCODE); \
$(ECHO) "$${jtregExitCode}" > $(EXITCODE); \
if [ -r "$${_summary}" ] ; then \
--- a/hotspot/test/TEST.groups Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/test/TEST.groups Fri Aug 26 10:14:15 2016 -0700
@@ -167,7 +167,7 @@
gc/survivorAlignment \
runtime/InternalApi/ThreadCpuTimesDeadlock.java \
runtime/NMT/JcmdSummaryDiff.java \
- runtime/RedefineTests/RedefineAnnotations.java
+ runtime/RedefineTests/RedefineAnnotations.java \
serviceability/sa/jmap-hashcode/Test8028623.java \
serviceability/threads/TestFalseDeadLock.java \
compiler/codecache/jmx \
@@ -282,7 +282,7 @@
-compiler/c2/Test6905845.java \
-compiler/c2/cr6340864 \
-compiler/c2/cr6589834 \
- -compiler/c2/cr8004867
+ -compiler/c2/cr8004867 \
-compiler/c2/stemmer \
-compiler/c2/Test6792161.java \
-compiler/c2/Test6603011.java \
--- a/hotspot/test/compiler/arguments/CheckCICompilerCount.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/test/compiler/arguments/CheckCICompilerCount.java Fri Aug 26 10:14:15 2016 -0700
@@ -23,8 +23,7 @@
/*
* @test CheckCheckCICompilerCount
- * @bug 8130858
- * @bug 8132525
+ * @bug 8130858 8132525 8162881
* @summary Check that correct range of values for CICompilerCount are allowed depending on whether tiered is enabled or not
* @library /testlibrary /
* @modules java.base/jdk.internal.misc
@@ -54,6 +53,13 @@
"-version"
},
{
+ "-server",
+ "-XX:+PrintFlagsFinal",
+ "-XX:CICompilerCount=1",
+ "-XX:-TieredCompilation",
+ "-version"
+ },
+ {
"-client",
"-XX:-TieredCompilation",
"-XX:+PrintFlagsFinal",
@@ -66,30 +72,31 @@
"-XX:+PrintFlagsFinal",
"-XX:CICompilerCount=1",
"-version"
+ },
+ {
+ "-client",
+ "-XX:+PrintFlagsFinal",
+ "-XX:CICompilerCount=1",
+ "-XX:-TieredCompilation",
+ "-version"
}
};
- private static final String[][] NON_TIERED_EXPECTED_OUTPUTS = {
- {
+ private static final String[] NON_TIERED_EXPECTED_OUTPUTS = {
"CICompilerCount (0) must be at least 1",
- "Improperly specified VM option 'CICompilerCount=0'"
- },
- {
+ "intx CICompilerCount = 1 {product} {command line}",
+ "intx CICompilerCount = 1 {product} {command line}",
+ "CICompilerCount (0) must be at least 1",
+ "intx CICompilerCount = 1 {product} {command line}",
"intx CICompilerCount = 1 {product} {command line}"
- },
- {
- "CICompilerCount (0) must be at least 1",
- "Improperly specified VM option 'CICompilerCount=0'"
- },
- {
- "intx CICompilerCount = 1 {product} {command line}"
- }
};
private static final int[] NON_TIERED_EXIT = {
1,
0,
+ 0,
1,
+ 0,
0
};
@@ -104,6 +111,22 @@
{
"-server",
"-XX:+TieredCompilation",
+ "-XX:TieredStopAtLevel=1",
+ "-XX:+PrintFlagsFinal",
+ "-XX:CICompilerCount=1",
+ "-version"
+ },
+ {
+ "-server",
+ "-XX:+TieredCompilation",
+ "-XX:+PrintFlagsFinal",
+ "-XX:CICompilerCount=1",
+ "-XX:TieredStopAtLevel=1",
+ "-version"
+ },
+ {
+ "-server",
+ "-XX:+TieredCompilation",
"-XX:+PrintFlagsFinal",
"-XX:CICompilerCount=2",
"-version"
@@ -118,37 +141,51 @@
{
"-client",
"-XX:+TieredCompilation",
+ "-XX:TieredStopAtLevel=1",
+ "-XX:+PrintFlagsFinal",
+ "-XX:CICompilerCount=1",
+ "-version"
+ },
+ {
+ "-client",
+ "-XX:+TieredCompilation",
+ "-XX:+PrintFlagsFinal",
+ "-XX:CICompilerCount=1",
+ "-XX:TieredStopAtLevel=1",
+ "-version"
+ },
+ {
+ "-client",
+ "-XX:+TieredCompilation",
"-XX:+PrintFlagsFinal",
"-XX:CICompilerCount=2",
"-version"
}
};
- private static final String[][] TIERED_EXPECTED_OUTPUTS = {
- {
+ private static final String[] TIERED_EXPECTED_OUTPUTS = {
"CICompilerCount (1) must be at least 2",
- "Improperly specified VM option 'CICompilerCount=1'"
- },
- {
- "intx CICompilerCount = 2 {product} {command line, ergonomic}"
- },
- {
+ "intx CICompilerCount = 1 {product} {command line}",
+ "intx CICompilerCount = 1 {product} {command line}",
+ "intx CICompilerCount = 2 {product} {command line}",
"CICompilerCount (1) must be at least 2",
- "Improperly specified VM option 'CICompilerCount=1'"
- },
- {
- "intx CICompilerCount = 2 {product} {command line, ergonomic}"
- }
+ "intx CICompilerCount = 1 {product} {command line}",
+ "intx CICompilerCount = 1 {product} {command line}",
+ "intx CICompilerCount = 2 {product} {command line}",
};
private static final int[] TIERED_EXIT = {
1,
0,
+ 0,
+ 0,
1,
+ 0,
+ 0,
0
};
- private static void verifyValidOption(String[] arguments, String[] expected_outputs, int exit, boolean tiered) throws Exception {
+ private static void verifyValidOption(String[] arguments, String expected_output, int exit, boolean tiered) throws Exception {
ProcessBuilder pb;
OutputAnalyzer out;
@@ -157,9 +194,7 @@
try {
out.shouldHaveExitValue(exit);
- for (String expected_output : expected_outputs) {
- out.shouldContain(expected_output);
- }
+ out.shouldContain(expected_output);
} catch (RuntimeException e) {
// Check if tiered compilation is available in this JVM
// Version. Throw exception only if it is available.
--- a/hotspot/test/compiler/arraycopy/TestEliminatedArrayCopyDeopt.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/test/compiler/arraycopy/TestEliminatedArrayCopyDeopt.java Fri Aug 26 10:14:15 2016 -0700
@@ -25,7 +25,6 @@
* @test
* @bug 8130847 8156760
* @summary Eliminated instance/array written to by an array copy variant must be correctly initialized when reallocated at a deopt
- * @ignore 8136818
* @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement
* compiler.arraycopy.TestEliminatedArrayCopyDeopt
* @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement
--- a/hotspot/test/compiler/c2/Test6792161.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/test/compiler/c2/Test6792161.java Fri Aug 26 10:14:15 2016 -0700
@@ -27,7 +27,7 @@
* @bug 6792161
* @summary assert("No dead instructions after post-alloc")
*
- * @run main/othervm/timeout=600 -Xcomp -XX:MaxInlineSize=120 compiler.c2.Test6792161
+ * @run main/othervm/timeout=600 -Xcomp -XX:-TieredCompilation -XX:MaxInlineSize=120 compiler.c2.Test6792161
*/
package compiler.c2;
--- a/hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -36,6 +36,11 @@
* -XX:CompileCommand=compileonly,null::* -XX:-UseLargePages
* -XX:+SegmentedCodeCache
* compiler.codecache.jmx.InitialAndMaxUsageTest
+ * @run main/othervm -Xbootclasspath/a:. -XX:-UseCodeCacheFlushing
+ * -XX:-MethodFlushing -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
+ * -XX:CompileCommand=compileonly,null::* -XX:-UseLargePages
+ * -XX:-SegmentedCodeCache
+ * compiler.codecache.jmx.InitialAndMaxUsageTest
*/
package compiler.codecache.jmx;
@@ -70,10 +75,16 @@
}
}
- private void fillWithSize(long size, List<Long> blobs) {
+ private void fillWithSize(long size, List<Long> blobs, MemoryPoolMXBean bean) {
long blob;
- while ((blob = CodeCacheUtils.WB.allocateCodeBlob(size, btype.id))
- != 0L) {
+ /* Don't fill too much to have space for adapters. So, stop after crossing 95% and
+ don't allocate in case we'll cross 97% on next allocation. We can hit situation
+ like 94% -> (1 allocation) -> 100% otherwise. So, check if
+ <Usage + allocatedSize> is less than 97%, then allocate in case it is, then, stop
+ further allocations with given size in case <Usage> more than 95% */
+ while (((double) bean.getUsage().getUsed() + size <= (CACHE_USAGE_COEF + 0.02d) * maxSize)
+ && (blob = CodeCacheUtils.WB.allocateCodeBlob(size, btype.id)) != 0L
+ && ((double) bean.getUsage().getUsed() <= CACHE_USAGE_COEF * maxSize)) {
blobs.add(blob);
}
}
@@ -90,13 +101,13 @@
Asserts.assertEQ(initialUsage, 0L, "Unexpected initial usage");
}
ArrayList<Long> blobs = new ArrayList<>();
- long minAllocationUnit = Math.max(0, CodeCacheUtils.MIN_ALLOCATION - headerSize);
+ long minAllocationUnit = Math.max(1, CodeCacheUtils.MIN_ALLOCATION - headerSize);
/* now filling code cache with large-sized allocation first, since
lots of small allocations takes too much time, so, just a small
optimization */
try {
for (int coef = 1000000; coef > 0; coef /= 10) {
- fillWithSize(coef * minAllocationUnit, blobs);
+ fillWithSize(coef * minAllocationUnit, blobs, bean);
}
Asserts.assertGT((double) bean.getUsage().getUsed(),
CACHE_USAGE_COEF * maxSize, String.format("Unable to fill "
--- a/hotspot/test/compiler/codecache/jmx/ThresholdNotificationsTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/test/compiler/codecache/jmx/ThresholdNotificationsTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -31,11 +31,11 @@
* @build compiler.codecache.jmx.ThresholdNotificationsTest
* @run driver ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm -Xbootclasspath/a:. -XX:-UseCodeCacheFlushing
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -Xbootclasspath/a:. -XX:-UseCodeCacheFlushing
* -XX:+WhiteBoxAPI -XX:-MethodFlushing -XX:CompileCommand=compileonly,null::*
* -XX:+SegmentedCodeCache
* compiler.codecache.jmx.ThresholdNotificationsTest
- * @run main/othervm -Xbootclasspath/a:. -XX:-UseCodeCacheFlushing
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -Xbootclasspath/a:. -XX:-UseCodeCacheFlushing
* -XX:+WhiteBoxAPI -XX:-MethodFlushing -XX:CompileCommand=compileonly,null::*
* -XX:-SegmentedCodeCache
* compiler.codecache.jmx.ThresholdNotificationsTest
@@ -63,7 +63,9 @@
public static void main(String[] args) {
for (BlobType bt : BlobType.getAvailable()) {
- new ThresholdNotificationsTest(bt).runTest();
+ if (CodeCacheUtils.isCodeHeapPredictable(bt)) {
+ new ThresholdNotificationsTest(bt).runTest();
+ }
}
}
--- a/hotspot/test/compiler/codecache/jmx/UsageThresholdExceededTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/test/compiler/codecache/jmx/UsageThresholdExceededTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -63,7 +63,9 @@
public static void main(String[] args) {
int iterationsCount = Integer.getInteger("jdk.test.lib.iterations", 1);
for (BlobType btype : BlobType.getAvailable()) {
- new UsageThresholdExceededTest(btype, iterationsCount).runTest();
+ if (CodeCacheUtils.isCodeHeapPredictable(btype)) {
+ new UsageThresholdExceededTest(btype, iterationsCount).runTest();
+ }
}
}
--- a/hotspot/test/compiler/codecache/jmx/UsageThresholdIncreasedTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/test/compiler/codecache/jmx/UsageThresholdIncreasedTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -29,9 +29,9 @@
* @modules java.base/jdk.internal.misc
* java.management
*
+ * @build compiler.codecache.jmx.UsageThresholdIncreasedTest
* @run driver ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
- * @build compiler.codecache.jmx.UsageThresholdIncreasedTest
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
* -XX:+WhiteBoxAPI -XX:-UseCodeCacheFlushing -XX:-MethodFlushing
* -XX:CompileCommand=compileonly,null::*
--- a/hotspot/test/compiler/codecache/stress/RandomAllocationTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/test/compiler/codecache/stress/RandomAllocationTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -24,6 +24,7 @@
/*
* @test RandomAllocationTest
+ * @key stress
* @summary stressing code cache by allocating randomly sized "dummy" code blobs
* @library /testlibrary /test/lib /
* @modules java.base/jdk.internal.misc
--- a/hotspot/test/compiler/codecache/stress/UnexpectedDeoptimizationTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/test/compiler/codecache/stress/UnexpectedDeoptimizationTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -24,6 +24,7 @@
/*
* @test UnexpectedDeoptimizationTest
+ * @key stress
* @summary stressing code cache by forcing unexpected deoptimizations
* @library /testlibrary /test/lib /
* @modules java.base/jdk.internal.misc
--- a/hotspot/test/compiler/codegen/aes/TestAESMain.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/test/compiler/codegen/aes/TestAESMain.java Fri Aug 26 10:14:15 2016 -0700
@@ -25,6 +25,7 @@
/**
* @test
* @bug 7184394
+ * @key stress
* @summary add intrinsics to use AES instructions
* @library /testlibrary /
* @modules java.base/jdk.internal.misc
--- a/hotspot/test/compiler/floatingpoint/ModNaN.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/test/compiler/floatingpoint/ModNaN.java Fri Aug 26 10:14:15 2016 -0700
@@ -26,7 +26,6 @@
* @bug 8015396
* @summary double a%b returns NaN for some (a,b) (|a| < inf, |b|>0) (on Core i7 980X)
*
- * @ignore 8145543
* @run main compiler.floatingpoint.ModNaN
*/
--- a/hotspot/test/compiler/intrinsics/IntrinsicAvailableTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/test/compiler/intrinsics/IntrinsicAvailableTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -114,7 +114,7 @@
public void test() throws Exception {
Executable intrinsicMethod = testCase.getExecutable();
- if (Platform.isServer()) {
+ if (Platform.isServer() && (TIERED_STOP_AT_LEVEL == COMP_LEVEL_FULL_OPTIMIZATION)) {
if (TIERED_COMPILATION) {
checkIntrinsicForCompilationLevel(intrinsicMethod, COMP_LEVEL_SIMPLE);
}
--- a/hotspot/test/compiler/intrinsics/IntrinsicDisabledTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/test/compiler/intrinsics/IntrinsicDisabledTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -59,9 +59,9 @@
private static final int COMP_LEVEL_FULL_OPTIMIZATION = 4;
/* Determine if tiered compilation is enabled. */
- private static boolean isTieredCompilationEnabled() {
- return Boolean.valueOf(Objects.toString(wb.getVMFlag("TieredCompilation")));
- }
+ private static final boolean TIERED_COMPILATION = wb.getBooleanVMFlag("TieredCompilation");
+
+ private static final int TIERED_STOP_AT_LEVEL = wb.getIntxVMFlag("TieredStopAtLevel").intValue();
/* This test uses several methods from jdk.internal.misc.Unsafe. The method
* getMethod() returns a different Executable for each different
@@ -202,8 +202,8 @@
}
public static void main(String args[]) {
- if (Platform.isServer()) {
- if (isTieredCompilationEnabled()) {
+ if (Platform.isServer() && (TIERED_STOP_AT_LEVEL == COMP_LEVEL_FULL_OPTIMIZATION)) {
+ if (TIERED_COMPILATION) {
test(COMP_LEVEL_SIMPLE);
}
test(COMP_LEVEL_FULL_OPTIMIZATION);
--- a/hotspot/test/compiler/jvmci/common/patches/jdk.vm.ci/jdk/vm/ci/hotspot/CompilerToVMHelper.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/test/compiler/jvmci/common/patches/jdk.vm.ci/jdk/vm/ci/hotspot/CompilerToVMHelper.java Fri Aug 26 10:14:15 2016 -0700
@@ -273,8 +273,8 @@
return CTVM.getResolvedJavaMethod(base, displacement);
}
- public static HotSpotConstantPool getConstantPool(Object base, long displacement) {
- return CTVM.getConstantPool(base, displacement);
+ public static HotSpotConstantPool getConstantPool(Object object) {
+ return CTVM.getConstantPool(object);
}
public static HotSpotResolvedObjectType getResolvedJavaType(Object base,
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/jvmci/common/testcases/DuplicateSimpleSingleImplementerInterface.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.jvmci.common.testcases;
+
+public interface DuplicateSimpleSingleImplementerInterface {
+ void interfaceMethod();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/jvmci/common/testcases/MultipleSuperImplementers.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.jvmci.common.testcases;
+
+public abstract class MultipleSuperImplementers implements DuplicateSimpleSingleImplementerInterface, SimpleSingleImplementerInterface {
+ public void finalize() {
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/jvmci/common/testcases/SimpleSingleImplementerInterface.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.jvmci.common.testcases;
+
+public interface SimpleSingleImplementerInterface {
+ void interfaceMethod();
+}
--- a/hotspot/test/compiler/jvmci/compilerToVM/FindUniqueConcreteMethodTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/test/compiler/jvmci/compilerToVM/FindUniqueConcreteMethodTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -32,6 +32,8 @@
* java.base/jdk.internal.org.objectweb.asm.tree
* jdk.vm.ci/jdk.vm.ci.hotspot
* jdk.vm.ci/jdk.vm.ci.code
+ * jdk.vm.ci/jdk.vm.ci.meta
+ * jdk.vm.ci/jdk.vm.ci.runtime
* @build jdk.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
* @build compiler.jvmci.compilerToVM.FindUniqueConcreteMethodTest
* @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI
@@ -41,7 +43,10 @@
package compiler.jvmci.compilerToVM;
import compiler.jvmci.common.CTVMUtilities;
+import compiler.jvmci.common.testcases.DuplicateSimpleSingleImplementerInterface;
+import compiler.jvmci.common.testcases.SimpleSingleImplementerInterface;
import compiler.jvmci.common.testcases.MultipleImplementer1;
+import compiler.jvmci.common.testcases.MultipleSuperImplementers;
import compiler.jvmci.common.testcases.SingleImplementer;
import compiler.jvmci.common.testcases.SingleImplementerInterface;
import compiler.jvmci.common.testcases.SingleSubclass;
@@ -96,6 +101,11 @@
// static method
result.add(new TestCase(false, SingleSubclass.class,
SingleSubclass.class, "staticMethod"));
+ // interface method
+ result.add(new TestCase(false, MultipleSuperImplementers.class,
+ DuplicateSimpleSingleImplementerInterface.class, "interfaceMethod", false));
+ result.add(new TestCase(false, MultipleSuperImplementers.class,
+ SimpleSingleImplementerInterface.class, "interfaceMethod", false));
return result;
}
@@ -103,7 +113,7 @@
System.out.println(tcase);
Method method = tcase.holder.getDeclaredMethod(tcase.methodName);
HotSpotResolvedJavaMethod testMethod = CTVMUtilities
- .getResolvedMethod(tcase.receiver, method);
+ .getResolvedMethod(tcase.methodFromReceiver ? tcase.receiver : tcase.holder, method);
HotSpotResolvedObjectType resolvedType = CompilerToVMHelper
.lookupType(Utils.toJVMTypeSignature(tcase.receiver), getClass(),
/* resolve = */ true);
@@ -118,20 +128,25 @@
public final Class<?> holder;
public final String methodName;
public final boolean isPositive;
+ public final boolean methodFromReceiver;
public TestCase(boolean isPositive, Class<?> clazz, Class<?> holder,
- String methodName) {
+ String methodName, boolean methodFromReceiver) {
this.receiver = clazz;
this.methodName = methodName;
this.isPositive = isPositive;
this.holder = holder;
+ this.methodFromReceiver = methodFromReceiver;
+ }
+
+ public TestCase(boolean isPositive, Class<?> clazz, Class<?> holder, String methodName) {
+ this(isPositive, clazz, holder, methodName, true);
}
@Override
public String toString() {
- return String.format("CASE: receiver=%s, holder=%s, method=%s,"
- + " isPositive=%s", receiver.getName(),
- holder.getName(), methodName, isPositive);
+ return String.format("CASE: receiver=%s, holder=%s, method=%s, isPositive=%s, methodFromReceiver=%s",
+ receiver.getName(), holder.getName(), methodName, isPositive, methodFromReceiver);
}
}
}
--- a/hotspot/test/compiler/jvmci/compilerToVM/GetConstantPoolTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/test/compiler/jvmci/compilerToVM/GetConstantPoolTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -29,187 +29,76 @@
* @library /testlibrary /test/lib /
* @library ../common/patches
* @modules java.base/jdk.internal.misc
- * @modules jdk.vm.ci/jdk.vm.ci.hotspot
+ * @modules java.base/jdk.internal.org.objectweb.asm
+ java.base/jdk.internal.org.objectweb.asm.tree
+ jdk.vm.ci/jdk.vm.ci.hotspot
* jdk.vm.ci/jdk.vm.ci.meta
+ * jdk.vm.ci/jdk.vm.ci.code
*
* @build jdk.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
- * @build jdk.vm.ci/jdk.vm.ci.hotspot.PublicMetaspaceWrapperObject
* @build compiler.jvmci.compilerToVM.GetConstantPoolTest
- * @build sun.hotspot.WhiteBox
- * @run driver ClassFileInstaller sun.hotspot.WhiteBox
- * sun.hotspot.WhiteBox$WhiteBoxPermission
* @run main/othervm -Xbootclasspath/a:.
- * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
+ * -XX:+UnlockDiagnosticVMOptions
* -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI
* compiler.jvmci.compilerToVM.GetConstantPoolTest
*/
package compiler.jvmci.compilerToVM;
-import jdk.internal.misc.Unsafe;
import jdk.test.lib.Utils;
+import compiler.jvmci.common.CTVMUtilities;
+import compiler.jvmci.common.testcases.TestCase;
import jdk.vm.ci.hotspot.CompilerToVMHelper;
import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
-import jdk.vm.ci.hotspot.PublicMetaspaceWrapperObject;
+import jdk.vm.ci.hotspot.HotSpotResolvedObjectType;
import jdk.vm.ci.meta.ConstantPool;
-import sun.hotspot.WhiteBox;
import java.lang.reflect.Field;
+import java.lang.reflect.Executable;
/**
* Tests for jdk.vm.ci.hotspot.CompilerToVM::getConstantPool method
*/
public class GetConstantPoolTest {
- private static enum TestCase {
- NULL_BASE {
- @Override
- ConstantPool getConstantPool() {
- return CompilerToVMHelper.getConstantPool(null,
- getPtrToCpAddress());
- }
- },
- JAVA_METHOD_BASE {
- @Override
- ConstantPool getConstantPool() {
- HotSpotResolvedJavaMethod methodInstance
- = CompilerToVMHelper.getResolvedJavaMethodAtSlot(
- TEST_CLASS, 0);
- Field field;
- try {
- // jdk.vm.ci.hotspot.HotSpotResolvedJavaMethodImpl.metaspaceMethod
- field = methodInstance.getClass()
- .getDeclaredField("metaspaceMethod");
- field.setAccessible(true);
- field.set(methodInstance, getPtrToCpAddress());
- } catch (ReflectiveOperationException e) {
- throw new Error("TESTBUG : " + e, e);
- }
- return CompilerToVMHelper.getConstantPool(methodInstance, 0L);
- }
- },
- CONSTANT_POOL_BASE {
- @Override
- ConstantPool getConstantPool() {
- ConstantPool cpInst;
- try {
- cpInst = CompilerToVMHelper.getConstantPool(null,
- getPtrToCpAddress());
- Field field = CompilerToVMHelper.HotSpotConstantPoolClass()
- .getDeclaredField("metaspaceConstantPool");
- field.setAccessible(true);
- field.set(cpInst, getPtrToCpAddress());
- } catch (ReflectiveOperationException e) {
- throw new Error("TESTBUG : " + e.getMessage(), e);
- }
- return CompilerToVMHelper.getConstantPool(cpInst, 0L);
- }
- },
- CONSTANT_POOL_BASE_IN_TWO {
- @Override
- ConstantPool getConstantPool() {
- long ptr = getPtrToCpAddress();
- ConstantPool cpInst;
- try {
- cpInst = CompilerToVMHelper.getConstantPool(null, ptr);
- Field field = CompilerToVMHelper.HotSpotConstantPoolClass()
- .getDeclaredField("metaspaceConstantPool");
- field.setAccessible(true);
- field.set(cpInst, ptr / 2L);
- } catch (ReflectiveOperationException e) {
- throw new Error("TESTBUG : " + e.getMessage(), e);
- }
- return CompilerToVMHelper.getConstantPool(cpInst,
- ptr - ptr / 2L);
- }
- },
- CONSTANT_POOL_BASE_ZERO {
- @Override
- ConstantPool getConstantPool() {
- long ptr = getPtrToCpAddress();
- ConstantPool cpInst;
- try {
- cpInst = CompilerToVMHelper.getConstantPool(null, ptr);
- Field field = CompilerToVMHelper.HotSpotConstantPoolClass()
- .getDeclaredField("metaspaceConstantPool");
- field.setAccessible(true);
- field.set(cpInst, 0L);
- } catch (ReflectiveOperationException e) {
- throw new Error("TESTBUG : " + e.getMessage(), e);
- }
- return CompilerToVMHelper.getConstantPool(cpInst, ptr);
- }
- },
- ;
- abstract ConstantPool getConstantPool();
+ public static void testMethod(Executable executable) {
+ test(CTVMUtilities.getResolvedMethod(executable));
}
- private static final WhiteBox WB = WhiteBox.getWhiteBox();
- private static final Unsafe UNSAFE = Utils.getUnsafe();
-
- private static final Class TEST_CLASS = GetConstantPoolTest.class;
- private static final long CP_ADDRESS
- = WB.getConstantPool(GetConstantPoolTest.class);
+ public static void testClass(Class cls) {
+ HotSpotResolvedObjectType type = CompilerToVMHelper
+ .lookupType(Utils.toJVMTypeSignature(cls),
+ GetConstantPoolTest.class, /* resolve = */ true);
+ test(type);
+ }
- public void test(TestCase testCase) {
- System.out.println(testCase.name());
- ConstantPool cp = testCase.getConstantPool();
- String cpStringRep = cp.toString();
- String cpClassSimpleName
- = CompilerToVMHelper.HotSpotConstantPoolClass().getSimpleName();
- if (!cpStringRep.contains(cpClassSimpleName)
- || !cpStringRep.contains(TEST_CLASS.getName())) {
- String msg = String.format("%s : "
- + " Constant pool is not valid."
- + " String representation should contain \"%s\" and \"%s\"",
- testCase.name(), cpClassSimpleName,
- TEST_CLASS.getName());
- throw new AssertionError(msg);
- }
+ private static void test(Object object) {
+ ConstantPool cp = CompilerToVMHelper.getConstantPool(object);
+ System.out.println(object + " -> " + cp);
}
public static void main(String[] args) {
- GetConstantPoolTest test = new GetConstantPoolTest();
- for (TestCase testCase : TestCase.values()) {
- test.test(testCase);
- }
- testObjectBase();
- testMetaspaceWrapperBase();
+ TestCase.getAllClasses().forEach(GetConstantPoolTest::testClass);
+ TestCase.getAllExecutables().forEach(GetConstantPoolTest::testMethod);
+ testNull();
+ testObject();
}
- private static void testObjectBase() {
+ private static void testNull() {
try {
- Object cp = CompilerToVMHelper.getConstantPool(new Object(), 0L);
- throw new AssertionError("Test OBJECT_BASE."
+ Object cp = CompilerToVMHelper.getConstantPool(null);
+ throw new AssertionError("Test OBJECT."
+ + " Expected IllegalArgumentException has not been caught");
+ } catch (NullPointerException npe) {
+ // expected
+ }
+ }
+ private static void testObject() {
+ try {
+ Object cp = CompilerToVMHelper.getConstantPool(new Object());
+ throw new AssertionError("Test OBJECT."
+ " Expected IllegalArgumentException has not been caught");
} catch (IllegalArgumentException iae) {
// expected
}
}
- private static void testMetaspaceWrapperBase() {
- try {
- Object cp = CompilerToVMHelper.getConstantPool(
- new PublicMetaspaceWrapperObject() {
- @Override
- public long getMetaspacePointer() {
- return getPtrToCpAddress();
- }
- }, 0L);
- throw new AssertionError("Test METASPACE_WRAPPER_BASE."
- + " Expected IllegalArgumentException has not been caught");
- } catch (IllegalArgumentException iae) {
- // expected
- }
- }
-
- private static long getPtrToCpAddress() {
- Field field;
- try {
- field = TEST_CLASS.getDeclaredField("CP_ADDRESS");
- } catch (NoSuchFieldException nsfe) {
- throw new Error("TESTBUG : cannot find field \"CP_ADDRESS\" : "
- + nsfe.getMessage(), nsfe);
- }
- Object base = UNSAFE.staticFieldBase(field);
- return WB.getObjectAddress(base) + UNSAFE.staticFieldOffset(field);
- }
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/runtime/cr8015436/Driver8015436.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.runtime.cr8015436;
+
+import jdk.test.lib.process.OutputAnalyzer;
+import jdk.test.lib.process.ProcessTools;
+
+public class Driver8015436 {
+ public static void main(String args[]) {
+ OutputAnalyzer oa;
+ try {
+ oa = ProcessTools.executeProcess(ProcessTools.createJavaProcessBuilder(
+ /* add test vm options */ true, Test8015436.class.getName()));
+ } catch (Exception ex) {
+ throw new Error("TESTBUG: exception while running child process: " + ex, ex);
+ }
+ oa.shouldHaveExitValue(0);
+ oa.shouldContain(Test8015436.SOME_MTD_INVOKED);
+ oa.shouldContain(Test8015436.DEFAULT_MTD_INVOKED_DIRECTLY);
+ oa.shouldContain(Test8015436.DEFAULT_MTD_INVOKED_MH);
+ }
+}
--- a/hotspot/test/compiler/runtime/cr8015436/Test8015436.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/test/compiler/runtime/cr8015436/Test8015436.java Fri Aug 26 10:14:15 2016 -0700
@@ -25,8 +25,12 @@
* @test
* @bug 8015436
* @summary the IK _initial_method_idnum value must be adjusted if overpass methods are added
+ * @library /test/lib/share/classes /
+ * @modules java.base/jdk.internal.misc
+ * @build compiler.runtime.cr8015436.Test8015436
+ * compiler.runtime.cr8015436.Driver8015436
*
- * @run main compiler.runtime.cr8015436.Test8015436
+ * @run driver compiler.runtime.cr8015436.Driver8015436
*/
/*
@@ -45,20 +49,24 @@
import java.lang.invoke.MethodType;
public class Test8015436 implements InterfaceWithDefaultMethod {
+ public static final String SOME_MTD_INVOKED = "someMethod() invoked";
+ public static final String DEFAULT_MTD_INVOKED_DIRECTLY = "defaultMethod() invoked directly";
+ public static final String DEFAULT_MTD_INVOKED_MH = "defaultMethod() invoked via a MethodHandle";
+
@Override
public void someMethod() {
- System.out.println("someMethod() invoked");
+ System.out.println(SOME_MTD_INVOKED);
}
public static void main(String[] args) throws Throwable {
Test8015436 testObj = new Test8015436();
testObj.someMethod();
- testObj.defaultMethod("invoked directly");
+ testObj.defaultMethod(DEFAULT_MTD_INVOKED_DIRECTLY);
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodType mt = MethodType.methodType(void.class, String.class);
MethodHandle mh = lookup.findVirtual(Test8015436.class, "defaultMethod", mt);
- mh.invokeExact(testObj, "invoked via a MethodHandle");
+ mh.invokeExact(testObj, DEFAULT_MTD_INVOKED_MH);
}
}
@@ -66,7 +74,7 @@
public void someMethod();
default public void defaultMethod(String str){
- System.out.println("defaultMethod() " + str);
+ System.out.println(str);
}
}
/*
--- a/hotspot/test/gc/g1/ihop/TestIHOPErgo.java Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/test/gc/g1/ihop/TestIHOPErgo.java Fri Aug 26 10:14:15 2016 -0700
@@ -24,6 +24,7 @@
/*
* @test TestIHOPErgo
* @bug 8148397
+ * @key stress
* @summary Test checks that behavior of Adaptive and Static IHOP at concurrent cycle initiation
* @requires vm.gc.G1
* @requires !vm.flightRecorder
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/NMT/CheckForProperDetailStackTrace.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+ /*
+ * @test
+ * @key nmt
+ * @summary Running with NMT detail should produce expected stack traces.
+ * @library /testlibrary
+ * @modules java.base/jdk.internal.misc
+ * java.management
+ */
+
+import jdk.test.lib.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class CheckForProperDetailStackTrace {
+ /* The stack trace we look for by default. Note that :: has been replaced by .*
+ to make sure it maches even if the symbol is not unmangled. */
+ public static String stackTraceDefault =
+ ".*ModuleEntryTable.*new_entry.*\n" +
+ ".*ModuleEntryTable.*locked_create_entry_or_null.*\n" +
+ ".*Modules.*define_module.*\n" +
+ ".*JVM_DefineModule.*\n";
+
+ /* The stack trace we look for on Solaris and Windows slowdebug builds. For some
+ reason ALWAYSINLINE for AllocateHeap is ignored, so it appears in the stack strace. */
+ public static String stackTraceAllocateHeap =
+ ".*AllocateHeap.*\n" +
+ ".*ModuleEntryTable.*new_entry.*\n" +
+ ".*ModuleEntryTable.*locked_create_entry_or_null.*\n" +
+ ".*Modules.*define_module.*\n";
+
+ /* A symbol that should always be present in NMT detail output. */
+ private static String expectedSymbol =
+ "locked_create_entry_or_null";
+
+ private static final String jdkDebug = System.getProperty("jdk.debug");
+ private static boolean isSlowDebugBuild() {
+ return (jdkDebug.toLowerCase().equals("slowdebug"));
+ }
+
+ public static void main(String args[]) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:NativeMemoryTracking=detail",
+ "-XX:+PrintNMTStatistics",
+ "-version");
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+
+ output.shouldHaveExitValue(0);
+
+ // We should never see either of these frames because they are supposed to be skipped. */
+ output.shouldNotContain("NativeCallStack::NativeCallStack");
+ output.shouldNotContain("os::get_native_stack");
+
+ // AllocateHeap shouldn't be in the output because it is suppose to always be inlined.
+ // We check for that here, but allow it for Windows and Solaris slowdebug builds because
+ // the compiler ends up not inlining AllocateHeap.
+ Boolean okToHaveAllocateHeap =
+ isSlowDebugBuild() && (Platform.isSolaris() || Platform.isWindows());
+ if (!okToHaveAllocateHeap) {
+ output.shouldNotContain("AllocateHeap");
+ }
+
+ // See if we have any stack trace symbols in the output
+ boolean hasSymbols =
+ output.getStdout().contains(expectedSymbol) || output.getStderr().contains(expectedSymbol);
+ if (!hasSymbols) {
+ // It's ok for ARM not to have symbols, because it does not support NMT detail
+ // when targeting thumb2. It's also ok for Windows not to have symbols, because
+ // they are only available if the symbols file is included with the build.
+ if (Platform.isWindows() || Platform.isARM()) {
+ return; // we are done
+ }
+ output.reportDiagnosticSummary();
+ throw new RuntimeException("Expected symbol missing missing from output: " + expectedSymbol);
+ }
+
+ /* Make sure the expected NMT detail stack trace is found. */
+ String expectedStackTrace =
+ (okToHaveAllocateHeap ? stackTraceAllocateHeap : stackTraceDefault);
+ if (!stackTraceMatches(expectedStackTrace, output)) {
+ output.reportDiagnosticSummary();
+ throw new RuntimeException("Expected stack trace missing missing from output: " + expectedStackTrace);
+ }
+ }
+
+ public static boolean stackTraceMatches(String stackTrace, OutputAnalyzer output) {
+ Matcher stdoutMatcher = Pattern.compile(stackTrace, Pattern.MULTILINE).matcher(output.getStdout());
+ Matcher stderrMatcher = Pattern.compile(stackTrace, Pattern.MULTILINE).matcher(output.getStderr());
+ return (stdoutMatcher.find() || stderrMatcher.find());
+ }
+}
--- a/hotspot/test/runtime/StackGuardPages/exeinvoke.c Fri Aug 26 13:11:39 2016 +0300
+++ b/hotspot/test/runtime/StackGuardPages/exeinvoke.c Fri Aug 26 10:14:15 2016 -0700
@@ -242,7 +242,7 @@
CLASS_PATH_OPT, javaclasspath);
options[0].optionString = "-Xint";
- options[1].optionString = "-Xss328k";
+ options[1].optionString = "-Xss1M";
options[2].optionString = javaclasspathopt;
vm_args.version = JNI_VERSION_1_2;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/Unsafe/NestedUnsafe.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @summary Creates an anonymous class inside of an anonymous class.
+ * @library /testlibrary
+ * @modules java.base/jdk.internal.misc
+ * java.compiler
+ * java.management
+ * @run main NestedUnsafe
+ */
+
+import java.security.ProtectionDomain;
+import java.io.InputStream;
+import java.lang.*;
+import jdk.test.lib.*;
+import jdk.internal.misc.Unsafe;
+import static jdk.test.lib.Asserts.*;
+
+// package p;
+
+public class NestedUnsafe {
+ // The String concatenation should create the nested anonymous class.
+ static byte klassbuf[] = InMemoryJavaCompiler.compile("TestClass",
+ "public class TestClass { " +
+ " public static void concat(String one, String two) throws Throwable { " +
+ " System.out.println(one + two);" +
+ " } } ");
+
+ public static void main(String args[]) throws Exception {
+ Unsafe unsafe = Utils.getUnsafe();
+
+ Class klass = unsafe.defineAnonymousClass(NestedUnsafe.class, klassbuf, new Object[0]);
+ unsafe.ensureClassInitialized(klass);
+ Class[] cArgs = new Class[2];
+ cArgs[0] = String.class;
+ cArgs[1] = String.class;
+ try {
+ klass.getMethod("concat", cArgs).invoke(null, "AA", "BB");
+ } catch (Throwable ex) {
+ throw new RuntimeException("Exception: " + ex.toString());
+ }
+
+ // The anonymous class calls defineAnonymousClass creating a nested anonymous class.
+ byte klassbuf2[] = InMemoryJavaCompiler.compile("TestClass2",
+ "import jdk.internal.misc.Unsafe; " +
+ "public class TestClass2 { " +
+ " public static void doit() throws Throwable { " +
+ " Unsafe unsafe = jdk.internal.misc.Unsafe.getUnsafe(); " +
+ " Class klass2 = unsafe.defineAnonymousClass(TestClass2.class, NestedUnsafe.klassbuf, new Object[0]); " +
+ " unsafe.ensureClassInitialized(klass2); " +
+ " Class[] dArgs = new Class[2]; " +
+ " dArgs[0] = String.class; " +
+ " dArgs[1] = String.class; " +
+ " try { " +
+ " klass2.getMethod(\"concat\", dArgs).invoke(null, \"CC\", \"DD\"); " +
+ " } catch (Throwable ex) { " +
+ " throw new RuntimeException(\"Exception: \" + ex.toString()); " +
+ " } " +
+ "} } ",
+ "-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED");
+ Class klass2 = unsafe.defineAnonymousClass(NestedUnsafe.class, klassbuf2, new Object[0]);
+ try {
+ klass2.getMethod("doit").invoke(null);
+ } catch (Throwable ex) {
+ throw new RuntimeException("Exception: " + ex.toString());
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @summary Checks that the jshdb debugd utility sucessfully starts
+ * and tries to attach to a running process
+ * @modules java.base/jdk.internal.misc
+ * @library /test/lib/share/classes
+ *
+ * @ignore 8163805
+ * @run main/othervm SADebugDTest
+ */
+import java.io.File;
+import java.util.concurrent.CountDownLatch;
+import java.io.InputStreamReader;
+import java.io.BufferedReader;
+import java.io.Reader;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Predicate;
+import static jdk.test.lib.Asserts.assertTrue;
+import static jdk.test.lib.Platform.shouldSAAttach;
+import static jdk.test.lib.process.ProcessTools.startProcess;
+
+public class SADebugDTest {
+
+ private static final String GOLDEN = "Attaching to process ID %d and starting RMI services, please wait...";
+
+ private static final String JAVA_HOME = (System.getProperty("test.jdk") != null)
+ ? System.getProperty("test.jdk") : System.getProperty("java.home");
+
+ private static final String JAVA_BIN_DIR
+ = JAVA_HOME + File.separator + "bin" + File.separator;
+
+ private static final String JHSDB = JAVA_BIN_DIR + "jhsdb";
+
+ public static void main(String[] args) throws Exception {
+
+ if (!shouldSAAttach()) {
+ log("Not possible to attach the SA. Skipping the test");
+ return;
+ }
+
+ long ourPid = ProcessHandle.current().getPid();
+
+ // The string we are expecting in the debugd ouput
+ String golden = String.format(GOLDEN, ourPid);
+
+ // We are going to run 'jhsdb debugd <our pid>'
+ // The startProcess will block untl the 'golden' string appears in either process' stdout or stderr
+ // In case of timeout startProcess kills the debugd process
+ ProcessBuilder pb = new ProcessBuilder();
+ pb.command(JHSDB, "debugd", String.valueOf(ourPid));
+ Process debugd = startProcess("debugd", pb, null, (line) -> line.trim().contains(golden), 0, TimeUnit.SECONDS);
+
+ // If we are here, this means we have received the golden line and the test has passed
+ // The debugd remains running, we have to kill it
+ debugd.destroy();
+
+ }
+
+ private static void log(String string) {
+ System.out.println(string);
+ }
+
+}
--- a/jaxp/.hgtags Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxp/.hgtags Fri Aug 26 10:14:15 2016 -0700
@@ -374,3 +374,4 @@
74241304e87b0d463391a8ecab40979b5af86dc2 jdk-9+129
e66cdc2de6b02443911d386fc9217b0d824d0686 jdk-9+130
874082a9b565a7092a40bfa934a6e3e3c3455a60 jdk-9+131
+907445d85e680ea410fe2c83c0ec64b5508e4f3e jdk-9+132
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/res/XSLTErrorResources.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/res/XSLTErrorResources.java Fri Aug 26 10:14:15 2016 -0700
@@ -17,9 +17,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-/*
- * $Id: XSLTErrorResources.java,v 1.2.4.1 2005/09/13 09:55:37 pvedula Exp $
- */
package com.sun.org.apache.xalan.internal.res;
import java.util.ListResourceBundle;
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages.java Fri Aug 26 10:14:15 2016 -0700
@@ -17,9 +17,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-/*
- * $Id: ErrorMessages.java,v 1.2.4.1 2005/09/15 09:59:41 pvedula Exp $
- */
package com.sun.org.apache.xalan.internal.xsltc.compiler.util;
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages.java Fri Aug 26 10:14:15 2016 -0700
@@ -17,9 +17,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-/*
- * $Id: ErrorMessages.java,v 1.2.4.1 2005/09/14 05:06:42 pvedula Exp $
- */
package com.sun.org.apache.xalan.internal.xsltc.runtime;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/dom/AbortException.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.org.apache.xerces.internal.dom;
+
+public class AbortException extends RuntimeException {
+
+ private static final long serialVersionUID = 2608302175475740417L;
+
+ /**
+ * Constructor AbortException
+ */
+ public AbortException() { super(null, null, false, false); }
+}
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/dom/DOMNormalizer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/dom/DOMNormalizer.java Fri Aug 26 10:14:15 2016 -0700
@@ -26,6 +26,7 @@
import java.io.StringReader;
import java.util.Vector;
+import com.sun.org.apache.xerces.internal.dom.AbortException;
import com.sun.org.apache.xerces.internal.impl.Constants;
import com.sun.org.apache.xerces.internal.impl.RevalidationHandler;
import com.sun.org.apache.xerces.internal.impl.dtd.DTDGrammar;
@@ -157,11 +158,6 @@
// attribute value normalization
final XMLString fNormalizedValue = new XMLString(new char[16], 0, 0);
- /**
- * If the user stops the process, this exception will be thrown.
- */
- public static final RuntimeException abort = new RuntimeException();
-
//DTD validator
private XMLDTDValidator fDTDValidator;
@@ -242,11 +238,8 @@
XMLGrammarDescription.XML_SCHEMA, fValidationHandler);
fValidationHandler = null;
}
- }
- catch (RuntimeException e) {
- if( e==abort )
- return; // processing aborted by the user
- throw e; // otherwise re-throw.
+ } catch (AbortException e) {
+ return;
}
}
@@ -1371,10 +1364,10 @@
error.fRelatedData = locator.fRelatedNode;
if(!errorHandler.handleError(error))
- throw abort;
+ throw new AbortException();
}
if( severity==DOMError.SEVERITY_FATAL_ERROR )
- throw abort;
+ throw new AbortException();
}
protected final void updateQName (Node node, QName qname){
@@ -2043,5 +2036,4 @@
return null;
}
-
} // DOMNormalizer class
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/DOMMessages.properties Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/DOMMessages.properties Fri Aug 26 10:14:15 2016 -0700
@@ -2,8 +2,6 @@
# DOM implementation.
#
# The messages are arranged in key and value tuples in a ListResourceBundle.
-#
-# @version $Id: DOMMessages.properties,v 1.2 2005-08-16 22:51:51 jeffsuttor Exp $
BadMessageKey = The error message corresponding to the message key can not be found.
FormatFailed = An internal error occurred while formatting the following message:\n
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/DatatypeMessages.properties Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/DatatypeMessages.properties Fri Aug 26 10:14:15 2016 -0700
@@ -1,8 +1,6 @@
# This file stores localized messages for the Xerces JAXP Datatype API implementation.
#
# The messages are arranged in key and value tuples in a ListResourceBundle.
-#
-# @version $Id: DatatypeMessages.properties 3021 2011-03-01 00:12:28Z joehw $
BadMessageKey = The error message corresponding to the message key can not be found.
FormatFailed = An internal error occurred while formatting the following message:\n
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/JAXPValidationMessages.properties Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/JAXPValidationMessages.properties Fri Aug 26 10:14:15 2016 -0700
@@ -1,8 +1,6 @@
# This file stores localized messages for the Xerces JAXP Validation API implementation.
#
# The messages are arranged in key and value tuples in a ListResourceBundle.
-#
-# @version $Id: JAXPValidationMessages.properties 3021 2011-03-01 00:12:28Z joehw $
# Messages for message reporting
BadMessageKey = The error message corresponding to the message key can not be found.
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/SAXMessages.properties Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/SAXMessages.properties Fri Aug 26 10:14:15 2016 -0700
@@ -2,8 +2,6 @@
# SAX implementation.
#
# The messages are arranged in key and value tuples in a ListResourceBundle.
-#
-# @version $Id: SAXMessages.properties 3021 2011-03-01 00:12:28Z joehw $
BadMessageKey = The error message corresponding to the message key can not be found.
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLSchemaMessages.properties Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLSchemaMessages.properties Fri Aug 26 10:14:15 2016 -0700
@@ -1,7 +1,5 @@
# This file contains error and warning messages related to XML Schema
# The messages are arranged in key and value tuples in a ListResourceBundle.
-#
-# @version $Id: XMLSchemaMessages.properties 3021 2011-03-01 00:12:28Z joehw $
BadMessageKey = The error message corresponding to the message key can not be found.
FormatFailed = An internal error occurred while formatting the following message:\n
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages.properties Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages.properties Fri Aug 26 10:14:15 2016 -0700
@@ -4,8 +4,6 @@
#
# As usual with properties files, the messages are arranged in
# key/value tuples.
-#
-# @version $Id: XMLSerializerMessages.properties 3021 2011-03-01 00:12:28Z joehw $
BadMessageKey = The error message corresponding to the message key can not be found.
FormatFailed = An internal error occurred while formatting the following message:\n
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages.properties Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages.properties Fri Aug 26 10:14:15 2016 -0700
@@ -1,8 +1,6 @@
# This file stores localized messages for the Xerces XPointer implementation.
#
# The messages are arranged in key and value tuples in a ListResourceBundle.
-#
-# @version $Id: XPointerMessages.properties 3021 2011-03-01 00:12:28Z joehw $
# Messages for message reporting
BadMessageKey = The error message corresponding to the message key can not be found.
@@ -24,4 +22,4 @@
InvalidElementSchemeXPointer = InvalidElementSchemeXPointer: The Element Scheme XPointer expression ''{0}'' is invalid.
XPointerElementSchemeProcessingError = XPointerElementSchemeProcessingError: An error occurred while processing the XPointer element() Scheme expression.
InvalidNCNameInElementSchemeData = InvalidNCNameInElementSchemeData: The element() Scheme contains a ShortHand Pointer ''{0}'' with an invalid NCName.
-InvalidChildSequenceCharacter = InvalidChildSequenceCharacter: The element() Scheme contains an invalid child sequence character ''{0}''.
\ No newline at end of file
+InvalidChildSequenceCharacter = InvalidChildSequenceCharacter: The element() Scheme contains an invalid child sequence character ''{0}''.
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xml/internal/res/XMLErrorResources.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xml/internal/res/XMLErrorResources.java Fri Aug 26 10:14:15 2016 -0700
@@ -17,9 +17,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-/*
- * $Id: XMLErrorResources.java,v 1.2.4.1 2005/09/15 07:45:37 suresh_emailid Exp $
- */
package com.sun.org.apache.xml.internal.res;
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xml/internal/serialize/DOMSerializerImpl.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xml/internal/serialize/DOMSerializerImpl.java Fri Aug 26 10:14:15 2016 -0700
@@ -28,6 +28,7 @@
import java.lang.reflect.Method;
import java.util.ArrayList;
+import com.sun.org.apache.xerces.internal.dom.AbortException;
import com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl;
import com.sun.org.apache.xerces.internal.dom.DOMErrorImpl;
import com.sun.org.apache.xerces.internal.dom.DOMLocatorImpl;
@@ -501,11 +502,9 @@
} catch (LSException lse) {
// Rethrow LSException.
throw lse;
+ } catch (AbortException e) {
+ return null;
} catch (RuntimeException e) {
- if (e == DOMNormalizer.abort) {
- // stopped at user request
- return null;
- }
throw (LSException) DOMUtil.createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
} catch (IOException ioe) {
// REVISIT: A generic IOException doesn't provide enough information
@@ -733,11 +732,9 @@
} catch (LSException lse) {
// Rethrow LSException.
throw lse;
+ } catch (AbortException e) {
+ return false;
} catch (RuntimeException e) {
- if (e == DOMNormalizer.abort) {
- // stopped at user request
- return false;
- }
throw (LSException) DOMUtil.createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
} catch (Exception e) {
if (ser.fDOMErrorHandler != null) {
@@ -833,11 +830,9 @@
} catch (LSException lse) {
// Rethrow LSException.
throw lse;
+ } catch (AbortException e) {
+ return false;
} catch (RuntimeException e) {
- if (e == DOMNormalizer.abort) {
- // stopped at user request
- return false;
- }
throw (LSException) DOMUtil.createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
} catch (Exception e) {
if (ser.fDOMErrorHandler != null) {
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xml/internal/serializer/utils/SerializerMessages.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xml/internal/serializer/utils/SerializerMessages.java Fri Aug 26 10:14:15 2016 -0700
@@ -19,9 +19,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-/*
- * $Id: SerializerMessages.java,v 1.1.4.1 2005/09/08 11:03:11 suresh_emailid Exp $
- */
package com.sun.org.apache.xml.internal.serializer.utils;
import java.util.ListResourceBundle;
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathImplUtil.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathImplUtil.java Fri Aug 26 10:14:15 2016 -0700
@@ -28,6 +28,7 @@
import com.sun.org.apache.xalan.internal.res.XSLMessages;
import com.sun.org.apache.xalan.internal.utils.FactoryImpl;
import com.sun.org.apache.xml.internal.dtm.DTM;
+import com.sun.org.apache.xpath.internal.axes.LocPathIterator;
import com.sun.org.apache.xpath.internal.objects.XObject;
import com.sun.org.apache.xpath.internal.res.XPATHErrorResources;
import java.io.IOException;
@@ -73,6 +74,12 @@
XObject eval(Object contextItem, com.sun.org.apache.xpath.internal.XPath xpath)
throws javax.xml.transform.TransformerException {
com.sun.org.apache.xpath.internal.XPathContext xpathSupport;
+ if (contextItem == null && xpath.getExpression() instanceof LocPathIterator) {
+ // the operation must have no dependency on the context that is null
+ throw new TransformerException(XSLMessages.createXPATHMessage(
+ XPATHErrorResources.ER_CONTEXT_CAN_NOT_BE_NULL,
+ new Object[] {}));
+ }
if (functionResolver != null) {
JAXPExtensionsProvider jep = new JAXPExtensionsProvider(
functionResolver, featureSecureProcessing, featureManager);
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/res/XPATHErrorResources.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/res/XPATHErrorResources.java Fri Aug 26 10:14:15 2016 -0700
@@ -17,9 +17,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-/*
- * $Id: XPATHErrorResources.java,v 1.2.4.1 2005/09/15 01:29:15 jeffsuttor Exp $
- */
package com.sun.org.apache.xpath.internal.res;
import java.util.ListResourceBundle;
@@ -93,6 +90,7 @@
public static final String ER_CURRENT_TAKES_NO_ARGS =
"ER_CURRENT_TAKES_NO_ARGS";
public static final String ER_DOCUMENT_REPLACED = "ER_DOCUMENT_REPLACED";
+ public static final String ER_CONTEXT_CAN_NOT_BE_NULL = "ER_CONTEXT_CAN_NOT_BE_NULL";
public static final String ER_CONTEXT_HAS_NO_OWNERDOC =
"ER_CONTEXT_HAS_NO_OWNERDOC";
public static final String ER_LOCALNAME_HAS_TOO_MANY_ARGS =
@@ -368,6 +366,9 @@
{ ER_DOCUMENT_REPLACED,
"document() function implementation has been replaced by com.sun.org.apache.xalan.internal.xslt.FuncDocument!"},
+ { ER_CONTEXT_CAN_NOT_BE_NULL,
+ "The context can not be null when the operation is context-dependent."},
+
{ ER_CONTEXT_HAS_NO_OWNERDOC,
"context does not have an owner document!"},
--- a/jaxp/src/java.xml/share/classes/javax/xml/xpath/XPath.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxp/src/java.xml/share/classes/javax/xml/xpath/XPath.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -34,18 +34,20 @@
*
* <a name="XPath-evaluation"></a>
* <table border="1" cellpadding="2">
- * <thead>
- * <tr>
- * <th colspan="2">Evaluation of XPath Expressions.</th>
- * </tr>
- * </thead>
- * <tr>
- * <td>context</td>
- * <td>
- * If a request is made to evaluate the expression in the absence
- * of a context item, an empty document node will be used for the context.
- * For the purposes of evaluating XPath expressions, a DocumentFragment
- * is treated like a Document node.
+ * <thead>
+ * <tr>
+ * <th colspan="2">Evaluation of XPath Expressions.</th>
+ * </tr>
+ * </thead>
+ * <tr>
+ * <td>context</td>
+ * <td>
+ * The type of the context is implementation-dependent. If the value is
+ * null, the operation must have no dependency on the context, otherwise
+ * an XPathExpressionException will be thrown.
+ *
+ * For the purposes of evaluating XPath expressions, a DocumentFragment
+ * is treated like a Document node.
* </td>
* </tr>
* <tr>
--- a/jaxp/src/java.xml/share/classes/javax/xml/xpath/XPathExpression.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxp/src/java.xml/share/classes/javax/xml/xpath/XPathExpression.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -33,19 +33,20 @@
*
* <a name="XPathExpression-evaluation"></a>
* <table border="1" cellpadding="2">
- * <thead>
- * <tr>
- * <th colspan="2">Evaluation of XPath Expressions.</th>
- * </tr>
- * </thead>
- * <tbody>
- * <tr>
- * <td>context</td>
- * <td>
- * If a request is made to evaluate the expression in the absence
- * of a context item, an empty document node will be used for the context.
- * For the purposes of evaluating XPath expressions, a DocumentFragment
- * is treated like a Document node.
+ * <thead>
+ * <tr>
+ * <th colspan="2">Evaluation of XPath Expressions.</th>
+ * </tr>
+ * </thead>
+ * <tr>
+ * <td>context</td>
+ * <td>
+ * The type of the context is implementation-dependent. If the value is
+ * null, the operation must have no dependency on the context, otherwise
+ * an XPathExpressionException will be thrown.
+ *
+ * For the purposes of evaluating XPath expressions, a DocumentFragment
+ * is treated like a Document node.
* </td>
* </tr>
* <tr>
--- a/jaxp/src/java.xml/share/classes/module-info.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxp/src/java.xml/share/classes/module-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -23,6 +23,10 @@
* questions.
*/
+/**
+ * Defines the Java API for XML Processing (JAXP), the Streaming API for XML (StAX),
+ * the Simple API for XML (SAX), and the W3C Document Object Model (DOM) API.
+ */
module java.xml {
exports javax.xml;
exports javax.xml.catalog;
--- a/jaxp/test/javax/xml/jaxp/unittest/xpath/XPathTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxp/test/javax/xml/jaxp/unittest/xpath/XPathTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -24,11 +24,17 @@
package xpath;
import javax.xml.namespace.NamespaceContext;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
-
+import org.testng.annotations.DataProvider;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
/*
* @test
@@ -36,19 +42,105 @@
* @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest
* @run testng/othervm -DrunSecMngr=true xpath.XPathTest
* @run testng/othervm xpath.XPathTest
- * @summary Test XPath.getNamespaceContext() is supported.
+ * @summary Test XPath functions. See details for each test.
*/
@Listeners({jaxp.library.BasePolicy.class})
public class XPathTest {
+ /*
+ @bug 6211561
+ * Verifies the specification for XPath and XPathExpression:
+ * If a null value is provided for item (the context),
+ * the expression must have no dependency on the context.
+ */
+ @Test(dataProvider = "noContextDependency")
+ public void testNoContextDependency1(String expression, Object item) throws XPathExpressionException {
+ XPath xPath = XPathFactory.newInstance().newXPath();
+ xPath.evaluate(expression, item, XPathConstants.STRING);
+ }
+
+ @Test(dataProvider = "noContextDependency")
+ public void testNoContextDependency2(String expression, Object item) throws XPathExpressionException {
+ XPath xPath = XPathFactory.newInstance().newXPath();
+ xPath.evaluateExpression(expression, item, String.class);
+ }
+
+ /*
+ @bug 6211561
+ * Verifies the specification for XPath and XPathExpression:
+ * If a null value is provided for item (the context) that the operation
+ * depends on, XPathExpressionException will be thrown
+ */
+ @Test(dataProvider = "hasContextDependency", expectedExceptions = XPathExpressionException.class)
+ public void testHasContextDependency1(String expression, Object item) throws XPathExpressionException {
+ XPath xPath = XPathFactory.newInstance().newXPath();
+ xPath.evaluate(expression, item, XPathConstants.STRING);
+ }
+
+ @Test(dataProvider = "hasContextDependency", expectedExceptions = XPathExpressionException.class)
+ public void testHasContextDependency2(String expression, Object item) throws XPathExpressionException {
+ XPath xPath = XPathFactory.newInstance().newXPath();
+ xPath.evaluateExpression(expression, item, String.class);
+ }
+
+ /*
+ @bug 6376058
+ Verifies that XPath.getNamespaceContext() is supported.
+ */
@Test
public void testNamespaceContext() {
-
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();
+ NamespaceContext namespaceContext = xPath.getNamespaceContext();
+ }
- NamespaceContext namespaceContext = xPath.getNamespaceContext();
+ /*
+ * DataProvider: the expression has no dependency on the context
+ */
+ @DataProvider(name = "noContextDependency")
+ public Object[][] getExpressionContext() throws Exception {
+ return new Object[][]{
+ {"1+1", (Node)null},
+ {"5 mod 2", (Node)null},
+ {"8 div 2", (Node)null},
+ {"/node", getEmptyDocument()}
+ };
+ }
+ /*
+ * DataProvider: the expression has dependency on the context, but the context
+ * is null.
+ */
+ @DataProvider(name = "hasContextDependency")
+ public Object[][] getExpressionContext1() throws Exception {
+ return new Object[][]{
+ {"/node", (Node)null},
+ {"//@lang", (Node)null},
+ {"bookstore//book", (Node)null},
+ {"/bookstore/book[last()]", (Node)null},
+ {"//title[@lang='en']", (Node)null},
+ {"/bookstore/book[price>9.99]", (Node)null},
+ {"/bookstore/book[price>8.99 and price<9.99]", (Node)null},
+ {"/bookstore/*", (Node)null},
+ {"//title[@*]", (Node)null},
+ {"//title | //price", (Node)null},
+ {"//book/title | //book/price", (Node)null},
+ {"/bookstore/book/title | //price", (Node)null},
+ {"child::book", (Node)null},
+ {"child::text()", (Node)null},
+ {"child::*/child::price", (Node)null}
+ };
+ }
+
+ /**
+ * Returns an empty {@link org.w3c.dom.Document}.
+ * @return a DOM Document, null in case of Exception
+ */
+ public Document getEmptyDocument() {
+ try {
+ return DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+ } catch (ParserConfigurationException e) {
+ return null;
+ }
}
}
-
--- a/jaxws/.hgtags Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxws/.hgtags Fri Aug 26 10:14:15 2016 -0700
@@ -377,3 +377,4 @@
46a02f57218e4a8c334dbccf656fb048f823f163 jdk-9+129
39c6293131d91aec7f2f5120395e070a937b8858 jdk-9+130
783e7e2c587f2c7e1b9998a46d90ec196ab2a195 jdk-9+131
+9fff2477a4cadf2a9618a76f1f4fe0f20bb5ff3b jdk-9+132
--- a/jaxws/src/java.activation/share/classes/module-info.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxws/src/java.activation/share/classes/module-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -23,6 +23,9 @@
* questions.
*/
+/**
+ * Defines the JavaBeans Activation Framework (JAF) API.
+ */
module java.activation {
requires public java.datatransfer;
// dependence on java.beans.Beans to be eliminated
--- a/jaxws/src/java.annotations.common/share/classes/module-info.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxws/src/java.annotations.common/share/classes/module-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -23,6 +23,10 @@
* questions.
*/
+/**
+ * Defines a subset of the Common Annotations API to support programs running
+ * on the Java SE Platform.
+ */
module java.annotations.common {
exports javax.annotation;
}
--- a/jaxws/src/java.xml.bind/share/classes/module-info.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxws/src/java.xml.bind/share/classes/module-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -23,6 +23,9 @@
* questions.
*/
+/**
+ * Defines the Java Architecture for XML Binding (JAXB) API.
+ */
module java.xml.bind {
requires public java.activation;
requires public java.xml;
--- a/jaxws/src/java.xml.ws/share/classes/module-info.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jaxws/src/java.xml.ws/share/classes/module-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -23,6 +23,10 @@
* questions.
*/
+/**
+ * Defines the Java API for XML-Based Web Services (JAX-WS), and
+ * the Web Services Metadata API.
+ */
module java.xml.ws {
requires public java.activation;
requires public java.xml;
--- a/jdk/.hgtags Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/.hgtags Fri Aug 26 10:14:15 2016 -0700
@@ -375,3 +375,4 @@
6c827500e34587061af97ad6fef0e859280255c5 jdk-9+130
8c57f4c293bbc5609928308a6d91ba765760b5f9 jdk-9+131
d5c70818cd8a82e76632c8c815bdb4f75f53aeaf jdk-9+132
+3cdae27c90b5e41afe75eab904fda19fac076330 jdk-9+133
--- a/jdk/make/launcher/Launcher-jdk.jdeps.gmk Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/make/launcher/Launcher-jdk.jdeps.gmk Fri Aug 26 10:14:15 2016 -0700
@@ -36,3 +36,9 @@
CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \
-DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \
))
+
+$(eval $(call SetupBuildLauncher, jdeprscan, \
+ MAIN_CLASS := com.sun.tools.jdeprscan.Main, \
+ CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \
+ -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \
+))
--- a/jdk/src/java.base/macosx/classes/apple/security/AppleProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/macosx/classes/apple/security/AppleProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
package apple.security;
import java.security.*;
+import static sun.security.util.SecurityConstants.PROVIDER_VER;
/**
* The Apple Security Provider.
@@ -74,7 +75,7 @@
public AppleProvider() {
/* We are the Apple provider */
- super("Apple", 9.0d, info);
+ super("Apple", PROVIDER_VER, info);
final Provider p = this;
AccessController.doPrivileged(new PrivilegedAction<Void>() {
--- a/jdk/src/java.base/share/classes/com/sun/crypto/provider/CipherCore.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/com/sun/crypto/provider/CipherCore.java Fri Aug 26 10:14:15 2016 -0700
@@ -986,8 +986,9 @@
if (padding != null) {
int padStart = padding.unpad(outWithPadding, 0, outLen);
if (padStart < 0) {
- throw new BadPaddingException("Given final block not "
- + "properly padded");
+ throw new BadPaddingException("Given final block not " +
+ "properly padded. Such issues can arise if a bad key " +
+ "is used during decryption.");
}
outLen = padStart;
}
--- a/jdk/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java Fri Aug 26 10:14:15 2016 -0700
@@ -108,6 +108,11 @@
}
try {
this.prf = Mac.getInstance(prfAlgo);
+ // SunPKCS11 requires a non-empty PBE password
+ if (passwdBytes.length == 0 &&
+ this.prf.getProvider().getName().startsWith("SunPKCS11")) {
+ this.prf = Mac.getInstance(prfAlgo, SunJCE.getInstance());
+ }
} catch (NoSuchAlgorithmException nsae) {
// not gonna happen; re-throw just in case
InvalidKeySpecException ike = new InvalidKeySpecException();
--- a/jdk/src/java.base/share/classes/com/sun/crypto/provider/SunJCE.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/com/sun/crypto/provider/SunJCE.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,7 @@
import java.security.AccessController;
import java.security.Provider;
import java.security.SecureRandom;
+import static sun.security.util.SecurityConstants.PROVIDER_VER;
/**
@@ -104,7 +105,7 @@
public SunJCE() {
/* We are the "SunJCE" provider */
- super("SunJCE", 9.0d, info);
+ super("SunJCE", PROVIDER_VER, info);
final String BLOCK_MODES = "ECB|CBC|PCBC|CTR|CTS|CFB|OFB" +
"|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64" +
--- a/jdk/src/java.base/share/classes/java/lang/Class.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/Class.java Fri Aug 26 10:14:15 2016 -0700
@@ -331,12 +331,6 @@
* Note that this method does not check whether the requested class
* is accessible to its caller.
*
- * <p> If the {@code loader} is {@code null}, and a security
- * manager is present, and the caller's class loader is not null, then this
- * method calls the security manager's {@code checkPermission} method
- * with a {@code RuntimePermission("getClassLoader")} permission to
- * ensure it's ok to access the bootstrap class loader.
- *
* @param name fully qualified name of the desired class
* @param initialize if {@code true} the class will be initialized.
* See Section 12.4 of <em>The Java Language Specification</em>.
@@ -348,6 +342,11 @@
* by this method fails
* @exception ClassNotFoundException if the class cannot be located by
* the specified class loader
+ * @exception SecurityException
+ * if a security manager is present, and the {@code loader} is
+ * {@code null}, and the caller's class loader is not
+ * {@code null}, and the caller does not have the
+ * {@link RuntimePermission}{@code ("getClassLoader")}
*
* @see java.lang.Class#forName(String)
* @see java.lang.ClassLoader
@@ -782,22 +781,17 @@
* null in such implementations if this class was loaded by the bootstrap
* class loader.
*
- * <p> If a security manager is present, and the caller's class loader is
- * not null and the caller's class loader is not the same as or an ancestor of
- * the class loader for the class whose class loader is requested, then
- * this method calls the security manager's {@code checkPermission}
- * method with a {@code RuntimePermission("getClassLoader")}
- * permission to ensure it's ok to access the class loader for the class.
- *
* <p>If this object
* represents a primitive type or void, null is returned.
*
* @return the class loader that loaded the class or interface
* represented by this object.
- * @throws SecurityException
- * if a security manager exists and its
- * {@code checkPermission} method denies
- * access to the class loader for the class.
+ * @throws SecurityException
+ * if a security manager is present, and the caller's class loader
+ * is not {@code null} and is not the same as or an ancestor of the
+ * class loader for the class whose class loader is requested,
+ * and the caller does not have the
+ * {@link RuntimePermission}{@code ("getClassLoader")}
* @see java.lang.ClassLoader
* @see SecurityManager#checkPermission
* @see java.lang.RuntimePermission
--- a/jdk/src/java.base/share/classes/java/lang/ClassLoader.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/ClassLoader.java Fri Aug 26 10:14:15 2016 -0700
@@ -1537,22 +1537,13 @@
* will return <tt>null</tt> in such implementations if this class loader's
* parent is the bootstrap class loader.
*
- * <p> If a security manager is present, and the invoker's class loader is
- * not <tt>null</tt> and is not an ancestor of this class loader, then this
- * method invokes the security manager's {@link
- * SecurityManager#checkPermission(java.security.Permission)
- * <tt>checkPermission</tt>} method with a {@link
- * RuntimePermission#RuntimePermission(String)
- * <tt>RuntimePermission("getClassLoader")</tt>} permission to verify
- * access to the parent class loader is permitted. If not, a
- * <tt>SecurityException</tt> will be thrown. </p>
- *
* @return The parent <tt>ClassLoader</tt>
*
* @throws SecurityException
- * If a security manager exists and its <tt>checkPermission</tt>
- * method doesn't allow access to this class loader's parent class
- * loader.
+ * If a security manager is present, and the caller's class loader
+ * is not {@code null} and is not an ancestor of this class loader,
+ * and the caller does not have the
+ * {@link RuntimePermission}{@code ("getClassLoader")}
*
* @since 1.2
*/
@@ -1590,12 +1581,11 @@
* @return The platform {@code ClassLoader}.
*
* @throws SecurityException
- * If a security manager exists and the caller's class loader is
- * not {@code null} and the caller's class loader is not the same
+ * If a security manager is present, and the caller's class loader is
+ * not {@code null}, and the caller's class loader is not the same
* as or an ancestor of the platform class loader,
- * and the {@link SecurityManager#checkPermission(java.security.Permission)
- * checkPermission} method denies {@code RuntimePermission("getClassLoader")}
- * to access the platform class loader.
+ * and the caller does not have the
+ * {@link RuntimePermission}{@code ("getClassLoader")}
*
* @since 9
*/
@@ -1636,17 +1626,6 @@
* If circular initialization of the system class loader is detected then
* an unspecified error or exception is thrown.
*
- * <p> If a security manager is present, and the invoker's class loader is
- * not <tt>null</tt> and the invoker's class loader is not the same as or
- * an ancestor of the system class loader, then this method invokes the
- * security manager's {@link
- * SecurityManager#checkPermission(java.security.Permission)
- * <tt>checkPermission</tt>} method with a {@link
- * RuntimePermission#RuntimePermission(String)
- * <tt>RuntimePermission("getClassLoader")</tt>} permission to verify
- * access to the system class loader. If not, a
- * <tt>SecurityException</tt> will be thrown. </p>
- *
* @implNote The system property to override the system class loader is not
* examined until the VM is almost fully initialized. Code that executes
* this method during startup should take care not to cache the return
@@ -1656,8 +1635,10 @@
* <tt>null</tt> if none
*
* @throws SecurityException
- * If a security manager exists and its <tt>checkPermission</tt>
- * method doesn't allow access to the system class loader.
+ * If a security manager is present, and the caller's class loader
+ * is not {@code null} and is not the same as or an ancestor of the
+ * system class loader, and the caller does not have the
+ * {@link RuntimePermission}{@code ("getClassLoader")}
*
* @throws IllegalStateException
* If invoked recursively during the construction of the class
--- a/jdk/src/java.base/share/classes/java/lang/Math.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/Math.java Fri Aug 26 10:14:15 2016 -0700
@@ -1370,8 +1370,13 @@
* result is positive zero.
* <li>If the argument is infinite, the result is positive infinity.
* <li>If the argument is NaN, the result is NaN.</ul>
- * In other words, the result is the same as the value of the expression:
- * <p>{@code Float.intBitsToFloat(0x7fffffff & Float.floatToIntBits(a))}
+ *
+ * @apiNote As implied by the above, one valid implementation of
+ * this method is given by the expression below which computes a
+ * {@code float} with the same exponent and significand as the
+ * argument but with a guaranteed zero sign bit indicating a
+ * positive value:<br>
+ * {@code Float.intBitsToFloat(0x7fffffff & Float.floatToRawIntBits(a))}
*
* @param a the argument whose absolute value is to be determined
* @return the absolute value of the argument.
@@ -1389,8 +1394,13 @@
* is positive zero.
* <li>If the argument is infinite, the result is positive infinity.
* <li>If the argument is NaN, the result is NaN.</ul>
- * In other words, the result is the same as the value of the expression:
- * <p>{@code Double.longBitsToDouble((Double.doubleToLongBits(a)<<1)>>>1)}
+ *
+ * @apiNote As implied by the above, one valid implementation of
+ * this method is given by the expression below which computes a
+ * {@code double} with the same exponent and significand as the
+ * argument but with a guaranteed zero sign bit indicating a
+ * positive value:<br>
+ * {@code Double.longBitsToDouble((Double.doubleToRawLongBits(a)<<1)>>>1)}
*
* @param a the argument whose absolute value is to be determined
* @return the absolute value of the argument.
--- a/jdk/src/java.base/share/classes/java/lang/StrictMath.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/StrictMath.java Fri Aug 26 10:14:15 2016 -0700
@@ -1070,8 +1070,13 @@
* result is positive zero.
* <li>If the argument is infinite, the result is positive infinity.
* <li>If the argument is NaN, the result is NaN.</ul>
- * In other words, the result is the same as the value of the expression:
- * <p>{@code Float.intBitsToFloat(0x7fffffff & Float.floatToIntBits(a))}
+ *
+ * @apiNote As implied by the above, one valid implementation of
+ * this method is given by the expression below which computes a
+ * {@code float} with the same exponent and significand as the
+ * argument but with a guaranteed zero sign bit indicating a
+ * positive value: <br>
+ * {@code Float.intBitsToFloat(0x7fffffff & Float.floatToRawIntBits(a))}
*
* @param a the argument whose absolute value is to be determined
* @return the absolute value of the argument.
@@ -1089,8 +1094,13 @@
* is positive zero.
* <li>If the argument is infinite, the result is positive infinity.
* <li>If the argument is NaN, the result is NaN.</ul>
- * In other words, the result is the same as the value of the expression:
- * <p>{@code Double.longBitsToDouble((Double.doubleToLongBits(a)<<1)>>>1)}
+ *
+ * @apiNote As implied by the above, one valid implementation of
+ * this method is given by the expression below which computes a
+ * {@code double} with the same exponent and significand as the
+ * argument but with a guaranteed zero sign bit indicating a
+ * positive value: <br>
+ * {@code Double.longBitsToDouble((Double.doubleToRawLongBits(a)<<1)>>>1)}
*
* @param a the argument whose absolute value is to be determined
* @return the absolute value of the argument.
--- a/jdk/src/java.base/share/classes/java/lang/Thread.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/Thread.java Fri Aug 26 10:14:15 2016 -0700
@@ -1507,28 +1507,25 @@
}
/**
- * Returns the context ClassLoader for this Thread. The context
- * ClassLoader is provided by the creator of the thread for use
+ * Returns the context {@code ClassLoader} for this thread. The context
+ * {@code ClassLoader} is provided by the creator of the thread for use
* by code running in this thread when loading classes and resources.
* If not {@linkplain #setContextClassLoader set}, the default is the
- * ClassLoader context of the parent Thread. The context ClassLoader of the
+ * {@code ClassLoader} context of the parent thread. The context
+ * {@code ClassLoader} of the
* primordial thread is typically set to the class loader used to load the
* application.
*
- * <p>If a security manager is present, and the invoker's class loader is not
- * {@code null} and is not the same as or an ancestor of the context class
- * loader, then this method invokes the security manager's {@link
- * SecurityManager#checkPermission(java.security.Permission) checkPermission}
- * method with a {@link RuntimePermission RuntimePermission}{@code
- * ("getClassLoader")} permission to verify that retrieval of the context
- * class loader is permitted.
*
- * @return the context ClassLoader for this Thread, or {@code null}
+ * @return the context {@code ClassLoader} for this thread, or {@code null}
* indicating the system class loader (or, failing that, the
* bootstrap class loader)
*
* @throws SecurityException
- * if the current thread cannot get the context ClassLoader
+ * if a security manager is present, and the caller's class loader
+ * is not {@code null} and is not the same as or an ancestor of the
+ * context class loader, and the caller does not have the
+ * {@link RuntimePermission}{@code ("getClassLoader")}
*
* @since 1.2
*/
--- a/jdk/src/java.base/share/classes/java/lang/invoke/DirectMethodHandle.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/DirectMethodHandle.java Fri Aug 26 10:14:15 2016 -0700
@@ -492,7 +492,7 @@
}
// Caching machinery for field accessors:
- private static final byte
+ static final byte
AF_GETFIELD = 0,
AF_PUTFIELD = 1,
AF_GETSTATIC = 2,
@@ -502,7 +502,7 @@
AF_LIMIT = 6;
// Enumerate the different field kinds using Wrapper,
// with an extra case added for checked references.
- private static final int
+ static final int
FT_LAST_WRAPPER = Wrapper.COUNT-1,
FT_UNCHECKED_REF = Wrapper.OBJECT.ordinal(),
FT_CHECKED_REF = FT_LAST_WRAPPER+1,
@@ -515,7 +515,7 @@
@Stable
private static final LambdaForm[] ACCESSOR_FORMS
= new LambdaForm[afIndex(AF_LIMIT, false, 0)];
- private static int ftypeKind(Class<?> ftype) {
+ static int ftypeKind(Class<?> ftype) {
if (ftype.isPrimitive())
return Wrapper.forPrimitiveType(ftype).ordinal();
else if (VerifyType.isNullReferenceConversion(Object.class, ftype))
@@ -566,7 +566,64 @@
private static final Wrapper[] ALL_WRAPPERS = Wrapper.values();
- private static LambdaForm makePreparedFieldLambdaForm(byte formOp, boolean isVolatile, int ftypeKind) {
+ private static Kind getFieldKind(boolean isGetter, boolean isVolatile, Wrapper wrapper) {
+ if (isGetter) {
+ if (isVolatile) {
+ switch (wrapper) {
+ case BOOLEAN: return GET_BOOLEAN_VOLATILE;
+ case BYTE: return GET_BYTE_VOLATILE;
+ case SHORT: return GET_SHORT_VOLATILE;
+ case CHAR: return GET_CHAR_VOLATILE;
+ case INT: return GET_INT_VOLATILE;
+ case LONG: return GET_LONG_VOLATILE;
+ case FLOAT: return GET_FLOAT_VOLATILE;
+ case DOUBLE: return GET_DOUBLE_VOLATILE;
+ case OBJECT: return GET_OBJECT_VOLATILE;
+ }
+ } else {
+ switch (wrapper) {
+ case BOOLEAN: return GET_BOOLEAN;
+ case BYTE: return GET_BYTE;
+ case SHORT: return GET_SHORT;
+ case CHAR: return GET_CHAR;
+ case INT: return GET_INT;
+ case LONG: return GET_LONG;
+ case FLOAT: return GET_FLOAT;
+ case DOUBLE: return GET_DOUBLE;
+ case OBJECT: return GET_OBJECT;
+ }
+ }
+ } else {
+ if (isVolatile) {
+ switch (wrapper) {
+ case BOOLEAN: return PUT_BOOLEAN_VOLATILE;
+ case BYTE: return PUT_BYTE_VOLATILE;
+ case SHORT: return PUT_SHORT_VOLATILE;
+ case CHAR: return PUT_CHAR_VOLATILE;
+ case INT: return PUT_INT_VOLATILE;
+ case LONG: return PUT_LONG_VOLATILE;
+ case FLOAT: return PUT_FLOAT_VOLATILE;
+ case DOUBLE: return PUT_DOUBLE_VOLATILE;
+ case OBJECT: return PUT_OBJECT_VOLATILE;
+ }
+ } else {
+ switch (wrapper) {
+ case BOOLEAN: return PUT_BOOLEAN;
+ case BYTE: return PUT_BYTE;
+ case SHORT: return PUT_SHORT;
+ case CHAR: return PUT_CHAR;
+ case INT: return PUT_INT;
+ case LONG: return PUT_LONG;
+ case FLOAT: return PUT_FLOAT;
+ case DOUBLE: return PUT_DOUBLE;
+ case OBJECT: return PUT_OBJECT;
+ }
+ }
+ }
+ throw new AssertionError("Invalid arguments");
+ }
+
+ static LambdaForm makePreparedFieldLambdaForm(byte formOp, boolean isVolatile, int ftypeKind) {
boolean isGetter = (formOp & 1) == (AF_GETFIELD & 1);
boolean isStatic = (formOp >= AF_GETSTATIC);
boolean needsInit = (formOp >= AF_GETSTATIC_INIT);
@@ -576,24 +633,14 @@
assert(ftypeKind(needsCast ? String.class : ft) == ftypeKind);
// getObject, putIntVolatile, etc.
- StringBuilder nameBuilder = new StringBuilder();
- if (isGetter) {
- nameBuilder.append("get");
- } else {
- nameBuilder.append("put");
- }
- nameBuilder.append(fw.primitiveSimpleName());
- nameBuilder.setCharAt(3, Character.toUpperCase(nameBuilder.charAt(3)));
- if (isVolatile) {
- nameBuilder.append("Volatile");
- }
+ Kind kind = getFieldKind(isGetter, isVolatile, fw);
MethodType linkerType;
if (isGetter)
linkerType = MethodType.methodType(ft, Object.class, long.class);
else
linkerType = MethodType.methodType(void.class, Object.class, long.class, ft);
- MemberName linker = new MemberName(Unsafe.class, nameBuilder.toString(), linkerType, REF_invokeVirtual);
+ MemberName linker = new MemberName(Unsafe.class, kind.methodName, linkerType, REF_invokeVirtual);
try {
linker = IMPL_NAMES.resolveOrFail(REF_invokeVirtual, linker, null, NoSuchMethodException.class);
} catch (ReflectiveOperationException ex) {
@@ -620,6 +667,7 @@
final int F_HOLDER = (isStatic ? nameCursor++ : -1); // static base if any
final int F_OFFSET = nameCursor++; // Either static offset or field offset.
final int OBJ_CHECK = (OBJ_BASE >= 0 ? nameCursor++ : -1);
+ final int U_HOLDER = nameCursor++; // UNSAFE holder
final int INIT_BAR = (needsInit ? nameCursor++ : -1);
final int PRE_CAST = (needsCast && !isGetter ? nameCursor++ : -1);
final int LINKER_CALL = nameCursor++;
@@ -632,7 +680,7 @@
names[PRE_CAST] = new Name(NF_checkCast, names[DMH_THIS], names[SET_VALUE]);
Object[] outArgs = new Object[1 + linkerType.parameterCount()];
assert(outArgs.length == (isGetter ? 3 : 4));
- outArgs[0] = UNSAFE;
+ outArgs[0] = names[U_HOLDER] = new Name(NF_UNSAFE);
if (isStatic) {
outArgs[1] = names[F_HOLDER] = new Name(NF_staticBase, names[DMH_THIS]);
outArgs[2] = names[F_OFFSET] = new Name(NF_staticOffset, names[DMH_THIS]);
@@ -650,6 +698,7 @@
for (Name n : names) assert(n != null);
// add some detail to the lambdaForm debugname,
// significant only for debugging
+ StringBuilder nameBuilder = new StringBuilder(kind.methodName);
if (isStatic) {
nameBuilder.append("Static");
} else {
@@ -657,7 +706,12 @@
}
if (needsCast) nameBuilder.append("Cast");
if (needsInit) nameBuilder.append("Init");
- return new LambdaForm(nameBuilder.toString(), ARG_LIMIT, names, RESULT);
+ if (needsCast || needsInit) {
+ // can't use the pre-generated form when casting and/or initializing
+ return new LambdaForm(nameBuilder.toString(), ARG_LIMIT, names, RESULT);
+ } else {
+ return new LambdaForm(nameBuilder.toString(), ARG_LIMIT, names, RESULT, kind);
+ }
}
/**
@@ -674,7 +728,8 @@
NF_staticOffset,
NF_checkCast,
NF_allocateInstance,
- NF_constructorMethod;
+ NF_constructorMethod,
+ NF_UNSAFE;
static {
try {
NamedFunction nfs[] = {
@@ -697,7 +752,9 @@
NF_allocateInstance = new NamedFunction(DirectMethodHandle.class
.getDeclaredMethod("allocateInstance", Object.class)),
NF_constructorMethod = new NamedFunction(DirectMethodHandle.class
- .getDeclaredMethod("constructorMethod", Object.class))
+ .getDeclaredMethod("constructorMethod", Object.class)),
+ NF_UNSAFE = new NamedFunction(new MemberName(MethodHandleStatics.class
+ .getDeclaredField("UNSAFE")))
};
// Each nf must be statically invocable or we get tied up in our bootstraps.
assert(InvokerBytecodeGenerator.isStaticallyInvocable(nfs));
--- a/jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java Fri Aug 26 10:14:15 2016 -0700
@@ -28,9 +28,11 @@
import java.util.Map;
import jdk.internal.org.objectweb.asm.ClassWriter;
import jdk.internal.org.objectweb.asm.Opcodes;
-
import java.util.ArrayList;
import java.util.HashSet;
+import sun.invoke.util.Wrapper;
+
+import static java.lang.invoke.MethodHandleNatives.Constants.*;
/**
* Helper class to assist the GenerateJLIClassesPlugin to get access to
@@ -38,16 +40,66 @@
*/
class GenerateJLIClassesHelper {
+ static byte[] generateBasicFormsClassBytes(String className) {
+ ArrayList<LambdaForm> forms = new ArrayList<>();
+ ArrayList<String> names = new ArrayList<>();
+ HashSet<String> dedupSet = new HashSet<>();
+ for (LambdaForm.BasicType type : LambdaForm.BasicType.values()) {
+ LambdaForm zero = LambdaForm.zeroForm(type);
+ String name = zero.kind.defaultLambdaName
+ + "_" + zero.returnType().basicTypeChar();
+ if (dedupSet.add(name)) {
+ names.add(name);
+ forms.add(zero);
+ }
+
+ LambdaForm identity = LambdaForm.identityForm(type);
+ name = identity.kind.defaultLambdaName
+ + "_" + identity.returnType().basicTypeChar();
+ if (dedupSet.add(name)) {
+ names.add(name);
+ forms.add(identity);
+ }
+ }
+ return generateCodeBytesForLFs(className,
+ names.toArray(new String[0]),
+ forms.toArray(new LambdaForm[0]));
+ }
+
static byte[] generateDirectMethodHandleHolderClassBytes(String className,
MethodType[] methodTypes, int[] types) {
- LambdaForm[] forms = new LambdaForm[methodTypes.length];
- String[] names = new String[methodTypes.length];
- for (int i = 0; i < forms.length; i++) {
- forms[i] = DirectMethodHandle.makePreparedLambdaForm(methodTypes[i],
- types[i]);
- names[i] = forms[i].kind.defaultLambdaName;
+ ArrayList<LambdaForm> forms = new ArrayList<>();
+ ArrayList<String> names = new ArrayList<>();
+ for (int i = 0; i < methodTypes.length; i++) {
+ LambdaForm form = DirectMethodHandle
+ .makePreparedLambdaForm(methodTypes[i], types[i]);
+ forms.add(form);
+ names.add(form.kind.defaultLambdaName);
}
- return generateCodeBytesForLFs(className, names, forms);
+ for (Wrapper wrapper : Wrapper.values()) {
+ if (wrapper == Wrapper.VOID) {
+ continue;
+ }
+ for (byte b = DirectMethodHandle.AF_GETFIELD; b < DirectMethodHandle.AF_LIMIT; b++) {
+ int ftype = DirectMethodHandle.ftypeKind(wrapper.primitiveType());
+ LambdaForm form = DirectMethodHandle
+ .makePreparedFieldLambdaForm(b, /*isVolatile*/false, ftype);
+ if (form.kind != LambdaForm.Kind.GENERIC) {
+ forms.add(form);
+ names.add(form.kind.defaultLambdaName);
+ }
+ // volatile
+ form = DirectMethodHandle
+ .makePreparedFieldLambdaForm(b, /*isVolatile*/true, ftype);
+ if (form.kind != LambdaForm.Kind.GENERIC) {
+ forms.add(form);
+ names.add(form.kind.defaultLambdaName);
+ }
+ }
+ }
+ return generateCodeBytesForLFs(className,
+ names.toArray(new String[0]),
+ forms.toArray(new LambdaForm[0]));
}
static byte[] generateDelegatingMethodHandleHolderClassBytes(String className,
@@ -81,6 +133,34 @@
forms.toArray(new LambdaForm[0]));
}
+ static byte[] generateInvokersHolderClassBytes(String className,
+ MethodType[] methodTypes) {
+
+ HashSet<MethodType> dedupSet = new HashSet<>();
+ ArrayList<LambdaForm> forms = new ArrayList<>();
+ ArrayList<String> names = new ArrayList<>();
+ int[] types = {
+ MethodTypeForm.LF_EX_LINKER,
+ MethodTypeForm.LF_EX_INVOKER,
+ MethodTypeForm.LF_GEN_LINKER,
+ MethodTypeForm.LF_GEN_INVOKER
+ };
+ for (int i = 0; i < methodTypes.length; i++) {
+ // generate methods representing invokers of the specified type
+ if (dedupSet.add(methodTypes[i])) {
+ for (int type : types) {
+ LambdaForm invokerForm = Invokers.invokeHandleForm(methodTypes[i],
+ /*customized*/false, type);
+ forms.add(invokerForm);
+ names.add(invokerForm.kind.defaultLambdaName);
+ }
+ }
+ }
+ return generateCodeBytesForLFs(className,
+ names.toArray(new String[0]),
+ forms.toArray(new LambdaForm[0]));
+ }
+
/*
* Generate customized code for a set of LambdaForms of specified types into
* a class with a specified name.
@@ -140,4 +220,5 @@
BoundMethodHandle.Factory.generateConcreteBMHClassBytes(
shortTypes, types, className));
}
+
}
--- a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Fri Aug 26 10:14:15 2016 -0700
@@ -624,6 +624,33 @@
return resolveFrom(name, invokerType, DelegatingMethodHandle.Holder.class);
}
case DELEGATE: return resolveFrom(name, invokerType, DelegatingMethodHandle.Holder.class);
+ case ZERO: // fall-through
+ case IDENTITY: {
+ name = name + "_" + form.returnType().basicTypeChar();
+ return resolveFrom(name, invokerType, LambdaForm.Holder.class);
+ }
+ case EXACT_INVOKER: // fall-through
+ case EXACT_LINKER: // fall-through
+ case GENERIC_INVOKER: // fall-through
+ case GENERIC_LINKER: return resolveFrom(name, invokerType.basicType(), Invokers.Holder.class);
+ case GET_OBJECT: // fall-through
+ case GET_BOOLEAN: // fall-through
+ case GET_BYTE: // fall-through
+ case GET_CHAR: // fall-through
+ case GET_SHORT: // fall-through
+ case GET_INT: // fall-through
+ case GET_LONG: // fall-through
+ case GET_FLOAT: // fall-through
+ case GET_DOUBLE: // fall-through
+ case PUT_OBJECT: // fall-through
+ case PUT_BOOLEAN: // fall-through
+ case PUT_BYTE: // fall-through
+ case PUT_CHAR: // fall-through
+ case PUT_SHORT: // fall-through
+ case PUT_INT: // fall-through
+ case PUT_LONG: // fall-through
+ case PUT_FLOAT: // fall-through
+ case PUT_DOUBLE: // fall-through
case DIRECT_INVOKE_INTERFACE: // fall-through
case DIRECT_INVOKE_SPECIAL: // fall-through
case DIRECT_INVOKE_STATIC: // fall-through
--- a/jdk/src/java.base/share/classes/java/lang/invoke/Invokers.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/Invokers.java Fri Aug 26 10:14:15 2016 -0700
@@ -36,6 +36,7 @@
import static java.lang.invoke.MethodHandleNatives.Constants.*;
import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP;
import static java.lang.invoke.LambdaForm.*;
+import static java.lang.invoke.LambdaForm.Kind.*;
/**
* Construction and caching of often-used invokers.
@@ -254,7 +255,7 @@
* @param which bit-encoded 0x01 whether it is a CP adapter ("linker") or MHs.invoker value ("invoker");
* 0x02 whether it is for invokeExact or generic invoke
*/
- private static LambdaForm invokeHandleForm(MethodType mtype, boolean customized, int which) {
+ static LambdaForm invokeHandleForm(MethodType mtype, boolean customized, int which) {
boolean isCached;
if (!customized) {
mtype = mtype.basicType(); // normalize Z to I, String to Object, etc.
@@ -263,12 +264,12 @@
isCached = false; // maybe cache if mtype == mtype.basicType()
}
boolean isLinker, isGeneric;
- String debugName;
+ Kind kind;
switch (which) {
- case MethodTypeForm.LF_EX_LINKER: isLinker = true; isGeneric = false; debugName = "invokeExact_MT"; break;
- case MethodTypeForm.LF_EX_INVOKER: isLinker = false; isGeneric = false; debugName = "exactInvoker"; break;
- case MethodTypeForm.LF_GEN_LINKER: isLinker = true; isGeneric = true; debugName = "invoke_MT"; break;
- case MethodTypeForm.LF_GEN_INVOKER: isLinker = false; isGeneric = true; debugName = "invoker"; break;
+ case MethodTypeForm.LF_EX_LINKER: isLinker = true; isGeneric = false; kind = EXACT_LINKER; break;
+ case MethodTypeForm.LF_EX_INVOKER: isLinker = false; isGeneric = false; kind = EXACT_INVOKER; break;
+ case MethodTypeForm.LF_GEN_LINKER: isLinker = true; isGeneric = true; kind = GENERIC_LINKER; break;
+ case MethodTypeForm.LF_GEN_INVOKER: isLinker = false; isGeneric = true; kind = GENERIC_INVOKER; break;
default: throw new InternalError();
}
LambdaForm lform;
@@ -323,7 +324,11 @@
names[CHECK_CUSTOM] = new Name(NF_checkCustomized, outArgs[0]);
}
names[LINKER_CALL] = new Name(outCallType, outArgs);
- lform = new LambdaForm(debugName, INARG_LIMIT, names);
+ if (customized) {
+ lform = new LambdaForm(kind.defaultLambdaName, INARG_LIMIT, names);
+ } else {
+ lform = new LambdaForm(kind.defaultLambdaName, INARG_LIMIT, names, kind);
+ }
if (isLinker)
lform.compileToBytecode(); // JVM needs a real methodOop
if (isCached)
@@ -614,4 +619,15 @@
}
}
}
+
+ static {
+ // The Holder class will contain pre-generated Invokers resolved
+ // speculatively using MemberName.getFactory().resolveOrNull. However, that
+ // doesn't initialize the class, which subtly breaks inlining etc. By forcing
+ // initialization of the Holder class we avoid these issues.
+ UNSAFE.ensureClassInitialized(Holder.class);
+ }
+
+ /* Placeholder class for Invokers generated ahead of time */
+ final class Holder {}
}
--- a/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java Fri Aug 26 10:14:15 2016 -0700
@@ -270,15 +270,57 @@
enum Kind {
GENERIC(""),
+ ZERO("zero"),
+ IDENTITY("identity"),
BOUND_REINVOKER("BMH.reinvoke"),
REINVOKER("MH.reinvoke"),
DELEGATE("MH.delegate"),
+ EXACT_LINKER("MH.invokeExact_MT"),
+ EXACT_INVOKER("MH.exactInvoker"),
+ GENERIC_LINKER("MH.invoke_MT"),
+ GENERIC_INVOKER("MH.invoker"),
DIRECT_INVOKE_VIRTUAL("DMH.invokeVirtual"),
DIRECT_INVOKE_SPECIAL("DMH.invokeSpecial"),
DIRECT_INVOKE_STATIC("DMH.invokeStatic"),
DIRECT_NEW_INVOKE_SPECIAL("DMH.newInvokeSpecial"),
DIRECT_INVOKE_INTERFACE("DMH.invokeInterface"),
- DIRECT_INVOKE_STATIC_INIT("DMH.invokeStaticInit");
+ DIRECT_INVOKE_STATIC_INIT("DMH.invokeStaticInit"),
+ GET_OBJECT("getObject"),
+ PUT_OBJECT("putObject"),
+ GET_OBJECT_VOLATILE("getObjectVolatile"),
+ PUT_OBJECT_VOLATILE("putObjectVolatile"),
+ GET_INT("getInt"),
+ PUT_INT("putInt"),
+ GET_INT_VOLATILE("getIntVolatile"),
+ PUT_INT_VOLATILE("putIntVolatile"),
+ GET_BOOLEAN("getBoolean"),
+ PUT_BOOLEAN("putBoolean"),
+ GET_BOOLEAN_VOLATILE("getBooleanVolatile"),
+ PUT_BOOLEAN_VOLATILE("putBooleanVolatile"),
+ GET_BYTE("getByte"),
+ PUT_BYTE("putByte"),
+ GET_BYTE_VOLATILE("getByteVolatile"),
+ PUT_BYTE_VOLATILE("putByteVolatile"),
+ GET_CHAR("getChar"),
+ PUT_CHAR("putChar"),
+ GET_CHAR_VOLATILE("getCharVolatile"),
+ PUT_CHAR_VOLATILE("putCharVolatile"),
+ GET_SHORT("getShort"),
+ PUT_SHORT("putShort"),
+ GET_SHORT_VOLATILE("getShortVolatile"),
+ PUT_SHORT_VOLATILE("putShortVolatile"),
+ GET_LONG("getLong"),
+ PUT_LONG("putLong"),
+ GET_LONG_VOLATILE("getLongVolatile"),
+ PUT_LONG_VOLATILE("putLongVolatile"),
+ GET_FLOAT("getFloat"),
+ PUT_FLOAT("putFloat"),
+ GET_FLOAT_VOLATILE("getFloatVolatile"),
+ PUT_FLOAT_VOLATILE("putFloatVolatile"),
+ GET_DOUBLE("getDouble"),
+ PUT_DOUBLE("putDouble"),
+ GET_DOUBLE_VOLATILE("getDoubleVolatile"),
+ PUT_DOUBLE_VOLATILE("putDoubleVolatile");
final String defaultLambdaName;
final String methodName;
@@ -328,6 +370,10 @@
this(debugName, arity, names, LAST_RESULT, /*forceInline=*/true, /*customized=*/null, Kind.GENERIC);
}
LambdaForm(String debugName,
+ int arity, Name[] names, Kind kind) {
+ this(debugName, arity, names, LAST_RESULT, /*forceInline=*/true, /*customized=*/null, kind);
+ }
+ LambdaForm(String debugName,
int arity, Name[] names, boolean forceInline) {
this(debugName, arity, names, LAST_RESULT, forceInline, /*customized=*/null, Kind.GENERIC);
}
@@ -815,54 +861,6 @@
}
}
- private static void computeInitialPreparedForms() {
- // Find all predefined invokers and associate them with canonical empty lambda forms.
- for (MemberName m : MemberName.getFactory().getMethods(LambdaForm.class, false, null, null, null)) {
- if (!m.isStatic() || !m.isPackage()) continue;
- MethodType mt = m.getMethodType();
- if (mt.parameterCount() > 0 &&
- mt.parameterType(0) == MethodHandle.class &&
- m.getName().startsWith("interpret_")) {
- String sig = null;
- assert((sig = basicTypeSignature(mt)) != null &&
- m.getName().equals("interpret" + sig.substring(sig.indexOf('_'))));
- LambdaForm form = new LambdaForm(mt);
- form.vmentry = m;
- form = mt.form().setCachedLambdaForm(MethodTypeForm.LF_INTERPRET, form);
- }
- }
- }
-
- // Set this false to disable use of the interpret_L methods defined in this file.
- private static final boolean USE_PREDEFINED_INTERPRET_METHODS = true;
-
- // The following are predefined exact invokers. The system must build
- // a separate invoker for each distinct signature.
- static Object interpret_L(MethodHandle mh) throws Throwable {
- Object[] av = {mh};
- String sig = null;
- assert(argumentTypesMatch(sig = "L_L", av));
- Object res = mh.form.interpretWithArguments(av);
- assert(returnTypesMatch(sig, av, res));
- return res;
- }
- static Object interpret_L(MethodHandle mh, Object x1) throws Throwable {
- Object[] av = {mh, x1};
- String sig = null;
- assert(argumentTypesMatch(sig = "LL_L", av));
- Object res = mh.form.interpretWithArguments(av);
- assert(returnTypesMatch(sig, av, res));
- return res;
- }
- static Object interpret_L(MethodHandle mh, Object x1, Object x2) throws Throwable {
- Object[] av = {mh, x1, x2};
- String sig = null;
- assert(argumentTypesMatch(sig = "LLL_L", av));
- Object res = mh.form.interpretWithArguments(av);
- assert(returnTypesMatch(sig, av, res));
- return res;
- }
-
// The next few routines are called only from assert expressions
// They verify that the built-in invokers process the correct raw data types.
private static boolean argumentTypesMatch(String sig, Object[] av) {
@@ -1149,113 +1147,6 @@
return super.hashCode();
}
- // Put the predefined NamedFunction invokers into the table.
- static void initializeInvokers() {
- for (MemberName m : MemberName.getFactory().getMethods(NamedFunction.class, false, null, null, null)) {
- if (!m.isStatic() || !m.isPackage()) continue;
- MethodType type = m.getMethodType();
- if (type.equals(INVOKER_METHOD_TYPE) &&
- m.getName().startsWith("invoke_")) {
- String sig = m.getName().substring("invoke_".length());
- int arity = LambdaForm.signatureArity(sig);
- MethodType srcType = MethodType.genericMethodType(arity);
- if (LambdaForm.signatureReturn(sig) == V_TYPE)
- srcType = srcType.changeReturnType(void.class);
- MethodTypeForm typeForm = srcType.form();
- typeForm.setCachedMethodHandle(MethodTypeForm.MH_NF_INV, DirectMethodHandle.make(m));
- }
- }
- }
-
- // The following are predefined NamedFunction invokers. The system must build
- // a separate invoker for each distinct signature.
- /** void return type invokers. */
- @Hidden
- static Object invoke__V(MethodHandle mh, Object[] a) throws Throwable {
- assert(arityCheck(0, void.class, mh, a));
- mh.invokeBasic();
- return null;
- }
- @Hidden
- static Object invoke_L_V(MethodHandle mh, Object[] a) throws Throwable {
- assert(arityCheck(1, void.class, mh, a));
- mh.invokeBasic(a[0]);
- return null;
- }
- @Hidden
- static Object invoke_LL_V(MethodHandle mh, Object[] a) throws Throwable {
- assert(arityCheck(2, void.class, mh, a));
- mh.invokeBasic(a[0], a[1]);
- return null;
- }
- @Hidden
- static Object invoke_LLL_V(MethodHandle mh, Object[] a) throws Throwable {
- assert(arityCheck(3, void.class, mh, a));
- mh.invokeBasic(a[0], a[1], a[2]);
- return null;
- }
- @Hidden
- static Object invoke_LLLL_V(MethodHandle mh, Object[] a) throws Throwable {
- assert(arityCheck(4, void.class, mh, a));
- mh.invokeBasic(a[0], a[1], a[2], a[3]);
- return null;
- }
- @Hidden
- static Object invoke_LLLLL_V(MethodHandle mh, Object[] a) throws Throwable {
- assert(arityCheck(5, void.class, mh, a));
- mh.invokeBasic(a[0], a[1], a[2], a[3], a[4]);
- return null;
- }
- /** Object return type invokers. */
- @Hidden
- static Object invoke__L(MethodHandle mh, Object[] a) throws Throwable {
- assert(arityCheck(0, mh, a));
- return mh.invokeBasic();
- }
- @Hidden
- static Object invoke_L_L(MethodHandle mh, Object[] a) throws Throwable {
- assert(arityCheck(1, mh, a));
- return mh.invokeBasic(a[0]);
- }
- @Hidden
- static Object invoke_LL_L(MethodHandle mh, Object[] a) throws Throwable {
- assert(arityCheck(2, mh, a));
- return mh.invokeBasic(a[0], a[1]);
- }
- @Hidden
- static Object invoke_LLL_L(MethodHandle mh, Object[] a) throws Throwable {
- assert(arityCheck(3, mh, a));
- return mh.invokeBasic(a[0], a[1], a[2]);
- }
- @Hidden
- static Object invoke_LLLL_L(MethodHandle mh, Object[] a) throws Throwable {
- assert(arityCheck(4, mh, a));
- return mh.invokeBasic(a[0], a[1], a[2], a[3]);
- }
- @Hidden
- static Object invoke_LLLLL_L(MethodHandle mh, Object[] a) throws Throwable {
- assert(arityCheck(5, mh, a));
- return mh.invokeBasic(a[0], a[1], a[2], a[3], a[4]);
- }
- private static boolean arityCheck(int arity, MethodHandle mh, Object[] a) {
- return arityCheck(arity, Object.class, mh, a);
- }
- private static boolean arityCheck(int arity, Class<?> rtype, MethodHandle mh, Object[] a) {
- assert(a.length == arity)
- : Arrays.asList(a.length, arity);
- assert(mh.type().basicType() == MethodType.genericMethodType(arity).changeReturnType(rtype))
- : Arrays.asList(mh, rtype, arity);
- MemberName member = mh.internalMemberName();
- if (isInvokeBasic(member)) {
- assert(arity > 0);
- assert(a[0] instanceof MethodHandle);
- MethodHandle mh2 = (MethodHandle) a[0];
- assert(mh2.type().basicType() == MethodType.genericMethodType(arity-1).changeReturnType(rtype))
- : Arrays.asList(member, mh2, rtype, arity);
- }
- return true;
- }
-
static final MethodType INVOKER_METHOD_TYPE =
MethodType.methodType(Object.class, MethodHandle.class, Object[].class);
@@ -1848,7 +1739,7 @@
// bootstrap dependency on this method in case we're interpreting LFs
if (isVoid) {
Name[] idNames = new Name[] { argument(0, L_TYPE) };
- idForm = new LambdaForm(idMem.getName(), 1, idNames, VOID_RESULT);
+ idForm = new LambdaForm(idMem.getName(), 1, idNames, VOID_RESULT, Kind.IDENTITY);
idForm.compileToBytecode();
idFun = new NamedFunction(idMem, SimpleMethodHandle.make(idMem.getInvocationType(), idForm));
@@ -1856,15 +1747,17 @@
zeFun = idFun;
} else {
Name[] idNames = new Name[] { argument(0, L_TYPE), argument(1, type) };
- idForm = new LambdaForm(idMem.getName(), 2, idNames, 1);
+ idForm = new LambdaForm(idMem.getName(), 2, idNames, 1, Kind.IDENTITY);
idForm.compileToBytecode();
- idFun = new NamedFunction(idMem, SimpleMethodHandle.make(idMem.getInvocationType(), idForm));
+ idFun = new NamedFunction(idMem, MethodHandleImpl.makeIntrinsic(
+ idMem.getInvocationType(), idForm, MethodHandleImpl.Intrinsic.IDENTITY));
Object zeValue = Wrapper.forBasicType(btChar).zero();
Name[] zeNames = new Name[] { argument(0, L_TYPE), new Name(idFun, zeValue) };
- zeForm = new LambdaForm(zeMem.getName(), 1, zeNames, 1);
+ zeForm = new LambdaForm(zeMem.getName(), 1, zeNames, 1, Kind.ZERO);
zeForm.compileToBytecode();
- zeFun = new NamedFunction(zeMem, SimpleMethodHandle.make(zeMem.getInvocationType(), zeForm));
+ zeFun = new NamedFunction(zeMem, MethodHandleImpl.makeIntrinsic(
+ zeMem.getInvocationType(), zeForm, MethodHandleImpl.Intrinsic.ZERO));
}
LF_zero[ord] = zeForm;
@@ -1916,13 +1809,17 @@
DEBUG_NAME_COUNTERS = null;
}
- // Put this last, so that previous static inits can run before.
static {
- if (USE_PREDEFINED_INTERPRET_METHODS)
- computeInitialPreparedForms();
- NamedFunction.initializeInvokers();
+ // The Holder class will contain pre-generated forms resolved
+ // using MemberName.getFactory(). However, that doesn't initialize the
+ // class, which subtly breaks inlining etc. By forcing
+ // initialization of the Holder class we avoid these issues.
+ UNSAFE.ensureClassInitialized(Holder.class);
}
+ /* Placeholder class for zero and identity forms generated ahead of time */
+ final class Holder {}
+
// The following hack is necessary in order to suppress TRACE_INTERPRETER
// during execution of the static initializes of this class.
// Turning on TRACE_INTERPRETER too early will cause
--- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java Fri Aug 26 10:14:15 2016 -0700
@@ -1739,6 +1739,19 @@
return GenerateJLIClassesHelper
.generateConcreteBMHClassBytes(types);
}
+
+ @Override
+ public byte[] generateBasicFormsClassBytes(final String className) {
+ return GenerateJLIClassesHelper
+ .generateBasicFormsClassBytes(className);
+ }
+
+ @Override
+ public byte[] generateInvokersHolderClassBytes(final String className,
+ MethodType[] methodTypes) {
+ return GenerateJLIClassesHelper
+ .generateInvokersHolderClassBytes(className, methodTypes);
+ }
});
}
@@ -1934,7 +1947,7 @@
* @return whether the counter has reached the limit.
*/
static boolean countedLoopPredicate(int counter, int limit) {
- return counter <= limit;
+ return counter < limit;
}
/**
--- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java Fri Aug 26 10:14:15 2016 -0700
@@ -4583,7 +4583,8 @@
* // assume MH_decrement is a handle to x-1 of type int
* MethodHandle[]
* indexVar = {start, MH_increment}, // i = start; i = i+1
- * loopLimit = {end, null, MH_lessThan, returnVar }, // i<end
+ * loopLimit = {end, null,
+ * filterArgument(MH_lessThan, 0, MH_decrement), returnVar}, // i-1<end
* bodyClause = {init,
* filterArgument(dropArguments(body, 1, int.class), 0, MH_decrement}; // v = body(i-1, v)
* return loop(indexVar, loopLimit, bodyClause);
@@ -4619,12 +4620,12 @@
MethodHandle actualBody = body == null ? dropArguments(defaultResultHandle, 0, int.class) : body;
MethodHandle returnVar = dropArguments(defaultResultHandle, 0, int.class, int.class);
MethodHandle actualEnd = end == null ? constant(int.class, 0) : end;
+ MethodHandle decr = MethodHandleImpl.getConstantHandle(MethodHandleImpl.MH_decrementCounter);
MethodHandle[] indexVar = {start, MethodHandleImpl.getConstantHandle(MethodHandleImpl.MH_countedLoopStep)};
MethodHandle[] loopLimit = {actualEnd, null,
- MethodHandleImpl.getConstantHandle(MethodHandleImpl.MH_countedLoopPred), returnVar};
- MethodHandle[] bodyClause = {actualInit,
- filterArgument(dropArguments(actualBody, 1, int.class), 0,
- MethodHandleImpl.getConstantHandle(MethodHandleImpl.MH_decrementCounter))};
+ filterArgument(MethodHandleImpl.getConstantHandle(MethodHandleImpl.MH_countedLoopPred), 0, decr),
+ returnVar};
+ MethodHandle[] bodyClause = {actualInit, filterArgument(dropArguments(actualBody, 1, int.class), 0, decr)};
return loop(indexVar, loopLimit, bodyClause);
}
--- a/jdk/src/java.base/share/classes/java/lang/reflect/AbstractClassLoaderValue.java Fri Aug 26 13:11:39 2016 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,431 +0,0 @@
-/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package java.lang.reflect;
-
-import jdk.internal.loader.BootLoader;
-import jdk.internal.misc.JavaLangAccess;
-import jdk.internal.misc.SharedSecrets;
-
-import java.util.Iterator;
-import java.util.Objects;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.function.BiFunction;
-import java.util.function.Supplier;
-
-/**
- * AbstractClassLoaderValue is a superclass of root-{@link ClassLoaderValue}
- * and {@link Sub sub}-ClassLoaderValue.
- *
- * @param <CLV> the type of concrete ClassLoaderValue (this type)
- * @param <V> the type of values associated with ClassLoaderValue
- */
-abstract class AbstractClassLoaderValue<CLV extends AbstractClassLoaderValue<CLV, V>, V> {
-
- /**
- * Sole constructor.
- */
- AbstractClassLoaderValue() {}
-
- /**
- * Returns the key component of this ClassLoaderValue. The key component of
- * the root-{@link ClassLoaderValue} is the ClassLoaderValue itself,
- * while the key component of a {@link #sub(Object) sub}-ClassLoaderValue
- * is what was given to construct it.
- *
- * @return the key component of this ClassLoaderValue.
- */
- public abstract Object key();
-
- /**
- * Constructs new sub-ClassLoaderValue of this ClassLoaderValue with given
- * key component.
- *
- * @param key the key component of the sub-ClassLoaderValue.
- * @param <K> the type of the key component.
- * @return a sub-ClassLoaderValue of this ClassLoaderValue for given key
- */
- public <K> Sub<K> sub(K key) {
- return new Sub<>(key);
- }
-
- /**
- * Returns {@code true} if this ClassLoaderValue is equal to given {@code clv}
- * or if this ClassLoaderValue was derived from given {@code clv} by a chain
- * of {@link #sub(Object)} invocations.
- *
- * @param clv the ClassLoaderValue to test this against
- * @return if this ClassLoaderValue is equal to given {@code clv} or
- * its descendant
- */
- public abstract boolean isEqualOrDescendantOf(AbstractClassLoaderValue<?, V> clv);
-
- /**
- * Returns the value associated with this ClassLoaderValue and given ClassLoader
- * or {@code null} if there is none.
- *
- * @param cl the ClassLoader for the associated value
- * @return the value associated with this ClassLoaderValue and given ClassLoader
- * or {@code null} if there is none.
- */
- public V get(ClassLoader cl) {
- Object val = AbstractClassLoaderValue.<CLV>map(cl).get(this);
- try {
- return extractValue(val);
- } catch (Memoizer.RecursiveInvocationException e) {
- // propagate recursive get() for the same key that is just
- // being calculated in computeIfAbsent()
- throw e;
- } catch (Throwable t) {
- // don't propagate exceptions thrown from Memoizer - pretend
- // that there was no entry
- // (computeIfAbsent invocation will try to remove it anyway)
- return null;
- }
- }
-
- /**
- * Associates given value {@code v} with this ClassLoaderValue and given
- * ClassLoader and returns {@code null} if there was no previously associated
- * value or does nothing and returns previously associated value if there
- * was one.
- *
- * @param cl the ClassLoader for the associated value
- * @param v the value to associate
- * @return previously associated value or null if there was none
- */
- public V putIfAbsent(ClassLoader cl, V v) {
- ConcurrentHashMap<CLV, Object> map = map(cl);
- @SuppressWarnings("unchecked")
- CLV clv = (CLV) this;
- while (true) {
- try {
- Object val = map.putIfAbsent(clv, v);
- return extractValue(val);
- } catch (Memoizer.RecursiveInvocationException e) {
- // propagate RecursiveInvocationException for the same key that
- // is just being calculated in computeIfAbsent
- throw e;
- } catch (Throwable t) {
- // don't propagate exceptions thrown from foreign Memoizer -
- // pretend that there was no entry and retry
- // (foreign computeIfAbsent invocation will try to remove it anyway)
- }
- // TODO:
- // Thread.onSpinLoop(); // when available
- }
- }
-
- /**
- * Removes the value associated with this ClassLoaderValue and given
- * ClassLoader if the associated value is equal to given value {@code v} and
- * returns {@code true} or does nothing and returns {@code false} if there is
- * no currently associated value or it is not equal to given value {@code v}.
- *
- * @param cl the ClassLoader for the associated value
- * @param v the value to compare with currently associated value
- * @return {@code true} if the association was removed or {@code false} if not
- */
- public boolean remove(ClassLoader cl, Object v) {
- return AbstractClassLoaderValue.<CLV>map(cl).remove(this, v);
- }
-
- /**
- * Returns the value associated with this ClassLoaderValue and given
- * ClassLoader if there is one or computes the value by invoking given
- * {@code mappingFunction}, associates it and returns it.
- * <p>
- * Computation and association of the computed value is performed atomically
- * by the 1st thread that requests a particular association while holding a
- * lock associated with this ClassLoaderValue and given ClassLoader.
- * Nested calls from the {@code mappingFunction} to {@link #get},
- * {@link #putIfAbsent} or {@link #computeIfAbsent} for the same association
- * are not allowed and throw {@link IllegalStateException}. Nested call to
- * {@link #remove} for the same association is allowed but will always return
- * {@code false} regardless of passed-in comparison value. Nested calls for
- * other association(s) are allowed, but care should be taken to avoid
- * deadlocks. When two threads perform nested computations of the overlapping
- * set of associations they should always request them in the same order.
- *
- * @param cl the ClassLoader for the associated value
- * @param mappingFunction the function to compute the value
- * @return the value associated with this ClassLoaderValue and given
- * ClassLoader.
- * @throws IllegalStateException if a direct or indirect invocation from
- * within given {@code mappingFunction} that
- * computes the value of a particular association
- * to {@link #get}, {@link #putIfAbsent} or
- * {@link #computeIfAbsent}
- * for the same association is attempted.
- */
- public V computeIfAbsent(ClassLoader cl,
- BiFunction<
- ? super ClassLoader,
- ? super CLV,
- ? extends V
- > mappingFunction) throws IllegalStateException {
- ConcurrentHashMap<CLV, Object> map = map(cl);
- @SuppressWarnings("unchecked")
- CLV clv = (CLV) this;
- Memoizer<CLV, V> mv = null;
- while (true) {
- Object val = (mv == null) ? map.get(clv) : map.putIfAbsent(clv, mv);
- if (val == null) {
- if (mv == null) {
- // create Memoizer lazily when 1st needed and restart loop
- mv = new Memoizer<>(cl, clv, mappingFunction);
- continue;
- }
- // mv != null, therefore sv == null was a result of successful
- // putIfAbsent
- try {
- // trigger Memoizer to compute the value
- V v = mv.get();
- // attempt to replace our Memoizer with the value
- map.replace(clv, mv, v);
- // return computed value
- return v;
- } catch (Throwable t) {
- // our Memoizer has thrown, attempt to remove it
- map.remove(clv, mv);
- // propagate exception because it's from our Memoizer
- throw t;
- }
- } else {
- try {
- return extractValue(val);
- } catch (Memoizer.RecursiveInvocationException e) {
- // propagate recursive attempts to calculate the same
- // value as being calculated at the moment
- throw e;
- } catch (Throwable t) {
- // don't propagate exceptions thrown from foreign Memoizer -
- // pretend that there was no entry and retry
- // (foreign computeIfAbsent invocation will try to remove it anyway)
- }
- }
- // TODO:
- // Thread.onSpinLoop(); // when available
- }
- }
-
- /**
- * Removes all values associated with given ClassLoader {@code cl} and
- * {@link #isEqualOrDescendantOf(AbstractClassLoaderValue) this or descendants}
- * of this ClassLoaderValue.
- * This is not an atomic operation. Other threads may see some associations
- * be already removed and others still present while this method is executing.
- * <p>
- * The sole intention of this method is to cleanup after a unit test that
- * tests ClassLoaderValue directly. It is not intended for use in
- * actual algorithms.
- *
- * @param cl the associated ClassLoader of the values to be removed
- */
- public void removeAll(ClassLoader cl) {
- ConcurrentHashMap<CLV, Object> map = map(cl);
- for (Iterator<CLV> i = map.keySet().iterator(); i.hasNext(); ) {
- if (i.next().isEqualOrDescendantOf(this)) {
- i.remove();
- }
- }
- }
-
- private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess();
-
- /**
- * @return a ConcurrentHashMap for given ClassLoader
- */
- @SuppressWarnings("unchecked")
- private static <CLV extends AbstractClassLoaderValue<CLV, ?>>
- ConcurrentHashMap<CLV, Object> map(ClassLoader cl) {
- return (ConcurrentHashMap<CLV, Object>)
- (cl == null ? BootLoader.getClassLoaderValueMap()
- : JLA.createOrGetClassLoaderValueMap(cl));
- }
-
- /**
- * @return value extracted from the {@link Memoizer} if given
- * {@code memoizerOrValue} parameter is a {@code Memoizer} or
- * just return given parameter.
- */
- @SuppressWarnings("unchecked")
- private V extractValue(Object memoizerOrValue) {
- if (memoizerOrValue instanceof Memoizer) {
- return ((Memoizer<?, V>) memoizerOrValue).get();
- } else {
- return (V) memoizerOrValue;
- }
- }
-
- /**
- * A memoized supplier that invokes given {@code mappingFunction} just once
- * and remembers the result or thrown exception for subsequent calls.
- * If given mappingFunction returns null, it is converted to NullPointerException,
- * thrown from the Memoizer's {@link #get()} method and remembered.
- * If the Memoizer is invoked recursively from the given {@code mappingFunction},
- * {@link RecursiveInvocationException} is thrown, but it is not remembered.
- * The in-flight call to the {@link #get()} can still complete successfully if
- * such exception is handled by the mappingFunction.
- */
- private static final class Memoizer<CLV extends AbstractClassLoaderValue<CLV, V>, V>
- implements Supplier<V> {
-
- private final ClassLoader cl;
- private final CLV clv;
- private final BiFunction<? super ClassLoader, ? super CLV, ? extends V>
- mappingFunction;
-
- private volatile V v;
- private volatile Throwable t;
- private boolean inCall;
-
- Memoizer(ClassLoader cl,
- CLV clv,
- BiFunction<? super ClassLoader, ? super CLV, ? extends V>
- mappingFunction
- ) {
- this.cl = cl;
- this.clv = clv;
- this.mappingFunction = mappingFunction;
- }
-
- @Override
- public V get() throws RecursiveInvocationException {
- V v = this.v;
- if (v != null) return v;
- Throwable t = this.t;
- if (t == null) {
- synchronized (this) {
- if ((v = this.v) == null && (t = this.t) == null) {
- if (inCall) {
- throw new RecursiveInvocationException();
- }
- inCall = true;
- try {
- this.v = v = Objects.requireNonNull(
- mappingFunction.apply(cl, clv));
- } catch (Throwable x) {
- this.t = t = x;
- } finally {
- inCall = false;
- }
- }
- }
- }
- if (v != null) return v;
- if (t instanceof Error) {
- throw (Error) t;
- } else if (t instanceof RuntimeException) {
- throw (RuntimeException) t;
- } else {
- throw new UndeclaredThrowableException(t);
- }
- }
-
- static class RecursiveInvocationException extends IllegalStateException {
- private static final long serialVersionUID = 1L;
-
- RecursiveInvocationException() {
- super("Recursive call");
- }
- }
- }
-
- /**
- * sub-ClassLoaderValue is an inner class of {@link AbstractClassLoaderValue}
- * and also a subclass of it. It can therefore be instantiated as an inner
- * class of either an instance of root-{@link ClassLoaderValue} or another
- * instance of itself. This enables composing type-safe compound keys of
- * arbitrary length:
- * <pre>{@code
- * ClassLoaderValue<V> clv = new ClassLoaderValue<>();
- * ClassLoaderValue<V>.Sub<K1>.Sub<K2>.Sub<K3> clv_k123 =
- * clv.sub(k1).sub(k2).sub(k3);
- * }</pre>
- * From which individual components are accessible in a type-safe way:
- * <pre>{@code
- * K1 k1 = clv_k123.parent().parent().key();
- * K2 k2 = clv_k123.parent().key();
- * K3 k3 = clv_k123.key();
- * }</pre>
- * This allows specifying non-capturing lambdas for the mapping function of
- * {@link #computeIfAbsent(ClassLoader, BiFunction)} operation that can
- * access individual key components from passed-in
- * sub-[sub-...]ClassLoaderValue instance in a type-safe way.
- *
- * @param <K> the type of {@link #key()} component contained in the
- * sub-ClassLoaderValue.
- */
- final class Sub<K> extends AbstractClassLoaderValue<Sub<K>, V> {
-
- private final K key;
-
- Sub(K key) {
- this.key = key;
- }
-
- /**
- * @return the parent ClassLoaderValue this sub-ClassLoaderValue
- * has been {@link #sub(Object) derived} from.
- */
- public AbstractClassLoaderValue<CLV, V> parent() {
- return AbstractClassLoaderValue.this;
- }
-
- /**
- * @return the key component of this sub-ClassLoaderValue.
- */
- @Override
- public K key() {
- return key;
- }
-
- /**
- * sub-ClassLoaderValue is a descendant of given {@code clv} if it is
- * either equal to it or if its {@link #parent() parent} is a
- * descendant of given {@code clv}.
- */
- @Override
- public boolean isEqualOrDescendantOf(AbstractClassLoaderValue<?, V> clv) {
- return equals(Objects.requireNonNull(clv)) ||
- parent().isEqualOrDescendantOf(clv);
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof Sub)) return false;
- @SuppressWarnings("unchecked")
- Sub<?> that = (Sub<?>) o;
- return this.parent().equals(that.parent()) &&
- Objects.equals(this.key, that.key);
- }
-
- @Override
- public int hashCode() {
- return 31 * parent().hashCode() +
- Objects.hashCode(key);
- }
- }
-}
--- a/jdk/src/java.base/share/classes/java/lang/reflect/ClassLoaderValue.java Fri Aug 26 13:11:39 2016 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package java.lang.reflect;
-
-import java.util.Objects;
-import java.util.function.BiFunction;
-
-/**
- * root-ClassLoaderValue. Each instance defines a separate namespace for
- * associated values.
- * <p>
- * ClassLoaderValue allows associating a
- * {@link #computeIfAbsent(ClassLoader, BiFunction) computed} non-null value with
- * a {@code (ClassLoader, keys...)} tuple. The associated value, as well as the
- * keys are strongly reachable from the associated ClassLoader so care should be
- * taken to use such keys and values that only reference types resolvable from
- * the associated ClassLoader. Failing that, ClassLoader leaks are inevitable.
- * <p>
- * Example usage:
- * <pre>{@code
- * // create a root instance which represents a namespace and declares the type of
- * // associated values (Class instances in this example)
- * static final ClassLoaderValue<Class<?>> proxyClasses = new ClassLoaderValue<>();
- *
- * // create a compound key composed of a Module and a list of interfaces
- * Module module = ...;
- * List<Class<?>> interfaces = ...;
- * ClassLoaderValue<Class<?>>.Sub<Module>.Sub<List<Class<?>>> key =
- * proxyClasses.sub(module).sub(interfaces);
- *
- * // use the compound key together with ClassLoader to lazily associate
- * // the value with tuple (loader, module, interfaces) and return it
- * ClassLoader loader = ...;
- * Class<?> proxyClass = key.computeIfAbsent(loader, (ld, ky) -> {
- * List<Class<?>> intfcs = ky.key();
- * Module m = ky.parent().key();
- * Class<?> clazz = defineProxyClass(ld, m, intfcs);
- * return clazz;
- * });
- * }</pre>
- * <p>
- * {@code classLoaderValue.<operation>(classLoader, ...)} represents an operation
- * to {@link #get}, {@link #putIfAbsent}, {@link #computeIfAbsent} or {@link #remove}
- * a value associated with a (classLoader, classLoaderValue) tuple. ClassLoader
- * instances and root-{@link ClassLoaderValue} instances are compared using
- * identity equality while {@link Sub sub}-ClassLoaderValue instances define
- * {@link #equals(Object) equality} in terms of equality of its
- * {@link Sub#parent() parent} ClassLoaderValue and its
- * {@link #key() key} component.
- *
- * @param <V> the type of value(s) associated with the root-ClassLoaderValue and
- * all its {@link #sub(Object) descendants}.
- * @author Peter Levart
- * @since 9
- */
-final class ClassLoaderValue<V>
- extends AbstractClassLoaderValue<ClassLoaderValue<V>, V> {
-
- /**
- * Constructs new root-ClassLoaderValue representing its own namespace.
- */
- public ClassLoaderValue() {}
-
- /**
- * @return the key component of this root-ClassLoaderValue (itself).
- */
- @Override
- public ClassLoaderValue<V> key() {
- return this;
- }
-
- /**
- * root-ClassLoaderValue can only be equal to itself and has no predecessors.
- */
- @Override
- public boolean isEqualOrDescendantOf(AbstractClassLoaderValue<?, V> clv) {
- return equals(Objects.requireNonNull(clv));
- }
-}
--- a/jdk/src/java.base/share/classes/java/lang/reflect/Proxy.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/reflect/Proxy.java Fri Aug 26 10:14:15 2016 -0700
@@ -29,11 +29,9 @@
import java.security.PrivilegedAction;
import java.util.Arrays;
import java.util.Collections;
-import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.IdentityHashMap;
-import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -49,6 +47,7 @@
import jdk.internal.misc.VM;
import jdk.internal.reflect.CallerSensitive;
import jdk.internal.reflect.Reflection;
+import jdk.internal.loader.ClassLoaderValue;
import sun.reflect.misc.ReflectUtil;
import sun.security.action.GetPropertyAction;
import sun.security.util.SecurityConstants;
--- a/jdk/src/java.base/share/classes/java/security/AuthProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/security/AuthProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -50,9 +50,24 @@
* @param name the provider name.
* @param version the provider version number.
* @param info a description of the provider and its services.
+ * @deprecated use {@link #AuthProvider(String, String, String)} instead.
*/
+ @Deprecated(since="9")
protected AuthProvider(String name, double version, String info) {
- super(name, version, info);
+ super(name, Double.toString(version), info);
+ }
+
+ /**
+ * Constructs a provider with the specified name, version string,
+ * and information.
+ *
+ * @param name the provider name.
+ * @param versionStr the provider version string.
+ * @param info a description of the provider and its services.
+ * @since 9
+ */
+ protected AuthProvider(String name, String versionStr, String info) {
+ super(name, versionStr, info);
}
/**
--- a/jdk/src/java.base/share/classes/java/security/Provider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/security/Provider.java Fri Aug 26 10:14:15 2016 -0700
@@ -67,14 +67,14 @@
* <tr><td>{@code Provider.id name}</td>
* <td>{@code String.valueOf(provider.getName())}</td>
* <tr><td>{@code Provider.id version}</td>
- * <td>{@code String.valueOf(provider.getVersion())}</td>
+ * <td>{@code String.valueOf(provider.getVersionStr())}</td>
* <tr><td>{@code Provider.id info}</td>
<td>{@code String.valueOf(provider.getInfo())}</td>
* <tr><td>{@code Provider.id className}</td>
* <td>{@code provider.getClass().getName()}</td>
* </table>
*
- * <p>Each provider has a name and a version number. A provider normally
+ * <p>Each provider has a name and a version string. A provider normally
* identifies itself with a file named {@code java.security.Provider}
* in the resource directory {@code META-INF/services}.
* Security providers are looked up via the {@link ServiceLoader} mechanism
@@ -102,11 +102,10 @@
public abstract class Provider extends Properties {
// Declare serialVersionUID to be compatible with JDK1.1
- static final long serialVersionUID = -4298000515446427739L;
+ private static final long serialVersionUID = -4298000515446427739L;
private static final sun.security.util.Debug debug =
- sun.security.util.Debug.getInstance
- ("provider", "Provider");
+ sun.security.util.Debug.getInstance("provider", "Provider");
/**
* The provider name.
@@ -129,6 +128,12 @@
*/
private double version;
+ /**
+ * The provider version string.
+ *
+ * @serial
+ */
+ private String versionStr;
private transient Set<Map.Entry<Object,Object>> entrySet = null;
private transient int entrySetCallCount = 0;
@@ -174,19 +179,83 @@
}
}
+ private static double parseVersionStr(String s) {
+ try {
+ int firstDotIdx = s.indexOf('.');
+ int nextDotIdx = s.indexOf('.', firstDotIdx + 1);
+ if (nextDotIdx != -1) {
+ s = s.substring(0, nextDotIdx);
+ }
+ int endIdx = s.indexOf('-');
+ if (endIdx > 0) {
+ s = s.substring(0, endIdx);
+ }
+ endIdx = s.indexOf('+');
+ if (endIdx > 0) {
+ s = s.substring(0, endIdx);
+ }
+ return Double.parseDouble(s);
+ } catch (NullPointerException | NumberFormatException e) {
+ return 0d;
+ }
+ }
+
/**
* Constructs a provider with the specified name, version number,
- * and information.
+ * and information. Calling this constructor is equivalent to call the
+ * {@link #Provider(String, String, String)} with {@code name}
+ * name, {@code Double.toString(version)}, and {@code info}.
*
* @param name the provider name.
*
* @param version the provider version number.
*
* @param info a description of the provider and its services.
+ *
+ * @deprecated use {@link #Provider(String, String, String)} instead.
*/
+ @Deprecated(since="9")
protected Provider(String name, double version, String info) {
this.name = name;
this.version = version;
+ this.versionStr = Double.toString(version);
+ this.info = info;
+ putId();
+ initialized = true;
+ }
+
+ /**
+ * Constructs a provider with the specified name, version string,
+ * and information.
+ *
+ * <p>The version string contains a version number optionally followed
+ * by other information separated by one of the characters of '+', '-'.
+ *
+ * The format for the version number is:
+ *
+ * <blockquote><pre>
+ * ^[0-9]+(\.[0-9]+)*
+ * </pre></blockquote>
+ *
+ * <p>In order to return the version number in a double, when there are
+ * more than two components (separated by '.' as defined above), only
+ * the first two components are retained. The resulting string is then
+ * passed to {@link Double#valueOf(String)} to generate version number,
+ * i.e. {@link #getVersion}.
+ * <p>If the conversion failed, value 0 will be used.
+ *
+ * @param name the provider name.
+ *
+ * @param versionStr the provider version string.
+ *
+ * @param info a description of the provider and its services.
+ *
+ * @since 9
+ */
+ protected Provider(String name, String versionStr, String info) {
+ this.name = name;
+ this.versionStr = versionStr;
+ this.version = parseVersionStr(versionStr);
this.info = info;
putId();
initialized = true;
@@ -250,12 +319,26 @@
* Returns the version number for this provider.
*
* @return the version number for this provider.
+ *
+ * @deprecated use {@link #getVersionStr} instead.
*/
+ @Deprecated(since="9")
public double getVersion() {
return version;
}
/**
+ * Returns the version string for this provider.
+ *
+ * @return the version string for this provider.
+ *
+ * @since 9
+ */
+ public String getVersionStr() {
+ return versionStr;
+ }
+
+ /**
* Returns a human-readable description of the provider and its
* services. This may return an HTML page, with relevant links.
*
@@ -266,14 +349,14 @@
}
/**
- * Returns a string with the name and the version number
+ * Returns a string with the name and the version string
* of this provider.
*
- * @return the string with the name and the version number
+ * @return the string with the name and the version string
* for this provider.
*/
public String toString() {
- return name + " version " + version;
+ return name + " version " + versionStr;
}
/*
@@ -787,11 +870,21 @@
private void putId() {
// note: name and info may be null
super.put("Provider.id name", String.valueOf(name));
- super.put("Provider.id version", String.valueOf(version));
+ super.put("Provider.id version", String.valueOf(versionStr));
super.put("Provider.id info", String.valueOf(info));
super.put("Provider.id className", this.getClass().getName());
}
+ /**
+ * Reads the {@code ObjectInputStream} for the default serializable fields.
+ * If the serialized field {@code versionStr} is found in the STREAM FIELDS,
+ * its String value will be used to populate both the version string and
+ * version number. If {@code versionStr} is not found, but {@code version}
+ * is, then its double value will be used to populate both fields.
+ *
+ * @param in the {@code ObjectInputStream} to read
+ * @serial
+ */
private void readObject(ObjectInputStream in)
throws IOException, ClassNotFoundException {
Map<Object,Object> copy = new HashMap<>();
@@ -800,6 +893,13 @@
}
defaults = null;
in.defaultReadObject();
+ if (this.versionStr == null) {
+ // set versionStr based on version when not found in serialized bytes
+ this.versionStr = Double.toString(this.version);
+ } else {
+ // otherwise, set version based on versionStr
+ this.version = parseVersionStr(this.versionStr);
+ }
implClear();
initialized = true;
putAll(copy);
@@ -1913,7 +2013,5 @@
return provider.getName() + ": " + type + "." + algorithm
+ " -> " + className + aString + attrs + "\r\n";
}
-
}
-
}
--- a/jdk/src/java.base/share/classes/java/time/Duration.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/time/Duration.java Fri Aug 26 10:14:15 2016 -0700
@@ -150,10 +150,12 @@
/**
* The pattern for parsing.
*/
- private static final Pattern PATTERN =
+ private static class Lazy {
+ static final Pattern PATTERN =
Pattern.compile("([-+]?)P(?:([-+]?[0-9]+)D)?" +
"(T(?:([-+]?[0-9]+)H)?(?:([-+]?[0-9]+)M)?(?:([-+]?[0-9]+)(?:[.,]([0-9]{0,9}))?S)?)?",
Pattern.CASE_INSENSITIVE);
+ }
/**
* The number of seconds in the duration.
@@ -387,7 +389,7 @@
*/
public static Duration parse(CharSequence text) {
Objects.requireNonNull(text, "text");
- Matcher matcher = PATTERN.matcher(text);
+ Matcher matcher = Lazy.PATTERN.matcher(text);
if (matcher.matches()) {
// check for letter T but no time sections
if (!charMatch(text, matcher.start(3), matcher.end(3), 'T')) {
--- a/jdk/src/java.base/share/classes/java/time/ZoneOffset.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/time/ZoneOffset.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -375,15 +375,15 @@
} else if ((minutes > 0 && seconds < 0) || (minutes < 0 && seconds > 0)) {
throw new DateTimeException("Zone offset minutes and seconds must have the same sign");
}
- if (Math.abs(minutes) > 59) {
- throw new DateTimeException("Zone offset minutes not in valid range: abs(value) " +
- Math.abs(minutes) + " is not in the range 0 to 59");
+ if (minutes < -59 || minutes > 59) {
+ throw new DateTimeException("Zone offset minutes not in valid range: value " +
+ minutes + " is not in the range -59 to 59");
}
- if (Math.abs(seconds) > 59) {
- throw new DateTimeException("Zone offset seconds not in valid range: abs(value) " +
- Math.abs(seconds) + " is not in the range 0 to 59");
+ if (seconds < -59 || seconds > 59) {
+ throw new DateTimeException("Zone offset seconds not in valid range: value " +
+ seconds + " is not in the range -59 to 59");
}
- if (Math.abs(hours) == 18 && (Math.abs(minutes) > 0 || Math.abs(seconds) > 0)) {
+ if (Math.abs(hours) == 18 && (minutes | seconds) != 0) {
throw new DateTimeException("Zone offset not in valid range: -18:00 to +18:00");
}
}
@@ -411,7 +411,7 @@
* @throws DateTimeException if the offset is not in the required range
*/
public static ZoneOffset ofTotalSeconds(int totalSeconds) {
- if (Math.abs(totalSeconds) > MAX_SECONDS) {
+ if (totalSeconds < -MAX_SECONDS || totalSeconds > MAX_SECONDS) {
throw new DateTimeException("Zone offset not in valid range: -18:00 to +18:00");
}
if (totalSeconds % (15 * SECONDS_PER_MINUTE) == 0) {
@@ -696,11 +696,12 @@
* The comparison is "consistent with equals", as defined by {@link Comparable}.
*
* @param other the other date to compare to, not null
- * @return the comparator value, negative if less, postive if greater
+ * @return the comparator value, negative if less, positive if greater
* @throws NullPointerException if {@code other} is null
*/
@Override
public int compareTo(ZoneOffset other) {
+ // abs(totalSeconds) <= MAX_SECONDS, so no overflow can happen here
return other.totalSeconds - totalSeconds;
}
--- a/jdk/src/java.base/share/classes/java/util/Date.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/util/Date.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -952,6 +952,9 @@
* without affecting its internal state.
*/
static final long getMillisOf(Date date) {
+ if (date.getClass() != Date.class) {
+ return date.getTime();
+ }
if (date.cdate == null || date.cdate.isNormalized()) {
return date.fastTime;
}
--- a/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java Fri Aug 26 10:14:15 2016 -0700
@@ -4566,7 +4566,10 @@
boolean modified = false;
// Use (c instanceof Set) as a hint that lookup in c is as
// efficient as this view
- if (c instanceof Set<?> && c.size() > map.table.length) {
+ Node<K,V>[] t;
+ if ((t = map.table) == null) {
+ return false;
+ } else if (c instanceof Set<?> && c.size() > t.length) {
for (Iterator<?> it = iterator(); it.hasNext(); ) {
if (c.contains(it.next())) {
it.remove();
--- a/jdk/src/java.base/share/classes/java/util/jar/JarFile.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/util/jar/JarFile.java Fri Aug 26 10:14:15 2016 -0700
@@ -353,7 +353,7 @@
if (isMultiRelease) {
return true;
}
- if (MULTI_RELEASE_ENABLED && versionMajor != BASE_VERSION_MAJOR) {
+ if (MULTI_RELEASE_ENABLED) {
try {
checkForSpecialAttributes();
} catch (IOException io) {
@@ -644,7 +644,7 @@
return signers == null ? null : signers.clone();
}
JarFileEntry realEntry() {
- if (isMultiRelease()) {
+ if (isMultiRelease() && versionMajor != BASE_VERSION_MAJOR) {
String entryName = super.getName();
return entryName.equals(this.name) ? this : new JarFileEntry(entryName, this);
}
@@ -960,7 +960,7 @@
hasClassPathAttribute = match(CLASSPATH_CHARS, b,
CLASSPATH_LASTOCC) != -1;
// is this a multi-release jar file
- if (MULTI_RELEASE_ENABLED && versionMajor != BASE_VERSION_MAJOR) {
+ if (MULTI_RELEASE_ENABLED) {
int i = match(MULTIRELEASE_CHARS, b, MULTIRELEASE_LASTOCC);
if (i != -1) {
i += MULTIRELEASE_CHARS.length;
--- a/jdk/src/java.base/share/classes/java/util/stream/Collectors.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/util/stream/Collectors.java Fri Aug 26 10:14:15 2016 -0700
@@ -295,7 +295,13 @@
public static <T>
Collector<T, ?, Set<T>> toSet() {
return new CollectorImpl<>((Supplier<Set<T>>) HashSet::new, Set::add,
- (left, right) -> { left.addAll(right); return left; },
+ (left, right) -> {
+ if (left.size() < right.size()) {
+ right.addAll(left); return right;
+ } else {
+ left.addAll(right); return left;
+ }
+ },
CH_UNORDERED_ID);
}
--- a/jdk/src/java.base/share/classes/jdk/internal/jrtfs/jrtfsviewer.js Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/jdk/internal/jrtfs/jrtfsviewer.js Fri Aug 26 10:14:15 2016 -0700
@@ -53,6 +53,7 @@
var Files = Java.type("java.nio.file.Files");
var System = Java.type("java.lang.System");
var URI = Java.type("java.net.URI");
+var Collections = Java.type("java.util.Collections");
// JavaFX classes used
var StackPane = Java.type("javafx.scene.layout.StackPane");
@@ -100,7 +101,7 @@
print("did you miss specifying jrt-fs.jar with -cp option?");
usage();
}
- return FileSystems.newFileSystem(uri, null, cls.classLoader);
+ return FileSystems.newFileSystem(uri, Collections.emptyMap(), cls.classLoader);
}
}
--- a/jdk/src/java.base/share/classes/jdk/internal/jrtfs/jrtls.js Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/jdk/internal/jrtfs/jrtls.js Fri Aug 26 10:14:15 2016 -0700
@@ -34,7 +34,6 @@
* but also compiled and delivered as part of the jrtfs.jar to support access
* to the jimage file provided by the shipped JDK by tools running on JDK 8.
*/
- */
// classes used
var Files = Java.type("java.nio.file.Files");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/jdk/internal/loader/AbstractClassLoaderValue.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,431 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.internal.loader;
+
+import jdk.internal.misc.JavaLangAccess;
+import jdk.internal.misc.SharedSecrets;
+
+import java.lang.reflect.UndeclaredThrowableException;
+import java.util.Iterator;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.BiFunction;
+import java.util.function.Supplier;
+
+/**
+ * AbstractClassLoaderValue is a superclass of root-{@link ClassLoaderValue}
+ * and {@link Sub sub}-ClassLoaderValue.
+ *
+ * @param <CLV> the type of concrete ClassLoaderValue (this type)
+ * @param <V> the type of values associated with ClassLoaderValue
+ */
+public abstract class AbstractClassLoaderValue<CLV extends AbstractClassLoaderValue<CLV, V>, V> {
+
+ /**
+ * Sole constructor.
+ */
+ AbstractClassLoaderValue() {}
+
+ /**
+ * Returns the key component of this ClassLoaderValue. The key component of
+ * the root-{@link ClassLoaderValue} is the ClassLoaderValue itself,
+ * while the key component of a {@link #sub(Object) sub}-ClassLoaderValue
+ * is what was given to construct it.
+ *
+ * @return the key component of this ClassLoaderValue.
+ */
+ public abstract Object key();
+
+ /**
+ * Constructs new sub-ClassLoaderValue of this ClassLoaderValue with given
+ * key component.
+ *
+ * @param key the key component of the sub-ClassLoaderValue.
+ * @param <K> the type of the key component.
+ * @return a sub-ClassLoaderValue of this ClassLoaderValue for given key
+ */
+ public <K> Sub<K> sub(K key) {
+ return new Sub<>(key);
+ }
+
+ /**
+ * Returns {@code true} if this ClassLoaderValue is equal to given {@code clv}
+ * or if this ClassLoaderValue was derived from given {@code clv} by a chain
+ * of {@link #sub(Object)} invocations.
+ *
+ * @param clv the ClassLoaderValue to test this against
+ * @return if this ClassLoaderValue is equal to given {@code clv} or
+ * its descendant
+ */
+ public abstract boolean isEqualOrDescendantOf(AbstractClassLoaderValue<?, V> clv);
+
+ /**
+ * Returns the value associated with this ClassLoaderValue and given ClassLoader
+ * or {@code null} if there is none.
+ *
+ * @param cl the ClassLoader for the associated value
+ * @return the value associated with this ClassLoaderValue and given ClassLoader
+ * or {@code null} if there is none.
+ */
+ public V get(ClassLoader cl) {
+ Object val = AbstractClassLoaderValue.<CLV>map(cl).get(this);
+ try {
+ return extractValue(val);
+ } catch (Memoizer.RecursiveInvocationException e) {
+ // propagate recursive get() for the same key that is just
+ // being calculated in computeIfAbsent()
+ throw e;
+ } catch (Throwable t) {
+ // don't propagate exceptions thrown from Memoizer - pretend
+ // that there was no entry
+ // (computeIfAbsent invocation will try to remove it anyway)
+ return null;
+ }
+ }
+
+ /**
+ * Associates given value {@code v} with this ClassLoaderValue and given
+ * ClassLoader and returns {@code null} if there was no previously associated
+ * value or does nothing and returns previously associated value if there
+ * was one.
+ *
+ * @param cl the ClassLoader for the associated value
+ * @param v the value to associate
+ * @return previously associated value or null if there was none
+ */
+ public V putIfAbsent(ClassLoader cl, V v) {
+ ConcurrentHashMap<CLV, Object> map = map(cl);
+ @SuppressWarnings("unchecked")
+ CLV clv = (CLV) this;
+ while (true) {
+ try {
+ Object val = map.putIfAbsent(clv, v);
+ return extractValue(val);
+ } catch (Memoizer.RecursiveInvocationException e) {
+ // propagate RecursiveInvocationException for the same key that
+ // is just being calculated in computeIfAbsent
+ throw e;
+ } catch (Throwable t) {
+ // don't propagate exceptions thrown from foreign Memoizer -
+ // pretend that there was no entry and retry
+ // (foreign computeIfAbsent invocation will try to remove it anyway)
+ }
+ // TODO:
+ // Thread.onSpinLoop(); // when available
+ }
+ }
+
+ /**
+ * Removes the value associated with this ClassLoaderValue and given
+ * ClassLoader if the associated value is equal to given value {@code v} and
+ * returns {@code true} or does nothing and returns {@code false} if there is
+ * no currently associated value or it is not equal to given value {@code v}.
+ *
+ * @param cl the ClassLoader for the associated value
+ * @param v the value to compare with currently associated value
+ * @return {@code true} if the association was removed or {@code false} if not
+ */
+ public boolean remove(ClassLoader cl, Object v) {
+ return AbstractClassLoaderValue.<CLV>map(cl).remove(this, v);
+ }
+
+ /**
+ * Returns the value associated with this ClassLoaderValue and given
+ * ClassLoader if there is one or computes the value by invoking given
+ * {@code mappingFunction}, associates it and returns it.
+ * <p>
+ * Computation and association of the computed value is performed atomically
+ * by the 1st thread that requests a particular association while holding a
+ * lock associated with this ClassLoaderValue and given ClassLoader.
+ * Nested calls from the {@code mappingFunction} to {@link #get},
+ * {@link #putIfAbsent} or {@link #computeIfAbsent} for the same association
+ * are not allowed and throw {@link IllegalStateException}. Nested call to
+ * {@link #remove} for the same association is allowed but will always return
+ * {@code false} regardless of passed-in comparison value. Nested calls for
+ * other association(s) are allowed, but care should be taken to avoid
+ * deadlocks. When two threads perform nested computations of the overlapping
+ * set of associations they should always request them in the same order.
+ *
+ * @param cl the ClassLoader for the associated value
+ * @param mappingFunction the function to compute the value
+ * @return the value associated with this ClassLoaderValue and given
+ * ClassLoader.
+ * @throws IllegalStateException if a direct or indirect invocation from
+ * within given {@code mappingFunction} that
+ * computes the value of a particular association
+ * to {@link #get}, {@link #putIfAbsent} or
+ * {@link #computeIfAbsent}
+ * for the same association is attempted.
+ */
+ public V computeIfAbsent(ClassLoader cl,
+ BiFunction<
+ ? super ClassLoader,
+ ? super CLV,
+ ? extends V
+ > mappingFunction) throws IllegalStateException {
+ ConcurrentHashMap<CLV, Object> map = map(cl);
+ @SuppressWarnings("unchecked")
+ CLV clv = (CLV) this;
+ Memoizer<CLV, V> mv = null;
+ while (true) {
+ Object val = (mv == null) ? map.get(clv) : map.putIfAbsent(clv, mv);
+ if (val == null) {
+ if (mv == null) {
+ // create Memoizer lazily when 1st needed and restart loop
+ mv = new Memoizer<>(cl, clv, mappingFunction);
+ continue;
+ }
+ // mv != null, therefore sv == null was a result of successful
+ // putIfAbsent
+ try {
+ // trigger Memoizer to compute the value
+ V v = mv.get();
+ // attempt to replace our Memoizer with the value
+ map.replace(clv, mv, v);
+ // return computed value
+ return v;
+ } catch (Throwable t) {
+ // our Memoizer has thrown, attempt to remove it
+ map.remove(clv, mv);
+ // propagate exception because it's from our Memoizer
+ throw t;
+ }
+ } else {
+ try {
+ return extractValue(val);
+ } catch (Memoizer.RecursiveInvocationException e) {
+ // propagate recursive attempts to calculate the same
+ // value as being calculated at the moment
+ throw e;
+ } catch (Throwable t) {
+ // don't propagate exceptions thrown from foreign Memoizer -
+ // pretend that there was no entry and retry
+ // (foreign computeIfAbsent invocation will try to remove it anyway)
+ }
+ }
+ // TODO:
+ // Thread.onSpinLoop(); // when available
+ }
+ }
+
+ /**
+ * Removes all values associated with given ClassLoader {@code cl} and
+ * {@link #isEqualOrDescendantOf(AbstractClassLoaderValue) this or descendants}
+ * of this ClassLoaderValue.
+ * This is not an atomic operation. Other threads may see some associations
+ * be already removed and others still present while this method is executing.
+ * <p>
+ * The sole intention of this method is to cleanup after a unit test that
+ * tests ClassLoaderValue directly. It is not intended for use in
+ * actual algorithms.
+ *
+ * @param cl the associated ClassLoader of the values to be removed
+ */
+ public void removeAll(ClassLoader cl) {
+ ConcurrentHashMap<CLV, Object> map = map(cl);
+ for (Iterator<CLV> i = map.keySet().iterator(); i.hasNext(); ) {
+ if (i.next().isEqualOrDescendantOf(this)) {
+ i.remove();
+ }
+ }
+ }
+
+ private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess();
+
+ /**
+ * @return a ConcurrentHashMap for given ClassLoader
+ */
+ @SuppressWarnings("unchecked")
+ private static <CLV extends AbstractClassLoaderValue<CLV, ?>>
+ ConcurrentHashMap<CLV, Object> map(ClassLoader cl) {
+ return (ConcurrentHashMap<CLV, Object>)
+ (cl == null ? BootLoader.getClassLoaderValueMap()
+ : JLA.createOrGetClassLoaderValueMap(cl));
+ }
+
+ /**
+ * @return value extracted from the {@link Memoizer} if given
+ * {@code memoizerOrValue} parameter is a {@code Memoizer} or
+ * just return given parameter.
+ */
+ @SuppressWarnings("unchecked")
+ private V extractValue(Object memoizerOrValue) {
+ if (memoizerOrValue instanceof Memoizer) {
+ return ((Memoizer<?, V>) memoizerOrValue).get();
+ } else {
+ return (V) memoizerOrValue;
+ }
+ }
+
+ /**
+ * A memoized supplier that invokes given {@code mappingFunction} just once
+ * and remembers the result or thrown exception for subsequent calls.
+ * If given mappingFunction returns null, it is converted to NullPointerException,
+ * thrown from the Memoizer's {@link #get()} method and remembered.
+ * If the Memoizer is invoked recursively from the given {@code mappingFunction},
+ * {@link RecursiveInvocationException} is thrown, but it is not remembered.
+ * The in-flight call to the {@link #get()} can still complete successfully if
+ * such exception is handled by the mappingFunction.
+ */
+ private static final class Memoizer<CLV extends AbstractClassLoaderValue<CLV, V>, V>
+ implements Supplier<V> {
+
+ private final ClassLoader cl;
+ private final CLV clv;
+ private final BiFunction<? super ClassLoader, ? super CLV, ? extends V>
+ mappingFunction;
+
+ private volatile V v;
+ private volatile Throwable t;
+ private boolean inCall;
+
+ Memoizer(ClassLoader cl,
+ CLV clv,
+ BiFunction<? super ClassLoader, ? super CLV, ? extends V>
+ mappingFunction
+ ) {
+ this.cl = cl;
+ this.clv = clv;
+ this.mappingFunction = mappingFunction;
+ }
+
+ @Override
+ public V get() throws RecursiveInvocationException {
+ V v = this.v;
+ if (v != null) return v;
+ Throwable t = this.t;
+ if (t == null) {
+ synchronized (this) {
+ if ((v = this.v) == null && (t = this.t) == null) {
+ if (inCall) {
+ throw new RecursiveInvocationException();
+ }
+ inCall = true;
+ try {
+ this.v = v = Objects.requireNonNull(
+ mappingFunction.apply(cl, clv));
+ } catch (Throwable x) {
+ this.t = t = x;
+ } finally {
+ inCall = false;
+ }
+ }
+ }
+ }
+ if (v != null) return v;
+ if (t instanceof Error) {
+ throw (Error) t;
+ } else if (t instanceof RuntimeException) {
+ throw (RuntimeException) t;
+ } else {
+ throw new UndeclaredThrowableException(t);
+ }
+ }
+
+ static class RecursiveInvocationException extends IllegalStateException {
+ private static final long serialVersionUID = 1L;
+
+ RecursiveInvocationException() {
+ super("Recursive call");
+ }
+ }
+ }
+
+ /**
+ * sub-ClassLoaderValue is an inner class of {@link AbstractClassLoaderValue}
+ * and also a subclass of it. It can therefore be instantiated as an inner
+ * class of either an instance of root-{@link ClassLoaderValue} or another
+ * instance of itself. This enables composing type-safe compound keys of
+ * arbitrary length:
+ * <pre>{@code
+ * ClassLoaderValue<V> clv = new ClassLoaderValue<>();
+ * ClassLoaderValue<V>.Sub<K1>.Sub<K2>.Sub<K3> clv_k123 =
+ * clv.sub(k1).sub(k2).sub(k3);
+ * }</pre>
+ * From which individual components are accessible in a type-safe way:
+ * <pre>{@code
+ * K1 k1 = clv_k123.parent().parent().key();
+ * K2 k2 = clv_k123.parent().key();
+ * K3 k3 = clv_k123.key();
+ * }</pre>
+ * This allows specifying non-capturing lambdas for the mapping function of
+ * {@link #computeIfAbsent(ClassLoader, BiFunction)} operation that can
+ * access individual key components from passed-in
+ * sub-[sub-...]ClassLoaderValue instance in a type-safe way.
+ *
+ * @param <K> the type of {@link #key()} component contained in the
+ * sub-ClassLoaderValue.
+ */
+ public final class Sub<K> extends AbstractClassLoaderValue<Sub<K>, V> {
+
+ private final K key;
+
+ Sub(K key) {
+ this.key = key;
+ }
+
+ /**
+ * @return the parent ClassLoaderValue this sub-ClassLoaderValue
+ * has been {@link #sub(Object) derived} from.
+ */
+ public AbstractClassLoaderValue<CLV, V> parent() {
+ return AbstractClassLoaderValue.this;
+ }
+
+ /**
+ * @return the key component of this sub-ClassLoaderValue.
+ */
+ @Override
+ public K key() {
+ return key;
+ }
+
+ /**
+ * sub-ClassLoaderValue is a descendant of given {@code clv} if it is
+ * either equal to it or if its {@link #parent() parent} is a
+ * descendant of given {@code clv}.
+ */
+ @Override
+ public boolean isEqualOrDescendantOf(AbstractClassLoaderValue<?, V> clv) {
+ return equals(Objects.requireNonNull(clv)) ||
+ parent().isEqualOrDescendantOf(clv);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof Sub)) return false;
+ @SuppressWarnings("unchecked")
+ Sub<?> that = (Sub<?>) o;
+ return this.parent().equals(that.parent()) &&
+ Objects.equals(this.key, that.key);
+ }
+
+ @Override
+ public int hashCode() {
+ return 31 * parent().hashCode() +
+ Objects.hashCode(key);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/jdk/internal/loader/ClassLoaderValue.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.internal.loader;
+
+import java.util.Objects;
+import java.util.function.BiFunction;
+
+/**
+ * root-ClassLoaderValue. Each instance defines a separate namespace for
+ * associated values.
+ * <p>
+ * ClassLoaderValue allows associating a
+ * {@link #computeIfAbsent(ClassLoader, BiFunction) computed} non-null value with
+ * a {@code (ClassLoader, keys...)} tuple. The associated value, as well as the
+ * keys are strongly reachable from the associated ClassLoader so care should be
+ * taken to use such keys and values that only reference types resolvable from
+ * the associated ClassLoader. Failing that, ClassLoader leaks are inevitable.
+ * <p>
+ * Example usage:
+ * <pre>{@code
+ * // create a root instance which represents a namespace and declares the type of
+ * // associated values (Class instances in this example)
+ * static final ClassLoaderValue<Class<?>> proxyClasses = new ClassLoaderValue<>();
+ *
+ * // create a compound key composed of a Module and a list of interfaces
+ * Module module = ...;
+ * List<Class<?>> interfaces = ...;
+ * ClassLoaderValue<Class<?>>.Sub<Module>.Sub<List<Class<?>>> key =
+ * proxyClasses.sub(module).sub(interfaces);
+ *
+ * // use the compound key together with ClassLoader to lazily associate
+ * // the value with tuple (loader, module, interfaces) and return it
+ * ClassLoader loader = ...;
+ * Class<?> proxyClass = key.computeIfAbsent(loader, (ld, ky) -> {
+ * List<Class<?>> intfcs = ky.key();
+ * Module m = ky.parent().key();
+ * Class<?> clazz = defineProxyClass(ld, m, intfcs);
+ * return clazz;
+ * });
+ * }</pre>
+ * <p>
+ * {@code classLoaderValue.<operation>(classLoader, ...)} represents an operation
+ * to {@link #get}, {@link #putIfAbsent}, {@link #computeIfAbsent} or {@link #remove}
+ * a value associated with a (classLoader, classLoaderValue) tuple. ClassLoader
+ * instances and root-{@link ClassLoaderValue} instances are compared using
+ * identity equality while {@link Sub sub}-ClassLoaderValue instances define
+ * {@link #equals(Object) equality} in terms of equality of its
+ * {@link Sub#parent() parent} ClassLoaderValue and its
+ * {@link #key() key} component.
+ *
+ * @param <V> the type of value(s) associated with the root-ClassLoaderValue and
+ * all its {@link #sub(Object) descendants}.
+ * @author Peter Levart
+ * @since 9
+ */
+public final class ClassLoaderValue<V>
+ extends AbstractClassLoaderValue<ClassLoaderValue<V>, V> {
+
+ /**
+ * Constructs new root-ClassLoaderValue representing its own namespace.
+ */
+ public ClassLoaderValue() {}
+
+ /**
+ * @return the key component of this root-ClassLoaderValue (itself).
+ */
+ @Override
+ public ClassLoaderValue<V> key() {
+ return this;
+ }
+
+ /**
+ * root-ClassLoaderValue can only be equal to itself and has no predecessors.
+ */
+ @Override
+ public boolean isEqualOrDescendantOf(AbstractClassLoaderValue<?, V> clv) {
+ return equals(Objects.requireNonNull(clv));
+ }
+}
--- a/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangInvokeAccess.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangInvokeAccess.java Fri Aug 26 10:14:15 2016 -0700
@@ -46,7 +46,7 @@
boolean isNative(Object mname);
/**
- * Returns a {@code byte[]} containing the bytecode for a class implementing
+ * Returns a {@code byte[]} representation of a class implementing
* DirectMethodHandle of each pairwise combination of {@code MethodType} and
* an {@code int} representing method type. Used by
* GenerateJLIClassesPlugin to generate such a class during the jlink phase.
@@ -55,7 +55,7 @@
MethodType[] methodTypes, int[] types);
/**
- * Returns a {@code byte[]} containing the bytecode for a class implementing
+ * Returns a {@code byte[]} representation of a class implementing
* DelegatingMethodHandles of each {@code MethodType} kind in the
* {@code methodTypes} argument. Used by GenerateJLIClassesPlugin to
* generate such a class during the jlink phase.
@@ -64,7 +64,7 @@
MethodType[] methodTypes);
/**
- * Returns a {@code byte[]} containing the bytecode for a BoundMethodHandle
+ * Returns a {@code byte[]} representation of {@code BoundMethodHandle}
* species class implementing the signature defined by {@code types}. Used
* by GenerateBMHClassesPlugin to enable generation of such classes during
* the jlink phase. Should do some added validation since this string may be
@@ -72,4 +72,17 @@
*/
Map.Entry<String, byte[]> generateConcreteBMHClassBytes(
final String types);
+
+ /**
+ * Returns a {@code byte[]} representation of a class implementing
+ * the zero and identity forms of all {@code LambdaForm.BasicType}s.
+ */
+ byte[] generateBasicFormsClassBytes(final String className);
+
+ /**
+ * Returns a {@code byte[]} representation of a class implementing
+ * the invoker forms for the set of supplied {@code methodTypes}.
+ */
+ byte[] generateInvokersHolderClassBytes(String className,
+ MethodType[] methodTypes);
}
--- a/jdk/src/java.base/share/classes/sun/security/jca/ProviderList.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/jca/ProviderList.java Fri Aug 26 10:14:15 2016 -0700
@@ -76,7 +76,7 @@
// dummy provider object to use during initialization
// used to avoid explicit null checks in various places
private static final Provider EMPTY_PROVIDER =
- new Provider("##Empty##", 1.0d, "initialization in progress") {
+ new Provider("##Empty##", "1.0", "initialization in progress") {
private static final long serialVersionUID = 1151354171352296389L;
// override getService() to return null slightly faster
public Service getService(String type, String algorithm) {
--- a/jdk/src/java.base/share/classes/sun/security/provider/MD4.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/provider/MD4.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,7 @@
import java.security.*;
import static sun.security.provider.ByteArrayAccess.*;
+import static sun.security.util.SecurityConstants.PROVIDER_VER;
/**
* The MD4 class is used to compute an MD4 message digest over a given
@@ -65,7 +66,8 @@
private static final Provider md4Provider;
static {
- md4Provider = new Provider("MD4Provider", 9.0d, "MD4 MessageDigest") {
+ md4Provider = new Provider("MD4Provider", PROVIDER_VER,
+ "MD4 MessageDigest") {
private static final long serialVersionUID = -8850464997518327965L;
};
AccessController.doPrivileged(new PrivilegedAction<Void>() {
--- a/jdk/src/java.base/share/classes/sun/security/provider/Sun.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/provider/Sun.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -29,6 +29,8 @@
import java.security.*;
import sun.security.action.PutAllAction;
+import static sun.security.util.SecurityConstants.PROVIDER_VER;
+
/**
* The SUN Security Provider.
@@ -47,7 +49,7 @@
public Sun() {
/* We are the SUN provider */
- super("SUN", 9.0d, INFO);
+ super("SUN", PROVIDER_VER, INFO);
// if there is no security manager installed, put directly into
// the provider. Otherwise, create a temporary map and use a
--- a/jdk/src/java.base/share/classes/sun/security/provider/VerificationProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/provider/VerificationProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -31,6 +31,8 @@
import sun.security.action.PutAllAction;
import sun.security.rsa.SunRsaSignEntries;
+import static sun.security.util.SecurityConstants.PROVIDER_VER;
+
/**
* Provider used for verification of signed JAR files *if* the Sun and
@@ -61,7 +63,7 @@
}
public VerificationProvider() {
- super("SunJarVerification", 9.0d, "Jar Verification Provider");
+ super("SunJarVerification", PROVIDER_VER, "Jar Verification Provider");
// register all algorithms normally registered by the Sun and SunRsaSign
// providers, but only if they are missing
if (ACTIVE == false) {
--- a/jdk/src/java.base/share/classes/sun/security/rsa/RSAPadding.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/rsa/RSAPadding.java Fri Aug 26 10:14:15 2016 -0700
@@ -253,7 +253,8 @@
public byte[] pad(byte[] data) throws BadPaddingException {
if (data.length > maxDataSize) {
throw new BadPaddingException("Data must be shorter than "
- + (maxDataSize + 1) + " bytes");
+ + (maxDataSize + 1) + " bytes but received "
+ + data.length + " bytes.");
}
switch (type) {
case PAD_NONE:
@@ -281,7 +282,9 @@
*/
public byte[] unpad(byte[] padded) throws BadPaddingException {
if (padded.length != paddedSize) {
- throw new BadPaddingException("Decryption error");
+ throw new BadPaddingException("Decryption error." +
+ "The padded array length (" + padded.length +
+ ") is not the specified padded size (" + paddedSize + ")");
}
switch (type) {
case PAD_NONE:
--- a/jdk/src/java.base/share/classes/sun/security/rsa/SunRsaSign.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/rsa/SunRsaSign.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -30,6 +30,7 @@
import java.security.*;
import sun.security.action.PutAllAction;
+import static sun.security.util.SecurityConstants.PROVIDER_VER;
/**
* Provider class for the RSA signature provider. Supports RSA keyfactory,
@@ -43,7 +44,7 @@
private static final long serialVersionUID = 866040293550393045L;
public SunRsaSign() {
- super("SunRsaSign", 9.0d, "Sun RSA signature provider");
+ super("SunRsaSign", PROVIDER_VER, "Sun RSA signature provider");
// if there is no security manager installed, put directly into
// the provider. Otherwise, create a temporary map and use a
--- a/jdk/src/java.base/share/classes/sun/security/ssl/CipherBox.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/CipherBox.java Fri Aug 26 10:14:15 2016 -0700
@@ -493,7 +493,9 @@
if (protocolVersion.useTLS11PlusSpec()) {
if (newLen < blockSize) {
- throw new BadPaddingException("invalid explicit IV");
+ throw new BadPaddingException("The length after " +
+ "padding removal (" + newLen + ") should be larger " +
+ "than <" + blockSize + "> since explicit IV used");
}
}
}
@@ -504,7 +506,6 @@
}
}
-
/*
* Decrypts a block of data, returning the size of the
* resulting block if padding was required. position and limit
@@ -575,7 +576,9 @@
// check the explicit IV of TLS v1.1 or later
if (protocolVersion.useTLS11PlusSpec()) {
if (newLen < blockSize) {
- throw new BadPaddingException("invalid explicit IV");
+ throw new BadPaddingException("The length after " +
+ "padding removal (" + newLen + ") should be larger " +
+ "than <" + blockSize + "> since explicit IV used");
}
// reset the position to the end of the decrypted data
@@ -756,7 +759,9 @@
// so accept that as well
// v3 does not require any particular value for the other bytes
if (padLen > blockSize) {
- throw new BadPaddingException("Invalid SSLv3 padding");
+ throw new BadPaddingException("Padding length (" +
+ padLen + ") of SSLv3 message should not be bigger " +
+ "than the block size (" + blockSize + ")");
}
}
return newLen;
@@ -802,7 +807,9 @@
// so accept that as well
// v3 does not require any particular value for the other bytes
if (padLen > blockSize) {
- throw new BadPaddingException("Invalid SSLv3 padding");
+ throw new BadPaddingException("Padding length (" +
+ padLen + ") of SSLv3 message should not be bigger " +
+ "than the block size (" + blockSize + ")");
}
}
@@ -925,7 +932,10 @@
case AEAD_CIPHER:
if (bb.remaining() < (recordIvSize + tagSize)) {
throw new BadPaddingException(
- "invalid AEAD cipher fragment");
+ "Insufficient buffer remaining for AEAD cipher " +
+ "fragment (" + bb.remaining() + "). Needs to be " +
+ "more than or equal to IV size (" + recordIvSize +
+ ") + tag size (" + tagSize + ")");
}
// initialize the AEAD cipher for the unique IV
--- a/jdk/src/java.base/share/classes/sun/security/ssl/JsseJce.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/JsseJce.java Fri Aug 26 10:14:15 2016 -0700
@@ -44,6 +44,7 @@
import sun.security.util.ECUtil;
import static sun.security.ssl.SunJSSE.cryptoProvider;
+import static sun.security.util.SecurityConstants.PROVIDER_VER;
/**
* This class contains a few static methods for interaction with the JCA/JCE
@@ -90,7 +91,7 @@
private static final long serialVersionUID = -3284138292032213752L;
SunCertificates(final Provider p) {
- super("SunCertificates", 9.0d, "SunJSSE internal");
+ super("SunCertificates", PROVIDER_VER, "SunJSSE internal");
AccessController.doPrivileged(new PrivilegedAction<Object>() {
@Override
public Object run() {
--- a/jdk/src/java.base/share/classes/sun/security/ssl/SunJSSE.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/SunJSSE.java Fri Aug 26 10:14:15 2016 -0700
@@ -27,6 +27,7 @@
package sun.security.ssl;
import java.security.*;
+import static sun.security.util.SecurityConstants.PROVIDER_VER;
/**
* The JSSE provider.
@@ -104,7 +105,7 @@
// standard constructor
protected SunJSSE() {
- super("SunJSSE", 9.0d, info);
+ super("SunJSSE", PROVIDER_VER, info);
subclassCheck();
if (Boolean.TRUE.equals(fips)) {
throw new ProviderException
@@ -132,7 +133,7 @@
private SunJSSE(java.security.Provider cryptoProvider,
String providerName) {
- super("SunJSSE", 9.0d, fipsInfo + providerName + ")");
+ super("SunJSSE", PROVIDER_VER, fipsInfo + providerName + ")");
subclassCheck();
if (cryptoProvider == null) {
// Calling Security.getProvider() will cause other providers to be
--- a/jdk/src/java.base/share/classes/sun/security/util/SecurityConstants.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/util/SecurityConstants.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -33,6 +33,7 @@
import java.security.BasicPermission;
import java.security.SecurityPermission;
import java.security.AllPermission;
+import sun.security.action.GetPropertyAction;
/**
* Permission constants and string constants used to create permissions
@@ -145,4 +146,7 @@
// java.lang.SecurityManager
public static final SocketPermission LOCAL_LISTEN_PERMISSION =
new SocketPermission("localhost:0", SOCKET_LISTEN_ACTION);
+
+ public static final String PROVIDER_VER =
+ GetPropertyAction.privilegedGetProperty("java.specification.version");
}
--- a/jdk/src/java.base/share/classes/sun/util/calendar/ZoneInfo.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/sun/util/calendar/ZoneInfo.java Fri Aug 26 10:14:15 2016 -0700
@@ -27,15 +27,8 @@
import java.io.IOException;
import java.io.ObjectInputStream;
-import java.lang.ref.SoftReference;
-import java.security.AccessController;
-import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Date;
-import java.util.List;
-import java.util.Locale;
import java.util.Map;
-import java.util.Set;
import java.util.SimpleTimeZone;
import java.util.TimeZone;
@@ -80,8 +73,6 @@
private static final long ABBR_MASK = 0xf00L;
private static final int TRANSITION_NSHIFT = 12;
- private static final CalendarSystem gcal = CalendarSystem.getGregorianCalendar();
-
/**
* The raw GMT offset in milliseconds between this zone and GMT.
* Negative offsets are to the west of Greenwich. To obtain local
@@ -379,6 +370,7 @@
throw new IllegalArgumentException();
}
+ Gregorian gcal = CalendarSystem.getGregorianCalendar();
CalendarDate date = gcal.newCalendarDate(null);
date.setDate(year, month + 1, day);
if (gcal.validate(date) == false) {
--- a/jdk/src/java.base/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -143,8 +143,8 @@
defaultLocaleProviderAdapter = Type.CLDR;
if (!typeList.isEmpty()) {
// bona fide preference exists
- if (!typeList.contains(Type.CLDR)) {
- // Append FALLBACK as the last resort.
+ if (!(typeList.contains(Type.CLDR) || (typeList.contains(Type.JRE)))) {
+ // Append FALLBACK as the last resort when no ResourceBundleBasedAdapter is available.
typeList.add(Type.FALLBACK);
defaultLocaleProviderAdapter = Type.FALLBACK;
}
--- a/jdk/src/java.base/share/conf/security/java.security Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/conf/security/java.security Fri Aug 26 10:14:15 2016 -0700
@@ -490,7 +490,7 @@
# property is set then those two properties are ignored.
#
# Example,
-# ocsp.responderCertSubjectName="CN=OCSP Responder, O=XYZ Corp"
+# ocsp.responderCertSubjectName=CN=OCSP Responder, O=XYZ Corp
#
# Issuer name of the OCSP responder's certificate
@@ -505,7 +505,7 @@
# property is ignored.
#
# Example,
-# ocsp.responderCertIssuerName="CN=Enterprise CA, O=XYZ Corp"
+# ocsp.responderCertIssuerName=CN=Enterprise CA, O=XYZ Corp
#
# Serial number of the OCSP responder's certificate
@@ -803,3 +803,44 @@
# E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED \
# EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381 \
# FFFFFFFF FFFFFFFF, 2}
+
+#
+# The policy for the XML Signature secure validation mode. The mode is
+# enabled by setting the property "org.jcp.xml.dsig.secureValidation" to
+# true with the javax.xml.crypto.XMLCryptoContext.setProperty() method,
+# or by running the code with a SecurityManager.
+#
+# Policy:
+# Constraint {"," Constraint }
+# Constraint:
+# AlgConstraint | MaxTransformsConstraint | MaxReferencesConstraint |
+# ReferenceUriSchemeConstraint | OtherConstraint
+# AlgConstraint
+# "disallowAlg" Uri
+# MaxTransformsConstraint:
+# "maxTransforms" Integer
+# MaxReferencesConstraint:
+# "maxReferences" Integer
+# ReferenceUriSchemeConstraint:
+# "disallowReferenceUriSchemes" String { String }
+# OtherConstraint:
+# "noDuplicateIds" | "noRetrievalMethodLoops"
+#
+# For AlgConstraint, Uri is the algorithm URI String that is not allowed.
+# See the XML Signature Recommendation for more information on algorithm
+# URI Identifiers. If the MaxTransformsConstraint or MaxReferencesConstraint is
+# specified more than once, only the last entry is enforced.
+#
+# Note: This property is currently used by the JDK Reference implementation. It
+# is not guaranteed to be examined and used by other implementations.
+#
+jdk.xml.dsig.secureValidationPolicy=\
+ disallowAlg http://www.w3.org/TR/1999/REC-xslt-19991116,\
+ disallowAlg http://www.w3.org/2001/04/xmldsig-more#rsa-md5,\
+ disallowAlg http://www.w3.org/2001/04/xmldsig-more#hmac-md5,\
+ disallowAlg http://www.w3.org/2001/04/xmldsig-more#md5,\
+ maxTransforms 5,\
+ maxReferences 30,\
+ disallowReferenceUriSchemes file http https,\
+ noDuplicateIds,\
+ noRetrievalMethodLoops
--- a/jdk/src/java.base/share/lib/security/default.policy Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/share/lib/security/default.policy Fri Aug 26 10:14:15 2016 -0700
@@ -72,6 +72,8 @@
"removeProviderProperty.XMLDSig";
permission java.security.SecurityPermission
"com.sun.org.apache.xml.internal.security.register";
+ permission java.security.SecurityPermission
+ "getProperty.jdk.xml.dsig.secureValidationPolicy";
};
grant codeBase "jrt:/java.xml.ws" {
--- a/jdk/src/java.base/unix/classes/sun/nio/fs/UnixPath.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/unix/classes/sun/nio/fs/UnixPath.java Fri Aug 26 10:14:15 2016 -0700
@@ -252,6 +252,21 @@
return new UnixPath(getFileSystem(), new byte[0]);
}
+
+ // return true if this path has "." or ".."
+ private boolean hasDotOrDotDot() {
+ int n = getNameCount();
+ for (int i=0; i<n; i++) {
+ byte[] bytes = getName(i).path;
+ if ((bytes.length == 1 && bytes[0] == '.'))
+ return true;
+ if ((bytes.length == 2 && bytes[0] == '.') && bytes[1] == '.') {
+ return true;
+ }
+ }
+ return false;
+ }
+
@Override
public UnixFileSystem getFileSystem() {
return fs;
@@ -405,80 +420,94 @@
@Override
public UnixPath relativize(Path obj) {
- UnixPath other = toUnixPath(obj);
- if (other.equals(this))
+ UnixPath child = toUnixPath(obj);
+ if (child.equals(this))
return emptyPath();
// can only relativize paths of the same type
- if (this.isAbsolute() != other.isAbsolute())
+ if (this.isAbsolute() != child.isAbsolute())
throw new IllegalArgumentException("'other' is different type of Path");
// this path is the empty path
if (this.isEmpty())
- return other;
+ return child;
- int bn = this.getNameCount();
- int cn = other.getNameCount();
+ UnixPath base = this;
+ if (base.hasDotOrDotDot() || child.hasDotOrDotDot()) {
+ base = base.normalize();
+ child = child.normalize();
+ }
+
+ int baseCount = base.getNameCount();
+ int childCount = child.getNameCount();
// skip matching names
- int n = (bn > cn) ? cn : bn;
+ int n = Math.min(baseCount, childCount);
int i = 0;
while (i < n) {
- if (!this.getName(i).equals(other.getName(i)))
+ if (!base.getName(i).equals(child.getName(i)))
break;
i++;
}
- int dotdots = bn - i;
- if (i < cn) {
- // remaining name components in other
- UnixPath remainder = other.subpath(i, cn);
- if (dotdots == 0)
- return remainder;
+ // remaining elements in child
+ UnixPath childRemaining;
+ boolean isChildEmpty;
+ if (i == childCount) {
+ childRemaining = emptyPath();
+ isChildEmpty = true;
+ } else {
+ childRemaining = child.subpath(i, childCount);
+ isChildEmpty = childRemaining.isEmpty();
+ }
+
+ // matched all of base
+ if (i == baseCount) {
+ return childRemaining;
+ }
- // other is the empty path
- boolean isOtherEmpty = other.isEmpty();
+ // the remainder of base cannot contain ".."
+ UnixPath baseRemaining = base.subpath(i, baseCount);
+ if (baseRemaining.hasDotOrDotDot()) {
+ throw new IllegalArgumentException("Unable to compute relative "
+ + " path from " + this + " to " + obj);
+ }
+ if (baseRemaining.isEmpty())
+ return childRemaining;
+
+ // number of ".." needed
+ int dotdots = baseRemaining.getNameCount();
+ if (dotdots == 0) {
+ return childRemaining;
+ }
- // result is a "../" for each remaining name in base
- // followed by the remaining names in other. If the remainder is
- // the empty path then we don't add the final trailing slash.
- int len = dotdots*3 + remainder.path.length;
- if (isOtherEmpty) {
- assert remainder.isEmpty();
- len--;
+ // result is a "../" for each remaining name in base followed by the
+ // remaining names in child. If the remainder is the empty path
+ // then we don't add the final trailing slash.
+ int len = dotdots*3 + childRemaining.path.length;
+ if (isChildEmpty) {
+ assert childRemaining.isEmpty();
+ len--;
+ }
+ byte[] result = new byte[len];
+ int pos = 0;
+ while (dotdots > 0) {
+ result[pos++] = (byte)'.';
+ result[pos++] = (byte)'.';
+ if (isChildEmpty) {
+ if (dotdots > 1) result[pos++] = (byte)'/';
+ } else {
+ result[pos++] = (byte)'/';
}
- byte[] result = new byte[len];
- int pos = 0;
- while (dotdots > 0) {
- result[pos++] = (byte)'.';
- result[pos++] = (byte)'.';
- if (isOtherEmpty) {
- if (dotdots > 1) result[pos++] = (byte)'/';
- } else {
- result[pos++] = (byte)'/';
- }
- dotdots--;
- }
- System.arraycopy(remainder.path, 0, result, pos, remainder.path.length);
- return new UnixPath(getFileSystem(), result);
- } else {
- // no remaining names in other so result is simply a sequence of ".."
- byte[] result = new byte[dotdots*3 - 1];
- int pos = 0;
- while (dotdots > 0) {
- result[pos++] = (byte)'.';
- result[pos++] = (byte)'.';
- // no tailing slash at the end
- if (dotdots > 1)
- result[pos++] = (byte)'/';
- dotdots--;
- }
- return new UnixPath(getFileSystem(), result);
+ dotdots--;
}
+ System.arraycopy(childRemaining.path,0, result, pos,
+ childRemaining.path.length);
+ return new UnixPath(getFileSystem(), result);
}
@Override
- public Path normalize() {
+ public UnixPath normalize() {
final int count = getNameCount();
if (count == 0 || isEmpty())
return this;
--- a/jdk/src/java.base/windows/classes/sun/nio/fs/WindowsPath.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.base/windows/classes/sun/nio/fs/WindowsPath.java Fri Aug 26 10:14:15 2016 -0700
@@ -375,57 +375,108 @@
return (WindowsPath)path;
}
+ // return true if this path has "." or ".."
+ private boolean hasDotOrDotDot() {
+ int n = getNameCount();
+ for (int i=0; i<n; i++) {
+ String name = elementAsString(i);
+ if (name.length() == 1 && name.charAt(0) == '.')
+ return true;
+ if (name.length() == 2
+ && name.charAt(0) == '.' && name.charAt(1) == '.')
+ return true;
+ }
+ return false;
+ }
+
@Override
public WindowsPath relativize(Path obj) {
- WindowsPath other = toWindowsPath(obj);
- if (this.equals(other))
+ WindowsPath child = toWindowsPath(obj);
+ if (this.equals(child))
return emptyPath();
// can only relativize paths of the same type
- if (this.type != other.type)
+ if (this.type != child.type)
throw new IllegalArgumentException("'other' is different type of Path");
// can only relativize paths if root component matches
- if (!this.root.equalsIgnoreCase(other.root))
+ if (!this.root.equalsIgnoreCase(child.root))
throw new IllegalArgumentException("'other' has different root");
// this path is the empty path
if (this.isEmpty())
- return other;
+ return child;
+
- int bn = this.getNameCount();
- int cn = other.getNameCount();
+ WindowsPath base = this;
+ if (base.hasDotOrDotDot() || child.hasDotOrDotDot()) {
+ base = base.normalize();
+ child = child.normalize();
+ }
+
+ int baseCount = base.getNameCount();
+ int childCount = child.getNameCount();
// skip matching names
- int n = (bn > cn) ? cn : bn;
+ int n = Math.min(baseCount, childCount);
int i = 0;
while (i < n) {
- if (!this.getName(i).equals(other.getName(i)))
+ if (!base.getName(i).equals(child.getName(i)))
break;
i++;
}
- // append ..\ for remaining names in the base
+ // remaining elements in child
+ WindowsPath childRemaining;
+ boolean isChildEmpty;
+ if (i == childCount) {
+ childRemaining = emptyPath();
+ isChildEmpty = true;
+ } else {
+ childRemaining = child.subpath(i, childCount);
+ isChildEmpty = childRemaining.isEmpty();
+ }
+
+ // matched all of base
+ if (i == baseCount) {
+ return childRemaining;
+ }
+
+ // the remainder of base cannot contain ".."
+ WindowsPath baseRemaining = base.subpath(i, baseCount);
+ if (baseRemaining.hasDotOrDotDot()) {
+ throw new IllegalArgumentException("Unable to compute relative "
+ + " path from " + this + " to " + obj);
+ }
+ if (baseRemaining.isEmpty())
+ return childRemaining;
+
+ // number of ".." needed
+ int dotdots = baseRemaining.getNameCount();
+ if (dotdots == 0) {
+ return childRemaining;
+ }
+
StringBuilder result = new StringBuilder();
- for (int j=i; j<bn; j++) {
+ for (int j=0; j<dotdots; j++) {
result.append("..\\");
}
// append remaining names in child
- if (!other.isEmpty()) {
- for (int j=i; j<cn; j++) {
- result.append(other.getName(j).toString());
+ if (!isChildEmpty) {
+ for (int j=0; j<childRemaining.getNameCount(); j++) {
+ result.append(childRemaining.getName(j).toString());
result.append("\\");
}
}
- // drop trailing slash in result
+ // drop trailing slash
result.setLength(result.length()-1);
return createFromNormalizedPath(getFileSystem(), result.toString());
}
@Override
- public Path normalize() {
+ public WindowsPath normalize() {
final int count = getNameCount();
if (count == 0 || isEmpty())
return this;
--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaProgressBarUI.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaProgressBarUI.java Fri Aug 26 10:14:15 2016 -0700
@@ -124,7 +124,9 @@
if (!progressBar.isIndeterminate()) return;
stopAnimationTimer();
// start the animation thread
- startAnimationTimer();
+ if (progressBar.isDisplayable()) {
+ startAnimationTimer();
+ }
}
if ("JProgressBar.style".equals(prop)) {
@@ -141,7 +143,9 @@
public void ancestorAdded(final AncestorEvent e) {
if (!progressBar.isIndeterminate()) return;
- startAnimationTimer();
+ if (progressBar.isDisplayable()) {
+ startAnimationTimer();
+ }
}
public void ancestorMoved(final AncestorEvent e) { }
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTWindow.m Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTWindow.m Fri Aug 26 10:14:15 2016 -0700
@@ -807,6 +807,18 @@
- (void)sendEvent:(NSEvent *)event {
if ([event type] == NSLeftMouseDown || [event type] == NSRightMouseDown || [event type] == NSOtherMouseDown) {
+ // Move parent windows to front and make sure that a child window is displayed
+ // in front of its nearest parent.
+ if (self.ownerWindow != nil) {
+ JNIEnv *env = [ThreadUtilities getJNIEnvUncached];
+ jobject platformWindow = [self.javaPlatformWindow jObjectWithEnv:env];
+ if (platformWindow != NULL) {
+ static JNF_MEMBER_CACHE(jm_orderAboveSiblings, jc_CPlatformWindow, "orderAboveSiblings", "()V");
+ JNFCallVoidMethod(env,platformWindow, jm_orderAboveSiblings);
+ (*env)->DeleteLocalRef(env, platformWindow);
+ }
+ }
+ [self orderChildWindows:YES];
NSPoint p = [NSEvent mouseLocation];
NSRect frame = [self.nsWindow frame];
@@ -1159,6 +1171,16 @@
NSWindow *nsWindow = OBJC(windowPtr);
[ThreadUtilities performOnMainThreadWaiting:NO block:^(){
[nsWindow orderBack:nil];
+ // Order parent windows
+ AWTWindow *awtWindow = (AWTWindow*)[nsWindow delegate];
+ while (awtWindow.ownerWindow != nil) {
+ awtWindow = awtWindow.ownerWindow;
+ if ([AWTWindow isJavaPlatformWindowVisible:awtWindow.nsWindow]) {
+ [awtWindow.nsWindow orderBack:nil];
+ }
+ }
+ // Order child windows
+ [(AWTWindow*)[nsWindow delegate] orderChildWindows:NO];
}];
JNF_COCOA_EXIT(env);
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFColorConverter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFColorConverter.java Fri Aug 26 10:14:15 2016 -0700
@@ -47,7 +47,7 @@
* @throws NullPointerException if {@code result} is
* {@code null}.
* @throws ArrayIndexOutOfBoundsException if
- * {@code result.length < 3}.
+ * {@code result.length < 3}.
*/
public abstract void fromRGB(float r, float g, float b, float[] result);
@@ -63,7 +63,7 @@
* @throws NullPointerException if {@code rgb} is
* {@code null}.
* @throws ArrayIndexOutOfBoundsException if
- * {@code rgb.length < 3}.
+ * {@code rgb.length < 3}.
*/
public abstract void toRGB(float x0, float x1, float x2, float[] rgb);
}
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFDecompressor.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFDecompressor.java Fri Aug 26 10:14:15 2016 -0700
@@ -353,7 +353,7 @@
* <p> The pixels in the source region to be copied are
* those with X coordinates of the form {@code activeSrcMinX +
* k*subsampleX}, where {@code k} is an integer such
- * that {@code 0 ≤ k < dstWidth}.
+ * that {@code 0 <= k < dstWidth}.
*/
protected int activeSrcMinX;
@@ -365,7 +365,7 @@
* <p> The pixels in the source region to be copied are
* those with Y coordinates of the form {@code activeSrcMinY +
* k*subsampleY}, where {@code k} is an integer such
- * that {@code 0 ≤ k < dstHeight}.
+ * that {@code 0 <= k < dstHeight}.
*/
protected int activeSrcMinY;
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFIFD.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFIFD.java Fri Aug 26 10:14:15 2016 -0700
@@ -49,6 +49,45 @@
private long stripOrTileOffsetsPosition = -1;
private long lastPosition = -1;
+
+ /**
+ * Converts a {@code TIFFDirectory} to a {@code TIFFIFD}.
+ */
+ public static TIFFIFD getDirectoryAsIFD(TIFFDirectory dir) {
+ if(dir instanceof TIFFIFD) {
+ return (TIFFIFD)dir;
+ }
+
+ TIFFIFD ifd = new TIFFIFD(Arrays.asList(dir.getTagSets()),
+ dir.getParentTag());
+ TIFFField[] fields = dir.getTIFFFields();
+ int numFields = fields.length;
+ for(int i = 0; i < numFields; i++) {
+ TIFFField f = fields[i];
+ TIFFTag tag = f.getTag();
+ if(tag.isIFDPointer()) {
+ TIFFDirectory subDir = null;
+ if (f.hasDirectory()) {
+ subDir = f.getDirectory();
+ } else if (f.getData() instanceof TIFFDirectory) {
+ subDir = (TIFFDirectory)f.getData();
+ }
+ if (subDir != null) {
+ TIFFDirectory subIFD = getDirectoryAsIFD(subDir);
+ f = new TIFFField(tag, f.getType(), (long)f.getCount(),
+ subIFD);
+ } else {
+ f = null;
+ }
+ }
+ if (f != null) {
+ ifd.addTIFFField(f);
+ }
+ }
+
+ return ifd;
+ }
+
public static TIFFTag getTag(int tagNumber, List<TIFFTagSet> tagSets) {
Iterator<TIFFTagSet> iter = tagSets.iterator();
while (iter.hasNext()) {
@@ -704,7 +743,7 @@
pos = nextSpace;
if (tag.isIFDPointer() && f.hasDirectory()) {
- TIFFIFD subIFD = (TIFFIFD)f.getDirectory();
+ TIFFIFD subIFD = getDirectoryAsIFD(f.getDirectory());
subIFD.writeToStream(stream);
nextSpace = subIFD.lastPosition;
} else {
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageMetadata.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageMetadata.java Fri Aug 26 10:14:15 2016 -0700
@@ -132,7 +132,7 @@
if (tag == null) {
node = f.getAsNativeNode();
} else if (tag.isIFDPointer() && f.hasDirectory()) {
- TIFFIFD subIFD = (TIFFIFD)f.getDirectory();
+ TIFFIFD subIFD = TIFFIFD.getDirectoryAsIFD(f.getDirectory());
// Recurse
node = getIFDAsTree(subIFD, tag.getName(), tag.getNumber());
@@ -1465,8 +1465,14 @@
String className = st.nextToken();
Object o = null;
+ Class<?> setClass = null;
try {
- Class<?> setClass = Class.forName(className);
+ ClassLoader cl = TIFFImageMetadata.class.getClassLoader();
+ setClass = Class.forName(className, false, cl);
+ if (!TIFFTagSet.class.isAssignableFrom(setClass)) {
+ fatal(node, "TagSets in IFD must be subset of"
+ + " TIFFTagSet class");
+ }
Method getInstanceMethod =
setClass.getMethod("getInstance", (Class[])null);
o = getInstanceMethod.invoke(null, (Object[])null);
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageReader.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageReader.java Fri Aug 26 10:14:15 2016 -0700
@@ -35,6 +35,7 @@
import java.awt.image.Raster;
import java.awt.image.RenderedImage;
import java.awt.image.SampleModel;
+import java.io.EOFException;
import java.io.IOException;
import java.nio.ByteOrder;
import java.util.ArrayList;
@@ -189,8 +190,8 @@
// Seek to start of first IFD
long offset = stream.readUnsignedInt();
+ stream.seek(offset);
imageStartPosition.add(Long.valueOf(offset));
- stream.seek(offset);
} catch (IOException e) {
throw new IIOException("I/O error reading header!", e);
}
@@ -201,10 +202,10 @@
private int locateImage(int imageIndex) throws IIOException {
readHeader();
+ // Find closest known index
+ int index = Math.min(imageIndex, imageStartPosition.size() - 1);
+
try {
- // Find closest known index
- int index = Math.min(imageIndex, imageStartPosition.size() - 1);
-
// Seek to that position
Long l = imageStartPosition.get(index);
stream.seek(l.longValue());
@@ -212,6 +213,11 @@
// Skip IFDs until at desired index or last image found
while (index < imageIndex) {
int count = stream.readUnsignedShort();
+ // If zero-entry IFD, decrement the index and exit the loop
+ if (count == 0) {
+ imageIndex = index > 0 ? index - 1 : 0;
+ break;
+ }
stream.skipBytes(12 * count);
long offset = stream.readUnsignedInt();
@@ -219,12 +225,17 @@
return index;
}
+ stream.seek(offset);
imageStartPosition.add(Long.valueOf(offset));
- stream.seek(offset);
++index;
}
- } catch (IOException e) {
- throw new IIOException("Couldn't seek!", e);
+ } catch (EOFException eofe) {
+ forwardWarningMessage("Ignored " + eofe);
+
+ // Ran off the end of stream: decrement index
+ imageIndex = index > 0 ? index - 1 : 0;
+ } catch (IOException ioe) {
+ throw new IIOException("Couldn't seek!", ioe);
}
if (currIndex != imageIndex) {
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriter.java Fri Aug 26 10:14:15 2016 -0700
@@ -1478,7 +1478,7 @@
(ExifParentTIFFTagSet.TAG_EXIF_IFD_POINTER);
if(f != null && f.hasDirectory()) {
// Retrieve the Exif IFD.
- exifIFD = (TIFFIFD)f.getDirectory();
+ exifIFD = TIFFIFD.getDirectoryAsIFD(f.getDirectory());
} else if(isPrimaryIFD) {
// Create the Exif IFD.
List<TIFFTagSet> exifTagSets = new ArrayList<TIFFTagSet>(1);
@@ -3622,6 +3622,8 @@
streamMetadata = null;
imageMetadata = null;
+ isRescaling = false;
+
isWritingSequence = false;
isWritingEmpty = false;
isInsertingEmpty = false;
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFMetadataFormat.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFMetadataFormat.java Fri Aug 26 10:14:15 2016 -0700
@@ -49,7 +49,8 @@
}
try {
ResourceBundle bundle =
- ResourceBundle.getBundle(resourceBaseName, locale);
+ ResourceBundle.getBundle(resourceBaseName, locale,
+ this.getClass().getModule());
return bundle.getString(key);
} catch (MissingResourceException e) {
return null;
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/XPStyle.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/XPStyle.java Fri Aug 26 10:14:15 2016 -0700
@@ -657,7 +657,6 @@
protected void paintToImage(Component c, Image image, Graphics g,
int w, int h, Object[] args) {
- boolean accEnabled = false;
Skin skin = (Skin)args[0];
Part part = skin.part;
State state = (State)args[1];
@@ -668,6 +667,8 @@
c = skin.component;
}
BufferedImage bi = (BufferedImage)image;
+ w = bi.getWidth();
+ h = bi.getHeight();
WritableRaster raster = bi.getRaster();
DataBufferInt dbi = (DataBufferInt)raster.getDataBuffer();
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractDataLine.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractDataLine.java Fri Aug 26 10:14:15 2016 -0700
@@ -32,7 +32,6 @@
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineUnavailableException;
-
/**
* AbstractDataLine
*
@@ -147,36 +146,35 @@
}
}
-
public final void open(AudioFormat format) throws LineUnavailableException {
open(format, AudioSystem.NOT_SPECIFIED);
}
-
/**
* This implementation always returns 0.
*/
+ @Override
public int available() {
return 0;
}
-
/**
* This implementation does nothing.
*/
+ @Override
public void drain() {
if (Printer.trace) Printer.trace("AbstractDataLine: drain");
}
-
/**
* This implementation does nothing.
*/
+ @Override
public void flush() {
if (Printer.trace) Printer.trace("AbstractDataLine: flush");
}
-
+ @Override
public final void start() {
//$$fb 2001-10-09: Bug #4517739: avoiding deadlock by synchronizing to mixer !
synchronized(mixer) {
@@ -200,7 +198,7 @@
if (Printer.trace) Printer.trace("< "+getClass().getName()+".start() - AbstractDataLine");
}
-
+ @Override
public final void stop() {
//$$fb 2001-10-09: Bug #4517739: avoiding deadlock by synchronizing to mixer !
@@ -245,15 +243,17 @@
// in MixerSourceLine and MixerClip, and I want to touch as little
// code as possible to change isStarted() back to isRunning().
+ @Override
public final boolean isRunning() {
return started;
}
+ @Override
public final boolean isActive() {
return active;
}
-
+ @Override
public final long getMicrosecondPosition() {
long microseconds = getLongFramePosition();
@@ -263,12 +263,12 @@
return microseconds;
}
-
+ @Override
public final AudioFormat getFormat() {
return format;
}
-
+ @Override
public final int getBufferSize() {
return bufferSize;
}
@@ -283,11 +283,11 @@
/**
* This implementation returns AudioSystem.NOT_SPECIFIED.
*/
+ @Override
public final float getLevel() {
return (float)AudioSystem.NOT_SPECIFIED;
}
-
// HELPER METHODS
/**
@@ -317,19 +317,12 @@
synchronized (this) {
- //if (Printer.debug) Printer.debug(" AbstractDataLine: setActive: this.active: " + this.active);
- //if (Printer.debug) Printer.debug(" active: " + active);
-
if (this.active != active) {
this.active = active;
//sendEvents = true;
}
}
- //if (Printer.debug) Printer.debug(" this.active: " + this.active);
- //if (Printer.debug) Printer.debug(" sendEvents: " + sendEvents);
-
-
// $$kk: 11.19.99: take ACTIVE / INACTIVE / EOM events out;
// putting them in is technically an API change.
// do not generate ACTIVE / INACTIVE events for now
@@ -356,18 +349,12 @@
synchronized (this) {
- //if (Printer.debug) Printer.debug(" AbstractDataLine: setStarted: this.started: " + this.started);
- //if (Printer.debug) Printer.debug(" started: " + started);
-
if (this.started != started) {
this.started = started;
sendEvents = true;
}
}
- //if (Printer.debug) Printer.debug(" this.started: " + this.started);
- //if (Printer.debug) Printer.debug(" sendEvents: " + sendEvents);
-
if (sendEvents) {
if (started) {
@@ -379,7 +366,6 @@
if (Printer.trace) Printer.trace("< AbstractDataLine: setStarted completed");
}
-
/**
* This method generates a STOP event and sets the started state to false.
* It is here for historic reasons when an EOM event existed.
@@ -393,9 +379,6 @@
if (Printer.trace) Printer.trace("< AbstractDataLine: setEOM() completed");
}
-
-
-
// OVERRIDES OF ABSTRACT LINE METHODS
/**
@@ -404,6 +387,7 @@
* line is open, this should return quietly because the values
* requested will match the current ones.
*/
+ @Override
public final void open() throws LineUnavailableException {
if (Printer.trace) Printer.trace("> "+getClass().getName()+".open() - AbstractDataLine");
@@ -413,11 +397,11 @@
if (Printer.trace) Printer.trace("< "+getClass().getName()+".open() - AbstractDataLine");
}
-
/**
* This should also stop the line. The closed line should not be running or active.
* After we close the line, we reset the format and buffer size to the defaults.
*/
+ @Override
public final void close() {
//$$fb 2001-10-09: Bug #4517739: avoiding deadlock by synchronizing to mixer !
synchronized (mixer) {
@@ -445,12 +429,6 @@
if (Printer.trace) Printer.trace("< "+getClass().getName()+".close() - in AbstractDataLine");
}
-
- // IMPLEMENTATIONS OF ABSTRACT LINE ABSTRACE METHODS
-
-
- // ABSTRACT METHODS
-
abstract void implOpen(AudioFormat format, int bufferSize) throws LineUnavailableException;
abstract void implClose();
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractLine.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractLine.java Fri Aug 26 10:14:15 2016 -0700
@@ -36,7 +36,6 @@
import javax.sound.sampled.LineListener;
import javax.sound.sampled.LineUnavailableException;
-
/**
* AbstractLine
*
@@ -72,19 +71,19 @@
this.controls = controls;
}
-
// LINE METHODS
+ @Override
public final Line.Info getLineInfo() {
return info;
}
-
+ @Override
public final boolean isOpen() {
return open;
}
-
+ @Override
public final void addLineListener(LineListener listener) {
synchronized(listeners) {
if ( ! (listeners.contains(listener)) ) {
@@ -93,22 +92,22 @@
}
}
-
/**
* Removes an audio listener.
* @param listener listener to remove
*/
+ @Override
public final void removeLineListener(LineListener listener) {
listeners.removeElement(listener);
}
-
/**
* Obtains the set of controls supported by the
* line. If no controls are supported, returns an
* array of length 0.
* @return control set
*/
+ @Override
public final Control[] getControls() {
Control[] returnedArray = new Control[controls.length];
@@ -119,7 +118,7 @@
return returnedArray;
}
-
+ @Override
public final boolean isControlSupported(Control.Type controlType) {
// protect against a NullPointerException
if (controlType == null) {
@@ -135,7 +134,7 @@
return false;
}
-
+ @Override
public final Control getControl(Control.Type controlType) {
// protect against a NullPointerException
if (controlType != null) {
@@ -150,10 +149,8 @@
throw new IllegalArgumentException("Unsupported control type: " + controlType);
}
-
// HELPER METHODS
-
/**
* This method sets the open state and generates
* events if it changes.
@@ -182,7 +179,6 @@
if (Printer.trace) Printer.trace("< "+getClass().getName()+" (AbstractLine): setOpen(" + open + ") this.open: " + this.open);
}
-
/**
* Send line events.
*/
@@ -190,7 +186,6 @@
getEventDispatcher().sendAudioEvents(event, listeners);
}
-
/**
* This is an error in the API: getFramePosition
* should return a long value. At CD quality,
@@ -200,7 +195,6 @@
return (int) getLongFramePosition();
}
-
/**
* Return the frame position in a long value
* This implementation returns AudioSystem.NOT_SPECIFIED.
@@ -209,7 +203,6 @@
return AudioSystem.NOT_SPECIFIED;
}
-
// $$kk: 06.03.99: returns the mixer used in construction.
// this is a hold-over from when there was a public method like
// this on line and should be fixed!!
@@ -232,8 +225,8 @@
}
}
- // ABSTRACT METHODS
-
+ @Override
public abstract void open() throws LineUnavailableException;
+ @Override
public abstract void close();
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDevice.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDevice.java Fri Aug 26 10:14:15 2016 -0700
@@ -26,10 +26,17 @@
package com.sun.media.sound;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
-import java.util.Collections;
-import javax.sound.midi.*;
+import javax.sound.midi.InvalidMidiDataException;
+import javax.sound.midi.MidiDevice;
+import javax.sound.midi.MidiDeviceReceiver;
+import javax.sound.midi.MidiDeviceTransmitter;
+import javax.sound.midi.MidiMessage;
+import javax.sound.midi.MidiUnavailableException;
+import javax.sound.midi.Receiver;
+import javax.sound.midi.Transmitter;
/**
@@ -43,11 +50,8 @@
*/
abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice {
- // STATIC VARIABLES
private static final boolean TRACE_TRANSMITTER = false;
- // INSTANCE VARIABLES
-
private ArrayList<Receiver> receiverList;
private TransmitterList transmitterList;
@@ -62,7 +66,6 @@
private final MidiDevice.Info info;
-
// DEVICE STATE
private volatile boolean open;
@@ -73,15 +76,10 @@
private List<Object> openKeepingObjects;
/**
- * This is the device handle returned from native code
+ * This is the device handle returned from native code.
*/
protected volatile long id;
-
-
- // CONSTRUCTOR
-
-
/**
* Constructs an AbstractMidiDevice with the specified info object.
* @param info the description of the device
@@ -99,9 +97,9 @@
if(Printer.trace) Printer.trace("<< AbstractMidiDevice CONSTRUCTOR completed");
}
-
// MIDI DEVICE METHODS
+ @Override
public final MidiDevice.Info getDeviceInfo() {
return info;
}
@@ -111,6 +109,7 @@
* opened the device implicitly from closing it. The only way to close the device after
* this call is a call to close().
*/
+ @Override
public final void open() throws MidiUnavailableException {
if (Printer.trace) Printer.trace("> AbstractMidiDevice: open()");
synchronized(this) {
@@ -120,8 +119,6 @@
if (Printer.trace) Printer.trace("< AbstractMidiDevice: open() completed");
}
-
-
/** Open the device implicitly.
* This method is intended to be used by AbstractReceiver
* and BasicTransmitter. Actually, it is called by getReceiverReferenceCounting() and
@@ -146,7 +143,6 @@
if (Printer.trace) Printer.trace("< AbstractMidiDevice: openInternal() completed");
}
-
private void doOpen() throws MidiUnavailableException {
if (Printer.trace) Printer.trace("> AbstractMidiDevice: doOpen()");
synchronized(this) {
@@ -158,7 +154,7 @@
if (Printer.trace) Printer.trace("< AbstractMidiDevice: doOpen() completed");
}
-
+ @Override
public final void close() {
if (Printer.trace) Printer.trace("> AbstractMidiDevice: close()");
synchronized (this) {
@@ -168,7 +164,6 @@
if (Printer.trace) Printer.trace("< AbstractMidiDevice: close() completed");
}
-
/** Close the device for an object that implicitely opened it.
* This method is intended to be used by Transmitter.close() and Receiver.close().
* Those methods should pass this for the object parameter. Since Transmitters or Receivers
@@ -196,7 +191,6 @@
if (Printer.trace) Printer.trace("< AbstractMidiDevice: closeInternal() completed");
}
-
public final void doClose() {
if (Printer.trace) Printer.trace("> AbstractMidiDevice: doClose()");
synchronized(this) {
@@ -208,12 +202,11 @@
if (Printer.trace) Printer.trace("< AbstractMidiDevice: doClose() completed");
}
-
+ @Override
public final boolean isOpen() {
return open;
}
-
protected void implClose() {
synchronized (traRecLock) {
if (receiverList != null) {
@@ -230,21 +223,21 @@
}
}
-
/**
* This implementation always returns -1.
* Devices that actually provide this should over-ride
* this method.
*/
+ @Override
public long getMicrosecondPosition() {
return -1;
}
-
/** Return the maximum number of Receivers supported by this device.
Depending on the return value of hasReceivers(), this method returns either 0 or -1.
Subclasses should rather override hasReceivers() than override this method.
*/
+ @Override
public final int getMaxReceivers() {
if (hasReceivers()) {
return -1;
@@ -253,11 +246,11 @@
}
}
-
/** Return the maximum number of Transmitters supported by this device.
Depending on the return value of hasTransmitters(), this method returns either 0 or -1.
Subclasses should override hasTransmitters().
*/
+ @Override
public final int getMaxTransmitters() {
if (hasTransmitters()) {
return -1;
@@ -266,7 +259,6 @@
}
}
-
/** Retrieve a Receiver for this device.
This method returns the value returned by createReceiver(), if it doesn't throw
an exception. Subclasses should rather override createReceiver() than override
@@ -274,6 +266,7 @@
If createReceiver returns a Receiver, it is added to the internal list
of Receivers (see getReceiversList)
*/
+ @Override
public final Receiver getReceiver() throws MidiUnavailableException {
Receiver receiver;
synchronized (traRecLock) {
@@ -283,7 +276,7 @@
return receiver;
}
-
+ @Override
@SuppressWarnings("unchecked") // Cast of result of clone
public final List<Receiver> getReceivers() {
List<Receiver> recs;
@@ -298,12 +291,12 @@
return recs;
}
-
/**
* This implementation uses createTransmitter, which may throw an exception.
* If a transmitter is returned in createTransmitter, it is added to the internal
* TransmitterList
*/
+ @Override
public final Transmitter getTransmitter() throws MidiUnavailableException {
Transmitter transmitter;
synchronized (traRecLock) {
@@ -313,7 +306,7 @@
return transmitter;
}
-
+ @Override
@SuppressWarnings("unchecked") // Cast of result of clone
public final List<Transmitter> getTransmitters() {
List<Transmitter> tras;
@@ -328,19 +321,16 @@
return tras;
}
-
- // HELPER METHODS
-
final long getId() {
return id;
}
-
// REFERENCE COUNTING
/** Retrieve a Receiver and open the device implicitly.
This method is called by MidiSystem.getReceiver().
*/
+ @Override
public final Receiver getReceiverReferenceCounting()
throws MidiUnavailableException {
/* Keep this order of commands! If getReceiver() throws an exception,
@@ -354,10 +344,10 @@
return receiver;
}
-
/** Retrieve a Transmitter and open the device implicitly.
This method is called by MidiSystem.getTransmitter().
*/
+ @Override
public final Transmitter getTransmitterReferenceCounting()
throws MidiUnavailableException {
/* Keep this order of commands! If getTransmitter() throws an exception,
@@ -371,7 +361,6 @@
return transmitter;
}
-
/** Return the list of objects that have opened the device implicitely.
*/
private synchronized List<Object> getOpenKeepingObjects() {
@@ -381,23 +370,19 @@
return openKeepingObjects;
}
-
-
// RECEIVER HANDLING METHODS
-
/** Return the internal list of Receivers, possibly creating it first.
*/
private List<Receiver> getReceiverList() {
synchronized (traRecLock) {
if (receiverList == null) {
- receiverList = new ArrayList<Receiver>();
+ receiverList = new ArrayList<>();
}
}
return receiverList;
}
-
/** Returns if this device supports Receivers.
Subclasses that use Receivers should override this method to
return true. They also should override createReceiver().
@@ -408,7 +393,6 @@
return false;
}
-
/** Create a Receiver object.
throwing an exception here means that Receivers aren't enabled.
Subclasses that use Receivers should override this method with
@@ -420,8 +404,6 @@
throw new MidiUnavailableException("MIDI IN receiver not available");
}
-
-
// TRANSMITTER HANDLING
/** Return the internal list of Transmitters, possibly creating it first.
@@ -435,7 +417,6 @@
return transmitterList;
}
-
/** Returns if this device supports Transmitters.
Subclasses that use Transmitters should override this method to
return true. They also should override createTransmitter().
@@ -446,7 +427,6 @@
return false;
}
-
/** Create a Transmitter object.
throwing an exception here means that Transmitters aren't enabled.
Subclasses that use Transmitters should override this method with
@@ -458,20 +438,16 @@
throw new MidiUnavailableException("MIDI OUT transmitter not available");
}
- // ABSTRACT METHODS
-
protected abstract void implOpen() throws MidiUnavailableException;
-
/**
- * close this device if discarded by the garbage collector
+ * close this device if discarded by the garbage collector.
*/
+ @Override
protected final void finalize() {
close();
}
- // INNER CLASSES
-
/** Base class for Receivers.
Subclasses that use Receivers must use this base class, since it
contains magic necessary to manage implicit closing the device.
@@ -550,6 +526,7 @@
this.tlist = tlist;
}
+ @Override
public final void setReceiver(Receiver receiver) {
if (tlist != null && this.receiver != receiver) {
if (Printer.debug) Printer.debug("Transmitter "+toString()+": set receiver "+receiver);
@@ -558,16 +535,17 @@
}
}
+ @Override
public final Receiver getReceiver() {
return receiver;
}
-
/** Close the Transmitter.
* Here, the call to the magic method closeInternal() takes place.
* Therefore, subclasses that override this method must call
* 'super.close()'.
*/
+ @Override
public final void close() {
AbstractMidiDevice.this.closeInternal(this);
if (tlist != null) {
@@ -577,19 +555,19 @@
}
}
+ @Override
public final MidiDevice getMidiDevice() {
return AbstractMidiDevice.this;
}
} // class BasicTransmitter
-
/**
- * a class to manage a list of transmitters
+ * a class to manage a list of transmitters.
*/
final class TransmitterList {
- private final ArrayList<Transmitter> transmitters = new ArrayList<Transmitter>();
+ private final ArrayList<Transmitter> transmitters = new ArrayList<>();
private MidiOutDevice.MidiOutReceiver midiOutReceiver;
// how many transmitters must be present for optimized
@@ -712,9 +690,8 @@
}
}
-
/**
- * Send this message to all transmitters
+ * Send this message to all transmitters.
*/
void sendMessage(MidiMessage message, long timeStamp) {
if (message instanceof FastShortMessage) {
@@ -746,8 +723,5 @@
}
}
}
-
-
} // TransmitterList
-
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDeviceProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDeviceProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -52,7 +52,6 @@
// also for memory's sake, do not initialize the arrays here
}
-
final synchronized void readDeviceInfos() {
Info[] infos = getInfoCache();
MidiDevice[] devices = getDeviceCache();
@@ -148,10 +147,6 @@
throw MidiUtils.unsupportedDevice(info);
}
-
- // INNER CLASSES
-
-
/**
* Info class for MidiDevices. Adds an index value for
* making native references to a particular device.
@@ -182,9 +177,6 @@
} // class Info
-
- // ABSTRACT METHODS
-
abstract int getNumDevices();
abstract MidiDevice[] getDeviceCache();
abstract void setDeviceCache(MidiDevice[] devices);
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMixer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMixer.java Fri Aug 26 10:14:15 2016 -0700
@@ -28,9 +28,9 @@
import java.util.Vector;
import javax.sound.sampled.Control;
-import javax.sound.sampled.Mixer;
import javax.sound.sampled.Line;
import javax.sound.sampled.LineUnavailableException;
+import javax.sound.sampled.Mixer;
/**
* Abstract Mixer. Implements Mixer (with abstract methods) and specifies
@@ -76,29 +76,18 @@
*/
private boolean manuallyOpened = false;
+ // STATE VARIABLES
/**
- * Supported formats for the mixer.
- */
- //$$fb DELETE
- //protected Vector formats = new Vector();
-
-
- // STATE VARIABLES
-
-
- /**
- * Source lines (ports) currently open
+ * Source lines (ports) currently open.
*/
private final Vector<Line> sourceLines = new Vector<>();
-
/**
* Target lines currently open.
*/
private final Vector<Line> targetLines = new Vector<>();
-
/**
* Constructs a new AbstractMixer.
* @param mixer the mixer with which this line is associated
@@ -124,30 +113,28 @@
this.targetLineInfo = targetLineInfo;
}
-
// MIXER METHODS
-
+ @Override
public final Mixer.Info getMixerInfo() {
return mixerInfo;
}
-
+ @Override
public final Line.Info[] getSourceLineInfo() {
Line.Info[] localArray = new Line.Info[sourceLineInfo.length];
System.arraycopy(sourceLineInfo, 0, localArray, 0, sourceLineInfo.length);
return localArray;
}
-
+ @Override
public final Line.Info[] getTargetLineInfo() {
-
Line.Info[] localArray = new Line.Info[targetLineInfo.length];
System.arraycopy(targetLineInfo, 0, localArray, 0, targetLineInfo.length);
return localArray;
}
-
+ @Override
public final Line.Info[] getSourceLineInfo(Line.Info info) {
int i;
@@ -168,7 +155,7 @@
return returnedArray;
}
-
+ @Override
public final Line.Info[] getTargetLineInfo(Line.Info info) {
int i;
@@ -189,7 +176,7 @@
return returnedArray;
}
-
+ @Override
public final boolean isLineSupported(Line.Info info) {
int i;
@@ -211,9 +198,10 @@
return false;
}
-
+ @Override
public abstract Line getLine(Line.Info info) throws LineUnavailableException;
+ @Override
public abstract int getMaxLines(Line.Info info);
protected abstract void implOpen() throws LineUnavailableException;
@@ -221,7 +209,7 @@
protected abstract void implStop();
protected abstract void implClose();
-
+ @Override
public final Line[] getSourceLines() {
Line[] localLines;
@@ -238,7 +226,7 @@
return localLines;
}
-
+ @Override
public final Line[] getTargetLines() {
Line[] localLines;
@@ -255,37 +243,37 @@
return localLines;
}
-
/**
* Default implementation always throws an exception.
*/
+ @Override
public final void synchronize(Line[] lines, boolean maintainSync) {
throw new IllegalArgumentException("Synchronization not supported by this mixer.");
}
-
/**
* Default implementation always throws an exception.
*/
+ @Override
public final void unsynchronize(Line[] lines) {
throw new IllegalArgumentException("Synchronization not supported by this mixer.");
}
-
/**
* Default implementation always returns false.
*/
+ @Override
public final boolean isSynchronizationSupported(Line[] lines,
boolean maintainSync) {
return false;
}
-
// OVERRIDES OF ABSTRACT DATA LINE METHODS
/**
* This implementation tries to open the mixer with its current format and buffer size settings.
*/
+ @Override
public final synchronized void open() throws LineUnavailableException {
open(true);
}
@@ -307,10 +295,8 @@
if (Printer.trace) Printer.trace("<< AbstractMixer: open() succeeded");
}
-
// METHOD FOR INTERNAL IMPLEMENTATION USE
-
/**
* The default implementation of this method just determines whether
* this line is a source or target line, calls open(no-arg) on the
@@ -357,7 +343,6 @@
if (Printer.trace) Printer.trace("<< AbstractMixer: open(" + line + ") completed");
}
-
/**
* Removes this line from the list of open source lines and
* open target lines, if it exists in either.
@@ -388,10 +373,10 @@
if (Printer.trace) Printer.trace("<< AbstractMixer: close(" + line + ") succeeded");
}
-
/**
* Close all lines and then close this mixer.
*/
+ @Override
public final synchronized void close() {
if (Printer.trace) Printer.trace(">> AbstractMixer: close()");
if (isOpen()) {
@@ -439,7 +424,6 @@
if (Printer.trace) Printer.trace("<< AbstractMixer: start(" + line + ") succeeded");
}
-
/**
* Stops the mixer if this was the last running line.
*/
@@ -492,8 +476,6 @@
if (Printer.trace) Printer.trace("<< AbstractMixer: stop(" + line + ") succeeded");
}
-
-
/**
* Determines whether this is a source line for this mixer.
* Right now this just checks whether it's supported, but should
@@ -510,7 +492,6 @@
return false;
}
-
/**
* Determines whether this is a target line for this mixer.
* Right now this just checks whether it's supported, but should
@@ -527,7 +508,6 @@
return false;
}
-
/**
* Returns the first complete Line.Info object it finds that
* matches the one specified, or null if no matching Line.Info
@@ -551,8 +531,6 @@
return targetLineInfo[i];
}
}
-
return null;
}
-
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileFormat.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileFormat.java Fri Aug 26 10:14:15 2016 -0700
@@ -87,5 +87,4 @@
int getSsndChunkOffset() {
return getHeaderSize()-16;
}
-
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileReader.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileReader.java Fri Aug 26 10:14:15 2016 -0700
@@ -29,7 +29,6 @@
import java.io.IOException;
import java.io.InputStream;
-import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFileFormat.Type;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AlawCodec.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AlawCodec.java Fri Aug 26 10:14:15 2016 -0700
@@ -33,7 +33,6 @@
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
-
/**
* A-law encodes linear data, and decodes a-law data to linear data.
*
@@ -52,7 +51,7 @@
0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF};
/**
- * Initializes the decode tables
+ * Initializes the decode tables.
*/
static {
for (int i=0;i<256;i++) {
@@ -83,10 +82,7 @@
super(alawEncodings, alawEncodings);
}
- // NEW CODE
-
- /**
- */
+ @Override
public AudioFormat.Encoding[] getTargetEncodings(AudioFormat sourceFormat){
if( sourceFormat.getEncoding().equals( AudioFormat.Encoding.PCM_SIGNED )) {
@@ -117,8 +113,7 @@
}
}
- /**
- */
+ @Override
public AudioFormat[] getTargetFormats(AudioFormat.Encoding targetEncoding, AudioFormat sourceFormat){
Objects.requireNonNull(sourceFormat);
if( (targetEncoding.equals( AudioFormat.Encoding.PCM_SIGNED ) && sourceFormat.getEncoding().equals( AudioFormat.Encoding.ALAW)) ||
@@ -129,8 +124,7 @@
}
}
- /**
- */
+ @Override
public AudioInputStream getAudioInputStream(AudioFormat.Encoding targetEncoding, AudioInputStream sourceStream){
AudioFormat sourceFormat = sourceStream.getFormat();
AudioFormat.Encoding sourceEncoding = sourceFormat.getEncoding();
@@ -169,9 +163,7 @@
return getConvertedStream(targetFormat, sourceStream);
}
- /**
- * use old code...
- */
+ @Override
public AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInputStream sourceStream){
if (!isConversionSupported(targetFormat, sourceStream.getFormat()))
throw new IllegalArgumentException("Unsupported conversion: "
@@ -180,10 +172,6 @@
return getConvertedStream( targetFormat, sourceStream );
}
-
- // OLD CODE
-
-
/**
* Opens the codec with the specified parameters.
* @param stream stream from which data to be processed should be read
@@ -192,7 +180,6 @@
* @throws IllegalArgumentException if the format combination supplied is
* not supported.
*/
- /* public AudioInputStream getConvertedStream(AudioFormat outputFormat, AudioInputStream stream) { */
private AudioInputStream getConvertedStream(AudioFormat outputFormat, AudioInputStream stream) {
AudioInputStream cs = null;
@@ -201,7 +188,7 @@
if( inputFormat.matches(outputFormat) ) {
cs = stream;
} else {
- cs = (AudioInputStream) (new AlawCodecStream(stream, outputFormat));
+ cs = new AlawCodecStream(stream, outputFormat);
}
return cs;
@@ -214,7 +201,6 @@
* returns an array of length 0.
* @return array of supported output formats.
*/
- /* public AudioFormat[] getOutputFormats(AudioFormat inputFormat) { */
private AudioFormat[] getOutputFormats(AudioFormat inputFormat) {
@@ -343,18 +329,20 @@
* Note that this won't actually read anything; must read in
* two-byte units.
*/
+ @Override
public int read() throws IOException {
byte[] b = new byte[1];
return read(b, 0, b.length);
}
-
+ @Override
public int read(byte[] b) throws IOException {
return read(b, 0, b.length);
}
+ @Override
public int read(byte[] b, int off, int len) throws IOException {
// don't read fractional frames
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFileSoundbankReader.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFileSoundbankReader.java Fri Aug 26 10:14:15 2016 -0700
@@ -45,6 +45,7 @@
*/
public final class AudioFileSoundbankReader extends SoundbankReader {
+ @Override
public Soundbank getSoundbank(URL url)
throws InvalidMidiDataException, IOException {
try {
@@ -59,6 +60,7 @@
}
}
+ @Override
public Soundbank getSoundbank(InputStream stream)
throws InvalidMidiDataException, IOException {
stream.mark(512);
@@ -108,6 +110,7 @@
}
}
+ @Override
public Soundbank getSoundbank(File file)
throws InvalidMidiDataException, IOException {
try {
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatConverter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatConverter.java Fri Aug 26 10:14:15 2016 -0700
@@ -89,8 +89,9 @@
mask = (byte) 0xFF;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
byte[] ret = converter.toByteArray(in_buff, in_offset, in_len,
out_buff, out_offset);
@@ -102,8 +103,9 @@
return ret;
}
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
if (mask_buffer == null || mask_buffer.length < in_buff.length)
mask_buffer = new byte[in_buff.length];
System.arraycopy(in_buff, 0, mask_buffer, 0, in_buff.length);
@@ -132,8 +134,9 @@
double[] double_buff = null;
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int in_len = out_len * 8;
if (bytebuffer == null || bytebuffer.capacity() < in_len) {
bytebuffer = ByteBuffer.allocate(in_len).order(
@@ -154,8 +157,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int out_len = in_len * 8;
if (bytebuffer == null || bytebuffer.capacity() < out_len) {
bytebuffer = ByteBuffer.allocate(out_len).order(
@@ -184,8 +188,9 @@
double[] double_buff = null;
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int in_len = out_len * 8;
if (bytebuffer == null || bytebuffer.capacity() < in_len) {
bytebuffer = ByteBuffer.allocate(in_len).order(
@@ -206,8 +211,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int out_len = in_len * 8;
if (bytebuffer == null || bytebuffer.capacity() < out_len) {
bytebuffer = ByteBuffer.allocate(out_len).order(
@@ -240,8 +246,9 @@
FloatBuffer floatbuffer = null;
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int in_len = out_len * 4;
if (bytebuffer == null || bytebuffer.capacity() < in_len) {
bytebuffer = ByteBuffer.allocate(in_len).order(
@@ -255,8 +262,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int out_len = in_len * 4;
if (bytebuffer == null || bytebuffer.capacity() < out_len) {
bytebuffer = ByteBuffer.allocate(out_len).order(
@@ -277,8 +285,9 @@
FloatBuffer floatbuffer = null;
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int in_len = out_len * 4;
if (bytebuffer == null || bytebuffer.capacity() < in_len) {
bytebuffer = ByteBuffer.allocate(in_len).order(
@@ -292,8 +301,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int out_len = in_len * 4;
if (bytebuffer == null || bytebuffer.capacity() < out_len) {
bytebuffer = ByteBuffer.allocate(out_len).order(
@@ -316,8 +326,9 @@
// PCM 8 bit, signed
private static class AudioFloatConversion8S extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -327,8 +338,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -341,8 +353,9 @@
// PCM 8 bit, unsigned
private static class AudioFloatConversion8U extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -352,8 +365,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -372,8 +386,9 @@
// PCM 16 bit, signed, little-endian
private static class AudioFloatConversion16SL extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int len = out_offset + out_len;
for (int ox = out_offset; ox < len; ox++) {
@@ -383,8 +398,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ox = out_offset;
int len = in_offset + in_len;
for (int ix = in_offset; ix < len; ix++) {
@@ -399,8 +415,9 @@
// PCM 16 bit, signed, big-endian
private static class AudioFloatConversion16SB extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -410,8 +427,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -426,8 +444,9 @@
// PCM 16 bit, unsigned, little-endian
private static class AudioFloatConversion16UL extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -438,8 +457,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -454,8 +474,9 @@
// PCM 16 bit, unsigned, big-endian
private static class AudioFloatConversion16UB extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -466,8 +487,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -488,8 +510,9 @@
// PCM 24 bit, signed, little-endian
private static class AudioFloatConversion24SL extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -502,8 +525,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -521,8 +545,9 @@
// PCM 24 bit, signed, big-endian
private static class AudioFloatConversion24SB extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -535,8 +560,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -554,8 +580,9 @@
// PCM 24 bit, unsigned, little-endian
private static class AudioFloatConversion24UL extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -567,8 +594,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -585,8 +613,9 @@
// PCM 24 bit, unsigned, big-endian
private static class AudioFloatConversion24UB extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -598,8 +627,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -622,8 +652,9 @@
// PCM 32 bit, signed, little-endian
private static class AudioFloatConversion32SL extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -635,8 +666,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -652,8 +684,9 @@
// PCM 32 bit, signed, big-endian
private static class AudioFloatConversion32SB extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -665,8 +698,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -682,8 +716,9 @@
// PCM 32 bit, unsigned, little-endian
private static class AudioFloatConversion32UL extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -696,8 +731,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -715,8 +751,9 @@
// PCM 32 bit, unsigned, big-endian
private static class AudioFloatConversion32UB extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -729,8 +766,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -760,8 +798,9 @@
this.xbytes = xbytes;
}
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -774,8 +813,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -801,8 +841,9 @@
this.xbytes = xbytes;
}
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -816,8 +857,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -843,8 +885,9 @@
this.xbytes = xbytes;
}
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -858,8 +901,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -886,8 +930,9 @@
this.xbytes = xbytes;
}
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -901,8 +946,9 @@
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatFormatConverter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatFormatConverter.java Fri Aug 26 10:14:15 2016 -0700
@@ -32,9 +32,9 @@
import java.util.Objects;
import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioFormat.Encoding;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
-import javax.sound.sampled.AudioFormat.Encoding;
import javax.sound.sampled.spi.FormatConversionProvider;
/**
@@ -63,6 +63,7 @@
fsize = ((targetFormat.getSampleSizeInBits() + 7) / 8);
}
+ @Override
public int read() throws IOException {
byte[] b = new byte[1];
int ret = read(b);
@@ -71,6 +72,7 @@
return b[0] & 0xFF;
}
+ @Override
public int read(byte[] b, int off, int len) throws IOException {
int flen = len / fsize;
@@ -83,6 +85,7 @@
return ret * fsize;
}
+ @Override
public int available() throws IOException {
int ret = stream.available();
if (ret < 0)
@@ -90,22 +93,27 @@
return ret * fsize;
}
+ @Override
public void close() throws IOException {
stream.close();
}
+ @Override
public synchronized void mark(int readlimit) {
stream.mark(readlimit * fsize);
}
+ @Override
public boolean markSupported() {
return stream.markSupported();
}
+ @Override
public synchronized void reset() throws IOException {
stream.reset();
}
+ @Override
public long skip(long n) throws IOException {
long ret = stream.skip(n / fsize);
if (ret < 0)
@@ -141,30 +149,37 @@
.isBigEndian());
}
+ @Override
public int available() throws IOException {
return (ais.available() / sourceChannels) * targetChannels;
}
+ @Override
public void close() throws IOException {
ais.close();
}
+ @Override
public AudioFormat getFormat() {
return targetFormat;
}
+ @Override
public long getFrameLength() {
return ais.getFrameLength();
}
+ @Override
public void mark(int readlimit) {
ais.mark((readlimit / targetChannels) * sourceChannels);
}
+ @Override
public boolean markSupported() {
return ais.markSupported();
}
+ @Override
public int read(float[] b, int off, int len) throws IOException {
int len2 = (len / targetChannels) * sourceChannels;
if (conversion_buffer == null || conversion_buffer.length < len2)
@@ -212,10 +227,12 @@
return (ret / sourceChannels) * targetChannels;
}
+ @Override
public void reset() throws IOException {
ais.reset();
}
+ @Override
public long skip(long len) throws IOException {
long ret = ais.skip((len / targetChannels) * sourceChannels);
if (ret < 0)
@@ -305,22 +322,27 @@
ibuffer_len = buffer_len;
}
+ @Override
public int available() throws IOException {
return 0;
}
+ @Override
public void close() throws IOException {
ais.close();
}
+ @Override
public AudioFormat getFormat() {
return targetFormat;
}
+ @Override
public long getFrameLength() {
return AudioSystem.NOT_SPECIFIED; // ais.getFrameLength();
}
+ @Override
public void mark(int readlimit) {
ais.mark((int) (readlimit * pitch[0]));
mark_ibuffer_index = ibuffer_index;
@@ -337,6 +359,7 @@
}
}
+ @Override
public boolean markSupported() {
return ais.markSupported();
}
@@ -381,6 +404,7 @@
}
+ @Override
public int read(float[] b, int off, int len) throws IOException {
if (cbuffer == null || cbuffer[0].length < len / nrofchannels) {
@@ -431,6 +455,7 @@
return len - remain * nrofchannels;
}
+ @Override
public void reset() throws IOException {
ais.reset();
if (mark_ibuffer == null)
@@ -447,6 +472,7 @@
}
+ @Override
public long skip(long len) throws IOException {
if (len < 0)
return 0;
@@ -474,8 +500,9 @@
Encoding.PCM_UNSIGNED,
Encoding.PCM_FLOAT};
+ @Override
public AudioInputStream getAudioInputStream(Encoding targetEncoding,
- AudioInputStream sourceStream) {
+ AudioInputStream sourceStream) {
if (!isConversionSupported(targetEncoding, sourceStream.getFormat())) {
throw new IllegalArgumentException(
"Unsupported conversion: " + sourceStream.getFormat()
@@ -496,8 +523,9 @@
return getAudioInputStream(targetFormat, sourceStream);
}
+ @Override
public AudioInputStream getAudioInputStream(AudioFormat targetFormat,
- AudioInputStream sourceStream) {
+ AudioInputStream sourceStream) {
if (!isConversionSupported(targetFormat, sourceStream.getFormat()))
throw new IllegalArgumentException("Unsupported conversion: "
+ sourceStream.getFormat().toString() + " to "
@@ -526,16 +554,19 @@
.getFrameLength());
}
+ @Override
public Encoding[] getSourceEncodings() {
return new Encoding[] { Encoding.PCM_SIGNED, Encoding.PCM_UNSIGNED,
Encoding.PCM_FLOAT };
}
+ @Override
public Encoding[] getTargetEncodings() {
return new Encoding[] { Encoding.PCM_SIGNED, Encoding.PCM_UNSIGNED,
Encoding.PCM_FLOAT };
}
+ @Override
public Encoding[] getTargetEncodings(AudioFormat sourceFormat) {
if (AudioFloatConverter.getConverter(sourceFormat) == null)
return new Encoding[0];
@@ -543,14 +574,15 @@
Encoding.PCM_FLOAT };
}
+ @Override
public AudioFormat[] getTargetFormats(Encoding targetEncoding,
- AudioFormat sourceFormat) {
+ AudioFormat sourceFormat) {
Objects.requireNonNull(targetEncoding);
if (AudioFloatConverter.getConverter(sourceFormat) == null)
return new AudioFormat[0];
int channels = sourceFormat.getChannels();
- ArrayList<AudioFormat> formats = new ArrayList<AudioFormat>();
+ ArrayList<AudioFormat> formats = new ArrayList<>();
if (targetEncoding.equals(Encoding.PCM_SIGNED))
formats.add(new AudioFormat(Encoding.PCM_SIGNED,
@@ -598,8 +630,9 @@
return formats.toArray(new AudioFormat[formats.size()]);
}
+ @Override
public boolean isConversionSupported(AudioFormat targetFormat,
- AudioFormat sourceFormat) {
+ AudioFormat sourceFormat) {
Objects.requireNonNull(targetFormat);
if (AudioFloatConverter.getConverter(sourceFormat) == null)
return false;
@@ -612,8 +645,9 @@
return true;
}
+ @Override
public boolean isConversionSupported(Encoding targetEncoding,
- AudioFormat sourceFormat) {
+ AudioFormat sourceFormat) {
Objects.requireNonNull(targetEncoding);
if (AudioFloatConverter.getConverter(sourceFormat) == null)
return false;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatInputStream.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatInputStream.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.ByteArrayInputStream;
@@ -66,14 +67,17 @@
}
+ @Override
public AudioFormat getFormat() {
return format;
}
+ @Override
public long getFrameLength() {
return buffer_len;// / format.getFrameSize();
}
+ @Override
public int read(float[] b, int off, int len) throws IOException {
if (b == null)
throw new NullPointerException();
@@ -91,6 +95,7 @@
return len;
}
+ @Override
public long skip(long len) throws IOException {
if (pos >= buffer_len)
return -1;
@@ -102,21 +107,26 @@
return len;
}
+ @Override
public int available() throws IOException {
return buffer_len - pos;
}
+ @Override
public void close() throws IOException {
}
+ @Override
public void mark(int readlimit) {
markpos = pos;
}
+ @Override
public boolean markSupported() {
return true;
}
+ @Override
public void reset() throws IOException {
pos = markpos;
}
@@ -163,14 +173,17 @@
this.stream = stream;
}
+ @Override
public AudioFormat getFormat() {
return stream.getFormat();
}
+ @Override
public long getFrameLength() {
return stream.getFrameLength();
}
+ @Override
public int read(float[] b, int off, int len) throws IOException {
int b_len = len * framesize_pc;
if (buffer == null || buffer.length < b_len)
@@ -182,6 +195,7 @@
return ret / framesize_pc;
}
+ @Override
public long skip(long len) throws IOException {
long b_len = len * framesize_pc;
long ret = stream.skip(b_len);
@@ -190,22 +204,27 @@
return ret / framesize_pc;
}
+ @Override
public int available() throws IOException {
return stream.available() / framesize_pc;
}
+ @Override
public void close() throws IOException {
stream.close();
}
+ @Override
public void mark(int readlimit) {
stream.mark(readlimit * framesize_pc);
}
+ @Override
public boolean markSupported() {
return stream.markSupported();
}
+ @Override
public void reset() throws IOException {
stream.reset();
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizer.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,9 +22,11 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.Map;
+
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Synthesizer;
import javax.sound.sampled.AudioFormat;
@@ -53,7 +55,7 @@
* @return current audio data format
* @see AudioFormat
*/
- public AudioFormat getFormat();
+ AudioFormat getFormat();
/**
* Gets information about the possible properties for the synthesizer.
@@ -63,8 +65,7 @@
* describing possible properties. This array may be an empty array if
* no properties are required.
*/
- public AudioSynthesizerPropertyInfo[] getPropertyInfo(
- Map<String, Object> info);
+ AudioSynthesizerPropertyInfo[] getPropertyInfo(Map<String, Object> info);
/**
* Opens the synthesizer and starts rendering audio into
@@ -93,7 +94,7 @@
* @see #close
* @see #isOpen
*/
- public void open(SourceDataLine line, Map<String, Object> info)
+ void open(SourceDataLine line, Map<String, Object> info)
throws MidiUnavailableException;
/**
@@ -123,6 +124,7 @@
* @see #close
* @see #isOpen
*/
- public AudioInputStream openStream(AudioFormat targetFormat,
- Map<String, Object> info) throws MidiUnavailableException;
+ AudioInputStream openStream(AudioFormat targetFormat,
+ Map<String, Object> info)
+ throws MidiUnavailableException;
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizerPropertyInfo.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizerPropertyInfo.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AutoClosingClip.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AutoClosingClip.java Fri Aug 26 10:14:15 2016 -0700
@@ -28,7 +28,7 @@
import javax.sound.sampled.Clip;
/**
- * Interface for Clip objects that close themselves automatically
+ * Interface for Clip objects that close themselves automatically.
*
* @author Florian Bomers
*/
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AutoConnectSequencer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AutoConnectSequencer.java Fri Aug 26 10:14:15 2016 -0700
@@ -41,6 +41,5 @@
* needs to re-connect itself to a suitable
* device in open().
*/
- public void setAutoConnect(Receiver autoConnectReceiver);
-
+ void setAutoConnect(Receiver autoConnectReceiver);
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSInfo.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSInfo.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSInstrument.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSInstrument.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.ArrayList;
@@ -47,8 +48,8 @@
boolean druminstrument = false;
byte[] guid = null;
DLSInfo info = new DLSInfo();
- List<DLSRegion> regions = new ArrayList<DLSRegion>();
- List<DLSModulator> modulators = new ArrayList<DLSModulator>();
+ List<DLSRegion> regions = new ArrayList<>();
+ List<DLSModulator> modulators = new ArrayList<>();
public DLSInstrument() {
super(null, null, null, null);
@@ -62,6 +63,7 @@
return info;
}
+ @Override
public String getName() {
return info.name;
}
@@ -70,6 +72,7 @@
info.name = name;
}
+ @Override
public ModelPatch getPatch() {
return new ModelPatch(bank, preset, druminstrument);
}
@@ -86,6 +89,7 @@
}
}
+ @Override
public Object getData() {
return null;
}
@@ -98,6 +102,7 @@
return modulators;
}
+ @Override
public String toString() {
if (druminstrument)
return "Drumkit: " + info.name
@@ -362,17 +367,17 @@
return null;
}
+ @Override
public ModelPerformer[] getPerformers() {
- List<ModelPerformer> performers = new ArrayList<ModelPerformer>();
+ List<ModelPerformer> performers = new ArrayList<>();
- Map<String, DLSModulator> modmap = new HashMap<String, DLSModulator>();
+ Map<String, DLSModulator> modmap = new HashMap<>();
for (DLSModulator mod: getModulators()) {
modmap.put(mod.getSource() + "x" + mod.getControl() + "=" +
mod.getDestination(), mod);
}
- Map<String, DLSModulator> insmodmap =
- new HashMap<String, DLSModulator>();
+ Map<String, DLSModulator> insmodmap = new HashMap<>();
for (DLSRegion zone: regions) {
ModelPerformer performer = new ModelPerformer();
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSModulator.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSModulator.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSRegion.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSRegion.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.ArrayList;
@@ -39,7 +40,7 @@
public final class DLSRegion {
public static final int OPTION_SELFNONEXCLUSIVE = 0x0001;
- List<DLSModulator> modulators = new ArrayList<DLSModulator>();
+ List<DLSModulator> modulators = new ArrayList<>();
int keyfrom;
int keyto;
int velfrom;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSample.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSample.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,10 +22,12 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.InputStream;
import java.util.Arrays;
+
import javax.sound.midi.Soundbank;
import javax.sound.midi.SoundbankResource;
import javax.sound.sampled.AudioFormat;
@@ -60,6 +62,7 @@
return info;
}
+ @Override
public Object getData() {
AudioFormat format = getFormat();
@@ -93,6 +96,7 @@
this.data = new ModelByteBuffer(data, offset, length);
}
+ @Override
public String getName() {
return info.name;
}
@@ -109,6 +113,7 @@
this.sampleoptions = sampleOptions;
}
+ @Override
public String toString() {
return "Sample: " + info.name;
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSampleLoop.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSampleLoop.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSampleOptions.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSampleOptions.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.ArrayList;
@@ -40,7 +41,7 @@
short finetune;
int attenuation;
long options;
- List<DLSSampleLoop> loops = new ArrayList<DLSSampleLoop>();
+ List<DLSSampleLoop> loops = new ArrayList<>();
public int getAttenuation() {
return attenuation;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSoundbank.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSoundbank.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.File;
@@ -42,9 +43,9 @@
import javax.sound.midi.Soundbank;
import javax.sound.midi.SoundbankResource;
import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioFormat.Encoding;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
-import javax.sound.sampled.AudioFormat.Encoding;
/**
* A DLS Level 1 and Level 2 soundbank reader (from files/url/streams).
@@ -100,10 +101,12 @@
return d;
}
+ @Override
public int hashCode() {
return (int)i1;
}
+ @Override
public boolean equals(Object obj) {
if (!(obj instanceof DLSID)) {
return false;
@@ -176,8 +179,8 @@
private final DLSInfo info = new DLSInfo();
- private final List<DLSInstrument> instruments = new ArrayList<DLSInstrument>();
- private final List<DLSSample> samples = new ArrayList<DLSSample>();
+ private final List<DLSInstrument> instruments = new ArrayList<>();
+ private final List<DLSSample> samples = new ArrayList<>();
private boolean largeFormat = false;
private File sampleFile;
@@ -300,7 +303,7 @@
DLSID uuid;
long x;
long y;
- Stack<Long> stack = new Stack<Long>();
+ Stack<Long> stack = new Stack<>();
while (riff.available() != 0) {
int opcode = riff.readUnsignedShort();
@@ -482,7 +485,7 @@
}
}
if (chunk.getType().equals("lart")) {
- List<DLSModulator> modlist = new ArrayList<DLSModulator>();
+ List<DLSModulator> modlist = new ArrayList<>();
while (chunk.hasNextChunk()) {
RIFFReader subchunk = chunk.nextChunk();
if (chunk.getFormat().equals("cdl ")) {
@@ -498,7 +501,7 @@
}
if (chunk.getType().equals("lar2")) {
// support for DLS level 2 ART
- List<DLSModulator> modlist = new ArrayList<DLSModulator>();
+ List<DLSModulator> modlist = new ArrayList<>();
while (chunk.hasNextChunk()) {
RIFFReader subchunk = chunk.nextChunk();
if (chunk.getFormat().equals("cdl ")) {
@@ -582,7 +585,7 @@
}
}
- private Map<DLSRegion, Long> temp_rgnassign = new HashMap<DLSRegion, Long>();
+ private Map<DLSRegion, Long> temp_rgnassign = new HashMap<>();
private boolean readRgnChunk(DLSRegion split, RIFFReader riff)
throws IOException {
@@ -591,7 +594,7 @@
String format = chunk.getFormat();
if (format.equals("LIST")) {
if (chunk.getType().equals("lart")) {
- List<DLSModulator> modlist = new ArrayList<DLSModulator>();
+ List<DLSModulator> modlist = new ArrayList<>();
while (chunk.hasNextChunk()) {
RIFFReader subchunk = chunk.nextChunk();
if (chunk.getFormat().equals("cdl ")) {
@@ -607,7 +610,7 @@
}
if (chunk.getType().equals("lar2")) {
// support for DLS level 2 ART
- List<DLSModulator> modlist = new ArrayList<DLSModulator>();
+ List<DLSModulator> modlist = new ArrayList<>();
while (chunk.hasNextChunk()) {
RIFFReader subchunk = chunk.nextChunk();
if (chunk.getFormat().equals("cdl ")) {
@@ -902,7 +905,7 @@
RIFFWriter wvpl = writer.writeList("wvpl");
long off = wvpl.getFilePointer();
- List<Long> offsettable = new ArrayList<Long>();
+ List<Long> offsettable = new ArrayList<>();
for (DLSSample sample : samples) {
offsettable.add(Long.valueOf(wvpl.getFilePointer() - off));
writeSample(wvpl.writeList("wave"), sample);
@@ -1179,18 +1182,22 @@
return info;
}
+ @Override
public String getName() {
return info.name;
}
+ @Override
public String getVersion() {
return major + "." + minor;
}
+ @Override
public String getVendor() {
return info.engineers;
}
+ @Override
public String getDescription() {
return info.comments;
}
@@ -1207,6 +1214,7 @@
info.comments = s;
}
+ @Override
public SoundbankResource[] getResources() {
SoundbankResource[] resources = new SoundbankResource[samples.size()];
int j = 0;
@@ -1215,6 +1223,7 @@
return resources;
}
+ @Override
public DLSInstrument[] getInstruments() {
DLSInstrument[] inslist_array =
instruments.toArray(new DLSInstrument[instruments.size()]);
@@ -1226,6 +1235,7 @@
return samples.toArray(new DLSSample[samples.size()]);
}
+ @Override
public Instrument getInstrument(Patch patch) {
int program = patch.getProgram();
int bank = patch.getBank();
@@ -1256,9 +1266,9 @@
public void removeResource(SoundbankResource resource) {
if (resource instanceof DLSInstrument)
- instruments.remove((DLSInstrument) resource);
+ instruments.remove(resource);
if (resource instanceof DLSSample)
- samples.remove((DLSSample) resource);
+ samples.remove(resource);
}
public void addInstrument(DLSInstrument resource) {
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSoundbankReader.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSoundbankReader.java Fri Aug 26 10:14:15 2016 -0700
@@ -29,6 +29,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
+
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.Soundbank;
import javax.sound.midi.spi.SoundbankReader;
@@ -41,6 +42,7 @@
*/
public final class DLSSoundbankReader extends SoundbankReader {
+ @Override
public Soundbank getSoundbank(URL url)
throws InvalidMidiDataException, IOException {
try {
@@ -52,6 +54,7 @@
}
}
+ @Override
public Soundbank getSoundbank(InputStream stream)
throws InvalidMidiDataException, IOException {
try {
@@ -63,6 +66,7 @@
}
}
+ @Override
public Soundbank getSoundbank(File file)
throws InvalidMidiDataException, IOException {
try {
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DataPusher.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DataPusher.java Fri Aug 26 10:14:15 2016 -0700
@@ -27,7 +27,9 @@
import java.util.Arrays;
-import javax.sound.sampled.*;
+import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioInputStream;
+import javax.sound.sampled.SourceDataLine;
/**
* Class to write an AudioInputStream to a SourceDataLine.
@@ -125,7 +127,6 @@
if (DEBUG || Printer.debug) Printer.debug("< DataPusher.start(loop="+loop+")");
}
-
public synchronized void stop() {
if (DEBUG || Printer.debug) Printer.debug("> DataPusher.stop()");
if (threadState == STATE_STOPPING
@@ -161,6 +162,7 @@
/**
* Write data to the source data line.
*/
+ @Override
public void run() {
byte[] buffer = null;
boolean useStream = (ais != null);
@@ -242,5 +244,4 @@
}
if (DEBUG || Printer.debug)Printer.debug("DataPusher:end of thread");
}
-
} // class DataPusher
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DirectAudioDevice.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DirectAudioDevice.java Fri Aug 26 10:14:15 2016 -0700
@@ -29,35 +29,35 @@
import java.io.IOException;
import java.util.Vector;
-import javax.sound.sampled.*;
+import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioInputStream;
+import javax.sound.sampled.AudioSystem;
+import javax.sound.sampled.BooleanControl;
+import javax.sound.sampled.Clip;
+import javax.sound.sampled.Control;
+import javax.sound.sampled.DataLine;
+import javax.sound.sampled.FloatControl;
+import javax.sound.sampled.Line;
+import javax.sound.sampled.LineUnavailableException;
+import javax.sound.sampled.SourceDataLine;
+import javax.sound.sampled.TargetDataLine;
// IDEA:
// Use java.util.concurrent.Semaphore,
// java.util.concurrent.locks.ReentrantLock and other new classes/methods
// to improve this class's thread safety.
-
/**
- * A Mixer which provides direct access to audio devices
+ * A Mixer which provides direct access to audio devices.
*
* @author Florian Bomers
*/
final class DirectAudioDevice extends AbstractMixer {
- // CONSTANTS
private static final int CLIP_BUFFER_TIME = 1000; // in milliseconds
private static final int DEFAULT_LINE_BUFFER_TIME = 500; // in milliseconds
- // INSTANCE VARIABLES
-
- /** number of opened lines */
- private int deviceCountOpened = 0;
-
- /** number of started lines */
- private int deviceCountStarted = 0;
-
- // CONSTRUCTOR
DirectAudioDevice(DirectAudioDeviceProvider.DirectAudioDeviceInfo portMixerInfo) {
// pass in Line.Info, mixer, controls
super(portMixerInfo, // Mixer.Info
@@ -168,6 +168,7 @@
// ABSTRACT MIXER: ABSTRACT METHOD IMPLEMENTATIONS
+ @Override
public Line getLine(Line.Info info) throws LineUnavailableException {
Line.Info fullInfo = getLineInfo(info);
if (fullInfo == null) {
@@ -216,7 +217,7 @@
throw new IllegalArgumentException("Line unsupported: " + info);
}
-
+ @Override
public int getMaxLines(Line.Info info) {
Line.Info fullInfo = getLineInfo(info);
@@ -233,26 +234,26 @@
return 0;
}
-
+ @Override
protected void implOpen() throws LineUnavailableException {
if (Printer.trace) Printer.trace("DirectAudioDevice: implOpen - void method");
}
+ @Override
protected void implClose() {
if (Printer.trace) Printer.trace("DirectAudioDevice: implClose - void method");
}
+ @Override
protected void implStart() {
if (Printer.trace) Printer.trace("DirectAudioDevice: implStart - void method");
}
+ @Override
protected void implStop() {
if (Printer.trace) Printer.trace("DirectAudioDevice: implStop - void method");
}
-
- // IMPLEMENTATION HELPERS
-
int getMixerIndex() {
return ((DirectAudioDeviceProvider.DirectAudioDeviceInfo) getMixerInfo()).getIndex();
}
@@ -319,12 +320,6 @@
return null;
}
-
-
-
- // INNER CLASSES
-
-
/**
* Private inner class for the DataLine.Info objects
* adds a little magic for the isFormatSupported so
@@ -367,7 +362,7 @@
}
/**
- * Private inner class as base class for direct lines
+ * Private inner class as base class for direct lines.
*/
private static class DirectDL extends AbstractDataLine implements EventDispatcher.LineMonitor {
protected final int mixerIndex;
@@ -397,7 +392,6 @@
// Guards all native calls.
protected final Object lockNative = new Object();
- // CONSTRUCTOR
protected DirectDL(DataLine.Info info,
DirectAudioDevice mixer,
AudioFormat format,
@@ -414,11 +408,7 @@
}
-
- // ABSTRACT METHOD IMPLEMENTATIONS
-
- // ABSTRACT LINE / DATALINE
-
+ @Override
void implOpen(AudioFormat format, int bufferSize) throws LineUnavailableException {
if (Printer.trace) Printer.trace(">> DirectDL: implOpen("+format+", "+bufferSize+" bytes)");
@@ -538,7 +528,7 @@
if (Printer.trace) Printer.trace("<< DirectDL: implOpen() succeeded");
}
-
+ @Override
void implStart() {
if (Printer.trace) Printer.trace(" >> DirectDL: implStart()");
@@ -570,6 +560,7 @@
if (Printer.trace) Printer.trace("<< DirectDL: implStart() succeeded");
}
+ @Override
void implStop() {
if (Printer.trace) Printer.trace(">> DirectDL: implStop()");
@@ -600,6 +591,7 @@
if (Printer.trace) Printer.trace(" << DirectDL: implStop() succeeded");
}
+ @Override
void implClose() {
if (Printer.trace) Printer.trace(">> DirectDL: implClose()");
@@ -625,8 +617,7 @@
if (Printer.trace) Printer.trace("<< DirectDL: implClose() succeeded");
}
- // METHOD OVERRIDES
-
+ @Override
public int available() {
if (id == 0) {
return 0;
@@ -638,7 +629,7 @@
return a;
}
-
+ @Override
public void drain() {
noService = true;
// additional safeguard against draining forever
@@ -681,6 +672,7 @@
noService = false;
}
+ @Override
public void flush() {
if (id != 0) {
// first stop ongoing read/write method
@@ -699,6 +691,7 @@
}
// replacement for getFramePosition (see AbstractDataLine)
+ @Override
public long getLongFramePosition() {
long pos;
synchronized (lockNative) {
@@ -713,7 +706,6 @@
return (pos / getFormat().getFrameSize());
}
-
/*
* write() belongs into SourceDataLine and Clip,
* so define it here and make it accessible by
@@ -786,6 +778,7 @@
}
// called from event dispatcher for lines that need servicing
+ @Override
public void checkLine() {
synchronized (lockNative) {
if (monitoring
@@ -826,7 +819,6 @@
}
}
-
/////////////////// CONTROLS /////////////////////////////
protected final class Gain extends FloatControl {
@@ -844,6 +836,7 @@
"dB", "Minimum", "", "Maximum");
}
+ @Override
public void setValue(float newValue) {
// adjust value within range ?? spec says IllegalArgumentException
//newValue = Math.min(newValue, getMaximum());
@@ -861,13 +854,13 @@
}
} // class Gain
-
private final class Mute extends BooleanControl {
private Mute() {
super(BooleanControl.Type.MUTE, false, "True", "False");
}
+ @Override
public void setValue(boolean newValue) {
super.setValue(newValue);
calcVolume();
@@ -881,6 +874,7 @@
"", "Left", "Center", "Right");
}
+ @Override
public void setValue(float newValue) {
setValueImpl(newValue);
panControl.setValueImpl(newValue);
@@ -900,6 +894,7 @@
"", "Left", "Center", "Right");
}
+ @Override
public void setValue(float newValue) {
setValueImpl(newValue);
balanceControl.setValueImpl(newValue);
@@ -909,19 +904,14 @@
super.setValue(newValue);
}
} // class Pan
-
-
-
} // class DirectDL
-
/**
- * Private inner class representing a SourceDataLine
+ * Private inner class representing a SourceDataLine.
*/
private static final class DirectSDL extends DirectDL
implements SourceDataLine {
- // CONSTRUCTOR
private DirectSDL(DataLine.Info info,
AudioFormat format,
int bufferSize,
@@ -933,12 +923,11 @@
}
/**
- * Private inner class representing a TargetDataLine
+ * Private inner class representing a TargetDataLine.
*/
private static final class DirectTDL extends DirectDL
implements TargetDataLine {
- // CONSTRUCTOR
private DirectTDL(DataLine.Info info,
AudioFormat format,
int bufferSize,
@@ -947,8 +936,7 @@
if (Printer.trace) Printer.trace("DirectTDL CONSTRUCTOR: completed");
}
- // METHOD OVERRIDES
-
+ @Override
public int read(byte[] b, int off, int len) {
flushing = false;
if (len == 0) {
@@ -1030,7 +1018,6 @@
// auto closing clip support
private boolean autoclosing = false;
- // CONSTRUCTOR
private DirectClip(DataLine.Info info,
AudioFormat format,
int bufferSize,
@@ -1041,6 +1028,7 @@
// CLIP METHODS
+ @Override
public void open(AudioFormat format, byte[] data, int offset, int bufferSize)
throws LineUnavailableException {
@@ -1111,7 +1099,7 @@
if (Printer.trace) Printer.trace("< DirectClip.open completed");
}
-
+ @Override
public void open(AudioInputStream stream) throws LineUnavailableException, IOException {
// $$fb part of fix for 4679187: Clip.open() throws unexpected Exceptions
@@ -1178,17 +1166,17 @@
} // synchronized
}
-
+ @Override
public int getFrameLength() {
return m_lengthInFrames;
}
-
+ @Override
public long getMicrosecondLength() {
return Toolkit.frames2micros(getFormat(), getFrameLength());
}
-
+ @Override
public void setFramePosition(int frames) {
if (Printer.trace) Printer.trace("> DirectClip: setFramePosition: " + frames);
@@ -1229,6 +1217,7 @@
}
// replacement for getFramePosition (see AbstractDataLine)
+ @Override
public long getLongFramePosition() {
/* $$fb
* this would be intuitive, but the definition of getFramePosition
@@ -1243,7 +1232,7 @@
return super.getLongFramePosition();
}
-
+ @Override
public synchronized void setMicrosecondPosition(long microseconds) {
if (Printer.trace) Printer.trace("> DirectClip: setMicrosecondPosition: " + microseconds);
@@ -1253,6 +1242,7 @@
if (Printer.trace) Printer.trace("< DirectClip: setMicrosecondPosition succeeded");
}
+ @Override
public void setLoopPoints(int start, int end) {
if (Printer.trace) Printer.trace("> DirectClip: setLoopPoints: start: " + start + " end: " + end);
@@ -1283,7 +1273,7 @@
if (Printer.trace) Printer.trace("< DirectClip: setLoopPoints completed");
}
-
+ @Override
public void loop(int count) {
// note: when count reaches 0, it means that the entire clip
// will be played, i.e. it will play past the loop end point
@@ -1291,10 +1281,7 @@
start();
}
- // ABSTRACT METHOD IMPLEMENTATIONS
-
- // ABSTRACT LINE
-
+ @Override
void implOpen(AudioFormat format, int bufferSize) throws LineUnavailableException {
// only if audioData wasn't set in a calling open(format, byte[], frameSize)
// this call is allowed.
@@ -1304,6 +1291,7 @@
super.implOpen(format, bufferSize);
}
+ @Override
void implClose() {
if (Printer.trace) Printer.trace(">> DirectClip: implClose()");
@@ -1333,13 +1321,14 @@
if (Printer.trace) Printer.trace("<< DirectClip: implClose() succeeded");
}
-
+ @Override
void implStart() {
if (Printer.trace) Printer.trace("> DirectClip: implStart()");
super.implStart();
if (Printer.trace) Printer.trace("< DirectClip: implStart() succeeded");
}
+ @Override
void implStop() {
if (Printer.trace) Printer.trace(">> DirectClip: implStop()");
@@ -1351,8 +1340,8 @@
if (Printer.trace) Printer.trace("<< DirectClip: implStop() succeeded");
}
-
// main playback loop
+ @Override
public void run() {
if (Printer.trace) Printer.trace(">>> DirectClip: run() threadID="+Thread.currentThread().getId());
while (thread != null) {
@@ -1418,10 +1407,12 @@
MixerClip. They should be moved to a base class, together
with the instance variable 'autoclosing'. */
+ @Override
public boolean isAutoClosing() {
return autoclosing;
}
+ @Override
public void setAutoClosing(boolean value) {
if (value != autoclosing) {
if (isOpen()) {
@@ -1435,6 +1426,7 @@
}
}
+ @Override
protected boolean requiresServicing() {
// no need for servicing for Clips
return false;
@@ -1488,5 +1480,4 @@
private static native boolean nRequiresServicing(long id, boolean isSource);
// called in irregular intervals
private static native void nService(long id, boolean isSource);
-
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DirectAudioDeviceProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DirectAudioDeviceProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -28,7 +28,6 @@
import javax.sound.sampled.Mixer;
import javax.sound.sampled.spi.MixerProvider;
-
/**
* DirectAudioDevice provider.
*
@@ -36,8 +35,6 @@
*/
public final class DirectAudioDeviceProvider extends MixerProvider {
- // STATIC VARIABLES
-
/**
* Set of info objects for all port input devices on the system.
*/
@@ -48,18 +45,11 @@
*/
private static DirectAudioDevice[] devices;
-
- // STATIC
-
static {
// initialize
Platform.initialize();
}
-
- // CONSTRUCTOR
-
-
/**
* Required public no-arg constructor.
*/
@@ -92,6 +82,7 @@
}
}
+ @Override
public Mixer.Info[] getMixerInfo() {
synchronized (DirectAudioDeviceProvider.class) {
Mixer.Info[] localArray = new Mixer.Info[infos.length];
@@ -100,7 +91,7 @@
}
}
-
+ @Override
public Mixer getMixer(Mixer.Info info) {
synchronized (DirectAudioDeviceProvider.class) {
// if the default device is asked, we provide the mixer
@@ -125,7 +116,6 @@
String.format("Mixer %s not supported by this provider", info));
}
-
private static Mixer getDevice(DirectAudioDeviceInfo info) {
int index = info.getIndex();
if (devices[index] == null) {
@@ -134,9 +124,6 @@
return devices[index];
}
- // INNER CLASSES
-
-
/**
* Info class for DirectAudioDevices. Adds an index value and a string for
* making native references to a particular device.
@@ -171,7 +158,6 @@
}
} // class DirectAudioDeviceInfo
- // NATIVE METHODS
private static native int nGetNumDevices();
// index: [0..nGetNumDevices()-1]
private static native DirectAudioDeviceInfo nNewDirectAudioDeviceInfo(int deviceIndex);
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/EmergencySoundbank.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/EmergencySoundbank.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.Random;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/EventDispatcher.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/EventDispatcher.java Fri Aug 26 10:14:15 2016 -0700
@@ -35,8 +35,6 @@
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
-
-
/**
* EventDispatcher. Used by various classes in the Java Sound implementation
* to send events.
@@ -49,39 +47,35 @@
/**
* time of inactivity until the auto closing clips
- * are closed
+ * are closed.
*/
private static final int AUTO_CLOSE_TIME = 5000;
-
/**
- * List of events
+ * List of events.
*/
private final ArrayList<EventInfo> eventQueue = new ArrayList<>();
-
/**
- * Thread object for this EventDispatcher instance
+ * Thread object for this EventDispatcher instance.
*/
private Thread thread = null;
-
/*
* support for auto-closing Clips
*/
- private final ArrayList<ClipInfo> autoClosingClips = new ArrayList<ClipInfo>();
+ private final ArrayList<ClipInfo> autoClosingClips = new ArrayList<>();
/*
* support for monitoring data lines
*/
- private final ArrayList<LineMonitor> lineMonitors = new ArrayList<LineMonitor>();
+ private final ArrayList<LineMonitor> lineMonitors = new ArrayList<>();
/**
* Approximate interval between calls to LineMonitor.checkLine
*/
static final int LINE_MONITOR_TIME = 400;
-
/**
* This start() method starts an event thread if one is not already active.
*/
@@ -96,7 +90,6 @@
}
}
-
/**
* Invoked when there is at least one event in the queue.
* Implement this as a callback to process one event.
@@ -153,7 +146,6 @@
Printer.err("Unknown event type: " + eventInfo.getEvent());
}
-
/**
* Wait until there is something in the event queue to process. Then
* dispatch the event to the listeners.The entire method does not
@@ -202,7 +194,6 @@
}
}
-
/**
* Queue the given event in the event queue.
*/
@@ -211,10 +202,10 @@
notifyAll();
}
-
/**
* A loop to dispatch events.
*/
+ @Override
public void run() {
while (true) {
@@ -226,7 +217,6 @@
}
}
-
/**
* Send audio and MIDI events.
*/
@@ -243,7 +233,6 @@
postEvent(eventInfo);
}
-
/*
* go through the list of registered auto-closing
* Clip instances and close them, if appropriate
@@ -291,7 +280,7 @@
}
/**
- * called from auto-closing clips when one of their open() method is called
+ * called from auto-closing clips when one of their open() method is called.
*/
void autoClosingClipOpened(AutoClosingClip clip) {
if (Printer.debug)Printer.debug("> EventDispatcher.autoClosingClipOpened ");
@@ -316,7 +305,7 @@
}
/**
- * called from auto-closing clips when their closed() method is called
+ * called from auto-closing clips when their closed() method is called.
*/
void autoClosingClipClosed(AutoClosingClip clip) {
// nothing to do -- is removed from arraylist above
@@ -340,9 +329,8 @@
if (Printer.debug)Printer.debug("< EventDispatcher.monitorLines("+lineMonitors.size()+" monitors)");
}
-
/**
- * Add this LineMonitor instance to the list of monitors
+ * Add this LineMonitor instance to the list of monitors.
*/
void addLineMonitor(LineMonitor lm) {
if (Printer.trace)Printer.trace("> EventDispatcher.addLineMonitor("+lm+")");
@@ -362,7 +350,7 @@
}
/**
- * Remove this LineMonitor instance from the list of monitors
+ * Remove this LineMonitor instance from the list of monitors.
*/
void removeLineMonitor(LineMonitor lm) {
if (Printer.trace)Printer.trace("> EventDispatcher.removeLineMonitor("+lm+")");
@@ -377,8 +365,6 @@
if (Printer.debug)Printer.debug("< EventDispatcher.removeLineMonitor finished -- now ("+lineMonitors.size()+" monitors)");
}
- // /////////////////////////////////// INNER CLASSES ////////////////////////////////////////// //
-
/**
* Container for an event and a set of listeners to deliver it to.
*/
@@ -413,7 +399,7 @@
/**
- * Container for a clip with its expiration time
+ * Container for a clip with its expiration time.
*/
private class ClipInfo {
@@ -421,7 +407,7 @@
private final long expiration;
/**
- * Create a new instance of this clip Info class
+ * Create a new instance of this clip Info class.
*/
ClipInfo(AutoClosingClip clip) {
this.clip = clip;
@@ -440,13 +426,13 @@
/**
* Interface that a class that wants to get regular
- * line monitor events implements
+ * line monitor events implements.
*/
interface LineMonitor {
/**
- * Called by event dispatcher in regular intervals
+ * Called by event dispatcher in regular intervals.
*/
- public void checkLine();
+ void checkLine();
}
} // class EventDispatcher
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/FFT.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/FFT.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
@@ -588,7 +589,6 @@
i += jmax << 1;
}
-
}
// Perform Factor-4 Decomposition with 3 * complex operators and 8 +/-
@@ -682,7 +682,6 @@
i += jmax << 1;
}
-
}
private void bitreversal(double[] data) {
@@ -743,6 +742,5 @@
data[n] = data[m];
data[m] = tempi;
}
-
}
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/FastShortMessage.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/FastShortMessage.java Fri Aug 26 10:14:15 2016 -0700
@@ -25,10 +25,11 @@
package com.sun.media.sound;
-import javax.sound.midi.*;
+import javax.sound.midi.InvalidMidiDataException;
+import javax.sound.midi.ShortMessage;
/**
- * an optimized ShortMessage that does not need an array
+ * an optimized ShortMessage that does not need an array.
*
* @author Florian Bomers
*/
@@ -51,6 +52,7 @@
return packedMsg;
}
+ @Override
public byte[] getMessage() {
int length = 0;
try {
@@ -73,6 +75,7 @@
return returnedArray;
}
+ @Override
public int getLength() {
try {
return getDataLength(packedMsg & 0xFF) + 1;
@@ -82,6 +85,7 @@
return 0;
}
+ @Override
public void setMessage(int status) throws InvalidMidiDataException {
// check for valid values
int dataLength = getDataLength(status); // can throw InvalidMidiDataException
@@ -91,35 +95,39 @@
packedMsg = (packedMsg & 0xFFFF00) | (status & 0xFF);
}
-
+ @Override
public void setMessage(int status, int data1, int data2) throws InvalidMidiDataException {
getDataLength(status); // can throw InvalidMidiDataException
packedMsg = (status & 0xFF) | ((data1 & 0xFF) << 8) | ((data2 & 0xFF) << 16);
}
-
+ @Override
public void setMessage(int command, int channel, int data1, int data2) throws InvalidMidiDataException {
getDataLength(command); // can throw InvalidMidiDataException
packedMsg = (command & 0xF0) | (channel & 0x0F) | ((data1 & 0xFF) << 8) | ((data2 & 0xFF) << 16);
}
-
+ @Override
public int getChannel() {
return packedMsg & 0x0F;
}
+ @Override
public int getCommand() {
return packedMsg & 0xF0;
}
+ @Override
public int getData1() {
return (packedMsg & 0xFF00) >> 8;
}
+ @Override
public int getData2() {
return (packedMsg & 0xFF0000) >> 16;
}
+ @Override
public int getStatus() {
return packedMsg & 0xFF;
}
@@ -129,6 +137,7 @@
* as this object.
* @return a clone of this instance.
*/
+ @Override
public Object clone() {
try {
return new FastShortMessage(packedMsg);
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/FastSysexMessage.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/FastSysexMessage.java Fri Aug 26 10:14:15 2016 -0700
@@ -25,10 +25,11 @@
package com.sun.media.sound;
-import javax.sound.midi.*;
+import javax.sound.midi.InvalidMidiDataException;
+import javax.sound.midi.SysexMessage;
/**
- * optimized FastSysexMessage that doesn't copy the array upon instantiation
+ * optimized FastSysexMessage that doesn't copy the array upon instantiation.
*
* @author Florian Bomers
*/
@@ -51,6 +52,7 @@
// overwrite this method so that the original data array,
// which is shared among all transmitters, cannot be modified
+ @Override
public void setMessage(byte[] data, int length) throws InvalidMidiDataException {
if ((data.length == 0) || (((data[0] & 0xFF) != 0xF0) && ((data[0] & 0xFF) != 0xF7))) {
super.setMessage(data, data.length); // will throw Exception
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/InvalidDataException.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/InvalidDataException.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.IOException;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/InvalidFormatException.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/InvalidFormatException.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/JARSoundbankReader.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/JARSoundbankReader.java Fri Aug 26 10:14:15 2016 -0700
@@ -69,11 +69,12 @@
return ok;
}
+ @Override
public Soundbank getSoundbank(URL url)
throws InvalidMidiDataException, IOException {
if (!isZIP(url))
return null;
- ArrayList<Soundbank> soundbanks = new ArrayList<Soundbank>();
+ ArrayList<Soundbank> soundbanks = new ArrayList<>();
URLClassLoader ucl = URLClassLoader.newInstance(new URL[]{url});
InputStream stream = ucl.getResourceAsStream(
"META-INF/services/javax.sound.midi.Soundbank");
@@ -114,12 +115,14 @@
return sbk;
}
+ @Override
public Soundbank getSoundbank(InputStream stream)
throws InvalidMidiDataException, IOException {
Objects.requireNonNull(stream);
return null;
}
+ @Override
public Soundbank getSoundbank(File file)
throws InvalidMidiDataException, IOException {
return getSoundbank(file.toURI().toURL());
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/JDK13Services.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/JDK13Services.java Fri Aug 26 10:14:15 2016 -0700
@@ -136,7 +136,6 @@
return value;
}
-
/** Obtain the instance name part of a default provider property.
@param typeClass The type of the default provider property. This
should be one of Receiver.class, Transmitter.class, Sequencer.class,
@@ -158,7 +157,6 @@
return value;
}
-
/** Obtain the value of a default provider property.
@param typeClass The type of the default provider property. This
should be one of Receiver.class, Transmitter.class, Sequencer.class,
@@ -190,7 +188,6 @@
return value;
}
-
/** Obtain a properties bundle containing property values from the
properties file. If the properties file could not be loaded,
the properties bundle is empty.
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/JSSecurityManager.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/JSSecurityManager.java Fri Aug 26 10:14:15 2016 -0700
@@ -26,19 +26,17 @@
package com.sun.media.sound;
import java.io.BufferedInputStream;
-import java.io.InputStream;
import java.io.File;
import java.io.FileInputStream;
-
+import java.io.InputStream;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.ServiceLoader;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
import javax.sound.sampled.AudioPermission;
/** Managing security in the Java Sound implementation.
@@ -64,7 +62,6 @@
return (System.getSecurityManager() != null);
}
-
static void checkRecordPermission() throws SecurityException {
if(Printer.trace) Printer.trace("JSSecurityManager.checkRecordPermission()");
SecurityManager sm = System.getSecurityManager();
@@ -90,6 +87,7 @@
try {
// invoke the privileged action using 1.2 security
PrivilegedAction<Void> action = new PrivilegedAction<Void>() {
+ @Override
public Void run() {
loadPropertiesImpl(properties, filename);
return null;
@@ -108,7 +106,6 @@
}
}
-
private static void loadPropertiesImpl(Properties properties,
String filename) {
if(Printer.trace)Printer.trace(">> JSSecurityManager: loadPropertiesImpl()");
@@ -176,6 +173,7 @@
// the iterator's hasNext() method looks through classpath for
// the provider class names, so it requires read permissions
PrivilegedAction<Boolean> hasNextAction = new PrivilegedAction<Boolean>() {
+ @Override
public Boolean run() {
return ps.hasNext();
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/JavaSoundAudioClip.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/JavaSoundAudioClip.java Fri Aug 26 10:14:15 2016 -0700
@@ -25,38 +25,36 @@
package com.sun.media.sound;
+import java.applet.AudioClip;
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.io.BufferedInputStream;
-import java.io.ByteArrayOutputStream;
-import java.applet.AudioClip;
+import javax.sound.midi.InvalidMidiDataException;
+import javax.sound.midi.MetaEventListener;
+import javax.sound.midi.MetaMessage;
+import javax.sound.midi.MidiFileFormat;
+import javax.sound.midi.MidiSystem;
+import javax.sound.midi.MidiUnavailableException;
+import javax.sound.midi.Sequence;
+import javax.sound.midi.Sequencer;
+import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
-import javax.sound.sampled.AudioInputStream;
-import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.DataLine;
-import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
+import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
-import javax.sound.midi.MidiSystem;
-import javax.sound.midi.MidiFileFormat;
-import javax.sound.midi.MetaMessage;
-import javax.sound.midi.Sequence;
-import javax.sound.midi.Sequencer;
-import javax.sound.midi.InvalidMidiDataException;
-import javax.sound.midi.MidiUnavailableException;
-import javax.sound.midi.MetaEventListener;
-
/**
* Java Sound audio clip;
*
* @author Arthur van Hoff, Kara Kytle, Jan Borgersen
* @author Florian Bomers
*/
-
public final class JavaSoundAudioClip implements AudioClip, MetaEventListener, LineListener {
private static final boolean DEBUG = false;
@@ -126,12 +124,12 @@
}
}
-
+ @Override
public synchronized void play() {
startImpl(false);
}
-
+ @Override
public synchronized void loop() {
startImpl(true);
}
@@ -205,6 +203,7 @@
}
}
+ @Override
public synchronized void stop() {
if (DEBUG || Printer.debug)Printer.debug("JavaSoundAudioClip->stop()");
@@ -248,13 +247,15 @@
// Event handlers (for debugging)
+ @Override
public synchronized void update(LineEvent event) {
if (DEBUG || Printer.debug) Printer.debug("line event received: "+event);
}
// handle MIDI track end meta events for looping
- public synchronized void meta( MetaMessage message ) {
+ @Override
+ public synchronized void meta(MetaMessage message) {
if (DEBUG || Printer.debug)Printer.debug("META EVENT RECEIVED!!!!! ");
@@ -269,12 +270,12 @@
}
}
-
+ @Override
public String toString() {
return getClass().toString();
}
-
+ @Override
protected void finalize() {
if (clip != null) {
@@ -326,8 +327,6 @@
return true;
}
-
-
private void readStream(AudioInputStream as, long byteLen) throws IOException {
// arrays "only" max. 2GB
int intLen;
@@ -371,7 +370,6 @@
loadedAudioByteLength = totalBytesRead;
}
-
// METHODS FOR CREATING THE DEVICE
private boolean createClip() {
@@ -464,7 +462,6 @@
return true;
}
-
/*
* private inner class representing a ByteArrayOutputStream
* which allows retrieval of the internal array
@@ -479,5 +476,4 @@
}
} // class DirectBAOS
-
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiDeviceReceiverEnvelope.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiDeviceReceiverEnvelope.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,10 +22,13 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
-import javax.sound.midi.*;
-
+import javax.sound.midi.MidiDevice;
+import javax.sound.midi.MidiDeviceReceiver;
+import javax.sound.midi.MidiMessage;
+import javax.sound.midi.Receiver;
/**
* Helper class which allows to convert {@code Receiver}
@@ -55,15 +58,18 @@
}
// Receiver implementation
+ @Override
public void close() {
receiver.close();
}
+ @Override
public void send(MidiMessage message, long timeStamp) {
receiver.send(message, timeStamp);
}
// MidiDeviceReceiver implementation
+ @Override
public MidiDevice getMidiDevice() {
return device;
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiDeviceTransmitterEnvelope.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiDeviceTransmitterEnvelope.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,10 +22,13 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
-import javax.sound.midi.*;
-
+import javax.sound.midi.MidiDevice;
+import javax.sound.midi.MidiDeviceTransmitter;
+import javax.sound.midi.Receiver;
+import javax.sound.midi.Transmitter;
/**
* Helper class which allows to convert {@code Transmitter}
@@ -55,20 +58,23 @@
}
// Transmitter implementation
+ @Override
public void setReceiver(Receiver receiver) {
transmitter.setReceiver(receiver);
}
+ @Override
public Receiver getReceiver() {
return transmitter.getReceiver();
}
+ @Override
public void close() {
transmitter.close();
}
-
// MidiDeviceReceiver implementation
+ @Override
public MidiDevice getMidiDevice() {
return device;
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiInDevice.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiInDevice.java Fri Aug 26 10:14:15 2016 -0700
@@ -25,9 +25,8 @@
package com.sun.media.sound;
-import javax.sound.midi.*;
-
-
+import javax.sound.midi.MidiUnavailableException;
+import javax.sound.midi.Transmitter;
/**
* MidiInDevice class representing functionality of MidiIn devices.
@@ -40,18 +39,14 @@
private volatile Thread midiInThread;
- // CONSTRUCTOR
-
MidiInDevice(AbstractMidiDeviceProvider.Info info) {
super(info);
if(Printer.trace) Printer.trace("MidiInDevice CONSTRUCTOR");
}
-
- // IMPLEMENTATION OF ABSTRACT MIDI DEVICE METHODS
-
// $$kk: 06.24.99: i have this both opening and starting the midi in device.
// may want to separate these??
+ @Override
protected synchronized void implOpen() throws MidiUnavailableException {
if (Printer.trace) Printer.trace("> MidiInDevice: implOpen()");
@@ -75,9 +70,9 @@
if (Printer.trace) Printer.trace("< MidiInDevice: implOpen() completed");
}
-
// $$kk: 06.24.99: i have this both stopping and closing the midi in device.
// may want to separate these??
+ @Override
protected synchronized void implClose() {
if (Printer.trace) Printer.trace("> MidiInDevice: implClose()");
long oldId = id;
@@ -98,7 +93,7 @@
if (Printer.trace) Printer.trace("< MidiInDevice: implClose() completed");
}
-
+ @Override
public long getMicrosecondPosition() {
long timestamp = -1;
if (isOpen()) {
@@ -107,22 +102,21 @@
return timestamp;
}
-
// OVERRIDES OF ABSTRACT MIDI DEVICE METHODS
-
+ @Override
protected boolean hasTransmitters() {
return true;
}
-
+ @Override
protected Transmitter createTransmitter() {
return new MidiInTransmitter();
}
/**
* An own class to distinguish the class name from
- * the transmitter of other devices
+ * the transmitter of other devices.
*/
private final class MidiInTransmitter extends BasicTransmitter {
private MidiInTransmitter() {
@@ -130,8 +124,7 @@
}
}
- // RUNNABLE METHOD
-
+ @Override
public void run() {
// while the device is started, keep trying to get messages.
// this thread returns from native code whenever stop() or close() is called
@@ -149,9 +142,6 @@
midiInThread = null;
}
-
- // CALLBACKS FROM NATIVE
-
/**
* Callback from native code when a short MIDI event is received from hardware.
* @param packedMsg: status | data1 << 8 | data2 << 8
@@ -179,8 +169,6 @@
getTransmitterList().sendMessage(data, timeStamp);
}
- // NATIVE METHODS
-
private native long nOpen(int index) throws MidiUnavailableException;
private native void nClose(long id);
@@ -190,6 +178,4 @@
// go into native code and get messages. May be blocking
private native void nGetMessages(long id);
-
-
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiInDeviceProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiInDeviceProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -27,7 +27,6 @@
import javax.sound.midi.MidiDevice;
-
/**
* MIDI input device provider.
*
@@ -44,16 +43,12 @@
private static final boolean enabled;
- // STATIC
-
static {
// initialize
Platform.initialize();
enabled = Platform.isMidiIOEnabled();
}
- // CONSTRUCTOR
-
/**
* Required public no-arg constructor.
*/
@@ -63,6 +58,7 @@
// implementation of abstract methods in AbstractMidiDeviceProvider
+ @Override
AbstractMidiDeviceProvider.Info createInfo(int index) {
if (!enabled) {
return null;
@@ -70,6 +66,7 @@
return new MidiInDeviceInfo(index, MidiInDeviceProvider.class);
}
+ @Override
MidiDevice createDevice(AbstractMidiDeviceProvider.Info info) {
if (enabled && (info instanceof MidiInDeviceInfo)) {
return new MidiInDevice(info);
@@ -77,6 +74,7 @@
return null;
}
+ @Override
int getNumDevices() {
if (!enabled) {
if (Printer.debug)Printer.debug("MidiInDevice not enabled, returning 0 devices");
@@ -87,14 +85,15 @@
return numDevices;
}
+ @Override
MidiDevice[] getDeviceCache() { return devices; }
+ @Override
void setDeviceCache(MidiDevice[] devices) { MidiInDeviceProvider.devices = devices; }
+ @Override
Info[] getInfoCache() { return infos; }
+ @Override
void setInfoCache(Info[] infos) { MidiInDeviceProvider.infos = infos; }
-
- // INNER CLASSES
-
/**
* Info class for MidiInDevices. Adds the
* provider's Class to keep the provider class from being
@@ -115,9 +114,6 @@
} // class MidiInDeviceInfo
-
- // NATIVE METHODS
-
private static native int nGetNumDevices();
private static native String nGetName(int index);
private static native String nGetVendor(int index);
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiOutDevice.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiOutDevice.java Fri Aug 26 10:14:15 2016 -0700
@@ -25,9 +25,10 @@
package com.sun.media.sound;
-import javax.sound.midi.*;
-
-
+import javax.sound.midi.MidiMessage;
+import javax.sound.midi.MidiUnavailableException;
+import javax.sound.midi.Receiver;
+import javax.sound.midi.ShortMessage;
/**
* MidiOutDevice class representing functionality of MidiOut devices.
@@ -38,16 +39,12 @@
*/
final class MidiOutDevice extends AbstractMidiDevice {
- // CONSTRUCTOR
-
MidiOutDevice(AbstractMidiDeviceProvider.Info info) {
super(info);
if(Printer.trace) Printer.trace("MidiOutDevice CONSTRUCTOR");
}
-
- // IMPLEMENTATION OF ABSTRACT MIDI DEVICE METHODS
-
+ @Override
protected synchronized void implOpen() throws MidiUnavailableException {
if (Printer.trace) Printer.trace("> MidiOutDevice: implOpen()");
int index = ((AbstractMidiDeviceProvider.Info)getDeviceInfo()).getIndex();
@@ -58,7 +55,7 @@
if (Printer.trace) Printer.trace("< MidiOutDevice: implOpen(): completed.");
}
-
+ @Override
protected synchronized void implClose() {
if (Printer.trace) Printer.trace("> MidiOutDevice: implClose()");
// prevent further action
@@ -72,7 +69,7 @@
if (Printer.trace) Printer.trace("< MidiOutDevice: implClose(): completed");
}
-
+ @Override
public long getMicrosecondPosition() {
long timestamp = -1;
if (isOpen()) {
@@ -81,28 +78,23 @@
return timestamp;
}
-
-
- // OVERRIDES OF ABSTRACT MIDI DEVICE METHODS
-
/** Returns if this device supports Receivers.
This implementation always returns true.
@return true, if the device supports Receivers, false otherwise.
*/
+ @Override
protected boolean hasReceivers() {
return true;
}
-
+ @Override
protected Receiver createReceiver() {
return new MidiOutReceiver();
}
-
- // INNER CLASSES
-
final class MidiOutReceiver extends AbstractReceiver {
+ @Override
void implSend(final MidiMessage message, final long timeStamp) {
final int length = message.getLength();
final int status = message.getStatus();
@@ -159,13 +151,8 @@
nSendShortMessage(id, packedMsg, timeStamp);
}
}
-
-
} // class MidiOutReceiver
-
- // NATIVE METHODS
-
private native long nOpen(int index) throws MidiUnavailableException;
private native void nClose(long id);
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiOutDeviceProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiOutDeviceProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -27,7 +27,6 @@
import javax.sound.midi.MidiDevice;
-
/**
* MIDI output device provider.
*
@@ -44,16 +43,12 @@
private static final boolean enabled;
- // STATIC
-
static {
// initialize
Platform.initialize();
enabled = Platform.isMidiIOEnabled();
}
- // CONSTRUCTOR
-
/**
* Required public no-arg constructor.
*/
@@ -61,8 +56,7 @@
if (Printer.trace) Printer.trace("MidiOutDeviceProvider: constructor");
}
- // implementation of abstract methods in AbstractMidiDeviceProvider
-
+ @Override
AbstractMidiDeviceProvider.Info createInfo(int index) {
if (!enabled) {
return null;
@@ -70,6 +64,7 @@
return new MidiOutDeviceInfo(index, MidiOutDeviceProvider.class);
}
+ @Override
MidiDevice createDevice(AbstractMidiDeviceProvider.Info info) {
if (enabled && (info instanceof MidiOutDeviceInfo)) {
return new MidiOutDevice(info);
@@ -77,6 +72,7 @@
return null;
}
+ @Override
int getNumDevices() {
if (!enabled) {
if (Printer.debug)Printer.debug("MidiOutDevice not enabled, returning 0 devices");
@@ -85,14 +81,15 @@
return nGetNumDevices();
}
+ @Override
MidiDevice[] getDeviceCache() { return devices; }
+ @Override
void setDeviceCache(MidiDevice[] devices) { MidiOutDeviceProvider.devices = devices; }
+ @Override
Info[] getInfoCache() { return infos; }
+ @Override
void setInfoCache(Info[] infos) { MidiOutDeviceProvider.infos = infos; }
-
- // INNER CLASSES
-
/**
* Info class for MidiOutDevices. Adds the
* provider's Class to keep the provider class from being
@@ -113,9 +110,6 @@
} // class MidiOutDeviceInfo
-
- // NATIVE METHODS
-
private static native int nGetNumDevices();
private static native String nGetName(int index);
private static native String nGetVendor(int index);
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiUtils.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiUtils.java Fri Aug 26 10:14:15 2016 -0700
@@ -77,7 +77,6 @@
return ((msg[1] & 0xFF) == META_END_OF_TRACK_TYPE) && (msg[2] == 0);
}
-
/** return if the given message is a meta tempo message */
public static boolean isMetaTempo(MidiMessage midiMsg) {
// first check if it is a META message at all
@@ -91,7 +90,6 @@
return ((msg[1] & 0xFF) == META_TEMPO_TYPE) && (msg[2] == 3);
}
-
/** parses this message for a META tempo message and returns
* the tempo in MPQ, or -1 if this isn't a tempo message
*/
@@ -111,7 +109,6 @@
return tempo;
}
-
/**
* converts<br>
* 1 - MPQ-Tempo to BPM tempo<br>
@@ -124,7 +121,6 @@
return ((double) 60000000l) / tempo;
}
-
/**
* convert tick to microsecond with given tempo.
* Does not take tempo changes into account.
@@ -145,7 +141,6 @@
return (long) ((((double)us) * resolution) / tempoMPQ);
}
-
/**
* Given a tick, convert to microsecond
* @param cache tempo info and current tempo
@@ -246,7 +241,6 @@
return tick;
}
-
/**
* Binary search for the event indexes of the track
*
@@ -283,7 +277,6 @@
return ret;
}
-
public static final class TempoCache {
long[] ticks;
int[] tempos; // in MPQ
@@ -310,7 +303,6 @@
refresh(seq);
}
-
public synchronized void refresh(Sequence seq) {
ArrayList<MidiEvent> list = new ArrayList<>();
Track[] tracks = seq.getTracks();
@@ -373,6 +365,5 @@
}
return tempos[tempos.length - 1];
}
-
}
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelAbstractChannelMixer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelAbstractChannelMixer.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
@@ -32,95 +33,123 @@
*/
public abstract class ModelAbstractChannelMixer implements ModelChannelMixer {
+ @Override
public abstract boolean process(float[][] buffer, int offset, int len);
+ @Override
public abstract void stop();
+ @Override
public void allNotesOff() {
}
+ @Override
public void allSoundOff() {
}
+ @Override
public void controlChange(int controller, int value) {
}
+ @Override
public int getChannelPressure() {
return 0;
}
+ @Override
public int getController(int controller) {
return 0;
}
+ @Override
public boolean getMono() {
return false;
}
+ @Override
public boolean getMute() {
return false;
}
+ @Override
public boolean getOmni() {
return false;
}
+ @Override
public int getPitchBend() {
return 0;
}
+ @Override
public int getPolyPressure(int noteNumber) {
return 0;
}
+ @Override
public int getProgram() {
return 0;
}
+ @Override
public boolean getSolo() {
return false;
}
+ @Override
public boolean localControl(boolean on) {
return false;
}
+ @Override
public void noteOff(int noteNumber) {
}
+ @Override
public void noteOff(int noteNumber, int velocity) {
}
+ @Override
public void noteOn(int noteNumber, int velocity) {
}
+ @Override
public void programChange(int program) {
}
+ @Override
public void programChange(int bank, int program) {
}
+ @Override
public void resetAllControllers() {
}
+ @Override
public void setChannelPressure(int pressure) {
}
+ @Override
public void setMono(boolean on) {
}
+ @Override
public void setMute(boolean mute) {
}
+ @Override
public void setOmni(boolean on) {
}
+ @Override
public void setPitchBend(int bend) {
}
+ @Override
public void setPolyPressure(int noteNumber, int pressure) {
}
+ @Override
public void setSolo(boolean soloState) {
}
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelAbstractOscillator.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelAbstractOscillator.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,9 +22,11 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.IOException;
+
import javax.sound.midi.Instrument;
import javax.sound.midi.MidiChannel;
import javax.sound.midi.Patch;
@@ -51,15 +53,18 @@
public void init() {
}
+ @Override
public void close() throws IOException {
}
+ @Override
public void noteOff(int velocity) {
on = false;
}
+ @Override
public void noteOn(MidiChannel channel, VoiceStatus voice, int noteNumber,
- int velocity) {
+ int velocity) {
this.channel = channel;
this.voice = voice;
this.noteNumber = noteNumber;
@@ -67,6 +72,7 @@
on = true;
}
+ @Override
public int read(float[][] buffer, int offset, int len) throws IOException {
return -1;
}
@@ -91,6 +97,7 @@
return on;
}
+ @Override
public void setPitch(float pitch) {
this.pitch = pitch;
}
@@ -107,14 +114,17 @@
return samplerate;
}
+ @Override
public float getAttenuation() {
return 0;
}
+ @Override
public int getChannels() {
return 1;
}
+ @Override
public String getName() {
return getClass().getName();
}
@@ -123,6 +133,7 @@
return new Patch(0, 0);
}
+ @Override
public ModelOscillatorStream open(float samplerate) {
ModelAbstractOscillator oscs;
try {
@@ -162,10 +173,12 @@
return sbk;
}
+ @Override
public String getDescription() {
return getName();
}
+ @Override
public Instrument getInstrument(Patch patch) {
Instrument ins = getInstrument();
Patch p = ins.getPatch();
@@ -182,18 +195,22 @@
return ins;
}
+ @Override
public Instrument[] getInstruments() {
return new Instrument[]{getInstrument()};
}
+ @Override
public SoundbankResource[] getResources() {
return new SoundbankResource[0];
}
+ @Override
public String getVendor() {
return null;
}
+ @Override
public String getVersion() {
return null;
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelByteBuffer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelByteBuffer.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.ByteArrayInputStream;
@@ -60,12 +61,14 @@
left = capacity();
}
+ @Override
public int available() throws IOException {
if (left > Integer.MAX_VALUE)
return Integer.MAX_VALUE;
return (int)left;
}
+ @Override
public synchronized void mark(int readlimit) {
try {
mark = raf.getFilePointer();
@@ -75,15 +78,18 @@
}
}
+ @Override
public boolean markSupported() {
return true;
}
+ @Override
public synchronized void reset() throws IOException {
raf.seek(mark);
left = markleft;
}
+ @Override
public long skip(long n) throws IOException {
if( n < 0)
return 0;
@@ -95,6 +101,7 @@
return n;
}
+ @Override
public int read(byte b[], int off, int len) throws IOException {
if (len > left)
len = (int)left;
@@ -107,6 +114,7 @@
return len;
}
+ @Override
public int read(byte[] b) throws IOException {
int len = b.length;
if (len > left)
@@ -120,6 +128,7 @@
return len;
}
+ @Override
public int read() throws IOException {
if (left == 0)
return -1;
@@ -130,6 +139,7 @@
return b;
}
+ @Override
public void close() throws IOException {
raf.close();
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelByteBufferWavetable.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelByteBufferWavetable.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,14 +22,16 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.IOException;
import java.io.InputStream;
+
import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioFormat.Encoding;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
-import javax.sound.sampled.AudioFormat.Encoding;
/**
* Wavetable oscillator for pre-loaded data.
@@ -52,6 +54,7 @@
bigendian = format.isBigEndian();
}
+ @Override
public int read(byte[] b, int off, int len) throws IOException {
int avail = available();
if (avail <= 0)
@@ -82,6 +85,7 @@
return len;
}
+ @Override
public long skip(long n) throws IOException {
int avail = available();
if (avail <= 0)
@@ -93,10 +97,12 @@
return super.skip(n);
}
+ @Override
public int read(byte[] b) throws IOException {
return read(b, 0, b.length);
}
+ @Override
public int read() throws IOException {
byte[] b = new byte[1];
int ret = read(b, 0, 1);
@@ -105,19 +111,23 @@
return 0 & 0xFF;
}
+ @Override
public boolean markSupported() {
return true;
}
+ @Override
public int available() throws IOException {
return (int)buffer.capacity() + (int)buffer8.capacity() - pos - pos2;
}
+ @Override
public synchronized void mark(int readlimit) {
markpos = pos;
markpos2 = pos2;
}
+ @Override
public synchronized void reset() throws IOException {
pos = markpos;
pos2 = markpos2;
@@ -189,6 +199,7 @@
return format;
}
+ @Override
public AudioFloatInputStream openStream() {
if (buffer == null)
return null;
@@ -230,16 +241,19 @@
(int)buffer.arrayOffset(), (int)buffer.capacity());
}
+ @Override
public int getChannels() {
return getFormat().getChannels();
}
+ @Override
public ModelOscillatorStream open(float samplerate) {
// ModelWavetableOscillator doesn't support ModelOscillatorStream
return null;
}
// attenuation is in cB
+ @Override
public float getAttenuation() {
return attenuation;
}
@@ -248,6 +262,7 @@
this.attenuation = attenuation;
}
+ @Override
public float getLoopLength() {
return loopLength;
}
@@ -256,6 +271,7 @@
this.loopLength = loopLength;
}
+ @Override
public float getLoopStart() {
return loopStart;
}
@@ -268,10 +284,12 @@
this.loopType = loopType;
}
+ @Override
public int getLoopType() {
return loopType;
}
+ @Override
public float getPitchcorrection() {
return pitchcorrection;
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelChannelMixer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelChannelMixer.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import javax.sound.midi.MidiChannel;
@@ -42,9 +43,9 @@
public interface ModelChannelMixer extends MidiChannel {
// Used to process input audio from voices mix.
- public boolean process(float[][] buffer, int offset, int len);
+ boolean process(float[][] buffer, int offset, int len);
// Is used to trigger that this mixer is not be used
// and it should fade out.
- public void stop();
+ void stop();
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelConnectionBlock.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelConnectionBlock.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.Arrays;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelDestination.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelDestination.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelDirectedPlayer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelDirectedPlayer.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
@@ -32,5 +33,5 @@
*/
public interface ModelDirectedPlayer {
- public void play(int performerIndex, ModelConnectionBlock[] connectionBlocks);
+ void play(int performerIndex, ModelConnectionBlock[] connectionBlocks);
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelDirector.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelDirector.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
@@ -38,9 +39,9 @@
*/
public interface ModelDirector {
- public void noteOn(int noteNumber, int velocity);
+ void noteOn(int noteNumber, int velocity);
- public void noteOff(int noteNumber, int velocity);
+ void noteOff(int noteNumber, int velocity);
- public void close();
+ void close();
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelIdentifier.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelIdentifier.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
@@ -134,6 +135,7 @@
this.variable = variable;
}
+ @Override
public int hashCode() {
int hashcode = instance;
if(object != null) hashcode |= object.hashCode();
@@ -141,6 +143,7 @@
return hashcode;
}
+ @Override
public boolean equals(Object obj) {
if (!(obj instanceof ModelIdentifier))
return false;
@@ -159,6 +162,7 @@
return true;
}
+ @Override
public String toString() {
if (variable == null) {
return object + "[" + instance + "]";
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelInstrument.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelInstrument.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import javax.sound.midi.Instrument;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelInstrumentComparator.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelInstrumentComparator.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,9 +22,11 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.Comparator;
+
import javax.sound.midi.Instrument;
import javax.sound.midi.Patch;
@@ -36,6 +38,7 @@
*/
public final class ModelInstrumentComparator implements Comparator<Instrument> {
+ @Override
public int compare(Instrument arg0, Instrument arg1) {
Patch p0 = arg0.getPatch();
Patch p1 = arg1.getPatch();
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelMappedInstrument.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelMappedInstrument.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import javax.sound.midi.MidiChannel;
@@ -42,21 +43,25 @@
this.ins = ins;
}
+ @Override
public Object getData() {
return ins.getData();
}
+ @Override
public ModelPerformer[] getPerformers() {
return ins.getPerformers();
}
+ @Override
public ModelDirector getDirector(ModelPerformer[] performers,
- MidiChannel channel, ModelDirectedPlayer player) {
+ MidiChannel channel, ModelDirectedPlayer player) {
return ins.getDirector(performers, channel, player);
}
+ @Override
public ModelChannelMixer getChannelMixer(MidiChannel channel,
- AudioFormat format) {
+ AudioFormat format) {
return ins.getChannelMixer(channel, format);
}
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelOscillator.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelOscillator.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
@@ -32,13 +33,13 @@
*/
public interface ModelOscillator {
- public int getChannels();
+ int getChannels();
/**
* Attenuation is in cB.
* @return
*/
- public float getAttenuation();
+ float getAttenuation();
- public ModelOscillatorStream open(float samplerate);
+ ModelOscillatorStream open(float samplerate);
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelOscillatorStream.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelOscillatorStream.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,9 +22,11 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.IOException;
+
import javax.sound.midi.MidiChannel;
import javax.sound.midi.VoiceStatus;
@@ -35,14 +37,14 @@
*/
public interface ModelOscillatorStream {
- public void setPitch(float pitch); // Pitch is in cents!
+ void setPitch(float pitch); // Pitch is in cents!
- public void noteOn(MidiChannel channel, VoiceStatus voice, int noteNumber,
- int velocity);
+ void noteOn(MidiChannel channel, VoiceStatus voice, int noteNumber,
+ int velocity);
- public void noteOff(int velocity);
+ void noteOff(int velocity);
- public int read(float[][] buffer, int offset, int len) throws IOException;
+ int read(float[][] buffer, int offset, int len) throws IOException;
- public void close() throws IOException;
+ void close() throws IOException;
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelPatch.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelPatch.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import javax.sound.midi.Patch;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelPerformer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelPerformer.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.ArrayList;
@@ -35,9 +36,9 @@
*/
public final class ModelPerformer {
- private final List<ModelOscillator> oscillators = new ArrayList<ModelOscillator>();
- private List<ModelConnectionBlock> connectionBlocks
- = new ArrayList<ModelConnectionBlock>();
+ private final List<ModelOscillator> oscillators = new ArrayList<>();
+ private List<ModelConnectionBlock> connectionBlocks = new ArrayList<>();
+
private int keyFrom = 0;
private int keyTo = 127;
private int velFrom = 0;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelSource.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelSource.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelStandardDirector.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelStandardDirector.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.Arrays;
@@ -52,9 +53,11 @@
}
}
+ @Override
public void close() {
}
+ @Override
public void noteOff(int noteNumber, int velocity) {
if (!noteOffUsed)
return;
@@ -70,6 +73,7 @@
}
}
+ @Override
public void noteOn(int noteNumber, int velocity) {
if (!noteOnUsed)
return;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelStandardIndexedDirector.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelStandardIndexedDirector.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.Arrays;
@@ -156,9 +157,11 @@
}
}
+ @Override
public void close() {
}
+ @Override
public void noteOff(int noteNumber, int velocity) {
if (!noteOffUsed)
return;
@@ -172,6 +175,7 @@
}
}
+ @Override
public void noteOn(int noteNumber, int velocity) {
if (!noteOnUsed)
return;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelStandardTransform.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelStandardTransform.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
@@ -73,6 +74,7 @@
this.transform = transform;
}
+ @Override
public double transform(double value) {
double s;
double a;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelTransform.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelTransform.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
@@ -31,5 +32,5 @@
*/
public interface ModelTransform {
- public abstract double transform(double value);
+ double transform(double value);
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelWavetable.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelWavetable.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
@@ -31,19 +32,19 @@
*/
public interface ModelWavetable extends ModelOscillator {
- public static final int LOOP_TYPE_OFF = 0;
- public static final int LOOP_TYPE_FORWARD = 1;
- public static final int LOOP_TYPE_RELEASE = 2;
- public static final int LOOP_TYPE_PINGPONG = 4;
- public static final int LOOP_TYPE_REVERSE = 8;
+ int LOOP_TYPE_OFF = 0;
+ int LOOP_TYPE_FORWARD = 1;
+ int LOOP_TYPE_RELEASE = 2;
+ int LOOP_TYPE_PINGPONG = 4;
+ int LOOP_TYPE_REVERSE = 8;
- public AudioFloatInputStream openStream();
+ AudioFloatInputStream openStream();
- public float getLoopLength();
+ float getLoopLength();
- public float getLoopStart();
+ float getLoopStart();
- public int getLoopType();
+ int getLoopType();
- public float getPitchcorrection();
+ float getPitchcorrection();
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/PCMtoPCMCodec.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/PCMtoPCMCodec.java Fri Aug 26 10:14:15 2016 -0700
@@ -40,7 +40,6 @@
*/
public final class PCMtoPCMCodec extends SunCodec {
-
private static final AudioFormat.Encoding[] inputEncodings = {
AudioFormat.Encoding.PCM_SIGNED,
AudioFormat.Encoding.PCM_UNSIGNED,
@@ -59,8 +58,7 @@
super( inputEncodings, outputEncodings);
}
- // NEW CODE
-
+ @Override
public AudioFormat.Encoding[] getTargetEncodings(AudioFormat sourceFormat) {
final int sampleSize = sourceFormat.getSampleSizeInBits();
@@ -88,9 +86,7 @@
return new AudioFormat.Encoding[0];
}
-
- /**
- */
+ @Override
public AudioFormat[] getTargetFormats(AudioFormat.Encoding targetEncoding, AudioFormat sourceFormat){
Objects.requireNonNull(targetEncoding);
@@ -113,9 +109,7 @@
return formatArray;
}
-
- /**
- */
+ @Override
public AudioInputStream getAudioInputStream(AudioFormat.Encoding targetEncoding, AudioInputStream sourceStream) {
if( isConversionSupported(targetEncoding, sourceStream.getFormat()) ) {
@@ -136,9 +130,8 @@
}
}
- /**
- * use old code
- */
+
+ @Override
public AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInputStream sourceStream){
if (!isConversionSupported(targetFormat, sourceStream.getFormat()))
throw new IllegalArgumentException("Unsupported conversion: "
@@ -147,11 +140,6 @@
return getConvertedStream( targetFormat, sourceStream );
}
-
-
-
- // OLD CODE
-
/**
* Opens the codec with the specified parameters.
* @param stream stream from which data to be processed should be read
@@ -160,7 +148,6 @@
* @throws IllegalArgumentException if the format combination supplied is
* not supported.
*/
- /* public AudioInputStream getConvertedStream(AudioFormat outputFormat, AudioInputStream stream) {*/
private AudioInputStream getConvertedStream(AudioFormat outputFormat, AudioInputStream stream) {
AudioInputStream cs = null;
@@ -172,13 +159,11 @@
cs = stream;
} else {
- cs = (AudioInputStream) (new PCMtoPCMCodecStream(stream, outputFormat));
+ cs = new PCMtoPCMCodecStream(stream, outputFormat);
}
return cs;
}
-
-
/**
* Obtains the set of output formats supported by the codec
* given a particular input format.
@@ -186,7 +171,6 @@
* returns an array of length 0.
* @return array of supported output formats.
*/
- /* public AudioFormat[] getOutputFormats(AudioFormat inputFormat) { */
private AudioFormat[] getOutputFormats(AudioFormat inputFormat) {
Vector<AudioFormat> formats = new Vector<>();
@@ -350,7 +334,6 @@
return formatArray;
}
-
class PCMtoPCMCodecStream extends AudioInputStream {
private final int PCM_SWITCH_SIGNED_8BIT = 1;
@@ -460,7 +443,7 @@
* Note that this only works for sign conversions.
* Other conversions require a read of at least 2 bytes.
*/
-
+ @Override
public int read() throws IOException {
// $$jb: do we want to implement this function?
@@ -489,12 +472,13 @@
}
}
-
+ @Override
public int read(byte[] b) throws IOException {
return read(b, 0, b.length);
}
+ @Override
public int read(byte[] b, int off, int len) throws IOException {
@@ -589,9 +573,5 @@
}
}
}
-
-
-
} // end class PCMtoPCMCodecStream
-
} // end class PCMtoPCMCodec
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/Platform.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/Platform.java Fri Aug 26 10:14:15 2016 -0700
@@ -29,8 +29,6 @@
import java.security.PrivilegedAction;
import java.util.StringTokenizer;
-
-
/**
* Audio configuration class for exposing attributes specific to the platform or system.
*
@@ -39,9 +37,6 @@
*/
final class Platform {
-
- // STATIC FINAL CHARACTERISTICS
-
// native library we need to load
private static final String libNameMain = "jsound";
private static final String libNameALSA = "jsoundalsa";
@@ -74,37 +69,26 @@
readProperties();
}
-
/**
* Private constructor.
*/
private Platform() {
}
-
- // METHODS FOR INTERNAL IMPLEMENTATION USE
-
-
/**
* Dummy method for forcing initialization.
*/
static void initialize() {
-
if(Printer.trace)Printer.trace("Platform: initialize()");
}
-
/**
* Determine whether the system is big-endian.
*/
static boolean isBigEndian() {
-
return bigEndian;
}
-
- // PRIVATE METHODS
-
/**
* Load the native library or libraries.
*/
@@ -147,7 +131,6 @@
}
}
-
static boolean isMidiIOEnabled() {
return isFeatureLibLoaded(FEATURE_MIDIIO);
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/PortMixer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/PortMixer.java Fri Aug 26 10:14:15 2016 -0700
@@ -27,14 +27,13 @@
import java.util.Vector;
+import javax.sound.sampled.BooleanControl;
+import javax.sound.sampled.CompoundControl;
import javax.sound.sampled.Control;
+import javax.sound.sampled.FloatControl;
import javax.sound.sampled.Line;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.Port;
-import javax.sound.sampled.BooleanControl;
-import javax.sound.sampled.CompoundControl;
-import javax.sound.sampled.FloatControl;
-
/**
* A Mixer which only provides Ports.
@@ -43,7 +42,6 @@
*/
final class PortMixer extends AbstractMixer {
- // CONSTANTS
private static final int SRC_UNKNOWN = 0x01;
private static final int SRC_MICROPHONE = 0x02;
private static final int SRC_LINE_IN = 0x03;
@@ -56,15 +54,13 @@
private static final int DST_LINE_OUT = 0x0400;
private static final int DST_MASK = 0xFF00;
- // INSTANCE VARIABLES
- private Port.Info[] portInfos;
+ private final Port.Info[] portInfos;
// cache of instantiated ports
private PortMixerPort[] ports;
// instance ID of the native implementation
private long id = 0;
- // CONSTRUCTOR
PortMixer(PortMixerProvider.PortMixerInfo portMixerInfo) {
// pass in Line.Info, mixer, controls
super(portMixerInfo, // Mixer.Info
@@ -121,9 +117,7 @@
if (Printer.trace) Printer.trace("<< PortMixer: constructor completed");
}
-
- // ABSTRACT MIXER: ABSTRACT METHOD IMPLEMENTATIONS
-
+ @Override
public Line getLine(Line.Info info) throws LineUnavailableException {
Line.Info fullInfo = getLineInfo(info);
@@ -137,7 +131,7 @@
throw new IllegalArgumentException("Line unsupported: " + info);
}
-
+ @Override
public int getMaxLines(Line.Info info) {
Line.Info fullInfo = getLineInfo(info);
@@ -153,7 +147,7 @@
return 0;
}
-
+ @Override
protected void implOpen() throws LineUnavailableException {
if (Printer.trace) Printer.trace(">> PortMixer: implOpen (id="+id+")");
@@ -163,6 +157,7 @@
if (Printer.trace) Printer.trace("<< PortMixer: implOpen succeeded.");
}
+ @Override
protected void implClose() {
if (Printer.trace) Printer.trace(">> PortMixer: implClose");
@@ -181,11 +176,11 @@
if (Printer.trace) Printer.trace("<< PortMixer: implClose succeeded");
}
+ @Override
protected void implStart() {}
+ @Override
protected void implStop() {}
- // IMPLEMENTATION HELPERS
-
private Port.Info getPortInfo(int portIndex, int type) {
switch (type) {
case SRC_UNKNOWN: return new PortInfo(nGetPortName(getID(), portIndex), true);
@@ -223,8 +218,6 @@
return id;
}
- // INNER CLASSES
-
/**
* Private inner class representing a Port for the PortMixer.
*/
@@ -234,7 +227,6 @@
private final int portIndex;
private long id;
- // CONSTRUCTOR
private PortMixerPort(Port.Info info,
PortMixer mixer,
int portIndex) {
@@ -243,11 +235,6 @@
this.portIndex = portIndex;
}
-
- // ABSTRACT METHOD IMPLEMENTATIONS
-
- // ABSTRACT LINE
-
void implOpen() throws LineUnavailableException {
if (Printer.trace) Printer.trace(">> PortMixerPort: implOpen().");
long newID = ((PortMixer) mixer).getID();
@@ -286,7 +273,6 @@
controls = new Control[0];
}
-
void implClose() {
if (Printer.trace) Printer.trace(">> PortMixerPort: implClose()");
// get rid of controls
@@ -294,9 +280,8 @@
if (Printer.trace) Printer.trace("<< PortMixerPort: implClose() succeeded");
}
- // METHOD OVERRIDES
-
// this is very similar to open(AudioFormat, int) in AbstractDataLine...
+ @Override
public void open() throws LineUnavailableException {
synchronized (mixer) {
// if the line is not currently open, try to open it with this format and buffer size
@@ -321,6 +306,7 @@
}
// this is very similar to close() in AbstractDataLine...
+ @Override
public void close() {
synchronized (mixer) {
if (isOpen()) {
@@ -342,7 +328,7 @@
} // class PortMixerPort
/**
- * Private inner class representing a BooleanControl for PortMixerPort
+ * Private inner class representing a BooleanControl for PortMixerPort.
*/
private static final class BoolCtrl extends BooleanControl {
// the handle to the native control function
@@ -360,7 +346,6 @@
return new BCT(name);
}
-
private BoolCtrl(long controlID, String name) {
this(controlID, createType(name));
}
@@ -370,12 +355,14 @@
this.controlID = controlID;
}
+ @Override
public void setValue(boolean value) {
if (!closed) {
nControlSetIntValue(controlID, value?1:0);
}
}
+ @Override
public boolean getValue() {
if (!closed) {
// never use any cached values
@@ -386,7 +373,7 @@
}
/**
- * inner class for custom types
+ * inner class for custom types.
*/
private static final class BCT extends BooleanControl.Type {
private BCT(String name) {
@@ -396,7 +383,7 @@
}
/**
- * Private inner class representing a CompoundControl for PortMixerPort
+ * Private inner class representing a CompoundControl for PortMixerPort.
*/
private static final class CompCtrl extends CompoundControl {
private CompCtrl(String name, Control[] controls) {
@@ -404,7 +391,7 @@
}
/**
- * inner class for custom compound control types
+ * inner class for custom compound control types.
*/
private static final class CCT extends CompoundControl.Type {
private CCT(String name) {
@@ -414,7 +401,7 @@
}
/**
- * Private inner class representing a BooleanControl for PortMixerPort
+ * Private inner class representing a BooleanControl for PortMixerPort.
*/
private static final class FloatCtrl extends FloatControl {
// the handle to the native control function
@@ -446,12 +433,14 @@
this.controlID = controlID;
}
+ @Override
public void setValue(float value) {
if (!closed) {
nControlSetFloatValue(controlID, value);
}
}
+ @Override
public float getValue() {
if (!closed) {
// never use any cached values
@@ -462,7 +451,7 @@
}
/**
- * inner class for custom types
+ * inner class for custom types.
*/
private static final class FCT extends FloatControl.Type {
private FCT(String name) {
@@ -472,7 +461,7 @@
}
/**
- * Private inner class representing a port info
+ * Private inner class representing a port info.
*/
private static final class PortInfo extends Port.Info {
private PortInfo(String name, boolean isSource) {
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/PortMixerProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/PortMixerProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -28,7 +28,6 @@
import javax.sound.sampled.Mixer;
import javax.sound.sampled.spi.MixerProvider;
-
/**
* Port provider.
*
@@ -36,8 +35,6 @@
*/
public final class PortMixerProvider extends MixerProvider {
- // STATIC VARIABLES
-
/**
* Set of info objects for all port input devices on the system.
*/
@@ -48,18 +45,11 @@
*/
private static PortMixer[] devices;
-
- // STATIC
-
static {
// initialize
Platform.initialize();
}
-
- // CONSTRUCTOR
-
-
/**
* Required public no-arg constructor.
*/
@@ -93,6 +83,7 @@
}
}
+ @Override
public Mixer.Info[] getMixerInfo() {
synchronized (PortMixerProvider.class) {
Mixer.Info[] localArray = new Mixer.Info[infos.length];
@@ -101,6 +92,7 @@
}
}
+ @Override
public Mixer getMixer(Mixer.Info info) {
synchronized (PortMixerProvider.class) {
for (int i = 0; i < infos.length; i++) {
@@ -113,7 +105,6 @@
String.format("Mixer %s not supported by this provider", info));
}
-
private static Mixer getDevice(PortMixerInfo info) {
int index = info.getIndex();
if (devices[index] == null) {
@@ -122,9 +113,6 @@
return devices[index];
}
- // INNER CLASSES
-
-
/**
* Info class for PortMixers. Adds an index value for
* making native references to a particular device.
@@ -144,7 +132,6 @@
} // class PortMixerInfo
- // NATIVE METHODS
private static native int nGetNumDevices();
private static native PortMixerInfo nNewPortMixerInfo(int mixerIndex);
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFInvalidDataException.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFInvalidDataException.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFInvalidFormatException.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFInvalidFormatException.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFReader.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFReader.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.EOFException;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFWriter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFWriter.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.File;
@@ -39,21 +40,21 @@
private interface RandomAccessWriter {
- public void seek(long chunksizepointer) throws IOException;
+ void seek(long chunksizepointer) throws IOException;
- public long getPointer() throws IOException;
+ long getPointer() throws IOException;
- public void close() throws IOException;
+ void close() throws IOException;
- public void write(int b) throws IOException;
+ void write(int b) throws IOException;
- public void write(byte[] b, int off, int len) throws IOException;
+ void write(byte[] b, int off, int len) throws IOException;
- public void write(byte[] bytes) throws IOException;
+ void write(byte[] bytes) throws IOException;
- public long length() throws IOException;
+ long length() throws IOException;
- public void setLength(long i) throws IOException;
+ void setLength(long i) throws IOException;
}
private static class RandomAccessFileWriter implements RandomAccessWriter {
@@ -68,34 +69,42 @@
this.raf = new RandomAccessFile(name, "rw");
}
+ @Override
public void seek(long chunksizepointer) throws IOException {
raf.seek(chunksizepointer);
}
+ @Override
public long getPointer() throws IOException {
return raf.getFilePointer();
}
+ @Override
public void close() throws IOException {
raf.close();
}
+ @Override
public void write(int b) throws IOException {
raf.write(b);
}
+ @Override
public void write(byte[] b, int off, int len) throws IOException {
raf.write(b, off, len);
}
+ @Override
public void write(byte[] bytes) throws IOException {
raf.write(bytes);
}
+ @Override
public long length() throws IOException {
return raf.length();
}
+ @Override
public void setLength(long i) throws IOException {
raf.setLength(i);
}
@@ -113,19 +122,23 @@
this.stream = stream;
}
+ @Override
public void seek(long chunksizepointer) throws IOException {
pos = (int) chunksizepointer;
}
+ @Override
public long getPointer() throws IOException {
return pos;
}
+ @Override
public void close() throws IOException {
stream.write(buff, 0, length);
stream.close();
}
+ @Override
public void write(int b) throws IOException {
if (s == null)
s = new byte[1];
@@ -133,6 +146,7 @@
write(s, 0, 1);
}
+ @Override
public void write(byte[] b, int off, int len) throws IOException {
int newsize = pos + len;
if (newsize > length)
@@ -143,14 +157,17 @@
}
}
+ @Override
public void write(byte[] bytes) throws IOException {
write(bytes, 0, bytes.length);
}
+ @Override
public long length() throws IOException {
return length;
}
+ @Override
public void setLength(long i) throws IOException {
length = (int) i;
if (length > buff.length) {
@@ -223,6 +240,7 @@
return writeoverride;
}
+ @Override
public void close() throws IOException {
if (!open)
return;
@@ -245,6 +263,7 @@
raf = null;
}
+ @Override
public void write(int b) throws IOException {
if (!writeoverride) {
if (chunktype != 2) {
@@ -259,6 +278,7 @@
raf.write(b);
}
+ @Override
public void write(byte b[], int off, int len) throws IOException {
if (!writeoverride) {
if (chunktype != 2) {
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/RealTimeSequencer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/RealTimeSequencer.java Fri Aug 26 10:14:15 2016 -0700
@@ -27,14 +27,27 @@
import java.io.IOException;
import java.io.InputStream;
-
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;
-import javax.sound.midi.*;
-
+import javax.sound.midi.ControllerEventListener;
+import javax.sound.midi.InvalidMidiDataException;
+import javax.sound.midi.MetaEventListener;
+import javax.sound.midi.MetaMessage;
+import javax.sound.midi.MidiDevice;
+import javax.sound.midi.MidiEvent;
+import javax.sound.midi.MidiMessage;
+import javax.sound.midi.MidiSystem;
+import javax.sound.midi.MidiUnavailableException;
+import javax.sound.midi.Receiver;
+import javax.sound.midi.Sequence;
+import javax.sound.midi.Sequencer;
+import javax.sound.midi.ShortMessage;
+import javax.sound.midi.Synthesizer;
+import javax.sound.midi.Track;
+import javax.sound.midi.Transmitter;
/**
* A Real Time Sequencer
@@ -48,8 +61,6 @@
final class RealTimeSequencer extends AbstractMidiDevice
implements Sequencer, AutoConnectSequencer {
- // STATIC VARIABLES
-
/** debugging flags */
private static final boolean DEBUG_PUMP = false;
private static final boolean DEBUG_PUMP_ALL = false;
@@ -73,7 +84,6 @@
private static final Sequencer.SyncMode masterSyncMode = Sequencer.SyncMode.INTERNAL_CLOCK;
private static final Sequencer.SyncMode slaveSyncMode = Sequencer.SyncMode.NO_SYNC;
-
/**
* Sequence on which this sequencer is operating.
*/
@@ -87,14 +97,12 @@
*/
private double cacheTempoMPQ = -1;
-
/**
* cache value for tempo factor until sequence is set
* -1 means not set.
*/
private float cacheTempoFactor = -1;
-
/** if a particular track is muted */
private boolean[] trackMuted = null;
/** if a particular track is solo */
@@ -108,47 +116,48 @@
*/
private volatile boolean running;
-
- /** the thread for pushing out the MIDI messages */
+ /**
+ * the thread for pushing out the MIDI messages.
+ */
private PlayThread playThread;
-
/**
- * True if we are recording
+ * True if we are recording.
*/
private volatile boolean recording;
-
/**
- * List of tracks to which we're recording
+ * List of tracks to which we're recording.
*/
private final List<RecordingTrack> recordingTracks = new ArrayList<>();
-
private long loopStart = 0;
private long loopEnd = -1;
private int loopCount = 0;
-
/**
- * Meta event listeners
+ * Meta event listeners.
*/
private final ArrayList<Object> metaEventListeners = new ArrayList<>();
-
/**
- * Control change listeners
+ * Control change listeners.
*/
private final ArrayList<ControllerListElement> controllerEventListeners = new ArrayList<>();
-
- /** automatic connection support */
+ /**
+ * automatic connection support.
+ */
private boolean autoConnect = false;
- /** if we need to autoconnect at next open */
+ /**
+ * if we need to autoconnect at next open.
+ */
private boolean doAutoConnectAtNextOpen = false;
- /** the receiver that this device is auto-connected to */
+ /**
+ * the receiver that this device is auto-connected to.
+ */
Receiver autoConnectedReceiver = null;
@@ -161,9 +170,9 @@
if (Printer.trace) Printer.trace("<< RealTimeSequencer CONSTRUCTOR completed");
}
-
/* ****************************** SEQUENCER METHODS ******************** */
+ @Override
public synchronized void setSequence(Sequence sequence)
throws InvalidMidiDataException {
@@ -211,7 +220,7 @@
if (Printer.trace) Printer.trace("<< RealTimeSequencer: setSequence(" + sequence +") completed");
}
-
+ @Override
public synchronized void setSequence(InputStream stream) throws IOException, InvalidMidiDataException {
if (Printer.trace) Printer.trace(">> RealTimeSequencer: setSequence(" + stream +")");
@@ -229,12 +238,12 @@
}
-
+ @Override
public Sequence getSequence() {
return sequence;
}
-
+ @Override
public synchronized void start() {
if (Printer.trace) Printer.trace(">> RealTimeSequencer: start()");
@@ -259,7 +268,7 @@
if (Printer.trace) Printer.trace("<< RealTimeSequencer: start() completed");
}
-
+ @Override
public synchronized void stop() {
if (Printer.trace) Printer.trace(">> RealTimeSequencer: stop()");
@@ -280,12 +289,12 @@
if (Printer.trace) Printer.trace("<< RealTimeSequencer: stop() completed");
}
-
+ @Override
public boolean isRunning() {
return running;
}
-
+ @Override
public void startRecording() {
if (!isOpen()) {
throw new IllegalStateException("Sequencer not open");
@@ -295,7 +304,7 @@
recording = true;
}
-
+ @Override
public void stopRecording() {
if (!isOpen()) {
throw new IllegalStateException("Sequencer not open");
@@ -303,12 +312,12 @@
recording = false;
}
-
+ @Override
public boolean isRecording() {
return recording;
}
-
+ @Override
public void recordEnable(Track track, int channel) {
if (!findTrack(track)) {
throw new IllegalArgumentException("Track does not exist in the current sequence");
@@ -325,7 +334,7 @@
}
-
+ @Override
public void recordDisable(Track track) {
synchronized(recordingTracks) {
RecordingTrack rc = RecordingTrack.get(recordingTracks, track);
@@ -336,7 +345,6 @@
}
-
private boolean findTrack(Track track) {
boolean found = false;
if (sequence != null) {
@@ -351,14 +359,14 @@
return found;
}
-
+ @Override
public float getTempoInBPM() {
if (Printer.trace) Printer.trace(">> RealTimeSequencer: getTempoInBPM() ");
return (float) MidiUtils.convertTempo(getTempoInMPQ());
}
-
+ @Override
public void setTempoInBPM(float bpm) {
if (Printer.trace) Printer.trace(">> RealTimeSequencer: setTempoInBPM() ");
if (bpm <= 0) {
@@ -369,7 +377,7 @@
setTempoInMPQ((float) MidiUtils.convertTempo((double) bpm));
}
-
+ @Override
public float getTempoInMPQ() {
if (Printer.trace) Printer.trace(">> RealTimeSequencer: getTempoInMPQ() ");
@@ -389,7 +397,7 @@
return getDataPump().getTempoMPQ();
}
-
+ @Override
public void setTempoInMPQ(float mpq) {
if (mpq <= 0) {
// should throw IllegalArgumentException
@@ -410,7 +418,7 @@
}
}
-
+ @Override
public void setTempoFactor(float factor) {
if (factor <= 0) {
// should throw IllegalArgumentException
@@ -428,7 +436,7 @@
}
}
-
+ @Override
public float getTempoFactor() {
if (Printer.trace) Printer.trace(">> RealTimeSequencer: getTempoFactor() ");
@@ -441,7 +449,7 @@
return getDataPump().getTempoFactor();
}
-
+ @Override
public long getTickLength() {
if (Printer.trace) Printer.trace(">> RealTimeSequencer: getTickLength() ");
@@ -452,7 +460,7 @@
return sequence.getTickLength();
}
-
+ @Override
public synchronized long getTickPosition() {
if (Printer.trace) Printer.trace(">> RealTimeSequencer: getTickPosition() ");
@@ -463,7 +471,7 @@
return getDataPump().getTickPos();
}
-
+ @Override
public synchronized void setTickPosition(long tick) {
if (tick < 0) {
// should throw IllegalArgumentException
@@ -486,7 +494,7 @@
}
}
-
+ @Override
public long getMicrosecondLength() {
if (Printer.trace) Printer.trace(">> RealTimeSequencer: getMicrosecondLength() ");
@@ -497,7 +505,7 @@
return sequence.getMicrosecondLength();
}
-
+ @Override
public long getMicrosecondPosition() {
if (Printer.trace) Printer.trace(">> RealTimeSequencer: getMicrosecondPosition() ");
@@ -509,7 +517,7 @@
}
}
-
+ @Override
public void setMicrosecondPosition(long microseconds) {
if (microseconds < 0) {
// should throw IllegalArgumentException
@@ -534,34 +542,34 @@
}
}
-
+ @Override
public void setMasterSyncMode(Sequencer.SyncMode sync) {
// not supported
}
-
+ @Override
public Sequencer.SyncMode getMasterSyncMode() {
return masterSyncMode;
}
-
+ @Override
public Sequencer.SyncMode[] getMasterSyncModes() {
Sequencer.SyncMode[] returnedModes = new Sequencer.SyncMode[masterSyncModes.length];
System.arraycopy(masterSyncModes, 0, returnedModes, 0, masterSyncModes.length);
return returnedModes;
}
-
+ @Override
public void setSlaveSyncMode(Sequencer.SyncMode sync) {
// not supported
}
-
+ @Override
public Sequencer.SyncMode getSlaveSyncMode() {
return slaveSyncMode;
}
-
+ @Override
public Sequencer.SyncMode[] getSlaveSyncModes() {
Sequencer.SyncMode[] returnedModes = new Sequencer.SyncMode[slaveSyncModes.length];
System.arraycopy(slaveSyncModes, 0, returnedModes, 0, slaveSyncModes.length);
@@ -577,8 +585,7 @@
return 0;
}
-
-
+ @Override
public synchronized void setTrackMute(int track, boolean mute) {
int trackCount = getTrackCount();
if (track < 0 || track >= getTrackCount()) return;
@@ -589,14 +596,14 @@
}
}
-
+ @Override
public synchronized boolean getTrackMute(int track) {
if (track < 0 || track >= getTrackCount()) return false;
if (trackMuted == null || trackMuted.length <= track) return false;
return trackMuted[track];
}
-
+ @Override
public synchronized void setTrackSolo(int track, boolean solo) {
int trackCount = getTrackCount();
if (track < 0 || track >= getTrackCount()) return;
@@ -607,14 +614,14 @@
}
}
-
+ @Override
public synchronized boolean getTrackSolo(int track) {
if (track < 0 || track >= getTrackCount()) return false;
if (trackSolo == null || trackSolo.length <= track) return false;
return trackSolo[track];
}
-
+ @Override
public boolean addMetaEventListener(MetaEventListener listener) {
synchronized(metaEventListeners) {
if (! metaEventListeners.contains(listener)) {
@@ -625,7 +632,7 @@
}
}
-
+ @Override
public void removeMetaEventListener(MetaEventListener listener) {
synchronized(metaEventListeners) {
int index = metaEventListeners.indexOf(listener);
@@ -635,7 +642,7 @@
}
}
-
+ @Override
public int[] addControllerEventListener(ControllerEventListener listener, int[] controllers) {
synchronized(controllerEventListeners) {
@@ -663,7 +670,7 @@
}
}
-
+ @Override
public int[] removeControllerEventListener(ControllerEventListener listener, int[] controllers) {
synchronized(controllerEventListeners) {
ControllerListElement cve = null;
@@ -690,9 +697,9 @@
}
}
-
////////////////// LOOPING (added in 1.5) ///////////////////////
+ @Override
public void setLoopStartPoint(long tick) {
if ((tick > getTickLength())
|| ((loopEnd != -1) && (tick > loopEnd))
@@ -702,10 +709,12 @@
loopStart = tick;
}
+ @Override
public long getLoopStartPoint() {
return loopStart;
}
+ @Override
public void setLoopEndPoint(long tick) {
if ((tick > getTickLength())
|| ((loopStart > tick) && (tick != -1))
@@ -715,10 +724,12 @@
loopEnd = tick;
}
+ @Override
public long getLoopEndPoint() {
return loopEnd;
}
+ @Override
public void setLoopCount(int count) {
if (count != LOOP_CONTINUOUSLY
&& count < 0) {
@@ -730,15 +741,14 @@
}
}
+ @Override
public int getLoopCount() {
return loopCount;
}
-
/* *********************************** play control ************************* */
- /*
- */
+ @Override
protected void implOpen() throws MidiUnavailableException {
if (Printer.trace) Printer.trace(">> RealTimeSequencer: implOpen()");
@@ -820,14 +830,15 @@
}
}
- /** populate the caches with the current values */
+ /**
+ * populate the caches with the current values.
+ */
private synchronized void setCaches() {
cacheTempoFactor = getTempoFactor();
cacheTempoMPQ = getTempoInMPQ();
}
-
-
+ @Override
protected synchronized void implClose() {
if (Printer.trace) Printer.trace(">> RealTimeSequencer: implClose() ");
@@ -882,7 +893,6 @@
if (Printer.trace) Printer.trace("<< RealTimeSequencer: implStart() completed");
}
-
void implStop() {
if (Printer.trace) Printer.trace(">> RealTimeSequencer: implStop()");
@@ -953,8 +963,6 @@
getEventDispatcher().sendAudioEvents(message, sendToListeners);
}
-
-
private boolean needCaching() {
return !isOpen() || (sequence == null) || (playThread == null);
}
@@ -988,42 +996,39 @@
return array;
}
-
// OVERRIDES OF ABSTRACT MIDI DEVICE METHODS
+ @Override
protected boolean hasReceivers() {
return true;
}
// for recording
+ @Override
protected Receiver createReceiver() throws MidiUnavailableException {
return new SequencerReceiver();
}
-
+ @Override
protected boolean hasTransmitters() {
return true;
}
-
+ @Override
protected Transmitter createTransmitter() throws MidiUnavailableException {
return new SequencerTransmitter();
}
-
// interface AutoConnectSequencer
+ @Override
public void setAutoConnect(Receiver autoConnectedReceiver) {
this.autoConnect = (autoConnectedReceiver != null);
this.autoConnectedReceiver = autoConnectedReceiver;
}
-
-
- // INNER CLASSES
-
/**
* An own class to distinguish the class name from
- * the transmitter of other devices
+ * the transmitter of other devices.
*/
private class SequencerTransmitter extends BasicTransmitter {
private SequencerTransmitter() {
@@ -1031,9 +1036,9 @@
}
}
-
final class SequencerReceiver extends AbstractReceiver {
+ @Override
void implSend(MidiMessage message, long timeStamp) {
if (recording) {
long tickPos = 0;
@@ -1080,7 +1085,6 @@
}
}
-
private static class RealTimeSequencerInfo extends MidiDevice.Info {
private static final String name = "Real Time Sequencer";
@@ -1093,7 +1097,6 @@
}
} // class Info
-
private class ControllerListElement {
// $$jb: using an array for controllers b/c its
@@ -1202,7 +1205,6 @@
} // class ControllerListElement
-
static class RecordingTrack {
private final Track track;
@@ -1244,7 +1246,6 @@
}
}
-
final class PlayThread implements Runnable {
private Thread thread;
private final Object lock = new Object();
@@ -1351,13 +1352,13 @@
}
}
-
/**
* Main process loop driving the media flow.
*
* Make sure to NOT synchronize on RealTimeSequencer
* anywhere here (even implicit). That is a sure deadlock!
*/
+ @Override
public void run() {
while (!interrupted) {
@@ -1409,10 +1410,9 @@
}
}
-
/**
* class that does the actual dispatching of events,
- * used to be in native in MMAPI
+ * used to be in native in MMAPI.
*/
private class DataPump {
private float currTempo; // MPQ tempo
@@ -1434,7 +1434,6 @@
//private sun.misc.Perf perf = sun.misc.Perf.getPerf();
//private long perfFreq = perf.highResFrequency();
-
DataPump() {
init();
}
@@ -1516,8 +1515,6 @@
trackDisabled = newDisabled;
}
-
-
synchronized void setSequence(Sequence seq) {
if (seq == null) {
init();
@@ -1568,7 +1565,6 @@
if (DEBUG_PUMP) Printer.println(" noteOff: sent "+done+" messages.");
}
-
private boolean[] makeDisabledArray() {
if (tracks == null) {
return null;
@@ -1656,11 +1652,10 @@
if (DEBUG_PUMP) Printer.println(" sendNoteOffIfOn: sent "+done+" messages.");
}
-
/**
* Runtime application of mute/solo:
* if a track is muted that was previously playing, send
- * note off events for all currently playing notes
+ * note off events for all currently playing notes.
*/
private void applyDisabledTracks(boolean[] oldDisabled, boolean[] newDisabled) {
byte[][] tempArray = null;
@@ -1781,8 +1776,9 @@
if (DEBUG_PUMP) Printer.println(" chaseTrackEvents track "+trackNum+": sent "+numControllersSent+" controllers.");
}
-
- /** chase controllers and program for all tracks */
+ /**
+ * chase controllers and program for all tracks.
+ */
synchronized void chaseEvents(long startTick, long endTick) {
if (DEBUG_PUMP) Printer.println(">> chaseEvents from tick "+startTick+".."+(endTick-1));
byte[][] tempArray = new byte[128][16];
@@ -1797,7 +1793,6 @@
if (DEBUG_PUMP) Printer.println("<< chaseEvents");
}
-
// playback related methods (pumping)
private long getCurrentTimeMillis() {
@@ -1900,7 +1895,6 @@
return changesPending;
}
-
/** the main pump method
* @return true if end of sequence is reached
*/
@@ -2078,7 +2072,5 @@
return EOM;
}
-
} // class DataPump
-
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ReferenceCountingDevice.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ReferenceCountingDevice.java Fri Aug 26 10:14:15 2016 -0700
@@ -29,8 +29,6 @@
import javax.sound.midi.Receiver;
import javax.sound.midi.Transmitter;
-
-
/** MidiDevice that can use reference counting for open/close.
* This interface is intended to be used by MidiSystem.getTransmitter() and
* MidiSystem.getReceiver().
@@ -42,11 +40,11 @@
* This method is similar to MidiDevice.getReceiver(). However, by calling this one,
* the device is opened implicitly. This is needed by MidiSystem.getReceiver().
*/
- public Receiver getReceiverReferenceCounting() throws MidiUnavailableException;
+ Receiver getReceiverReferenceCounting() throws MidiUnavailableException;
/** Retrieve a Transmitter that opens the device implicitly.
* This method is similar to MidiDevice.getTransmitter(). However, by calling this one,
* the device is opened implicitly. This is needed by MidiSystem.getTransmitter().
*/
- public Transmitter getTransmitterReferenceCounting() throws MidiUnavailableException;
+ Transmitter getTransmitterReferenceCounting() throws MidiUnavailableException;
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2GlobalRegion.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2GlobalRegion.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Instrument.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Instrument.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.ArrayList;
@@ -45,8 +46,7 @@
long genre = 0;
long morphology = 0;
SF2GlobalRegion globalregion = null;
- List<SF2InstrumentRegion> regions
- = new ArrayList<SF2InstrumentRegion>();
+ List<SF2InstrumentRegion> regions = new ArrayList<>();
public SF2Instrument() {
super(null, null, null, null);
@@ -56,6 +56,7 @@
super(soundbank, null, null, null);
}
+ @Override
public String getName() {
return name;
}
@@ -64,6 +65,7 @@
this.name = name;
}
+ @Override
public Patch getPatch() {
if (bank == 128)
return new ModelPatch(0, preset, true);
@@ -81,6 +83,7 @@
}
}
+ @Override
public Object getData() {
return null;
}
@@ -121,6 +124,7 @@
globalregion = zone;
}
+ @Override
public String toString() {
if (bank == 128)
return "Drumkit: " + name + " preset #" + preset;
@@ -129,6 +133,7 @@
+ " preset #" + preset;
}
+ @Override
public ModelPerformer[] getPerformers() {
int performercount = 0;
for (SF2InstrumentRegion presetzone : regions)
@@ -138,7 +143,7 @@
SF2GlobalRegion presetglobal = globalregion;
for (SF2InstrumentRegion presetzone : regions) {
- Map<Integer, Short> pgenerators = new HashMap<Integer, Short>();
+ Map<Integer, Short> pgenerators = new HashMap<>();
pgenerators.putAll(presetzone.getGenerators());
if (presetglobal != null)
pgenerators.putAll(presetglobal.getGenerators());
@@ -267,7 +272,7 @@
if (buff24 != null)
osc.set8BitExtensionBuffer(buff24);
- Map<Integer, Short> generators = new HashMap<Integer, Short>();
+ Map<Integer, Short> generators = new HashMap<>();
if (layerglobal != null)
generators.putAll(layerglobal.getGenerators());
generators.putAll(layerzone.getGenerators());
@@ -608,6 +613,7 @@
new ModelConnectionBlock(
new ModelSource(ModelSource.SOURCE_NOTEON_VELOCITY,
new ModelTransform() {
+ @Override
public double transform(double value) {
if (value < 0.5)
return 1 - value * 2;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2InstrumentRegion.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2InstrumentRegion.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Layer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Layer.java Fri Aug 26 10:14:15 2016 -0700
@@ -38,7 +38,7 @@
String name = "";
SF2GlobalRegion globalregion = null;
- List<SF2LayerRegion> regions = new ArrayList<SF2LayerRegion>();
+ List<SF2LayerRegion> regions = new ArrayList<>();
public SF2Layer(SF2Soundbank soundBank) {
super(soundBank, null, null);
@@ -48,10 +48,12 @@
super(null, null, null);
}
+ @Override
public Object getData() {
return null;
}
+ @Override
public String getName() {
return name;
}
@@ -72,6 +74,7 @@
globalregion = zone;
}
+ @Override
public String toString() {
return "Layer: " + name;
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2LayerRegion.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2LayerRegion.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Modulator.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Modulator.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Region.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Region.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.ArrayList;
@@ -97,8 +98,8 @@
public static final int GENERATOR_OVERRIDINGROOTKEY = 58;
public static final int GENERATOR_UNUSED5 = 59;
public static final int GENERATOR_ENDOPR = 60;
- protected Map<Integer, Short> generators = new HashMap<Integer, Short>();
- protected List<SF2Modulator> modulators = new ArrayList<SF2Modulator>();
+ protected Map<Integer, Short> generators = new HashMap<>();
+ protected List<SF2Modulator> modulators = new ArrayList<>();
public Map<Integer, Short> getGenerators() {
return generators;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Sample.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Sample.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.InputStream;
@@ -57,6 +58,7 @@
super(null, null, AudioInputStream.class);
}
+ @Override
public Object getData() {
AudioFormat format = getFormat();
@@ -146,6 +148,7 @@
}
*/
+ @Override
public String getName() {
return name;
}
@@ -210,6 +213,7 @@
this.startLoop = startLoop;
}
+ @Override
public String toString() {
return "Sample: " + name;
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Soundbank.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Soundbank.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.File;
@@ -81,9 +82,9 @@
private ModelByteBuffer sampleData24 = null;
private File sampleFile = null;
private boolean largeFormat = false;
- private final List<SF2Instrument> instruments = new ArrayList<SF2Instrument>();
- private final List<SF2Layer> layers = new ArrayList<SF2Layer>();
- private final List<SF2Sample> samples = new ArrayList<SF2Sample>();
+ private final List<SF2Instrument> instruments = new ArrayList<>();
+ private final List<SF2Layer> layers = new ArrayList<>();
+ private final List<SF2Sample> samples = new ArrayList<>();
public SF2Soundbank() {
}
@@ -224,19 +225,15 @@
private void readPdtaChunk(RIFFReader riff) throws IOException {
- List<SF2Instrument> presets = new ArrayList<SF2Instrument>();
- List<Integer> presets_bagNdx = new ArrayList<Integer>();
- List<SF2InstrumentRegion> presets_splits_gen
- = new ArrayList<SF2InstrumentRegion>();
- List<SF2InstrumentRegion> presets_splits_mod
- = new ArrayList<SF2InstrumentRegion>();
+ List<SF2Instrument> presets = new ArrayList<>();
+ List<Integer> presets_bagNdx = new ArrayList<>();
+ List<SF2InstrumentRegion> presets_splits_gen = new ArrayList<>();
+ List<SF2InstrumentRegion> presets_splits_mod = new ArrayList<>();
- List<SF2Layer> instruments = new ArrayList<SF2Layer>();
- List<Integer> instruments_bagNdx = new ArrayList<Integer>();
- List<SF2LayerRegion> instruments_splits_gen
- = new ArrayList<SF2LayerRegion>();
- List<SF2LayerRegion> instruments_splits_mod
- = new ArrayList<SF2LayerRegion>();
+ List<SF2Layer> instruments = new ArrayList<>();
+ List<Integer> instruments_bagNdx = new ArrayList<>();
+ List<SF2LayerRegion> instruments_splits_gen = new ArrayList<>();
+ List<SF2LayerRegion> instruments_splits_mod = new ArrayList<>();
while (riff.hasNextChunk()) {
RIFFReader chunk = riff.nextChunk();
@@ -830,18 +827,22 @@
}
+ @Override
public String getName() {
return name;
}
+ @Override
public String getVersion() {
return major + "." + minor;
}
+ @Override
public String getVendor() {
return engineers;
}
+ @Override
public String getDescription() {
return comments;
}
@@ -858,6 +859,7 @@
comments = s;
}
+ @Override
public SoundbankResource[] getResources() {
SoundbankResource[] resources
= new SoundbankResource[layers.size() + samples.size()];
@@ -869,6 +871,7 @@
return resources;
}
+ @Override
public SF2Instrument[] getInstruments() {
SF2Instrument[] inslist_array
= instruments.toArray(new SF2Instrument[instruments.size()]);
@@ -884,6 +887,7 @@
return samples.toArray(new SF2Sample[samples.size()]);
}
+ @Override
public Instrument getInstrument(Patch patch) {
int program = patch.getProgram();
int bank = patch.getBank();
@@ -972,11 +976,11 @@
public void removeResource(SoundbankResource resource) {
if (resource instanceof SF2Instrument)
- instruments.remove((SF2Instrument)resource);
+ instruments.remove(resource);
if (resource instanceof SF2Layer)
- layers.remove((SF2Layer)resource);
+ layers.remove(resource);
if (resource instanceof SF2Sample)
- samples.remove((SF2Sample)resource);
+ samples.remove(resource);
}
public void addInstrument(SF2Instrument resource) {
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2SoundbankReader.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2SoundbankReader.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,12 +22,14 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
+
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.Soundbank;
import javax.sound.midi.spi.SoundbankReader;
@@ -40,6 +42,7 @@
*/
public final class SF2SoundbankReader extends SoundbankReader {
+ @Override
public Soundbank getSoundbank(URL url)
throws InvalidMidiDataException, IOException {
try {
@@ -51,6 +54,7 @@
}
}
+ @Override
public Soundbank getSoundbank(InputStream stream)
throws InvalidMidiDataException, IOException {
try {
@@ -62,6 +66,7 @@
}
}
+ @Override
public Soundbank getSoundbank(File file)
throws InvalidMidiDataException, IOException {
try {
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SimpleInstrument.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SimpleInstrument.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,10 +22,12 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.ArrayList;
import java.util.List;
+
import javax.sound.midi.Patch;
/**
@@ -48,8 +50,7 @@
protected int bank = 0;
protected boolean percussion = false;
protected String name = "";
- protected List<SimpleInstrumentPart> parts
- = new ArrayList<SimpleInstrumentPart>();
+ protected List<SimpleInstrumentPart> parts = new ArrayList<>();
public SimpleInstrument() {
super(null, null, null, null);
@@ -121,6 +122,7 @@
add(ins.getPerformers());
}
+ @Override
public ModelPerformer[] getPerformers() {
int percount = 0;
@@ -166,10 +168,12 @@
return performers;
}
+ @Override
public Object getData() {
return null;
}
+ @Override
public String getName() {
return this.name;
}
@@ -178,6 +182,7 @@
this.name = name;
}
+ @Override
public ModelPatch getPatch() {
return new ModelPatch(bank, preset, percussion);
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SimpleSoundbank.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SimpleSoundbank.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.ArrayList;
@@ -44,21 +45,25 @@
String version = "";
String vendor = "";
String description = "";
- List<SoundbankResource> resources = new ArrayList<SoundbankResource>();
- List<Instrument> instruments = new ArrayList<Instrument>();
+ List<SoundbankResource> resources = new ArrayList<>();
+ List<Instrument> instruments = new ArrayList<>();
+ @Override
public String getName() {
return name;
}
+ @Override
public String getVersion() {
return version;
}
+ @Override
public String getVendor() {
return vendor;
}
+ @Override
public String getDescription() {
return description;
}
@@ -79,10 +84,12 @@
this.version = version;
}
+ @Override
public SoundbankResource[] getResources() {
return resources.toArray(new SoundbankResource[resources.size()]);
}
+ @Override
public Instrument[] getInstruments() {
Instrument[] inslist_array
= instruments.toArray(new Instrument[resources.size()]);
@@ -90,6 +97,7 @@
return inslist_array;
}
+ @Override
public Instrument getInstrument(Patch patch) {
int program = patch.getProgram();
int bank = patch.getBank();
@@ -120,7 +128,7 @@
public void removeResource(SoundbankResource resource) {
if (resource instanceof Instrument)
- instruments.remove((Instrument) resource);
+ instruments.remove(resource);
else
resources.remove(resource);
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAbstractResampler.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAbstractResampler.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.IOException;
@@ -74,14 +75,17 @@
ibuffer_order = true;
}
+ @Override
public void noteOn(MidiChannel channel, VoiceStatus voice,
- int noteNumber, int velocity) {
+ int noteNumber, int velocity) {
}
+ @Override
public void noteOff(int velocity) {
noteOff_flag = true;
}
+ @Override
public void open(ModelWavetable osc, float outputsamplerate)
throws IOException {
@@ -135,6 +139,7 @@
nextBuffer();
}
+ @Override
public void setPitch(float pitch) {
/*
this.pitch = (float) Math.pow(2f,
@@ -254,6 +259,7 @@
}
}
+ @Override
public int read(float[][] buffer, int offset, int len)
throws IOException {
@@ -373,6 +379,7 @@
return len;
}
+ @Override
public void close() throws IOException {
stream.close();
}
@@ -384,6 +391,7 @@
float in_end, float[] pitch, float pitchstep, float[] out,
int[] out_offset, int out_end);
+ @Override
public final SoftResamplerStreamer openStreamer() {
return new ModelAbstractResamplerStream();
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAudioBuffer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAudioBuffer.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.Arrays;
@@ -123,6 +124,5 @@
}
}
}
-
}
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAudioProcessor.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAudioProcessor.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
@@ -31,18 +32,17 @@
*/
public interface SoftAudioProcessor {
- public void globalParameterControlChange(int[] slothpath, long param,
- long value);
+ void globalParameterControlChange(int[] slothpath, long param, long value);
- public void init(float samplerate, float controlrate);
+ void init(float samplerate, float controlrate);
- public void setInput(int pin, SoftAudioBuffer input);
+ void setInput(int pin, SoftAudioBuffer input);
- public void setOutput(int pin, SoftAudioBuffer output);
+ void setOutput(int pin, SoftAudioBuffer output);
- public void setMixMode(boolean mix);
+ void setMixMode(boolean mix);
- public void processAudio();
+ void processAudio();
- public void processControlLogic();
+ void processControlLogic();
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAudioPusher.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAudioPusher.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.IOException;
@@ -70,6 +71,7 @@
}
}
+ @Override
public void run() {
byte[] buffer = SoftAudioPusher.this.buffer;
AudioInputStream ais = SoftAudioPusher.this.ais;
@@ -87,6 +89,5 @@
active = false;
//e.printStackTrace();
}
-
}
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftChannel.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftChannel.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.ArrayList;
@@ -41,7 +42,7 @@
*/
public final class SoftChannel implements MidiChannel, ModelDirectedPlayer {
- private static boolean[] dontResetControls = new boolean[128];
+ private static final boolean[] dontResetControls = new boolean[128];
static {
for (int i = 0; i < dontResetControls.length; i++)
dontResetControls[i] = false;
@@ -99,18 +100,18 @@
private boolean solo = false;
private boolean solomute = false;
private final Object control_mutex;
- private int channel;
- private SoftVoice[] voices;
+ private final int channel;
+ private final SoftVoice[] voices;
private int bank;
private int program;
- private SoftSynthesizer synthesizer;
- private SoftMainMixer mainmixer;
- private int[] polypressure = new int[128];
+ private final SoftSynthesizer synthesizer;
+ private final SoftMainMixer mainmixer;
+ private final int[] polypressure = new int[128];
private int channelpressure = 0;
- private int[] controller = new int[128];
+ private final int[] controller = new int[128];
private int pitchbend;
- private double[] co_midi_pitch = new double[1];
- private double[] co_midi_channel_pressure = new double[1];
+ private final double[] co_midi_pitch = new double[1];
+ private final double[] co_midi_channel_pressure = new double[1];
SoftTuning tuning = new SoftTuning();
int tuning_bank = 0;
int tuning_program = 0;
@@ -132,6 +133,7 @@
double[] channel_pressure = co_midi_channel_pressure;
double[] poly_pressure = new double[1];
+ @Override
public double[] get(int instance, String name) {
if (name == null)
return null;
@@ -145,26 +147,28 @@
}
}
- private SoftControl[] co_midi = new SoftControl[128];
+ private final SoftControl[] co_midi = new SoftControl[128];
{
for (int i = 0; i < co_midi.length; i++) {
co_midi[i] = new MidiControlObject();
}
}
- private double[][] co_midi_cc_cc = new double[128][1];
- private SoftControl co_midi_cc = new SoftControl() {
+ private final double[][] co_midi_cc_cc = new double[128][1];
+ private final SoftControl co_midi_cc = new SoftControl() {
double[][] cc = co_midi_cc_cc;
+ @Override
public double[] get(int instance, String name) {
if (name == null)
return null;
return cc[Integer.parseInt(name)];
}
};
- Map<Integer, int[]> co_midi_rpn_rpn_i = new HashMap<Integer, int[]>();
- Map<Integer, double[]> co_midi_rpn_rpn = new HashMap<Integer, double[]>();
- private SoftControl co_midi_rpn = new SoftControl() {
+ Map<Integer, int[]> co_midi_rpn_rpn_i = new HashMap<>();
+ Map<Integer, double[]> co_midi_rpn_rpn = new HashMap<>();
+ private final SoftControl co_midi_rpn = new SoftControl() {
Map<Integer, double[]> rpn = co_midi_rpn_rpn;
+ @Override
public double[] get(int instance, String name) {
if (name == null)
return null;
@@ -177,10 +181,11 @@
return v;
}
};
- Map<Integer, int[]> co_midi_nrpn_nrpn_i = new HashMap<Integer, int[]>();
- Map<Integer, double[]> co_midi_nrpn_nrpn = new HashMap<Integer, double[]>();
- private SoftControl co_midi_nrpn = new SoftControl() {
+ Map<Integer, int[]> co_midi_nrpn_nrpn_i = new HashMap<>();
+ Map<Integer, double[]> co_midi_nrpn_nrpn = new HashMap<>();
+ private final SoftControl co_midi_nrpn = new SoftControl() {
Map<Integer, double[]> nrpn = co_midi_nrpn_nrpn;
+ @Override
public double[] get(int instance, String name) {
if (name == null)
return null;
@@ -407,6 +412,7 @@
}
}
+ @Override
public void noteOn(int noteNumber, int velocity) {
noteOn(noteNumber, velocity, 0);
}
@@ -544,6 +550,7 @@
}
}
+ @Override
public void noteOff(int noteNumber, int velocity) {
noteNumber = restrict7Bit(noteNumber);
velocity = restrict7Bit(velocity);
@@ -616,7 +623,7 @@
}
}
- private int[] lastVelocity = new int[128];
+ private final int[] lastVelocity = new int[128];
private int prevVoiceID;
private boolean firstVoice = true;
private int voiceNo = 0;
@@ -625,6 +632,7 @@
private int play_delay = 0;
private boolean play_releasetriggered = false;
+ @Override
public void play(int performerIndex, ModelConnectionBlock[] connectionBlocks) {
int noteNumber = play_noteNumber;
@@ -657,11 +665,13 @@
connectionBlocks, current_mixer, releasetriggered);
}
+ @Override
public void noteOff(int noteNumber) {
if(noteNumber < 0 || noteNumber > 127) return;
noteOff_internal(noteNumber, 64);
}
+ @Override
public void setPolyPressure(int noteNumber, int pressure) {
noteNumber = restrict7Bit(noteNumber);
pressure = restrict7Bit(pressure);
@@ -680,12 +690,14 @@
}
}
+ @Override
public int getPolyPressure(int noteNumber) {
synchronized (control_mutex) {
return polypressure[noteNumber];
}
}
+ @Override
public void setChannelPressure(int pressure) {
pressure = restrict7Bit(pressure);
if (current_mixer != null)
@@ -701,6 +713,7 @@
}
}
+ @Override
public int getChannelPressure() {
synchronized (control_mutex) {
return channelpressure;
@@ -823,7 +836,7 @@
05 LFO Amplitude Depth | 00H..7FH | 0..100 percent | 0
*/
- List<ModelConnectionBlock> conns = new ArrayList<ModelConnectionBlock>();
+ List<ModelConnectionBlock> conns = new ArrayList<>();
for (int i = 0; i < destination.length; i++) {
int d = destination[i];
@@ -869,6 +882,7 @@
final double scale = (r / 64.0);
ModelTransform mt = new ModelTransform() {
double s = scale;
+ @Override
public double transform(double value) {
if (s < 1)
value = s + (value * (1.0 - s));
@@ -923,6 +937,7 @@
ModelTransform mt = new ModelTransform() {
double s = scale;
+ @Override
public double transform(double value) {
return -((5.0 / 12.0) / Math.log(10))
* Math.log(1 - value * s);
@@ -1055,6 +1070,7 @@
return (int)(keybasedcontroller_value[noteNumber][controller] * 128);
}
+ @Override
public void controlChange(int controller, int value) {
controller = restrict7Bit(controller);
value = restrict7Bit(value);
@@ -1241,6 +1257,7 @@
}
}
+ @Override
public int getController(int controller) {
synchronized (control_mutex) {
// Should only return lower 7 bits,
@@ -1259,10 +1276,12 @@
}
}
+ @Override
public void programChange(int program) {
programChange(bank, program);
}
+ @Override
public void programChange(int bank, int program) {
bank = restrict14Bit(bank);
program = restrict7Bit(program);
@@ -1277,12 +1296,14 @@
}
}
+ @Override
public int getProgram() {
synchronized (control_mutex) {
return program;
}
}
+ @Override
public void setPitchBend(int bend) {
bend = restrict14Bit(bend);
if (current_mixer != null)
@@ -1297,6 +1318,7 @@
}
}
+ @Override
public int getPitchBend() {
synchronized (control_mutex) {
return pitchbend;
@@ -1398,6 +1420,7 @@
voices[i].rpnChange(controller, val_i[0]);
}
+ @Override
public void resetAllControllers() {
resetAllControllers(false);
}
@@ -1463,6 +1486,7 @@
}
}
+ @Override
public void allNotesOff() {
if (current_mixer != null)
current_mixer.allNotesOff();
@@ -1475,6 +1499,7 @@
}
}
+ @Override
public void allSoundOff() {
if (current_mixer != null)
current_mixer.allSoundOff();
@@ -1485,10 +1510,12 @@
}
}
+ @Override
public boolean localControl(boolean on) {
return false;
}
+ @Override
public void setMono(boolean on) {
if (current_mixer != null)
current_mixer.setMono(on);
@@ -1498,12 +1525,14 @@
}
}
+ @Override
public boolean getMono() {
synchronized (control_mutex) {
return mono;
}
}
+ @Override
public void setOmni(boolean on) {
if (current_mixer != null)
current_mixer.setOmni(on);
@@ -1511,10 +1540,12 @@
// Omni is not supported by GM2
}
+ @Override
public boolean getOmni() {
return false;
}
+ @Override
public void setMute(boolean mute) {
if (current_mixer != null)
current_mixer.setMute(mute);
@@ -1526,12 +1557,14 @@
}
}
+ @Override
public boolean getMute() {
synchronized (control_mutex) {
return mute;
}
}
+ @Override
public void setSolo(boolean soloState) {
if (current_mixer != null)
current_mixer.setSolo(soloState);
@@ -1571,6 +1604,7 @@
}
}
+ @Override
public boolean getSolo() {
synchronized (control_mutex) {
return solo;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftChannelProxy.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftChannelProxy.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import javax.sound.midi.MidiChannel;
@@ -44,156 +45,182 @@
this.channel = channel;
}
+ @Override
public void allNotesOff() {
if (channel == null)
return;
channel.allNotesOff();
}
+ @Override
public void allSoundOff() {
if (channel == null)
return;
channel.allSoundOff();
}
+ @Override
public void controlChange(int controller, int value) {
if (channel == null)
return;
channel.controlChange(controller, value);
}
+ @Override
public int getChannelPressure() {
if (channel == null)
return 0;
return channel.getChannelPressure();
}
+ @Override
public int getController(int controller) {
if (channel == null)
return 0;
return channel.getController(controller);
}
+ @Override
public boolean getMono() {
if (channel == null)
return false;
return channel.getMono();
}
+ @Override
public boolean getMute() {
if (channel == null)
return false;
return channel.getMute();
}
+ @Override
public boolean getOmni() {
if (channel == null)
return false;
return channel.getOmni();
}
+ @Override
public int getPitchBend() {
if (channel == null)
return 8192;
return channel.getPitchBend();
}
+ @Override
public int getPolyPressure(int noteNumber) {
if (channel == null)
return 0;
return channel.getPolyPressure(noteNumber);
}
+ @Override
public int getProgram() {
if (channel == null)
return 0;
return channel.getProgram();
}
+ @Override
public boolean getSolo() {
if (channel == null)
return false;
return channel.getSolo();
}
+ @Override
public boolean localControl(boolean on) {
if (channel == null)
return false;
return channel.localControl(on);
}
+ @Override
public void noteOff(int noteNumber) {
if (channel == null)
return;
channel.noteOff(noteNumber);
}
+ @Override
public void noteOff(int noteNumber, int velocity) {
if (channel == null)
return;
channel.noteOff(noteNumber, velocity);
}
+ @Override
public void noteOn(int noteNumber, int velocity) {
if (channel == null)
return;
channel.noteOn(noteNumber, velocity);
}
+ @Override
public void programChange(int program) {
if (channel == null)
return;
channel.programChange(program);
}
+ @Override
public void programChange(int bank, int program) {
if (channel == null)
return;
channel.programChange(bank, program);
}
+ @Override
public void resetAllControllers() {
if (channel == null)
return;
channel.resetAllControllers();
}
+ @Override
public void setChannelPressure(int pressure) {
if (channel == null)
return;
channel.setChannelPressure(pressure);
}
+ @Override
public void setMono(boolean on) {
if (channel == null)
return;
channel.setMono(on);
}
+ @Override
public void setMute(boolean mute) {
if (channel == null)
return;
channel.setMute(mute);
}
+ @Override
public void setOmni(boolean on) {
if (channel == null)
return;
channel.setOmni(on);
}
+ @Override
public void setPitchBend(int bend) {
if (channel == null)
return;
channel.setPitchBend(bend);
}
+ @Override
public void setPolyPressure(int noteNumber, int pressure) {
if (channel == null)
return;
channel.setPolyPressure(noteNumber, pressure);
}
+ @Override
public void setSolo(boolean soloState) {
if (channel == null)
return;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftChorus.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftChorus.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.Arrays;
@@ -190,6 +191,7 @@
private float dirty_vdelay1R_reverbsendgain;
private float controlrate;
+ @Override
public void init(float samplerate, float controlrate) {
this.controlrate = controlrate;
vdelay1L = new LFODelay(samplerate, controlrate);
@@ -202,8 +204,9 @@
globalParameterControlChange(new int[]{0x01 * 128 + 0x02}, 0, 2);
}
+ @Override
public void globalParameterControlChange(int[] slothpath, long param,
- long value) {
+ long value) {
if (slothpath.length == 1) {
if (slothpath[0] == 0x01 * 128 + 0x02) {
if (param == 0) { // Chorus Type
@@ -271,6 +274,7 @@
}
}
+ @Override
public void processControlLogic() {
if (dirty) {
dirty = false;
@@ -286,6 +290,7 @@
}
double silentcounter = 1000;
+ @Override
public void processAudio() {
if (inputA.isSilent()) {
@@ -317,15 +322,18 @@
}
}
+ @Override
public void setInput(int pin, SoftAudioBuffer input) {
if (pin == 0)
inputA = input;
}
+ @Override
public void setMixMode(boolean mix) {
this.mix = mix;
}
+ @Override
public void setOutput(int pin, SoftAudioBuffer output) {
if (pin == 0)
left = output;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftControl.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftControl.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
@@ -32,5 +33,5 @@
*/
public interface SoftControl {
- public double[] get(int instance, String name);
+ double[] get(int instance, String name);
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftCubicResampler.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftCubicResampler.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
@@ -31,13 +32,15 @@
*/
public final class SoftCubicResampler extends SoftAbstractResampler {
+ @Override
public int getPadding() {
return 3;
}
+ @Override
public void interpolate(float[] in, float[] in_offset, float in_end,
- float[] startpitch, float pitchstep, float[] out, int[] out_offset,
- int out_end) {
+ float[] startpitch, float pitchstep, float[] out, int[] out_offset,
+ int out_end) {
float pitch = startpitch[0];
float ix = in_offset[0];
int ox = out_offset[0];
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftEnvelopeGenerator.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftEnvelopeGenerator.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
@@ -61,6 +62,7 @@
private final double[][] decay2 = new double[max_count][1];
private double control_time = 0;
+ @Override
public void reset() {
for (int i = 0; i < used_count; i++) {
stage[i] = 0;
@@ -80,11 +82,13 @@
used_count = 0;
}
+ @Override
public void init(SoftSynthesizer synth) {
control_time = 1.0 / synth.getControlRate();
processControlLogic();
}
+ @Override
public double[] get(int instance, String name) {
if (instance >= used_count)
used_count = instance + 1;
@@ -118,6 +122,7 @@
return null;
}
+ @Override
@SuppressWarnings("fallthrough")
public void processControlLogic() {
for (int i = 0; i < used_count; i++) {
@@ -295,6 +300,5 @@
break;
}
}
-
}
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftFilter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftFilter.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftInstrument.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftInstrument.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import javax.sound.midi.Instrument;
@@ -72,6 +73,7 @@
return ins;
}
+ @Override
public Object getData() {
return data;
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftJitterCorrector.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftJitterCorrector.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,13 +22,15 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStream;
+
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
/**
* A jitter corrector to be used with SoftAudioPusher.
@@ -124,6 +126,7 @@
Runnable runnable = new Runnable() {
+ @Override
public void run() {
AudioFormat format = stream.getFormat();
int bufflen = buffers[0].length;
@@ -220,6 +223,7 @@
thread.start();
}
+ @Override
public void close() throws IOException {
synchronized (this) {
active = false;
@@ -232,6 +236,7 @@
stream.close();
}
+ @Override
public int read() throws IOException {
byte[] b = new byte[1];
if (read(b) == -1)
@@ -244,6 +249,7 @@
bbuffer_pos = 0;
}
+ @Override
public int read(byte[] b, int off, int len) {
if (bbuffer == null)
fillBuffer();
@@ -263,6 +269,7 @@
return len;
}
+ @Override
public int available() {
return bbuffer.length - bbuffer_pos;
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLanczosResampler.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLanczosResampler.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
@@ -69,14 +70,16 @@
return w;
}
+ @Override
public int getPadding() // must be at least half of sinc_table_size
{
return sinc_table_size / 2 + 2;
}
+ @Override
public void interpolate(float[] in, float[] in_offset, float in_end,
- float[] startpitch, float pitchstep, float[] out, int[] out_offset,
- int out_end) {
+ float[] startpitch, float pitchstep, float[] out, int[] out_offset,
+ int out_end) {
float pitch = startpitch[0];
float ix = in_offset[0];
int ox = out_offset[0];
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLimiter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLimiter.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
@@ -43,10 +44,12 @@
SoftAudioBuffer bufferRout;
float controlrate;
+ @Override
public void init(float samplerate, float controlrate) {
this.controlrate = controlrate;
}
+ @Override
public void setInput(int pin, SoftAudioBuffer input) {
if (pin == 0)
bufferL = input;
@@ -54,6 +57,7 @@
bufferR = input;
}
+ @Override
public void setOutput(int pin, SoftAudioBuffer output) {
if (pin == 0)
bufferLout = output;
@@ -61,16 +65,19 @@
bufferRout = output;
}
+ @Override
public void setMixMode(boolean mix) {
this.mix = mix;
}
+ @Override
public void globalParameterControlChange(int[] slothpath, long param,
- long value) {
+ long value) {
}
double silentcounter = 0;
+ @Override
public void processAudio() {
if (this.bufferL.isSilent()
&& (this.bufferR == null || this.bufferR.isSilent())) {
@@ -186,6 +193,7 @@
gain = newgain;
}
+ @Override
public void processControlLogic() {
}
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLinearResampler.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLinearResampler.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
@@ -31,13 +32,15 @@
*/
public final class SoftLinearResampler extends SoftAbstractResampler {
+ @Override
public int getPadding() {
return 2;
}
+ @Override
public void interpolate(float[] in, float[] in_offset, float in_end,
- float[] startpitch, float pitchstep, float[] out, int[] out_offset,
- int out_end) {
+ float[] startpitch, float pitchstep, float[] out, int[] out_offset,
+ int out_end) {
float pitch = startpitch[0];
float ix = in_offset[0];
@@ -65,6 +68,5 @@
in_offset[0] = ix;
out_offset[0] = ox;
startpitch[0] = pitch;
-
}
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLinearResampler2.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLinearResampler2.java Fri Aug 26 10:14:15 2016 -0700
@@ -33,13 +33,15 @@
*/
public final class SoftLinearResampler2 extends SoftAbstractResampler {
+ @Override
public int getPadding() {
return 2;
}
+ @Override
public void interpolate(float[] in, float[] in_offset, float in_end,
- float[] startpitch, float pitchstep, float[] out, int[] out_offset,
- int out_end) {
+ float[] startpitch, float pitchstep, float[] out, int[] out_offset,
+ int out_end) {
float pitch = startpitch[0];
float ix = in_offset[0];
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLowFrequencyOscillator.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLowFrequencyOscillator.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
@@ -52,6 +53,7 @@
}
}
+ @Override
public void reset() {
for (int i = 0; i < used_count; i++) {
out[i][0] = 0;
@@ -67,6 +69,7 @@
used_count = 0;
}
+ @Override
public void init(SoftSynthesizer synth) {
control_time = 1.0 / synth.getControlRate();
sin_factor = control_time * 2 * Math.PI;
@@ -78,6 +81,7 @@
processControlLogic();
}
+ @Override
public void processControlLogic() {
for (int i = 0; i < used_count; i++) {
if (delay_counter[i] > 0) {
@@ -114,6 +118,7 @@
}
}
+ @Override
public double[] get(int instance, String name) {
if (instance >= used_count)
used_count = instance + 1;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMainMixer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMainMixer.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,15 +22,16 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
-import java.util.Map.Entry;
import javax.sound.midi.MidiMessage;
import javax.sound.midi.Patch;
@@ -74,26 +75,26 @@
private long sample_pos = 0;
boolean readfully = true;
private final Object control_mutex;
- private SoftSynthesizer synth;
+ private final SoftSynthesizer synth;
private float samplerate = 44100;
private int nrofchannels = 2;
private SoftVoice[] voicestatus = null;
- private SoftAudioBuffer[] buffers;
- private SoftReverb reverb;
- private SoftAudioProcessor chorus;
- private SoftAudioProcessor agc;
+ private final SoftAudioBuffer[] buffers;
+ private final SoftReverb reverb;
+ private final SoftAudioProcessor chorus;
+ private final SoftAudioProcessor agc;
private long msec_buffer_len = 0;
private int buffer_len = 0;
- TreeMap<Long, Object> midimessages = new TreeMap<Long, Object>();
+ TreeMap<Long, Object> midimessages = new TreeMap<>();
private int delay_midievent = 0;
private int max_delay_midievent = 0;
double last_volume_left = 1.0;
double last_volume_right = 1.0;
- private double[] co_master_balance = new double[1];
- private double[] co_master_volume = new double[1];
- private double[] co_master_coarse_tuning = new double[1];
- private double[] co_master_fine_tuning = new double[1];
- private AudioInputStream ais;
+ private final double[] co_master_balance = new double[1];
+ private final double[] co_master_volume = new double[1];
+ private final double[] co_master_coarse_tuning = new double[1];
+ private final double[] co_master_fine_tuning = new double[1];
+ private final AudioInputStream ais;
private Set<SoftChannelMixerContainer> registeredMixers = null;
private Set<ModelChannelMixer> stoppedMixers = null;
private SoftChannelMixerContainer[] cur_registeredMixers = null;
@@ -104,6 +105,7 @@
double[] coarse_tuning = co_master_coarse_tuning;
double[] fine_tuning = co_master_fine_tuning;
+ @Override
public double[] get(int instance, String name) {
if (name == null)
return null;
@@ -777,13 +779,13 @@
public void stopMixer(ModelChannelMixer mixer) {
if (stoppedMixers == null)
- stoppedMixers = new HashSet<ModelChannelMixer>();
+ stoppedMixers = new HashSet<>();
stoppedMixers.add(mixer);
}
public void registerMixer(ModelChannelMixer mixer) {
if (registeredMixers == null)
- registeredMixers = new HashSet<SoftChannelMixerContainer>();
+ registeredMixers = new HashSet<>();
SoftChannelMixerContainer mixercontainer = new SoftChannelMixerContainer();
mixercontainer.buffers = new SoftAudioBuffer[6];
for (int i = 0; i < mixercontainer.buffers.length; i++) {
@@ -883,6 +885,7 @@
bbuffer_pos = 0;
}
+ @Override
public int read(byte[] b, int off, int len) {
int bbuffer_len = bbuffer.length;
int offlen = off + len;
@@ -903,6 +906,7 @@
return len;
}
+ @Override
public int read() throws IOException {
int ret = read(single);
if (ret == -1)
@@ -910,10 +914,12 @@
return single[0] & 0xFF;
}
+ @Override
public int available() {
return bbuffer.length - bbuffer_pos;
}
+ @Override
public void close() {
SoftMainMixer.this.synth.close();
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMidiAudioFileReader.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMidiAudioFileReader.java Fri Aug 26 10:14:15 2016 -0700
@@ -63,7 +63,7 @@
private AudioInputStream getAudioInputStream(final Sequence seq)
throws InvalidMidiDataException {
- AudioSynthesizer synth = (AudioSynthesizer) new SoftSynthesizer();
+ AudioSynthesizer synth = new SoftSynthesizer();
AudioInputStream stream;
Receiver recv;
try {
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingClip.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingClip.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.ByteArrayOutputStream;
@@ -52,6 +53,7 @@
private final InputStream datastream = new InputStream() {
+ @Override
public int read() throws IOException {
byte[] b = new byte[1];
int ret = read(b);
@@ -60,6 +62,7 @@
return b[0] & 0xFF;
}
+ @Override
public int read(byte[] b, int off, int len) throws IOException {
if (_loopcount != 0) {
@@ -166,6 +169,7 @@
super(mixer, info);
}
+ @Override
protected void processControlLogic() {
_rightgain = rightgain;
@@ -203,6 +207,7 @@
}
+ @Override
protected void processAudioLogic(SoftAudioBuffer[] buffers) {
if (_active) {
float[] left = buffers[SoftMixingMainMixer.CHANNEL_LEFT].array();
@@ -273,15 +278,18 @@
}
}
+ @Override
public int getFrameLength() {
return bufferSize / format.getFrameSize();
}
+ @Override
public long getMicrosecondLength() {
return (long) (getFrameLength() * (1000000.0 / (double) getFormat()
.getSampleRate()));
}
+ @Override
public void loop(int count) {
LineEvent event = null;
@@ -302,8 +310,9 @@
}
+ @Override
public void open(AudioInputStream stream) throws LineUnavailableException,
- IOException {
+ IOException {
if (isOpen()) {
throw new IllegalStateException("Clip is already open with format "
+ getFormat() + " and frame lengh of " + getFrameLength());
@@ -342,6 +351,7 @@
}
+ @Override
public void open(AudioFormat format, byte[] data, int offset, int bufferSize)
throws LineUnavailableException {
synchronized (control_mutex) {
@@ -385,6 +395,7 @@
}
+ @Override
public void setFramePosition(int frames) {
synchronized (control_mutex) {
frameposition_sg = true;
@@ -392,6 +403,7 @@
}
}
+ @Override
public void setLoopPoints(int start, int end) {
synchronized (control_mutex) {
if (end != -1) {
@@ -414,60 +426,73 @@
}
}
+ @Override
public void setMicrosecondPosition(long microseconds) {
setFramePosition((int) (microseconds * (((double) getFormat()
.getSampleRate()) / 1000000.0)));
}
+ @Override
public int available() {
return 0;
}
+ @Override
public void drain() {
}
+ @Override
public void flush() {
}
+ @Override
public int getBufferSize() {
return bufferSize;
}
+ @Override
public AudioFormat getFormat() {
return format;
}
+ @Override
public int getFramePosition() {
synchronized (control_mutex) {
return frameposition;
}
}
+ @Override
public float getLevel() {
return AudioSystem.NOT_SPECIFIED;
}
+ @Override
public long getLongFramePosition() {
return getFramePosition();
}
+ @Override
public long getMicrosecondPosition() {
return (long) (getFramePosition() * (1000000.0 / (double) getFormat()
.getSampleRate()));
}
+ @Override
public boolean isActive() {
synchronized (control_mutex) {
return active;
}
}
+ @Override
public boolean isRunning() {
synchronized (control_mutex) {
return active;
}
}
+ @Override
public void start() {
LineEvent event = null;
@@ -488,6 +513,7 @@
sendEvent(event);
}
+ @Override
public void stop() {
LineEvent event = null;
@@ -506,6 +532,7 @@
sendEvent(event);
}
+ @Override
public void close() {
LineEvent event = null;
@@ -526,10 +553,12 @@
}
+ @Override
public boolean isOpen() {
return open;
}
+ @Override
public void open() throws LineUnavailableException {
if (data == null) {
throw new IllegalArgumentException(
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingDataLine.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingDataLine.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.IOException;
@@ -33,11 +34,11 @@
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.BooleanControl;
import javax.sound.sampled.Control;
+import javax.sound.sampled.Control.Type;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
-import javax.sound.sampled.Control.Type;
/**
* General software mixing line.
@@ -130,22 +131,27 @@
ibuffer_len = buffer_len;
}
+ @Override
public int available() throws IOException {
return 0;
}
+ @Override
public void close() throws IOException {
ais.close();
}
+ @Override
public AudioFormat getFormat() {
return targetFormat;
}
+ @Override
public long getFrameLength() {
return AudioSystem.NOT_SPECIFIED; // ais.getFrameLength();
}
+ @Override
public void mark(int readlimit) {
ais.mark((int) (readlimit * pitch[0]));
mark_ibuffer_index = ibuffer_index;
@@ -162,6 +168,7 @@
}
}
+ @Override
public boolean markSupported() {
return ais.markSupported();
}
@@ -206,6 +213,7 @@
}
+ @Override
public int read(float[] b, int off, int len) throws IOException {
if (cbuffer == null || cbuffer[0].length < len / nrofchannels) {
@@ -255,6 +263,7 @@
return len - remain * nrofchannels;
}
+ @Override
public void reset() throws IOException {
ais.reset();
if (mark_ibuffer == null)
@@ -271,6 +280,7 @@
}
+ @Override
public long skip(long len) throws IOException {
if (len > 0)
return 0;
@@ -302,6 +312,7 @@
-1, 0.0f, "dB", "Minimum", "", "Maximum");
}
+ @Override
public void setValue(float newValue) {
super.setValue(newValue);
calcVolume();
@@ -314,6 +325,7 @@
super(BooleanControl.Type.MUTE, false, "True", "False");
}
+ @Override
public void setValue(boolean newValue) {
super.setValue(newValue);
calcVolume();
@@ -326,6 +338,7 @@
super(BooleanControl.Type.APPLY_REVERB, false, "True", "False");
}
+ @Override
public void setValue(boolean newValue) {
super.setValue(newValue);
calcVolume();
@@ -340,6 +353,7 @@
0.0f, "", "Left", "Center", "Right");
}
+ @Override
public void setValue(float newValue) {
super.setValue(newValue);
calcVolume();
@@ -354,11 +368,13 @@
0.0f, "", "Left", "Center", "Right");
}
+ @Override
public void setValue(float newValue) {
super.setValue(newValue);
balance_control.setValue(newValue);
}
+ @Override
public float getValue() {
return balance_control.getValue();
}
@@ -372,6 +388,7 @@
-1, -80f, "dB", "Minimum", "", "Maximum");
}
+ @Override
public void setValue(float newValue) {
super.setValue(newValue);
balance_control.setValue(newValue);
@@ -386,6 +403,7 @@
"Minimum", "", "Maximum");
}
+ @Override
public void setValue(float newValue) {
super.setValue(newValue);
balance_control.setValue(newValue);
@@ -417,7 +435,7 @@
float eff2gain = 0;
- List<LineListener> listeners = new ArrayList<LineListener>();
+ List<LineListener> listeners = new ArrayList<>();
final Object control_mutex;
@@ -476,22 +494,26 @@
}
}
+ @Override
public final void addLineListener(LineListener listener) {
synchronized (control_mutex) {
listeners.add(listener);
}
}
+ @Override
public final void removeLineListener(LineListener listener) {
synchronized (control_mutex) {
listeners.add(listener);
}
}
+ @Override
public final javax.sound.sampled.Line.Info getLineInfo() {
return info;
}
+ @Override
public final Control getControl(Type control) {
if (control != null) {
for (int i = 0; i < controls.length; i++) {
@@ -504,10 +526,12 @@
+ control);
}
+ @Override
public final Control[] getControls() {
return Arrays.copyOf(controls, controls.length);
}
+ @Override
public final boolean isControlSupported(Type control) {
if (control != null) {
for (int i = 0; i < controls.length; i++) {
@@ -518,5 +542,4 @@
}
return false;
}
-
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingMainMixer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingMainMixer.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.IOException;
@@ -79,7 +80,7 @@
private final Object control_mutex;
- private final List<SoftMixingDataLine> openLinesList = new ArrayList<SoftMixingDataLine>();
+ private final List<SoftMixingDataLine> openLinesList = new ArrayList<>();
private SoftMixingDataLine[] openLines = new SoftMixingDataLine[0];
@@ -184,6 +185,7 @@
bbuffer_pos = 0;
}
+ @Override
public int read(byte[] b, int off, int len) {
int bbuffer_len = bbuffer.length;
int offlen = off + len;
@@ -200,6 +202,7 @@
return len;
}
+ @Override
public int read() throws IOException {
int ret = read(single);
if (ret == -1)
@@ -207,10 +210,12 @@
return single[0] & 0xFF;
}
+ @Override
public int available() {
return bbuffer.length - bbuffer_pos;
}
+ @Override
public void close() {
SoftMixingMainMixer.this.mixer.close();
}
@@ -239,14 +244,12 @@
if (mixer.implicitOpen)
mixer.close();
}
-
}
public SoftMixingDataLine[] getOpenLines() {
synchronized (control_mutex) {
return openLines;
}
-
}
public void close() {
@@ -255,5 +258,4 @@
openLines[i].close();
}
}
-
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingMixer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingMixer.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.IOException;
@@ -29,10 +30,12 @@
import java.util.List;
import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioFormat.Encoding;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.Control;
+import javax.sound.sampled.Control.Type;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.Line;
import javax.sound.sampled.LineEvent;
@@ -40,11 +43,9 @@
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.SourceDataLine;
-import javax.sound.sampled.AudioFormat.Encoding;
-import javax.sound.sampled.Control.Type;
/**
- * Software audio mixer
+ * Software audio mixer.
*
* @author Karl Helgason
*/
@@ -88,7 +89,7 @@
private final boolean jitter_correction = false;
- private final List<LineListener> listeners = new ArrayList<LineListener>();
+ private final List<LineListener> listeners = new ArrayList<>();
private final javax.sound.sampled.Line.Info[] sourceLineInfo;
@@ -96,7 +97,7 @@
sourceLineInfo = new javax.sound.sampled.Line.Info[2];
- ArrayList<AudioFormat> formats = new ArrayList<AudioFormat>();
+ ArrayList<AudioFormat> formats = new ArrayList<>();
for (int channels = 1; channels <= 2; channels++) {
formats.add(new AudioFormat(Encoding.PCM_SIGNED,
AudioSystem.NOT_SPECIFIED, 8, channels, channels,
@@ -140,6 +141,7 @@
AudioSystem.NOT_SPECIFIED, AudioSystem.NOT_SPECIFIED);
}
+ @Override
public Line getLine(Line.Info info) throws LineUnavailableException {
if (!isLineSupported(info))
@@ -155,6 +157,7 @@
throw new IllegalArgumentException("Line unsupported: " + info);
}
+ @Override
public int getMaxLines(Line.Info info) {
if (info.getLineClass() == SourceDataLine.class)
return AudioSystem.NOT_SPECIFIED;
@@ -163,10 +166,12 @@
return 0;
}
+ @Override
public javax.sound.sampled.Mixer.Info getMixerInfo() {
return info;
}
+ @Override
public javax.sound.sampled.Line.Info[] getSourceLineInfo() {
Line.Info[] localArray = new Line.Info[sourceLineInfo.length];
System.arraycopy(sourceLineInfo, 0, localArray, 0,
@@ -174,10 +179,11 @@
return localArray;
}
+ @Override
public javax.sound.sampled.Line.Info[] getSourceLineInfo(
javax.sound.sampled.Line.Info info) {
int i;
- ArrayList<javax.sound.sampled.Line.Info> infos = new ArrayList<javax.sound.sampled.Line.Info>();
+ ArrayList<javax.sound.sampled.Line.Info> infos = new ArrayList<>();
for (i = 0; i < sourceLineInfo.length; i++) {
if (info.matches(sourceLineInfo[i])) {
@@ -187,6 +193,7 @@
return infos.toArray(new Line.Info[infos.size()]);
}
+ @Override
public Line[] getSourceLines() {
Line[] localLines;
@@ -207,19 +214,23 @@
return localLines;
}
+ @Override
public javax.sound.sampled.Line.Info[] getTargetLineInfo() {
return new javax.sound.sampled.Line.Info[0];
}
+ @Override
public javax.sound.sampled.Line.Info[] getTargetLineInfo(
javax.sound.sampled.Line.Info info) {
return new javax.sound.sampled.Line.Info[0];
}
+ @Override
public Line[] getTargetLines() {
return new Line[0];
}
+ @Override
public boolean isLineSupported(javax.sound.sampled.Line.Info info) {
if (info != null) {
for (int i = 0; i < sourceLineInfo.length; i++) {
@@ -231,20 +242,24 @@
return false;
}
+ @Override
public boolean isSynchronizationSupported(Line[] lines, boolean maintainSync) {
return false;
}
+ @Override
public void synchronize(Line[] lines, boolean maintainSync) {
throw new IllegalArgumentException(
"Synchronization not supported by this mixer.");
}
+ @Override
public void unsynchronize(Line[] lines) {
throw new IllegalArgumentException(
"Synchronization not supported by this mixer.");
}
+ @Override
public void addLineListener(LineListener listener) {
synchronized (control_mutex) {
listeners.add(listener);
@@ -261,6 +276,7 @@
}
}
+ @Override
public void close() {
if (!isOpen())
return;
@@ -308,29 +324,35 @@
}
+ @Override
public Control getControl(Type control) {
throw new IllegalArgumentException("Unsupported control type : "
+ control);
}
+ @Override
public Control[] getControls() {
return new Control[0];
}
+ @Override
public javax.sound.sampled.Line.Info getLineInfo() {
return new Line.Info(Mixer.class);
}
+ @Override
public boolean isControlSupported(Type control) {
return false;
}
+ @Override
public boolean isOpen() {
synchronized (control_mutex) {
return open;
}
}
+ @Override
public void open() throws LineUnavailableException {
if (isOpen()) {
implicitOpen = false;
@@ -498,6 +520,7 @@
}
+ @Override
public void removeLineListener(LineListener listener) {
synchronized (control_mutex) {
listeners.remove(listener);
@@ -525,5 +548,4 @@
return null;
return mainmixer;
}
-
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingMixerProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingMixerProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import javax.sound.sampled.Mixer;
@@ -29,7 +30,7 @@
import javax.sound.sampled.spi.MixerProvider;
/**
- * Provider for software audio mixer
+ * Provider for software audio mixer.
*
* @author Karl Helgason
*/
@@ -41,6 +42,7 @@
static final Object mutex = new Object();
+ @Override
public Mixer getMixer(Info info) {
if (!(info == null || info == SoftMixingMixer.info)) {
throw new IllegalArgumentException("Mixer " + info.toString()
@@ -56,11 +58,10 @@
globalmixer = new SoftMixingMixer();
return globalmixer;
}
-
}
+ @Override
public Info[] getMixerInfo() {
return new Info[] { SoftMixingMixer.info };
}
-
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingSourceDataLine.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingSourceDataLine.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.IOException;
@@ -76,30 +77,37 @@
this.ais = ais;
}
+ @Override
public int available() throws IOException {
return ais.available();
}
+ @Override
public void close() throws IOException {
ais.close();
}
+ @Override
public AudioFormat getFormat() {
return ais.getFormat();
}
+ @Override
public long getFrameLength() {
return ais.getFrameLength();
}
+ @Override
public void mark(int readlimit) {
ais.mark(readlimit);
}
+ @Override
public boolean markSupported() {
return ais.markSupported();
}
+ @Override
public int read(float[] b, int off, int len) throws IOException {
int avail = available();
if (len > avail) {
@@ -110,10 +118,12 @@
return ais.read(b, off, len);
}
+ @Override
public void reset() throws IOException {
ais.reset();
}
+ @Override
public long skip(long len) throws IOException {
return ais.skip(len);
}
@@ -124,6 +134,7 @@
super(mixer, info);
}
+ @Override
public int write(byte[] b, int off, int len) {
if (!isOpen())
return 0;
@@ -202,6 +213,7 @@
private float _eff2gain;
+ @Override
protected void processControlLogic() {
_active = active;
_rightgain = rightgain;
@@ -210,6 +222,7 @@
_eff2gain = eff2gain;
}
+ @Override
protected void processAudioLogic(SoftAudioBuffer[] buffers) {
if (_active) {
float[] left = buffers[SoftMixingMainMixer.CHANNEL_LEFT].array();
@@ -274,10 +287,12 @@
}
}
+ @Override
public void open() throws LineUnavailableException {
open(format);
}
+ @Override
public void open(AudioFormat format) throws LineUnavailableException {
if (bufferSize == -1)
bufferSize = ((int) (format.getFrameRate() / 2))
@@ -285,6 +300,7 @@
open(format, bufferSize);
}
+ @Override
public void open(AudioFormat format, int bufferSize)
throws LineUnavailableException {
@@ -323,6 +339,7 @@
InputStream cycling_inputstream = new InputStream() {
+ @Override
public int read() throws IOException {
byte[] b = new byte[1];
int ret = read(b);
@@ -331,12 +348,14 @@
return b[0] & 0xFF;
}
+ @Override
public int available() throws IOException {
synchronized (cycling_buffer) {
return cycling_avail;
}
}
+ @Override
public int read(byte[] b, int off, int len)
throws IOException {
@@ -387,12 +406,14 @@
}
+ @Override
public int available() {
synchronized (cycling_buffer) {
return cycling_buffer.length - cycling_avail;
}
}
+ @Override
public void drain() {
while (true) {
int avail;
@@ -409,6 +430,7 @@
}
}
+ @Override
public void flush() {
synchronized (cycling_buffer) {
cycling_read_pos = 0;
@@ -417,49 +439,58 @@
}
}
+ @Override
public int getBufferSize() {
synchronized (control_mutex) {
return bufferSize;
}
}
+ @Override
public AudioFormat getFormat() {
synchronized (control_mutex) {
return format;
}
}
+ @Override
public int getFramePosition() {
return (int) getLongFramePosition();
}
+ @Override
public float getLevel() {
return AudioSystem.NOT_SPECIFIED;
}
+ @Override
public long getLongFramePosition() {
synchronized (cycling_buffer) {
return cycling_framepos;
}
}
+ @Override
public long getMicrosecondPosition() {
return (long) (getLongFramePosition() * (1000000.0 / (double) getFormat()
.getSampleRate()));
}
+ @Override
public boolean isActive() {
synchronized (control_mutex) {
return active;
}
}
+ @Override
public boolean isRunning() {
synchronized (control_mutex) {
return active;
}
}
+ @Override
public void start() {
LineEvent event = null;
@@ -478,6 +509,7 @@
sendEvent(event);
}
+ @Override
public void stop() {
LineEvent event = null;
@@ -495,6 +527,7 @@
sendEvent(event);
}
+ @Override
public void close() {
LineEvent event = null;
@@ -516,10 +549,10 @@
}
+ @Override
public boolean isOpen() {
synchronized (control_mutex) {
return open;
}
}
-
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftPerformer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftPerformer.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.ArrayList;
@@ -92,6 +93,7 @@
ModelStandardTransform.TRANSFORM_LINEAR),
new ModelSource(new ModelIdentifier("midi_rpn", "0"),
new ModelTransform() {
+ @Override
public double transform(double value) {
int v = (int) (value * 16384.0);
int msb = v >> 7;
@@ -309,21 +311,22 @@
public ModelPerformer performer;
public ModelConnectionBlock[] connections;
public ModelOscillator[] oscillators;
- public Map<Integer, int[]> midi_rpn_connections = new HashMap<Integer, int[]>();
- public Map<Integer, int[]> midi_nrpn_connections = new HashMap<Integer, int[]>();
+ public Map<Integer, int[]> midi_rpn_connections = new HashMap<>();
+ public Map<Integer, int[]> midi_nrpn_connections = new HashMap<>();
public int[][] midi_ctrl_connections;
public int[][] midi_connections;
public int[] ctrl_connections;
- private List<Integer> ctrl_connections_list = new ArrayList<Integer>();
+ private final List<Integer> ctrl_connections_list = new ArrayList<>();
private static class KeySortComparator implements Comparator<ModelSource> {
+ @Override
public int compare(ModelSource o1, ModelSource o2) {
return o1.getIdentifier().toString().compareTo(
o2.getIdentifier().toString());
}
}
- private static KeySortComparator keySortComparator = new KeySortComparator();
+ private static final KeySortComparator keySortComparator = new KeySortComparator();
private String extractKeys(ModelConnectionBlock conn) {
StringBuilder sb = new StringBuilder();
@@ -474,9 +477,9 @@
exclusiveClass = performer.getExclusiveClass();
selfNonExclusive = performer.isSelfNonExclusive();
- Map<String, ModelConnectionBlock> connmap = new HashMap<String, ModelConnectionBlock>();
+ Map<String, ModelConnectionBlock> connmap = new HashMap<>();
- List<ModelConnectionBlock> performer_connections = new ArrayList<ModelConnectionBlock>();
+ List<ModelConnectionBlock> performer_connections = new ArrayList<>();
performer_connections.addAll(performer.getConnectionBlocks());
if (performer.isDefaultConnectionsEnabled()) {
@@ -649,6 +652,7 @@
new ModelSource(new ModelIdentifier("midi_cc", "77"),
new ModelTransform() {
double s = scale;
+ @Override
public double transform(double value) {
value = value * 2 - 1;
value *= 600;
@@ -687,7 +691,7 @@
connmap.put(extractKeys(connection), connection);
// seperate connection blocks : Init time, Midi Time, Midi/Control Time,
// Control Time
- List<ModelConnectionBlock> connections = new ArrayList<ModelConnectionBlock>();
+ List<ModelConnectionBlock> connections = new ArrayList<>();
midi_ctrl_connections = new int[128][];
for (int i = 0; i < midi_ctrl_connections.length; i++) {
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftPointResampler.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftPointResampler.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
@@ -31,13 +32,15 @@
*/
public final class SoftPointResampler extends SoftAbstractResampler {
+ @Override
public int getPadding() {
return 100;
}
+ @Override
public void interpolate(float[] in, float[] in_offset, float in_end,
- float[] startpitch, float pitchstep, float[] out, int[] out_offset,
- int out_end) {
+ float[] startpitch, float pitchstep, float[] out, int[] out_offset,
+ int out_end) {
float pitch = startpitch[0];
float ix = in_offset[0];
int ox = out_offset[0];
@@ -58,6 +61,5 @@
in_offset[0] = ix;
out_offset[0] = ox;
startpitch[0] = pitch;
-
}
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftProcess.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftProcess.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,20 +22,22 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
- * Control signal processor interface
+ * Control signal processor interface.
*
* @author Karl Helgason
*/
public interface SoftProcess extends SoftControl {
- public void init(SoftSynthesizer synth);
+ void init(SoftSynthesizer synth);
- public double[] get(int instance, String name);
+ @Override
+ double[] get(int instance, String name);
- public void processControlLogic();
+ void processControlLogic();
- public void reset();
+ void reset();
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftReceiver.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftReceiver.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.TreeMap;
@@ -52,10 +53,12 @@
this.midimessages = mainmixer.midimessages;
}
+ @Override
public MidiDevice getMidiDevice() {
return synth;
}
+ @Override
public void send(MidiMessage message, long timeStamp) {
synchronized (control_mutex) {
@@ -80,6 +83,7 @@
}
}
+ @Override
public void close() {
synchronized (control_mutex) {
open = false;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftResampler.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftResampler.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
@@ -31,5 +32,5 @@
*/
public interface SoftResampler {
- public SoftResamplerStreamer openStreamer();
+ SoftResamplerStreamer openStreamer();
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftResamplerStreamer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftResamplerStreamer.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.IOException;
@@ -33,6 +34,5 @@
*/
public interface SoftResamplerStreamer extends ModelOscillatorStream {
- public void open(ModelWavetable osc, float outputsamplerate)
- throws IOException;
+ void open(ModelWavetable osc, float outputsamplerate) throws IOException;
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftReverb.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftReverb.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.Arrays;
@@ -210,6 +211,7 @@
private float samplerate;
private boolean light = true;
+ @Override
public void init(float samplerate, float controlrate) {
this.samplerate = samplerate;
@@ -260,11 +262,13 @@
}
+ @Override
public void setInput(int pin, SoftAudioBuffer input) {
if (pin == 0)
inputA = input;
}
+ @Override
public void setOutput(int pin, SoftAudioBuffer output) {
if (pin == 0)
left = output;
@@ -272,12 +276,14 @@
right = output;
}
+ @Override
public void setMixMode(boolean mix) {
this.mix = mix;
}
private boolean silent = true;
+ @Override
public void processAudio() {
boolean silent_input = this.inputA.isSilent();
if(!silent_input)
@@ -330,7 +336,7 @@
for (int i = 4; i < combL.length-2; i+=2)
combL[i].processMix(input, pre1);
- combL[3].processReplace(input, pre2);;
+ combL[3].processReplace(input, pre2);
for (int i = 5; i < combL.length-2; i+=2)
combL[i].processMix(input, pre2);
@@ -376,11 +382,6 @@
combL[i].processMix(out, left);
}
-
-
-
-
-
if (silent_input) {
silent = true;
for (int i = 0; i < numsamples; i++)
@@ -396,8 +397,9 @@
}
+ @Override
public void globalParameterControlChange(int[] slothpath, long param,
- long value) {
+ long value) {
if (slothpath.length == 1) {
if (slothpath[0] == 0x01 * 128 + 0x01) {
@@ -463,6 +465,7 @@
}
}
+ @Override
public void processControlLogic() {
if (dirty) {
dirty = false;
@@ -504,7 +507,6 @@
combL[i].setDamp(damp);
combR[i].setDamp(damp);
}
-
}
public void setLightMode(boolean light)
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftShortMessage.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftShortMessage.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import javax.sound.midi.InvalidMidiDataException;
@@ -36,16 +37,19 @@
int channel = 0;
+ @Override
public int getChannel() {
return channel;
}
+ @Override
public void setMessage(int command, int channel, int data1, int data2)
throws InvalidMidiDataException {
this.channel = channel;
super.setMessage(command, channel & 0xF, data1, data2);
}
+ @Override
public Object clone() {
SoftShortMessage clone = new SoftShortMessage();
try {
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftSincResampler.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftSincResampler.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
@@ -76,14 +77,16 @@
return w;
}
+ @Override
public int getPadding() // must be at least half of sinc_table_size
{
return sinc_table_size / 2 + 2;
}
+ @Override
public void interpolate(float[] in, float[] in_offset, float in_end,
- float[] startpitch, float pitchstep, float[] out, int[] out_offset,
- int out_end) {
+ float[] startpitch, float pitchstep, float[] out, int[] out_offset,
+ int out_end) {
float pitch = startpitch[0];
float ix = in_offset[0];
int ox = out_offset[0];
@@ -134,6 +137,5 @@
in_offset[0] = ix;
out_offset[0] = ox;
startpitch[0] = pitch;
-
}
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftSynthesizer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftSynthesizer.java Fri Aug 26 10:14:15 2016 -0700
@@ -78,16 +78,17 @@
public SourceDataLine sourceDataLine = null;
public volatile long silent_samples = 0;
private int framesize = 0;
- private WeakReference<AudioInputStream> weak_stream_link;
- private AudioFloatConverter converter;
+ private final WeakReference<AudioInputStream> weak_stream_link;
+ private final AudioFloatConverter converter;
private float[] silentbuffer = null;
- private int samplesize;
+ private final int samplesize;
public void setInputStream(AudioInputStream stream)
{
this.stream = stream;
}
+ @Override
public int available() throws IOException {
AudioInputStream local_stream = stream;
if(local_stream != null)
@@ -95,6 +96,7 @@
return 0;
}
+ @Override
public int read() throws IOException {
byte[] b = new byte[1];
if (read(b) == -1)
@@ -102,6 +104,7 @@
return b[0] & 0xFF;
}
+ @Override
public int read(byte[] b, int off, int len) throws IOException {
AudioInputStream local_stream = stream;
if(local_stream != null)
@@ -123,6 +126,7 @@
SoftAudioPusher _pusher = pusher;
AudioInputStream _jitter_stream = jitter_stream;
SourceDataLine _sourceDataLine = sourceDataLine;
+ @Override
public void run()
{
_pusher.stop();
@@ -147,7 +151,7 @@
public WeakAudioStream(AudioInputStream stream) {
this.stream = stream;
- weak_stream_link = new WeakReference<AudioInputStream>(stream);
+ weak_stream_link = new WeakReference<>(stream);
converter = AudioFloatConverter.getConverter(stream.getFormat());
samplesize = stream.getFormat().getFrameSize() / stream.getFormat().getChannels();
framesize = stream.getFormat().getFrameSize();
@@ -158,6 +162,7 @@
return new AudioInputStream(this, stream.getFormat(), AudioSystem.NOT_SPECIFIED);
}
+ @Override
public void close() throws IOException
{
AudioInputStream astream = weak_stream_link.get();
@@ -233,14 +238,10 @@
private SoftMainMixer mainmixer;
private SoftVoice[] voices;
- private Map<String, SoftTuning> tunings
- = new HashMap<String, SoftTuning>();
- private Map<String, SoftInstrument> inslist
- = new HashMap<String, SoftInstrument>();
- private Map<String, ModelInstrument> loadedlist
- = new HashMap<String, ModelInstrument>();
-
- private ArrayList<Receiver> recvslist = new ArrayList<Receiver>();
+ private final Map<String, SoftTuning> tunings = new HashMap<>();
+ private final Map<String, SoftInstrument> inslist = new HashMap<>();
+ private final Map<String, ModelInstrument> loadedlist = new HashMap<>();
+ private final ArrayList<Receiver> recvslist = new ArrayList<>();
private void getBuffers(ModelInstrument instrument,
List<ModelByteBuffer> buffers) {
@@ -264,7 +265,7 @@
private boolean loadSamples(List<ModelInstrument> instruments) {
if (largemode)
return true;
- List<ModelByteBuffer> buffers = new ArrayList<ModelByteBuffer>();
+ List<ModelByteBuffer> buffers = new ArrayList<>();
for (ModelInstrument instrument : instruments)
getBuffers(instrument, buffers);
try {
@@ -485,24 +486,28 @@
return tuning;
}
+ @Override
public long getLatency() {
synchronized (control_mutex) {
return latency;
}
}
+ @Override
public AudioFormat getFormat() {
synchronized (control_mutex) {
return format;
}
}
+ @Override
public int getMaxPolyphony() {
synchronized (control_mutex) {
return maxpoly;
}
}
+ @Override
public MidiChannel[] getChannels() {
synchronized (control_mutex) {
@@ -525,6 +530,7 @@
}
}
+ @Override
public VoiceStatus[] getVoiceStatus() {
if (!isOpen()) {
VoiceStatus[] tempVoiceStatusArray
@@ -559,6 +565,7 @@
}
}
+ @Override
public boolean isSoundbankSupported(Soundbank soundbank) {
for (Instrument ins: soundbank.getInstruments())
if (!(ins instanceof ModelInstrument))
@@ -566,16 +573,18 @@
return true;
}
+ @Override
public boolean loadInstrument(Instrument instrument) {
if (instrument == null || (!(instrument instanceof ModelInstrument))) {
throw new IllegalArgumentException("Unsupported instrument: " +
instrument);
}
- List<ModelInstrument> instruments = new ArrayList<ModelInstrument>();
+ List<ModelInstrument> instruments = new ArrayList<>();
instruments.add((ModelInstrument)instrument);
return loadInstruments(instruments);
}
+ @Override
public void unloadInstrument(Instrument instrument) {
if (instrument == null || (!(instrument instanceof ModelInstrument))) {
throw new IllegalArgumentException("Unsupported instrument: " +
@@ -596,6 +605,7 @@
}
}
+ @Override
public boolean remapInstrument(Instrument from, Instrument to) {
if (from == null)
@@ -623,15 +633,16 @@
}
}
+ @Override
public Soundbank getDefaultSoundbank() {
synchronized (SoftSynthesizer.class) {
if (defaultSoundBank != null)
return defaultSoundBank;
- List<PrivilegedAction<InputStream>> actions =
- new ArrayList<PrivilegedAction<InputStream>>();
+ List<PrivilegedAction<InputStream>> actions = new ArrayList<>();
actions.add(new PrivilegedAction<InputStream>() {
+ @Override
public InputStream run() {
File javahome = new File(System.getProperties()
.getProperty("java.home"));
@@ -667,6 +678,7 @@
});
actions.add(new PrivilegedAction<InputStream>() {
+ @Override
public InputStream run() {
if (System.getProperties().getProperty("os.name")
.startsWith("Linux")) {
@@ -701,6 +713,7 @@
});
actions.add(new PrivilegedAction<InputStream>() {
+ @Override
public InputStream run() {
if (System.getProperties().getProperty("os.name")
.startsWith("Windows")) {
@@ -718,6 +731,7 @@
});
actions.add(new PrivilegedAction<InputStream>() {
+ @Override
public InputStream run() {
/*
* Try to load saved generated soundbank
@@ -798,6 +812,7 @@
return defaultSoundBank;
}
+ @Override
public Instrument[] getAvailableInstruments() {
Soundbank defsbk = getDefaultSoundbank();
if (defsbk == null)
@@ -807,6 +822,7 @@
return inslist_array;
}
+ @Override
public Instrument[] getLoadedInstruments() {
if (!isOpen())
return new Instrument[0];
@@ -820,8 +836,9 @@
}
}
+ @Override
public boolean loadAllInstruments(Soundbank soundbank) {
- List<ModelInstrument> instruments = new ArrayList<ModelInstrument>();
+ List<ModelInstrument> instruments = new ArrayList<>();
for (Instrument ins: soundbank.getInstruments()) {
if (ins == null || !(ins instanceof ModelInstrument)) {
throw new IllegalArgumentException(
@@ -832,6 +849,7 @@
return loadInstruments(instruments);
}
+ @Override
public void unloadAllInstruments(Soundbank soundbank) {
if (soundbank == null || !isSoundbankSupported(soundbank))
throw new IllegalArgumentException("Unsupported soundbank: " + soundbank);
@@ -846,8 +864,9 @@
}
}
+ @Override
public boolean loadInstruments(Soundbank soundbank, Patch[] patchList) {
- List<ModelInstrument> instruments = new ArrayList<ModelInstrument>();
+ List<ModelInstrument> instruments = new ArrayList<>();
for (Patch patch: patchList) {
Instrument ins = soundbank.getInstrument(patch);
if (ins == null || !(ins instanceof ModelInstrument)) {
@@ -859,6 +878,7 @@
return loadInstruments(instruments);
}
+ @Override
public void unloadInstruments(Soundbank soundbank, Patch[] patchList) {
if (soundbank == null || !isSoundbankSupported(soundbank))
throw new IllegalArgumentException("Unsupported soundbank: " + soundbank);
@@ -874,6 +894,7 @@
}
}
+ @Override
public MidiDevice.Info getDeviceInfo() {
return info;
}
@@ -901,9 +922,9 @@
});
}
+ @Override
public AudioSynthesizerPropertyInfo[] getPropertyInfo(Map<String, Object> info) {
- List<AudioSynthesizerPropertyInfo> list =
- new ArrayList<AudioSynthesizerPropertyInfo>();
+ List<AudioSynthesizerPropertyInfo> list = new ArrayList<>();
AudioSynthesizerPropertyInfo item;
@@ -1058,6 +1079,7 @@
return items;
}
+ @Override
public void open() throws MidiUnavailableException {
if (isOpen()) {
synchronized (control_mutex) {
@@ -1068,6 +1090,7 @@
open(null, null);
}
+ @Override
public void open(SourceDataLine line, Map<String, Object> info) throws MidiUnavailableException {
if (isOpen()) {
synchronized (control_mutex) {
@@ -1162,8 +1185,9 @@
}
}
+ @Override
public AudioInputStream openStream(AudioFormat targetFormat,
- Map<String, Object> info) throws MidiUnavailableException {
+ Map<String, Object> info) throws MidiUnavailableException {
if (isOpen())
throw new MidiUnavailableException("Synthesizer is already open");
@@ -1243,6 +1267,7 @@
}
}
+ @Override
public void close() {
if (!isOpen())
@@ -1301,12 +1326,14 @@
}
}
+ @Override
public boolean isOpen() {
synchronized (control_mutex) {
return open;
}
}
+ @Override
public long getMicrosecondPosition() {
if (!isOpen())
@@ -1317,14 +1344,17 @@
}
}
+ @Override
public int getMaxReceivers() {
return -1;
}
+ @Override
public int getMaxTransmitters() {
return 0;
}
+ @Override
public Receiver getReceiver() throws MidiUnavailableException {
synchronized (control_mutex) {
@@ -1335,25 +1365,29 @@
}
}
+ @Override
public List<Receiver> getReceivers() {
synchronized (control_mutex) {
- ArrayList<Receiver> recvs = new ArrayList<Receiver>();
+ ArrayList<Receiver> recvs = new ArrayList<>();
recvs.addAll(recvslist);
return recvs;
}
}
+ @Override
public Transmitter getTransmitter() throws MidiUnavailableException {
throw new MidiUnavailableException("No transmitter available");
}
+ @Override
public List<Transmitter> getTransmitters() {
- return new ArrayList<Transmitter>();
+ return new ArrayList<>();
}
+ @Override
public Receiver getReceiverReferenceCounting()
throws MidiUnavailableException {
@@ -1367,6 +1401,7 @@
return getReceiver();
}
+ @Override
public Transmitter getTransmitterReferenceCounting()
throws MidiUnavailableException {
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftTuning.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftTuning.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.UnsupportedEncodingException;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftVoice.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftVoice.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.IOException;
@@ -63,8 +64,7 @@
private final SoftFilter filter_right;
private final SoftProcess eg = new SoftEnvelopeGenerator();
private final SoftProcess lfo = new SoftLowFrequencyOscillator();
- Map<String, SoftControl> objects =
- new HashMap<String, SoftControl>();
+ final Map<String, SoftControl> objects = new HashMap<>();
SoftSynthesizer synthesizer;
SoftInstrument instrument;
SoftPerformer performer;
@@ -107,6 +107,7 @@
double[] keynumber = co_noteon_keynumber;
double[] velocity = co_noteon_velocity;
double[] on = co_noteon_on;
+ @Override
public double[] get(int instance, String name) {
if (name == null)
return null;
@@ -126,12 +127,13 @@
private final double[] co_mixer_reverb = new double[1];
private final double[] co_mixer_chorus = new double[1];
private final SoftControl co_mixer = new SoftControl() {
- double[] active = co_mixer_active;
- double[] gain = co_mixer_gain;
- double[] pan = co_mixer_pan;
- double[] balance = co_mixer_balance;
- double[] reverb = co_mixer_reverb;
- double[] chorus = co_mixer_chorus;
+ final double[] active = co_mixer_active;
+ final double[] gain = co_mixer_gain;
+ final double[] pan = co_mixer_pan;
+ final double[] balance = co_mixer_balance;
+ final double[] reverb = co_mixer_reverb;
+ final double[] chorus = co_mixer_chorus;
+ @Override
public double[] get(int instance, String name) {
if (name == null)
return null;
@@ -152,7 +154,8 @@
};
private final double[] co_osc_pitch = new double[1];
private final SoftControl co_osc = new SoftControl() {
- double[] pitch = co_osc_pitch;
+ final double[] pitch = co_osc_pitch;
+ @Override
public double[] get(int instance, String name) {
if (name == null)
return null;
@@ -165,9 +168,10 @@
private final double[] co_filter_type = new double[1];
private final double[] co_filter_q = new double[1];
private final SoftControl co_filter = new SoftControl() {
- double[] freq = co_filter_freq;
- double[] ftype = co_filter_type;
- double[] q = co_filter_q;
+ final double[] freq = co_filter_freq;
+ final double[] ftype = co_filter_type;
+ final double[] q = co_filter_q;
+ @Override
public double[] get(int instance, String name) {
if (name == null)
return null;
@@ -913,6 +917,5 @@
if (out_mixer_end) {
stopping = true;
}
-
}
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/StandardMidiFileReader.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/StandardMidiFileReader.java Fri Aug 26 10:14:15 2016 -0700
@@ -57,6 +57,7 @@
private static final int bisBufferSize = 1024; // buffer size in buffered input streams
+ @Override
public MidiFileFormat getMidiFileFormat(InputStream stream)
throws InvalidMidiDataException, IOException {
return getMidiFileFormatFromStream(stream, MidiFileFormat.UNKNOWN_LENGTH, null);
@@ -143,7 +144,7 @@
return format;
}
-
+ @Override
public MidiFileFormat getMidiFileFormat(URL url) throws InvalidMidiDataException, IOException {
InputStream urlStream = url.openStream(); // throws IOException
BufferedInputStream bis = new BufferedInputStream( urlStream, bisBufferSize );
@@ -156,7 +157,7 @@
return fileFormat;
}
-
+ @Override
public MidiFileFormat getMidiFileFormat(File file) throws InvalidMidiDataException, IOException {
FileInputStream fis = new FileInputStream(file); // throws IOException
BufferedInputStream bis = new BufferedInputStream(fis, bisBufferSize);
@@ -175,7 +176,7 @@
return fileFormat;
}
-
+ @Override
public Sequence getSequence(InputStream stream) throws InvalidMidiDataException, IOException {
SMFParser smfParser = new SMFParser();
MidiFileFormat format = getMidiFileFormatFromStream(stream,
@@ -201,8 +202,7 @@
return sequence;
}
-
-
+ @Override
public Sequence getSequence(URL url) throws InvalidMidiDataException, IOException {
InputStream is = url.openStream(); // throws IOException
is = new BufferedInputStream(is, bisBufferSize);
@@ -215,7 +215,7 @@
return seq;
}
-
+ @Override
public Sequence getSequence(File file) throws InvalidMidiDataException, IOException {
InputStream is = new FileInputStream(file); // throws IOException
is = new BufferedInputStream(is, bisBufferSize);
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/StandardMidiFileWriter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/StandardMidiFileWriter.java Fri Aug 26 10:14:15 2016 -0700
@@ -47,7 +47,6 @@
import javax.sound.midi.Track;
import javax.sound.midi.spi.MidiFileWriter;
-
/**
* MIDI file writer.
*
@@ -72,20 +71,15 @@
private static final int bufferSize = 16384; // buffersize for write
private DataOutputStream tddos; // data output stream for track writing
-
-
/**
- * MIDI parser types
+ * MIDI parser types.
*/
private static final int types[] = {
MIDI_TYPE_0,
MIDI_TYPE_1
};
-
- /**
- * new
- */
+ @Override
public int[] getMidiFileTypes() {
int[] localArray = new int[types.length];
System.arraycopy(types, 0, localArray, 0, types.length);
@@ -100,6 +94,7 @@
* @return array of file types. If no file types are supported,
* returns an array of length 0.
*/
+ @Override
public int[] getMidiFileTypes(Sequence sequence){
int typesArray[];
Track tracks[] = sequence.getTracks();
@@ -116,6 +111,7 @@
return typesArray;
}
+ @Override
public int write(Sequence in, int type, OutputStream out) throws IOException {
Objects.requireNonNull(out);
if (!isFileTypeSupported(type, in)) {
@@ -141,6 +137,7 @@
return (int) bytesWritten;
}
+ @Override
public int write(Sequence in, int type, File out) throws IOException {
Objects.requireNonNull(in);
FileOutputStream fos = new FileOutputStream(out); // throws IOException
@@ -151,7 +148,6 @@
//=================================================================================
-
private InputStream getFileStream(int type, Sequence sequence) throws IOException {
Track tracks[] = sequence.getTracks();
int bytesBuilt = 0;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunCodec.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunCodec.java Fri Aug 26 10:14:15 2016 -0700
@@ -55,16 +55,14 @@
this.outputEncodings = outputEncodings;
}
-
- /**
- */
+ @Override
public final AudioFormat.Encoding[] getSourceEncodings() {
AudioFormat.Encoding[] encodings = new AudioFormat.Encoding[inputEncodings.length];
System.arraycopy(inputEncodings, 0, encodings, 0, inputEncodings.length);
return encodings;
}
- /**
- */
+
+ @Override
public final AudioFormat.Encoding[] getTargetEncodings() {
AudioFormat.Encoding[] encodings = new AudioFormat.Encoding[outputEncodings.length];
System.arraycopy(outputEncodings, 0, encodings, 0, outputEncodings.length);
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunFileWriter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunFileWriter.java Fri Aug 26 10:14:15 2016 -0700
@@ -39,17 +39,14 @@
*/
abstract class SunFileWriter extends AudioFileWriter {
-
// buffer size for write
protected static final int bufferSize = 16384;
// buffer size for temporary input streams
protected static final int bisBufferSize = 4096;
-
final AudioFileFormat.Type types[];
-
/**
* Constructs a new SunParser object.
*/
@@ -57,12 +54,9 @@
this.types = types;
}
-
-
// METHODS TO IMPLEMENT AudioFileWriter
- // new, 10.27.99
-
+ @Override
public final AudioFileFormat.Type[] getAudioFileTypes(){
AudioFileFormat.Type[] localArray = new AudioFileFormat.Type[types.length];
System.arraycopy(types, 0, localArray, 0, types.length);
@@ -71,7 +65,6 @@
// HELPER METHODS
-
/**
* rllong
* Protected helper method to read 64 bits and changing the order of
@@ -213,6 +206,5 @@
public boolean markSupported() {
return in.markSupported();
}
-
}
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/Toolkit.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/Toolkit.java Fri Aug 26 10:14:15 2016 -0700
@@ -52,7 +52,6 @@
}
}
-
/**
* Swaps bytes.
* @throws ArrayOutOfBoundsException if len is not a multiple of 2.
@@ -68,7 +67,6 @@
}
}
-
/**
* Linear to DB scale conversion.
*/
@@ -78,7 +76,6 @@
return dB;
}
-
/**
* DB to linear scale conversion.
*/
@@ -108,7 +105,6 @@
return bytes - (bytes % blockSize);
}
-
/*
* gets the number of bytes needed to play the specified number of milliseconds
*/
@@ -188,7 +184,6 @@
}
}
-
static boolean isFullySpecifiedPCMFormat(AudioFormat format) {
if (!format.getEncoding().equals(AudioFormat.Encoding.PCM_SIGNED)
&& !format.getEncoding().equals(AudioFormat.Encoding.PCM_UNSIGNED)) {
@@ -204,7 +199,6 @@
return true;
}
-
public static AudioInputStream getPCMConvertedAudioInputStream(AudioInputStream ais) {
// we can't open the device for non-PCM playback, so we have
// convert any other encodings to PCM here (at least we try!)
@@ -231,5 +225,4 @@
return ais;
}
-
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/UlawCodec.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/UlawCodec.java Fri Aug 26 10:14:15 2016 -0700
@@ -33,7 +33,6 @@
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
-
/**
* U-law encodes linear data, and decodes u-law data to linear data.
*
@@ -53,7 +52,7 @@
0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF};
/**
- * Initializes the decode tables
+ * Initializes the decode tables.
*/
static {
for (int i=0;i<256;i++) {
@@ -70,7 +69,6 @@
}
}
-
/**
* Constructs a new ULAW codec object.
*/
@@ -78,8 +76,7 @@
super(ulawEncodings, ulawEncodings);
}
- /**
- */
+ @Override
public AudioFormat.Encoding[] getTargetEncodings(AudioFormat sourceFormat){
if( AudioFormat.Encoding.PCM_SIGNED.equals(sourceFormat.getEncoding()) ) {
if( sourceFormat.getSampleSizeInBits() == 16 ) {
@@ -102,9 +99,7 @@
}
}
-
- /**
- */
+ @Override
public AudioFormat[] getTargetFormats(AudioFormat.Encoding targetEncoding, AudioFormat sourceFormat){
Objects.requireNonNull(targetEncoding);
Objects.requireNonNull(sourceFormat);
@@ -119,8 +114,7 @@
}
}
- /**
- */
+ @Override
public AudioInputStream getAudioInputStream(AudioFormat.Encoding targetEncoding, AudioInputStream sourceStream){
AudioFormat sourceFormat = sourceStream.getFormat();
AudioFormat.Encoding sourceEncoding = sourceFormat.getEncoding();
@@ -157,9 +151,7 @@
return getConvertedStream(targetFormat, sourceStream);
}
- /**
- * use old code...
- */
+ @Override
public AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInputStream sourceStream){
if (!isConversionSupported(targetFormat, sourceStream.getFormat()))
throw new IllegalArgumentException("Unsupported conversion: "
@@ -168,9 +160,6 @@
return getConvertedStream(targetFormat, sourceStream);
}
-
- // OLD CODE
-
/**
* Opens the codec with the specified parameters.
* @param stream stream from which data to be processed should be read
@@ -179,7 +168,6 @@
* @throws IllegalArgumentException if the format combination supplied is
* not supported.
*/
- /* public AudioInputStream getConvertedStream(AudioFormat outputFormat, AudioInputStream stream) { */
private AudioInputStream getConvertedStream(AudioFormat outputFormat, AudioInputStream stream) {
AudioInputStream cs = null;
@@ -188,7 +176,7 @@
if( inputFormat.matches(outputFormat) ) {
cs = stream;
} else {
- cs = (AudioInputStream) (new UlawCodecStream(stream, outputFormat));
+ cs = new UlawCodecStream(stream, outputFormat);
}
return cs;
}
@@ -200,7 +188,6 @@
* returns an array of length 0.
* @return array of supported output formats.
*/
- /* public AudioFormat[] getOutputFormats(AudioFormat inputFormat) { */
private AudioFormat[] getOutputFormats(AudioFormat inputFormat) {
Vector<AudioFormat> formats = new Vector<>();
@@ -241,14 +228,13 @@
return formatArray;
}
-
private final class UlawCodecStream extends AudioInputStream {
private static final int tempBufferSize = 64;
private byte tempBuffer [] = null;
/**
- * True to encode to u-law, false to decode to linear
+ * True to encode to u-law, false to decode to linear.
*/
boolean encode = false;
@@ -312,7 +298,6 @@
}
}
-
/*
* $$jb 2/23/99
* Used to determine segment number in uLaw encoding
@@ -328,6 +313,7 @@
* Note that this won't actually read anything; must read in
* two-byte units.
*/
+ @Override
public int read() throws IOException {
byte[] b = new byte[1];
if (read(b, 0, b.length) == 1) {
@@ -336,10 +322,12 @@
return -1;
}
+ @Override
public int read(byte[] b) throws IOException {
return read(b, 0, b.length);
}
+ @Override
public int read(byte[] b, int off, int len) throws IOException {
// don't read fractional frames
if( len%frameSize != 0 ) {
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java Fri Aug 26 10:14:15 2016 -0700
@@ -43,7 +43,7 @@
*/
public final class WaveExtensibleFileReader extends SunFileReader {
- private static class GUID {
+ private static final class GUID {
private long i1;
private int s1;
private int s2;
@@ -222,7 +222,7 @@
if (!fmt_found || !data_found) {
throw new UnsupportedAudioFileException();
}
- Map<String, Object> p = new HashMap<String, Object>();
+ Map<String, Object> p = new HashMap<>();
String s_channelmask = decodeChannelMask(channelMask);
if (s_channelmask != null)
p.put("channelOrder", s_channelmask);
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFileFormat.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFileFormat.java Fri Aug 26 10:14:15 2016 -0700
@@ -46,7 +46,7 @@
//$$fb 2002-04-16: Fix for 4636355: RIFF audio headers could be _more_ spec compliant
/**
- * fmt_ chunk size in bytes
+ * fmt_ chunk size in bytes.
*/
private static final int STANDARD_FMT_CHUNK_SIZE = 16;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFileWriter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFileWriter.java Fri Aug 26 10:14:15 2016 -0700
@@ -80,7 +80,6 @@
return new AudioFileFormat.Type[0];
}
-
@Override
public int write(AudioInputStream stream, AudioFileFormat.Type fileType, OutputStream out) throws IOException {
Objects.requireNonNull(stream);
@@ -104,7 +103,6 @@
return writeWaveFile(stream, waveFileFormat, out);
}
-
@Override
public int write(AudioInputStream stream, AudioFileFormat.Type fileType, File out) throws IOException {
Objects.requireNonNull(stream);
@@ -257,7 +255,7 @@
int sampleRate = (int) audioFormat.getSampleRate();
int frameSizeInBytes = audioFormat.getFrameSize();
int frameRate = (int) audioFormat.getFrameRate();
- int avgBytesPerSec = channels * sampleSizeInBits * sampleRate / 8;;
+ int avgBytesPerSec = channels * sampleSizeInBits * sampleRate / 8;
short blockAlign = (short) ((sampleSizeInBits / 8) * channels);
int dataMagic = WaveFileFormat.DATA_MAGIC;
int dataLength = waveFileFormat.getFrameLength() * frameSizeInBytes;
@@ -347,6 +345,6 @@
waveStream = new SequenceInputStream(headerStream,
new NoCloseInputStream(codedAudioStream));
- return (InputStream)waveStream;
+ return waveStream;
}
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFloatFileWriter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFloatFileWriter.java Fri Aug 26 10:14:15 2016 -0700
@@ -89,7 +89,7 @@
data_chunk.close();
}
- private static class NoCloseOutputStream extends OutputStream {
+ private static final class NoCloseOutputStream extends OutputStream {
final OutputStream out;
NoCloseOutputStream(OutputStream out) {
--- a/jdk/src/java.desktop/share/classes/java/awt/Container.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/java/awt/Container.java Fri Aug 26 10:14:15 2016 -0700
@@ -1109,17 +1109,18 @@
}
checkAddToSelf(comp);
checkNotAWindow(comp);
+ /* Reparent the component and tidy up the tree's state. */
+ if (comp.parent != null) {
+ comp.parent.remove(comp);
+ if (index > component.size()) {
+ throw new IllegalArgumentException("illegal component position");
+ }
+ }
if (thisGC != null) {
comp.checkGD(thisGC.getDevice().getIDstring());
}
- /* Reparent the component and tidy up the tree's state. */
- if (comp.parent != null) {
- comp.parent.remove(comp);
- if (index > component.size()) {
- throw new IllegalArgumentException("illegal component position");
- }
- }
+
//index == -1 means add to the end.
if (index == -1) {
--- a/jdk/src/java.desktop/share/classes/java/awt/TrayIcon.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/java/awt/TrayIcon.java Fri Aug 26 10:14:15 2016 -0700
@@ -703,6 +703,9 @@
synchronized (this) {
p = peer;
peer = null;
+ if (popup != null) {
+ popup.removeNotify();
+ }
}
if (p != null) {
p.dispose();
--- a/jdk/src/java.desktop/share/classes/java/beans/MethodRef.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/java/beans/MethodRef.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -64,10 +64,9 @@
this.signature = null;
this.methodRef = null;
this.typeRef = null;
+ return null;
}
- else {
- this.methodRef = new SoftReference<>(method);
- }
+ this.methodRef = new SoftReference<>(method);
}
return isPackageAccessible(method.getDeclaringClass()) ? method : null;
}
--- a/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFDirectory.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFDirectory.java Fri Aug 26 10:14:15 2016 -0700
@@ -204,44 +204,6 @@
}
/**
- * Converts a {@code TIFFDirectory} to a {@code TIFFIFD}.
- */
- private static TIFFIFD getDirectoryAsIFD(TIFFDirectory dir) {
- if(dir instanceof TIFFIFD) {
- return (TIFFIFD)dir;
- }
-
- TIFFIFD ifd = new TIFFIFD(Arrays.asList(dir.getTagSets()),
- dir.getParentTag());
- TIFFField[] fields = dir.getTIFFFields();
- int numFields = fields.length;
- for(int i = 0; i < numFields; i++) {
- TIFFField f = fields[i];
- TIFFTag tag = f.getTag();
- if(tag.isIFDPointer()) {
- TIFFDirectory subDir = null;
- if (f.hasDirectory()) {
- subDir = f.getDirectory();
- } else if (f.getData() instanceof TIFFDirectory) {
- subDir = (TIFFDirectory)f.getData();
- }
- if (subDir != null) {
- TIFFDirectory subIFD = getDirectoryAsIFD(subDir);
- f = new TIFFField(tag, f.getType(), (long)f.getCount(),
- subIFD);
- } else {
- f = null;
- }
- }
- if (f != null) {
- ifd.addTIFFField(f);
- }
- }
-
- return ifd;
- }
-
- /**
* Constructs a {@code TIFFDirectory} which is aware of a given
* group of {@link TIFFTagSet}s. An optional parent {@link TIFFTag}
* may also be specified.
@@ -459,7 +421,7 @@
* {@code TIFFDirectory}.
*/
public IIOMetadata getAsMetadata() {
- return new TIFFImageMetadata(getDirectoryAsIFD(this));
+ return new TIFFImageMetadata(TIFFIFD.getDirectoryAsIFD(this));
}
/**
--- a/jdk/src/java.desktop/share/classes/javax/sound/midi/MetaMessage.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/MetaMessage.java Fri Aug 26 10:14:15 2016 -0700
@@ -195,6 +195,7 @@
*
* @return a clone of this instance
*/
+ @Override
public Object clone() {
byte[] newData = new byte[length];
System.arraycopy(data, 0, newData, 0, newData.length);
--- a/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiDevice.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiDevice.java Fri Aug 26 10:14:15 2016 -0700
@@ -134,6 +134,7 @@
* @see #open
* @see #isOpen
*/
+ @Override
void close();
/**
@@ -252,22 +253,22 @@
/**
* The device's name.
*/
- private String name;
+ private final String name;
/**
* The name of the company who provides the device.
*/
- private String vendor;
+ private final String vendor;
/**
* A description of the device.
*/
- private String description;
+ private final String description;
/**
* Device version.
*/
- private String version;
+ private final String version;
/**
* Constructs a device info object.
@@ -294,6 +295,7 @@
* @return {@code true} if this object is the same as the {@code obj}
* argument; {@code false} otherwise
*/
+ @Override
public final boolean equals(Object obj) {
return super.equals(obj);
}
@@ -301,6 +303,7 @@
/**
* Finalizes the hashcode method.
*/
+ @Override
public final int hashCode() {
return super.hashCode();
}
@@ -346,6 +349,7 @@
*
* @return a description of the info object
*/
+ @Override
public final String toString() {
return name;
}
--- a/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiFileFormat.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiFileFormat.java Fri Aug 26 10:14:15 2016 -0700
@@ -180,7 +180,7 @@
int resolution, int bytes,
long microseconds, Map<String, Object> properties) {
this(type, divisionType, resolution, bytes, microseconds);
- this.properties = new HashMap<String, Object>(properties);
+ this.properties = new HashMap<>(properties);
}
/**
@@ -257,7 +257,7 @@
public Map<String,Object> properties() {
Map<String,Object> ret;
if (properties == null) {
- ret = new HashMap<String,Object>(0);
+ ret = new HashMap<>(0);
} else {
ret = (Map<String,Object>) (properties.clone());
}
--- a/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiMessage.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiMessage.java Fri Aug 26 10:14:15 2016 -0700
@@ -177,5 +177,6 @@
*
* @return a clone of this instance
*/
+ @Override
public abstract Object clone();
}
--- a/jdk/src/java.desktop/share/classes/javax/sound/midi/Receiver.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/Receiver.java Fri Aug 26 10:14:15 2016 -0700
@@ -66,5 +66,6 @@
*
* @see javax.sound.midi.MidiSystem#getReceiver
*/
+ @Override
void close();
}
--- a/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequence.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequence.java Fri Aug 26 10:14:15 2016 -0700
@@ -118,7 +118,7 @@
*
* @see #getTracks
*/
- protected Vector<Track> tracks = new Vector<Track>();
+ protected Vector<Track> tracks = new Vector<>();
/**
* Constructs a new MIDI sequence with the specified timing division type
--- a/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequencer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequencer.java Fri Aug 26 10:14:15 2016 -0700
@@ -324,6 +324,7 @@
* @return the current position in microseconds
* @see #setMicrosecondPosition
*/
+ @Override
long getMicrosecondPosition();
/**
@@ -680,7 +681,7 @@
/**
* Synchronization mode name.
*/
- private String name;
+ private final String name;
/**
* Constructs a synchronization mode.
@@ -700,6 +701,7 @@
* @return {@code true} if this object is the same as the {@code obj}
* argument, {@code false} otherwise
*/
+ @Override
public final boolean equals(Object obj) {
return super.equals(obj);
@@ -708,6 +710,7 @@
/**
* Finalizes the hashcode method.
*/
+ @Override
public final int hashCode() {
return super.hashCode();
@@ -719,6 +722,7 @@
*
* @return the name of this synchronization mode
*/
+ @Override
public final String toString() {
return name;
--- a/jdk/src/java.desktop/share/classes/javax/sound/midi/ShortMessage.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/ShortMessage.java Fri Aug 26 10:14:15 2016 -0700
@@ -429,6 +429,7 @@
*
* @return a clone of this instance
*/
+ @Override
public Object clone() {
byte[] newData = new byte[length];
System.arraycopy(data, 0, newData, 0, newData.length);
--- a/jdk/src/java.desktop/share/classes/javax/sound/midi/SysexMessage.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/SysexMessage.java Fri Aug 26 10:14:15 2016 -0700
@@ -179,6 +179,7 @@
* @param length the length of the valid message data in the array,
* including the status byte
*/
+ @Override
public void setMessage(byte[] data, int length) throws InvalidMidiDataException {
int status = (data[0] & 0xFF);
if ((status != 0xF0) && (status != 0xF7)) {
@@ -233,6 +234,7 @@
*
* @return a clone of this instance
*/
+ @Override
public Object clone() {
byte[] newData = new byte[length];
System.arraycopy(data, 0, newData, 0, newData.length);
--- a/jdk/src/java.desktop/share/classes/javax/sound/midi/Track.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/Track.java Fri Aug 26 10:14:15 2016 -0700
@@ -65,12 +65,12 @@
// TODO: use arrays for faster access
// the list containing the events
- private ArrayList<MidiEvent> eventsList = new ArrayList<>();
+ private final ArrayList<MidiEvent> eventsList = new ArrayList<>();
// use a hashset to detect duplicate events in add(MidiEvent)
- private HashSet<MidiEvent> set = new HashSet<>();
+ private final HashSet<MidiEvent> set = new HashSet<>();
- private MidiEvent eotEvent;
+ private final MidiEvent eotEvent;
/**
* Package-private constructor. Constructs a new, empty Track object, which
@@ -264,6 +264,7 @@
data[2] = 0;
}
+ @Override
public void setMessage(int type, byte[] data, int length) throws InvalidMidiDataException {
throw new InvalidMidiDataException("cannot modify end of track message");
}
--- a/jdk/src/java.desktop/share/classes/javax/sound/midi/Transmitter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/Transmitter.java Fri Aug 26 10:14:15 2016 -0700
@@ -69,5 +69,6 @@
*
* @see javax.sound.midi.MidiSystem#getTransmitter
*/
+ @Override
void close();
}
--- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/AudioFileFormat.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/AudioFileFormat.java Fri Aug 26 10:14:15 2016 -0700
@@ -100,22 +100,22 @@
/**
* File type.
*/
- private Type type;
+ private final Type type;
/**
* File length in bytes.
*/
- private int byteLength;
+ private final int byteLength;
/**
* Format of the audio data contained in the file.
*/
- private AudioFormat format;
+ private final AudioFormat format;
/**
* Audio data length in sample frames.
*/
- private int frameLength;
+ private final int frameLength;
/**
* The set of properties.
@@ -176,7 +176,7 @@
public AudioFileFormat(Type type, AudioFormat format,
int frameLength, Map<String, Object> properties) {
this(type,AudioSystem.NOT_SPECIFIED,format,frameLength);
- this.properties = new HashMap<String, Object>(properties);
+ this.properties = new HashMap<>(properties);
}
/**
--- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/AudioFormat.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/AudioFormat.java Fri Aug 26 10:14:15 2016 -0700
@@ -223,7 +223,7 @@
boolean bigEndian, Map<String, Object> properties) {
this(encoding, sampleRate, sampleSizeInBits, channels,
frameSize, frameRate, bigEndian);
- this.properties = new HashMap<String, Object>(properties);
+ this.properties = new HashMap<>(properties);
}
/**
@@ -592,7 +592,7 @@
/**
* Encoding name.
*/
- private String name;
+ private final String name;
/**
* Constructs a new encoding.
--- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/AudioInputStream.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/AudioInputStream.java Fri Aug 26 10:14:15 2016 -0700
@@ -60,7 +60,7 @@
* The {@code InputStream} from which this {@code AudioInputStream} object
* was constructed.
*/
- private InputStream stream;
+ private final InputStream stream;
/**
* The format of the audio data contained in the stream.
--- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/CompoundControl.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/CompoundControl.java Fri Aug 26 10:14:15 2016 -0700
@@ -38,7 +38,7 @@
/**
* The set of member controls.
*/
- private Control[] controls;
+ private final Control[] controls;
/**
* Constructs a new compound control object with the given parameters.
--- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/Control.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/Control.java Fri Aug 26 10:14:15 2016 -0700
@@ -84,7 +84,7 @@
/**
* Type name.
*/
- private String name;
+ private final String name;
/**
* Constructs a new control type with the name specified. The name
--- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/EnumControl.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/EnumControl.java Fri Aug 26 10:14:15 2016 -0700
@@ -53,7 +53,7 @@
/**
* The set of possible values.
*/
- private Object[] values;
+ private final Object[] values;
/**
* The current value.
--- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/FloatControl.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/FloatControl.java Fri Aug 26 10:14:15 2016 -0700
@@ -54,23 +54,23 @@
/**
* The minimum supported value.
*/
- private float minimum;
+ private final float minimum;
/**
* The maximum supported value.
*/
- private float maximum;
+ private final float maximum;
/**
* The control's precision.
*/
- private float precision;
+ private final float precision;
/**
* The smallest time increment in which a value change can be effected
* during a value shift, in microseconds.
*/
- private int updatePeriod;
+ private final int updatePeriod;
/**
* A label for the units in which the control values are expressed, such as
@@ -334,6 +334,7 @@
*
* @return a string description
*/
+ @Override
public String toString() {
return new String(getType() + " with current value: " + getValue() + " " + units +
" (range: " + minimum + " - " + maximum + ")");
--- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/LineEvent.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/LineEvent.java Fri Aug 26 10:14:15 2016 -0700
@@ -169,8 +169,7 @@
/**
* Type name.
*/
- // $$kk: 03.25.99: why can't this be final??
- private /*final*/ String name;
+ private final String name;
/**
* Constructs a new event type.
--- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/Port.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/Port.java Fri Aug 26 10:14:15 2016 -0700
@@ -56,10 +56,8 @@
*/
class Info extends Line.Info {
-
// AUDIO PORT TYPE DEFINES
-
// SOURCE PORTS
/**
@@ -78,7 +76,6 @@
*/
public static final Info COMPACT_DISC = new Info(Port.class,"COMPACT_DISC", true);
-
// TARGET PORTS
/**
@@ -97,18 +94,14 @@
*/
public static final Info LINE_OUT = new Info(Port.class,"LINE_OUT", false);
-
// FUTURE DIRECTIONS...
// telephone
// DAT
// DVD
-
- // INSTANCE VARIABLES
-
- private String name;
- private boolean isSource;
+ private final String name;
+ private final boolean isSource;
/**
* Constructs a port's info object from the information given. This
--- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/ReverbType.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/ReverbType.java Fri Aug 26 10:14:15 2016 -0700
@@ -139,32 +139,32 @@
/**
* Descriptive name of the reverb type.
*/
- private String name;
+ private final String name;
/**
* Early reflection delay in microseconds.
*/
- private int earlyReflectionDelay;
+ private final int earlyReflectionDelay;
/**
* Early reflection intensity.
*/
- private float earlyReflectionIntensity;
+ private final float earlyReflectionIntensity;
/**
* Late reflection delay in microseconds.
*/
- private int lateReflectionDelay;
+ private final int lateReflectionDelay;
/**
* Late reflection intensity.
*/
- private float lateReflectionIntensity;
+ private final float lateReflectionIntensity;
/**
* Total decay time.
*/
- private int decayTime;
+ private final int decayTime;
/**
* Constructs a new reverb type that has the specified reverberation
--- a/jdk/src/java.desktop/share/classes/javax/swing/DefaultRowSorter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/swing/DefaultRowSorter.java Fri Aug 26 10:14:15 2016 -0700
@@ -81,11 +81,6 @@
* sort order is unsorted (the same as the model), and columns are
* sortable by default.
* <p>
- * If the underlying model structure changes (the
- * <code>modelStructureChanged</code> method is invoked) the following
- * are reset to their default values: <code>Comparator</code>s by column,
- * current sort order and whether a column is sortable.
- * <p>
* <code>DefaultRowSorter</code> is an abstract class. Concrete
* subclasses must provide access to the underlying data by invoking
* {@code setModelWrapper}. The {@code setModelWrapper} method
--- a/jdk/src/java.desktop/share/classes/javax/swing/JList.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/swing/JList.java Fri Aug 26 10:14:15 2016 -0700
@@ -3058,7 +3058,7 @@
public Accessible getAccessibleAt(Point p) {
int i = locationToIndex(p);
if (i >= 0) {
- return new ActionableAccessibleJListChild(JList.this, i);
+ return new AccessibleJListChild(JList.this, i);
} else {
return null;
}
@@ -3085,7 +3085,7 @@
if (i >= getModel().getSize()) {
return null;
} else {
- return new ActionableAccessibleJListChild(JList.this, i);
+ return new AccessibleJListChild(JList.this, i);
}
}
@@ -3188,7 +3188,7 @@
* for list children.
*/
protected class AccessibleJListChild extends AccessibleContext
- implements Accessible, AccessibleComponent {
+ implements Accessible, AccessibleComponent, AccessibleAction {
private JList<E> parent = null;
int indexInParent;
private Component component = null;
@@ -3743,16 +3743,17 @@
}
}
- } // inner class AccessibleJListChild
-
- private class ActionableAccessibleJListChild
- extends AccessibleJListChild
- implements AccessibleAction {
-
- ActionableAccessibleJListChild(JList<E> parent, int indexInParent) {
- super(parent, indexInParent);
- }
-
+ /**
+ * {@inheritDoc}
+ * @implSpec Returns the AccessibleAction for this AccessibleJListChild
+ * as follows: First getListCellRendererComponent of the ListCellRenderer
+ * for the component at the "index in parent" of this child is called.
+ * Then its AccessibleContext is fetched and that AccessibleContext's
+ * AccessibleAction is returned. Note that if an AccessibleAction
+ * is not found using this process then this object with its implementation
+ * of the AccessibleAction interface is returned.
+ * @since 9
+ */
@Override
public AccessibleAction getAccessibleAction() {
AccessibleContext ac = getCurrentAccessibleContext();
@@ -3768,6 +3769,13 @@
}
}
+ /**
+ * {@inheritDoc}
+ * @implSpec If i == 0 selects this AccessibleJListChild by calling
+ * JList.this.setSelectedIndex(indexInParent) and then returns true;
+ * otherwise returns false.
+ * @since 9
+ */
@Override
public boolean doAccessibleAction(int i) {
if (i == 0) {
@@ -3778,6 +3786,13 @@
}
}
+ /**
+ * {@inheritDoc}
+ * @implSpec If i == 0 returns the action description fetched from
+ * UIManager.getString("AbstractButton.clickText");
+ * otherwise returns null.
+ * @since 9
+ */
@Override
public String getAccessibleActionDescription(int i) {
if (i == 0) {
@@ -3787,12 +3802,17 @@
}
}
+ /**
+ * {@inheritDoc}
+ * @implSpec Returns 1, i.e. there is only one action.
+ * @since 9
+ */
@Override
public int getAccessibleActionCount() {
return 1;
}
- } // inner class ActionableAccessibleJListChild
+ } // inner class AccessibleJListChild
} // inner class AccessibleJList
}
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalComboBoxIcon.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalComboBoxIcon.java Fri Aug 26 10:14:15 2016 -0700
@@ -52,13 +52,11 @@
g.translate( x, y );
- g.setColor( component.isEnabled() ? MetalLookAndFeel.getControlInfo() : MetalLookAndFeel.getControlShadow() );
- g.drawLine( 0, 0, iconWidth - 1, 0 );
- g.drawLine( 1, 1, 1 + (iconWidth - 3), 1 );
- g.drawLine( 2, 2, 2 + (iconWidth - 5), 2 );
- g.drawLine( 3, 3, 3 + (iconWidth - 7), 3 );
- g.drawLine( 4, 4, 4 + (iconWidth - 9), 4 );
-
+ g.setColor(component.isEnabled()
+ ? MetalLookAndFeel.getControlInfo()
+ : MetalLookAndFeel.getControlShadow());
+ g.fillPolygon(new int[]{0, 5, iconWidth - 5, iconWidth},
+ new int[]{0, 5, 5, 0}, 4);
g.translate( -x, -y );
}
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalIconFactory.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalIconFactory.java Fri Aug 26 10:14:15 2016 -0700
@@ -1289,11 +1289,7 @@
else {
g.setColor(MetalLookAndFeel.getControl());
}
- g.fillRect(2, 2, 8, 8);
- g.fillRect(4, 1, 4, 1);
- g.fillRect(4, 10, 4, 1);
- g.fillRect(1, 4, 1, 4);
- g.fillRect(10, 4, 1, 4);
+ g.fillOval(1, 1, 9, 9);
}
// draw Dark Circle (start at top, go clockwise)
@@ -1303,35 +1299,14 @@
else {
g.setColor(MetalLookAndFeel.getControlDarkShadow());
}
- g.drawLine( 4, 0, 7, 0);
- g.drawLine( 8, 1, 9, 1);
- g.drawLine(10, 2, 10, 3);
- g.drawLine(11, 4, 11, 7);
- g.drawLine(10, 8, 10, 9);
- g.drawLine( 9,10, 8,10);
- g.drawLine( 7,11, 4,11);
- g.drawLine( 3,10, 2,10);
- g.drawLine( 1, 9, 1, 8);
- g.drawLine( 0, 7, 0, 4);
- g.drawLine( 1, 3, 1, 2);
- g.drawLine( 2, 1, 3, 1);
+ g.drawOval(0, 0, 11, 11);
if (pressed) {
- g.fillRect(1, 4, 1, 4);
- g.fillRect(2, 2, 1, 2);
- g.fillRect(3, 2, 1, 1);
- g.fillRect(4, 1, 4, 1);
+ g.drawArc(1, 1, 10, 10, 60, 160);
}
else if (rollover) {
g.setColor(MetalLookAndFeel.getPrimaryControl());
- g.fillRect(4, 1, 4, 2);
- g.fillRect(8, 2, 2, 2);
- g.fillRect(9, 4, 2, 4);
- g.fillRect(8, 8, 2, 2);
- g.fillRect(4, 9, 4, 2);
- g.fillRect(2, 8, 2, 2);
- g.fillRect(1, 4, 2, 4);
- g.fillRect(2, 2, 2, 2);
+ g.drawOval(2, 2, 7, 7);
}
// selected dot
@@ -1341,11 +1316,7 @@
} else {
g.setColor(MetalLookAndFeel.getControlDarkShadow());
}
- g.fillRect( 4, 4, 4, 4);
- g.drawLine( 4, 3, 7, 3);
- g.drawLine( 8, 4, 8, 7);
- g.drawLine( 7, 8, 4, 8);
- g.drawLine( 3, 7, 3, 4);
+ g.fillOval(2, 2, 7, 7);
}
g.translate(-x, -y);
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalScrollButton.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalScrollButton.java Fri Aug 26 10:14:15 2016 -0700
@@ -128,9 +128,10 @@
int startY = ((h+1) - arrowHeight) / 2;
int startX = (w / 2);
- for (int line = 0; line < arrowHeight; line++) {
- g.drawLine( startX-line, startY+line, startX +line+1, startY+line);
- }
+ g.translate(startX, startY);
+ g.fillPolygon(new int[]{0, 1, arrowHeight + 1, -arrowHeight},
+ new int[]{0, 0, arrowHeight, arrowHeight}, 4);
+ g.translate(-startX, -startY);
if (isEnabled) {
g.setColor( highlightColor );
@@ -174,10 +175,10 @@
int startY = (((h+1) - arrowHeight) / 2)+ arrowHeight-1;
int startX = (w / 2);
-
- for (int line = 0; line < arrowHeight; line++) {
- g.drawLine( startX-line, startY-line, startX +line+1, startY-line);
- }
+ g.translate(startX, startY);
+ g.fillPolygon(new int[]{0, 1, arrowHeight + 1, -arrowHeight},
+ new int[]{0, 0, -arrowHeight, -arrowHeight}, 4);
+ g.translate(-startX, -startY);
if (isEnabled) {
g.setColor( highlightColor );
@@ -220,9 +221,10 @@
int startX = (((w+1) - arrowHeight) / 2) + arrowHeight-1;
int startY = (h / 2);
- for (int line = 0; line < arrowHeight; line++) {
- g.drawLine( startX-line, startY-line, startX -line, startY+line+1);
- }
+ g.translate(startX, startY);
+ g.fillPolygon(new int[]{0, 0, -arrowHeight, -arrowHeight},
+ new int[]{0, 1, arrowHeight + 1, -arrowHeight}, 4);
+ g.translate(-startX, -startY);
if (isEnabled) {
g.setColor( highlightColor );
@@ -262,10 +264,10 @@
int startX = (((w+1) - arrowHeight) / 2);
int startY = (h / 2);
-
- for (int line = 0; line < arrowHeight; line++) {
- g.drawLine( startX+line, startY-line, startX +line, startY+line+1);
- }
+ g.translate(startX, startY);
+ g.fillPolygon(new int[]{0, 0, arrowHeight, arrowHeight},
+ new int[]{0, 1, arrowHeight + 1, -arrowHeight}, 4);
+ g.translate(-startX, -startY);
if (isEnabled) {
g.setColor( highlightColor );
--- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/ArrayCache.java Fri Aug 26 13:11:39 2016 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,232 +0,0 @@
-/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.java2d.marlin;
-
-import java.util.Arrays;
-import static sun.java2d.marlin.MarlinUtils.logInfo;
-
-public final class ArrayCache implements MarlinConst {
-
- static final int BUCKETS = 4;
- static final int MIN_ARRAY_SIZE = 4096;
- static final int MAX_ARRAY_SIZE;
- static final int MASK_CLR_1 = ~1;
- // threshold to grow arrays only by (3/2) instead of 2
- static final int THRESHOLD_ARRAY_SIZE;
- static final int[] ARRAY_SIZES = new int[BUCKETS];
- // dirty byte array sizes
- static final int MIN_DIRTY_BYTE_ARRAY_SIZE = 32 * 2048; // 32px x 2048px
- static final int MAX_DIRTY_BYTE_ARRAY_SIZE;
- static final int[] DIRTY_BYTE_ARRAY_SIZES = new int[BUCKETS];
- // large array thresholds:
- static final long THRESHOLD_LARGE_ARRAY_SIZE;
- static final long THRESHOLD_HUGE_ARRAY_SIZE;
- // stats
- private static int resizeInt = 0;
- private static int resizeDirtyInt = 0;
- private static int resizeDirtyFloat = 0;
- private static int resizeDirtyByte = 0;
- private static int oversize = 0;
-
- static {
- // initialize buckets for int/float arrays
- int arraySize = MIN_ARRAY_SIZE;
-
- for (int i = 0; i < BUCKETS; i++, arraySize <<= 2) {
- ARRAY_SIZES[i] = arraySize;
-
- if (DO_TRACE) {
- logInfo("arraySize[" + i + "]: " + arraySize);
- }
- }
- MAX_ARRAY_SIZE = arraySize >> 2;
-
- /* initialize buckets for dirty byte arrays
- (large AA chunk = 32 x 2048 pixels) */
- arraySize = MIN_DIRTY_BYTE_ARRAY_SIZE;
-
- for (int i = 0; i < BUCKETS; i++, arraySize <<= 1) {
- DIRTY_BYTE_ARRAY_SIZES[i] = arraySize;
-
- if (DO_TRACE) {
- logInfo("dirty arraySize[" + i + "]: " + arraySize);
- }
- }
- MAX_DIRTY_BYTE_ARRAY_SIZE = arraySize >> 1;
-
- // threshold to grow arrays only by (3/2) instead of 2
- THRESHOLD_ARRAY_SIZE = Math.max(2 * 1024 * 1024, MAX_ARRAY_SIZE); // 2M
-
- THRESHOLD_LARGE_ARRAY_SIZE = 8L * THRESHOLD_ARRAY_SIZE; // 16M
- THRESHOLD_HUGE_ARRAY_SIZE = 8L * THRESHOLD_LARGE_ARRAY_SIZE; // 128M
-
- if (DO_STATS || DO_MONITORS) {
- logInfo("ArrayCache.BUCKETS = " + BUCKETS);
- logInfo("ArrayCache.MIN_ARRAY_SIZE = " + MIN_ARRAY_SIZE);
- logInfo("ArrayCache.MAX_ARRAY_SIZE = " + MAX_ARRAY_SIZE);
- logInfo("ArrayCache.ARRAY_SIZES = "
- + Arrays.toString(ARRAY_SIZES));
- logInfo("ArrayCache.MIN_DIRTY_BYTE_ARRAY_SIZE = "
- + MIN_DIRTY_BYTE_ARRAY_SIZE);
- logInfo("ArrayCache.MAX_DIRTY_BYTE_ARRAY_SIZE = "
- + MAX_DIRTY_BYTE_ARRAY_SIZE);
- logInfo("ArrayCache.ARRAY_SIZES = "
- + Arrays.toString(DIRTY_BYTE_ARRAY_SIZES));
- logInfo("ArrayCache.THRESHOLD_ARRAY_SIZE = "
- + THRESHOLD_ARRAY_SIZE);
- logInfo("ArrayCache.THRESHOLD_LARGE_ARRAY_SIZE = "
- + THRESHOLD_LARGE_ARRAY_SIZE);
- logInfo("ArrayCache.THRESHOLD_HUGE_ARRAY_SIZE = "
- + THRESHOLD_HUGE_ARRAY_SIZE);
- }
- }
-
- private ArrayCache() {
- // Utility class
- }
-
- static synchronized void incResizeInt() {
- resizeInt++;
- }
-
- static synchronized void incResizeDirtyInt() {
- resizeDirtyInt++;
- }
-
- static synchronized void incResizeDirtyFloat() {
- resizeDirtyFloat++;
- }
-
- static synchronized void incResizeDirtyByte() {
- resizeDirtyByte++;
- }
-
- static synchronized void incOversize() {
- oversize++;
- }
-
- static void dumpStats() {
- if (resizeInt != 0 || resizeDirtyInt != 0 || resizeDirtyFloat != 0
- || resizeDirtyByte != 0 || oversize != 0) {
- logInfo("ArrayCache: int resize: " + resizeInt
- + " - dirty int resize: " + resizeDirtyInt
- + " - dirty float resize: " + resizeDirtyFloat
- + " - dirty byte resize: " + resizeDirtyByte
- + " - oversize: " + oversize);
- }
- }
-
- // small methods used a lot (to be inlined / optimized by hotspot)
-
- static int getBucket(final int length) {
- for (int i = 0; i < ARRAY_SIZES.length; i++) {
- if (length <= ARRAY_SIZES[i]) {
- return i;
- }
- }
- return -1;
- }
-
- static int getBucketDirtyBytes(final int length) {
- for (int i = 0; i < DIRTY_BYTE_ARRAY_SIZES.length; i++) {
- if (length <= DIRTY_BYTE_ARRAY_SIZES[i]) {
- return i;
- }
- }
- return -1;
- }
-
- /**
- * Return the new array size (~ x2)
- * @param curSize current used size
- * @param needSize needed size
- * @return new array size
- */
- public static int getNewSize(final int curSize, final int needSize) {
- // check if needSize is negative or integer overflow:
- if (needSize < 0) {
- // hard overflow failure - we can't even accommodate
- // new items without overflowing
- throw new ArrayIndexOutOfBoundsException(
- "array exceeds maximum capacity !");
- }
- assert curSize >= 0;
- final int initial = (curSize & MASK_CLR_1);
- int size;
- if (initial > THRESHOLD_ARRAY_SIZE) {
- size = initial + (initial >> 1); // x(3/2)
- } else {
- size = (initial << 1); // x2
- }
- // ensure the new size is >= needed size:
- if (size < needSize) {
- // align to 4096 (may overflow):
- size = ((needSize >> 12) + 1) << 12;
- }
- // check integer overflow:
- if (size < 0) {
- // resize to maximum capacity:
- size = Integer.MAX_VALUE;
- }
- return size;
- }
-
- /**
- * Return the new array size (~ x2)
- * @param curSize current used size
- * @param needSize needed size
- * @return new array size
- */
- public static long getNewLargeSize(final long curSize, final long needSize) {
- // check if needSize is negative or integer overflow:
- if ((needSize >> 31L) != 0L) {
- // hard overflow failure - we can't even accommodate
- // new items without overflowing
- throw new ArrayIndexOutOfBoundsException(
- "array exceeds maximum capacity !");
- }
- assert curSize >= 0L;
- long size;
- if (curSize > THRESHOLD_HUGE_ARRAY_SIZE) {
- size = curSize + (curSize >> 2L); // x(5/4)
- } else if (curSize > THRESHOLD_LARGE_ARRAY_SIZE) {
- size = curSize + (curSize >> 1L); // x(3/2)
- } else {
- size = (curSize << 1L); // x2
- }
- // ensure the new size is >= needed size:
- if (size < needSize) {
- // align to 4096:
- size = ((needSize >> 12L) + 1L) << 12L;
- }
- // check integer overflow:
- if (size > Integer.MAX_VALUE) {
- // resize to maximum capacity:
- size = Integer.MAX_VALUE;
- }
- return size;
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/ArrayCacheConst.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,273 @@
+/*
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.java2d.marlin;
+
+import java.util.Arrays;
+import static sun.java2d.marlin.MarlinUtils.logInfo;
+
+public final class ArrayCacheConst implements MarlinConst {
+
+ static final int BUCKETS = 8;
+ static final int MIN_ARRAY_SIZE = 4096;
+ // maximum array size
+ static final int MAX_ARRAY_SIZE;
+ // threshold below to grow arrays by 4
+ static final int THRESHOLD_SMALL_ARRAY_SIZE = 4 * 1024 * 1024;
+ // threshold to grow arrays only by (3/2) instead of 2
+ static final int THRESHOLD_ARRAY_SIZE;
+ // threshold to grow arrays only by (5/4) instead of (3/2)
+ static final long THRESHOLD_HUGE_ARRAY_SIZE;
+ static final int[] ARRAY_SIZES = new int[BUCKETS];
+
+ static {
+ // initialize buckets for int/float arrays
+ int arraySize = MIN_ARRAY_SIZE;
+
+ int inc_lg = 2; // x4
+
+ for (int i = 0; i < BUCKETS; i++, arraySize <<= inc_lg) {
+ ARRAY_SIZES[i] = arraySize;
+
+ if (DO_TRACE) {
+ logInfo("arraySize[" + i + "]: " + arraySize);
+ }
+
+ if (arraySize >= THRESHOLD_SMALL_ARRAY_SIZE) {
+ inc_lg = 1; // x2
+ }
+ }
+ MAX_ARRAY_SIZE = arraySize >> inc_lg;
+
+ if (MAX_ARRAY_SIZE <= 0) {
+ throw new IllegalStateException("Invalid max array size !");
+ }
+
+ THRESHOLD_ARRAY_SIZE = 16 * 1024 * 1024; // >16M
+ THRESHOLD_HUGE_ARRAY_SIZE = 48L * 1024 * 1024; // >48M
+
+ if (DO_STATS || DO_MONITORS) {
+ logInfo("ArrayCache.BUCKETS = " + BUCKETS);
+ logInfo("ArrayCache.MIN_ARRAY_SIZE = " + MIN_ARRAY_SIZE);
+ logInfo("ArrayCache.MAX_ARRAY_SIZE = " + MAX_ARRAY_SIZE);
+ logInfo("ArrayCache.ARRAY_SIZES = "
+ + Arrays.toString(ARRAY_SIZES));
+ logInfo("ArrayCache.THRESHOLD_ARRAY_SIZE = "
+ + THRESHOLD_ARRAY_SIZE);
+ logInfo("ArrayCache.THRESHOLD_HUGE_ARRAY_SIZE = "
+ + THRESHOLD_HUGE_ARRAY_SIZE);
+ }
+ }
+
+ private ArrayCacheConst() {
+ // Utility class
+ }
+
+ // small methods used a lot (to be inlined / optimized by hotspot)
+
+ static int getBucket(final int length) {
+ for (int i = 0; i < ARRAY_SIZES.length; i++) {
+ if (length <= ARRAY_SIZES[i]) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * Return the new array size (~ x2)
+ * @param curSize current used size
+ * @param needSize needed size
+ * @return new array size
+ */
+ public static int getNewSize(final int curSize, final int needSize) {
+ // check if needSize is negative or integer overflow:
+ if (needSize < 0) {
+ // hard overflow failure - we can't even accommodate
+ // new items without overflowing
+ throw new ArrayIndexOutOfBoundsException(
+ "array exceeds maximum capacity !");
+ }
+ assert curSize >= 0;
+ final int initial = curSize;
+ int size;
+ if (initial > THRESHOLD_ARRAY_SIZE) {
+ size = initial + (initial >> 1); // x(3/2)
+ } else {
+ size = (initial << 1); // x2
+ }
+ // ensure the new size is >= needed size:
+ if (size < needSize) {
+ // align to 4096 (may overflow):
+ size = ((needSize >> 12) + 1) << 12;
+ }
+ // check integer overflow:
+ if (size < 0) {
+ // resize to maximum capacity:
+ size = Integer.MAX_VALUE;
+ }
+ return size;
+ }
+
+ /**
+ * Return the new array size (~ x2)
+ * @param curSize current used size
+ * @param needSize needed size
+ * @return new array size
+ */
+ public static long getNewLargeSize(final long curSize, final long needSize) {
+ // check if needSize is negative or integer overflow:
+ if ((needSize >> 31L) != 0L) {
+ // hard overflow failure - we can't even accommodate
+ // new items without overflowing
+ throw new ArrayIndexOutOfBoundsException(
+ "array exceeds maximum capacity !");
+ }
+ assert curSize >= 0L;
+ long size;
+ if (curSize > THRESHOLD_HUGE_ARRAY_SIZE) {
+ size = curSize + (curSize >> 2L); // x(5/4)
+ } else if (curSize > THRESHOLD_ARRAY_SIZE) {
+ size = curSize + (curSize >> 1L); // x(3/2)
+ } else if (curSize > THRESHOLD_SMALL_ARRAY_SIZE) {
+ size = (curSize << 1L); // x2
+ } else {
+ size = (curSize << 2L); // x4
+ }
+ // ensure the new size is >= needed size:
+ if (size < needSize) {
+ // align to 4096:
+ size = ((needSize >> 12L) + 1L) << 12L;
+ }
+ // check integer overflow:
+ if (size > Integer.MAX_VALUE) {
+ // resize to maximum capacity:
+ size = Integer.MAX_VALUE;
+ }
+ return size;
+ }
+
+ static final class CacheStats {
+ final String name;
+ final BucketStats[] bucketStats;
+ int resize = 0;
+ int oversize = 0;
+ long totalInitial = 0L;
+
+ CacheStats(final String name) {
+ this.name = name;
+
+ bucketStats = new BucketStats[BUCKETS];
+ for (int i = 0; i < BUCKETS; i++) {
+ bucketStats[i] = new BucketStats();
+ }
+ }
+
+ void reset() {
+ resize = 0;
+ oversize = 0;
+
+ for (int i = 0; i < BUCKETS; i++) {
+ bucketStats[i].reset();
+ }
+ }
+
+ long dumpStats() {
+ long totalCacheBytes = 0L;
+
+ if (DO_STATS) {
+ for (int i = 0; i < BUCKETS; i++) {
+ final BucketStats s = bucketStats[i];
+
+ if (s.maxSize != 0) {
+ totalCacheBytes += getByteFactor()
+ * (s.maxSize * ARRAY_SIZES[i]);
+ }
+ }
+
+ if (totalInitial != 0L || totalCacheBytes != 0L
+ || resize != 0 || oversize != 0)
+ {
+ logInfo(name + ": resize: " + resize
+ + " - oversize: " + oversize
+ + " - initial: " + getTotalInitialBytes()
+ + " bytes (" + totalInitial + " elements)"
+ + " - cache: " + totalCacheBytes + " bytes"
+ );
+ }
+
+ if (totalCacheBytes != 0L) {
+ logInfo(name + ": usage stats:");
+
+ for (int i = 0; i < BUCKETS; i++) {
+ final BucketStats s = bucketStats[i];
+
+ if (s.getOp != 0) {
+ logInfo(" Bucket[" + ARRAY_SIZES[i] + "]: "
+ + "get: " + s.getOp
+ + " - put: " + s.returnOp
+ + " - create: " + s.createOp
+ + " :: max size: " + s.maxSize
+ );
+ }
+ }
+ }
+ }
+ return totalCacheBytes;
+ }
+
+ private int getByteFactor() {
+ int factor = 1;
+ if (name.contains("Int") || name.contains("Float")) {
+ factor = 4;
+ }
+ return factor;
+ }
+
+ long getTotalInitialBytes() {
+ return getByteFactor() * totalInitial;
+ }
+ }
+
+ static final class BucketStats {
+ int getOp = 0;
+ int createOp = 0;
+ int returnOp = 0;
+ int maxSize = 0;
+
+ void reset() {
+ getOp = 0;
+ createOp = 0;
+ returnOp = 0;
+ maxSize = 0;
+ }
+
+ void updateMaxSize(final int size) {
+ if (size > maxSize) {
+ maxSize = size;
+ }
+ }
+ }
+}
--- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/ByteArrayCache.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/ByteArrayCache.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,109 +22,224 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
-
package sun.java2d.marlin;
-import java.util.ArrayDeque;
+import static sun.java2d.marlin.ArrayCacheConst.ARRAY_SIZES;
+import static sun.java2d.marlin.ArrayCacheConst.BUCKETS;
+import static sun.java2d.marlin.ArrayCacheConst.MAX_ARRAY_SIZE;
+import static sun.java2d.marlin.MarlinUtils.logInfo;
+import static sun.java2d.marlin.MarlinUtils.logException;
+
+import java.lang.ref.WeakReference;
import java.util.Arrays;
-import static sun.java2d.marlin.MarlinUtils.logException;
-import static sun.java2d.marlin.MarlinUtils.logInfo;
+
+import sun.java2d.marlin.ArrayCacheConst.BucketStats;
+import sun.java2d.marlin.ArrayCacheConst.CacheStats;
+
+/*
+ * Note that the [BYTE/INT/FLOAT]ArrayCache files are nearly identical except
+ * for a few type and name differences. Typically, the [BYTE]ArrayCache.java file
+ * is edited manually and then [INT]ArrayCache.java and [FLOAT]ArrayCache.java
+ * files are generated with the following command lines:
+ */
+// % sed -e 's/(b\yte)[ ]*//g' -e 's/b\yte/int/g' -e 's/B\yte/Int/g' < B\yteArrayCache.java > IntArrayCache.java
+// % sed -e 's/(b\yte)[ ]*/(float) /g' -e 's/b\yte/float/g' -e 's/B\yte/Float/g' < B\yteArrayCache.java > FloatArrayCache.java
final class ByteArrayCache implements MarlinConst {
- private final int arraySize;
- private final ArrayDeque<byte[]> byteArrays;
- // stats
- private int getOp = 0;
- private int createOp = 0;
- private int returnOp = 0;
+ final boolean clean;
+ private final int bucketCapacity;
+ private WeakReference<Bucket[]> refBuckets = null;
+ final CacheStats stats;
+
+ ByteArrayCache(final boolean clean, final int bucketCapacity) {
+ this.clean = clean;
+ this.bucketCapacity = bucketCapacity;
+ this.stats = (DO_STATS) ?
+ new CacheStats(getLogPrefix(clean) + "ByteArrayCache") : null;
+ }
+
+ Bucket getCacheBucket(final int length) {
+ final int bucket = ArrayCacheConst.getBucket(length);
+ return getBuckets()[bucket];
+ }
+
+ private Bucket[] getBuckets() {
+ // resolve reference:
+ Bucket[] buckets = (refBuckets != null) ? refBuckets.get() : null;
+
+ // create a new buckets ?
+ if (buckets == null) {
+ buckets = new Bucket[BUCKETS];
+
+ for (int i = 0; i < BUCKETS; i++) {
+ buckets[i] = new Bucket(clean, ARRAY_SIZES[i], bucketCapacity,
+ (DO_STATS) ? stats.bucketStats[i] : null);
+ }
+
+ // update weak reference:
+ refBuckets = new WeakReference<Bucket[]>(buckets);
+ }
+ return buckets;
+ }
+
+ Reference createRef(final int initialSize) {
+ return new Reference(this, initialSize);
+ }
+
+ static final class Reference {
+
+ // initial array reference (direct access)
+ final byte[] initial;
+ private final boolean clean;
+ private final ByteArrayCache cache;
+
+ Reference(final ByteArrayCache cache, final int initialSize) {
+ this.cache = cache;
+ this.clean = cache.clean;
+ this.initial = createArray(initialSize, clean);
+ if (DO_STATS) {
+ cache.stats.totalInitial += initialSize;
+ }
+ }
- void dumpStats() {
- if (getOp > 0) {
- logInfo("ByteArrayCache[" + arraySize + "]: get: " + getOp
- + " created: " + createOp + " - returned: " + returnOp
- + " :: cache size: " + byteArrays.size());
+ byte[] getArray(final int length) {
+ if (length <= MAX_ARRAY_SIZE) {
+ return cache.getCacheBucket(length).getArray();
+ }
+ if (DO_STATS) {
+ cache.stats.oversize++;
+ }
+ if (DO_LOG_OVERSIZE) {
+ logInfo(getLogPrefix(clean) + "ByteArrayCache: "
+ + "getArray[oversize]: length=\t" + length);
+ }
+ return createArray(length, clean);
+ }
+
+ byte[] widenArray(final byte[] array, final int usedSize,
+ final int needSize)
+ {
+ final int length = array.length;
+ if (DO_CHECKS && length >= needSize) {
+ return array;
+ }
+ if (DO_STATS) {
+ cache.stats.resize++;
+ }
+
+ // maybe change bucket:
+ // ensure getNewSize() > newSize:
+ final byte[] res = getArray(ArrayCacheConst.getNewSize(usedSize, needSize));
+
+ // use wrapper to ensure proper copy:
+ System.arraycopy(array, 0, res, 0, usedSize); // copy only used elements
+
+ // maybe return current array:
+ putArray(array, 0, usedSize); // ensure array is cleared
+
+ if (DO_LOG_WIDEN_ARRAY) {
+ logInfo(getLogPrefix(clean) + "ByteArrayCache: "
+ + "widenArray[" + res.length
+ + "]: usedSize=\t" + usedSize + "\tlength=\t" + length
+ + "\tneeded length=\t" + needSize);
+ }
+ return res;
+ }
+
+ byte[] putArray(final byte[] array)
+ {
+ // dirty array helper:
+ return putArray(array, 0, array.length);
+ }
+
+ byte[] putArray(final byte[] array, final int fromIndex,
+ final int toIndex)
+ {
+ if (array.length <= MAX_ARRAY_SIZE) {
+ if ((clean || DO_CLEAN_DIRTY) && (toIndex != 0)) {
+ // clean-up array of dirty part[fromIndex; toIndex[
+ fill(array, fromIndex, toIndex, (byte)0);
+ }
+ // ensure to never store initial arrays in cache:
+ if (array != initial) {
+ cache.getCacheBucket(array.length).putArray(array);
+ }
+ }
+ return initial;
}
}
- ByteArrayCache(final int arraySize) {
- this.arraySize = arraySize;
- // small but enough: almost 1 cache line
- this.byteArrays = new ArrayDeque<byte[]>(6);
- }
+ static final class Bucket {
+
+ private int tail = 0;
+ private final int arraySize;
+ private final boolean clean;
+ private final byte[][] arrays;
+ private final BucketStats stats;
- byte[] getArray() {
- if (DO_STATS) {
- getOp++;
+ Bucket(final boolean clean, final int arraySize,
+ final int capacity, final BucketStats stats)
+ {
+ this.arraySize = arraySize;
+ this.clean = clean;
+ this.stats = stats;
+ this.arrays = new byte[capacity][];
}
- // use cache:
- final byte[] array = byteArrays.pollLast();
- if (array != null) {
- return array;
+ byte[] getArray() {
+ if (DO_STATS) {
+ stats.getOp++;
+ }
+ // use cache:
+ if (tail != 0) {
+ final byte[] array = arrays[--tail];
+ arrays[tail] = null;
+ return array;
+ }
+ if (DO_STATS) {
+ stats.createOp++;
+ }
+ return createArray(arraySize, clean);
}
- if (DO_STATS) {
- createOp++;
+ void putArray(final byte[] array)
+ {
+ if (DO_CHECKS && (array.length != arraySize)) {
+ logInfo(getLogPrefix(clean) + "ByteArrayCache: "
+ + "bad length = " + array.length);
+ return;
+ }
+ if (DO_STATS) {
+ stats.returnOp++;
+ }
+ // fill cache:
+ if (arrays.length > tail) {
+ arrays[tail++] = array;
+
+ if (DO_STATS) {
+ stats.updateMaxSize(tail);
+ }
+ } else if (DO_CHECKS) {
+ logInfo(getLogPrefix(clean) + "ByteArrayCache: "
+ + "array capacity exceeded !");
+ }
}
-
- return new byte[arraySize];
}
- void putDirtyArray(final byte[] array, final int length) {
- if (length != arraySize) {
- if (DO_CHECKS) {
- MarlinUtils.logInfo("ArrayCache: bad length = " + length);
- }
- return;
- }
- if (DO_STATS) {
- returnOp++;
- }
-
- // NO clean-up of array data = DIRTY ARRAY
-
- if (DO_CLEAN_DIRTY) {
- // Force zero-fill dirty arrays:
- Arrays.fill(array, 0, array.length, BYTE_0);
+ static byte[] createArray(final int length, final boolean clean) {
+ if (clean) {
+ return new byte[length];
}
-
- // fill cache:
- byteArrays.addLast(array);
- }
-
- void putArray(final byte[] array, final int length,
- final int fromIndex, final int toIndex)
- {
- if (length != arraySize) {
- if (DO_CHECKS) {
- MarlinUtils.logInfo("ArrayCache: bad length = " + length);
- }
- return;
- }
- if (DO_STATS) {
- returnOp++;
- }
-
- // clean-up array of dirty part[fromIndex; toIndex[
- fill(array, fromIndex, toIndex, BYTE_0);
-
- // fill cache:
- byteArrays.addLast(array);
+ // use JDK9 Unsafe.allocateUninitializedArray(class, length):
+ return (byte[]) OffHeapArray.UNSAFE.allocateUninitializedArray(byte.class, length);
}
static void fill(final byte[] array, final int fromIndex,
final int toIndex, final byte value)
{
// clear array data:
- /*
- * Arrays.fill is faster than System.arraycopy(empty array)
- * or Unsafe.setMemory(byte 0)
- */
- if (toIndex != 0) {
- Arrays.fill(array, fromIndex, toIndex, value);
- }
-
+ Arrays.fill(array, fromIndex, toIndex, value);
if (DO_CHECKS) {
check(array, fromIndex, toIndex, value);
}
@@ -149,4 +264,8 @@
}
}
}
+
+ static String getLogPrefix(final boolean clean) {
+ return (clean) ? "Clean" : "Dirty";
+ }
}
--- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Dasher.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Dasher.java Fri Aug 26 10:14:15 2016 -0700
@@ -68,15 +68,13 @@
// per-thread renderer context
final RendererContext rdrCtx;
- // dashes array (dirty)
- final float[] dashes_initial = new float[INITIAL_ARRAY];
-
// flag to recycle dash array copy
boolean recycleDashes;
- // per-thread initial arrays (large enough to satisfy most usages
- // +1 to avoid recycling in Helpers.widenArray()
- private final float[] firstSegmentsBuffer_initial = new float[INITIAL_ARRAY + 1];
+ // dashes ref (dirty)
+ final FloatArrayCache.Reference dashes_ref;
+ // firstSegmentsBuffer ref (dirty)
+ final FloatArrayCache.Reference firstSegmentsBuffer_ref;
/**
* Constructs a <code>Dasher</code>.
@@ -85,7 +83,10 @@
Dasher(final RendererContext rdrCtx) {
this.rdrCtx = rdrCtx;
- firstSegmentsBuffer = firstSegmentsBuffer_initial;
+ dashes_ref = rdrCtx.newDirtyFloatArrayRef(INITIAL_ARRAY); // 1K
+
+ firstSegmentsBuffer_ref = rdrCtx.newDirtyFloatArrayRef(INITIAL_ARRAY); // 1K
+ firstSegmentsBuffer = firstSegmentsBuffer_ref.initial;
// we need curCurvepts to be able to contain 2 curves because when
// dashing curves, we need to subdivide it
@@ -142,18 +143,12 @@
if (DO_CLEAN_DIRTY) {
// Force zero-fill dirty arrays:
Arrays.fill(curCurvepts, 0f);
- Arrays.fill(firstSegmentsBuffer, 0f);
}
// Return arrays:
- if (recycleDashes && dash != dashes_initial) {
- rdrCtx.putDirtyFloatArray(dash);
- dash = null;
+ if (recycleDashes) {
+ dash = dashes_ref.putArray(dash);
}
-
- if (firstSegmentsBuffer != firstSegmentsBuffer_initial) {
- rdrCtx.putDirtyFloatArray(firstSegmentsBuffer);
- firstSegmentsBuffer = firstSegmentsBuffer_initial;
- }
+ firstSegmentsBuffer = firstSegmentsBuffer_ref.putArray(firstSegmentsBuffer);
}
@Override
@@ -222,7 +217,8 @@
.add(segIdx + len);
}
firstSegmentsBuffer = buf
- = rdrCtx.widenDirtyFloatArray(buf, segIdx, segIdx + len);
+ = firstSegmentsBuffer_ref.widenArray(buf, segIdx,
+ segIdx + len);
}
buf[segIdx++] = type;
len--;
--- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/FloatArrayCache.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/FloatArrayCache.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,110 +22,224 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
-
package sun.java2d.marlin;
-import java.util.ArrayDeque;
+import static sun.java2d.marlin.ArrayCacheConst.ARRAY_SIZES;
+import static sun.java2d.marlin.ArrayCacheConst.BUCKETS;
+import static sun.java2d.marlin.ArrayCacheConst.MAX_ARRAY_SIZE;
+import static sun.java2d.marlin.MarlinUtils.logInfo;
+import static sun.java2d.marlin.MarlinUtils.logException;
+
+import java.lang.ref.WeakReference;
import java.util.Arrays;
-import static sun.java2d.marlin.MarlinUtils.logException;
-import static sun.java2d.marlin.MarlinUtils.logInfo;
+
+import sun.java2d.marlin.ArrayCacheConst.BucketStats;
+import sun.java2d.marlin.ArrayCacheConst.CacheStats;
+
+/*
+ * Note that the [BYTE/INT/FLOAT]ArrayCache files are nearly identical except
+ * for a few type and name differences. Typically, the [BYTE]ArrayCache.java file
+ * is edited manually and then [INT]ArrayCache.java and [FLOAT]ArrayCache.java
+ * files are generated with the following command lines:
+ */
+// % sed -e 's/(b\yte)[ ]*//g' -e 's/b\yte/int/g' -e 's/B\yte/Int/g' < B\yteArrayCache.java > IntArrayCache.java
+// % sed -e 's/(b\yte)[ ]*/(float) /g' -e 's/b\yte/float/g' -e 's/B\yte/Float/g' < B\yteArrayCache.java > FloatArrayCache.java
final class FloatArrayCache implements MarlinConst {
- private final int arraySize;
- private final ArrayDeque<float[]> floatArrays;
- // stats
- private int getOp = 0;
- private int createOp = 0;
- private int returnOp = 0;
+ final boolean clean;
+ private final int bucketCapacity;
+ private WeakReference<Bucket[]> refBuckets = null;
+ final CacheStats stats;
+
+ FloatArrayCache(final boolean clean, final int bucketCapacity) {
+ this.clean = clean;
+ this.bucketCapacity = bucketCapacity;
+ this.stats = (DO_STATS) ?
+ new CacheStats(getLogPrefix(clean) + "FloatArrayCache") : null;
+ }
+
+ Bucket getCacheBucket(final int length) {
+ final int bucket = ArrayCacheConst.getBucket(length);
+ return getBuckets()[bucket];
+ }
+
+ private Bucket[] getBuckets() {
+ // resolve reference:
+ Bucket[] buckets = (refBuckets != null) ? refBuckets.get() : null;
+
+ // create a new buckets ?
+ if (buckets == null) {
+ buckets = new Bucket[BUCKETS];
+
+ for (int i = 0; i < BUCKETS; i++) {
+ buckets[i] = new Bucket(clean, ARRAY_SIZES[i], bucketCapacity,
+ (DO_STATS) ? stats.bucketStats[i] : null);
+ }
+
+ // update weak reference:
+ refBuckets = new WeakReference<Bucket[]>(buckets);
+ }
+ return buckets;
+ }
+
+ Reference createRef(final int initialSize) {
+ return new Reference(this, initialSize);
+ }
+
+ static final class Reference {
+
+ // initial array reference (direct access)
+ final float[] initial;
+ private final boolean clean;
+ private final FloatArrayCache cache;
+
+ Reference(final FloatArrayCache cache, final int initialSize) {
+ this.cache = cache;
+ this.clean = cache.clean;
+ this.initial = createArray(initialSize, clean);
+ if (DO_STATS) {
+ cache.stats.totalInitial += initialSize;
+ }
+ }
- void dumpStats() {
- if (getOp > 0) {
- logInfo("FloatArrayCache[" + arraySize + "]: get: " + getOp
- + " created: " + createOp + " - returned: " + returnOp
- + " :: cache size: " + floatArrays.size());
+ float[] getArray(final int length) {
+ if (length <= MAX_ARRAY_SIZE) {
+ return cache.getCacheBucket(length).getArray();
+ }
+ if (DO_STATS) {
+ cache.stats.oversize++;
+ }
+ if (DO_LOG_OVERSIZE) {
+ logInfo(getLogPrefix(clean) + "FloatArrayCache: "
+ + "getArray[oversize]: length=\t" + length);
+ }
+ return createArray(length, clean);
+ }
+
+ float[] widenArray(final float[] array, final int usedSize,
+ final int needSize)
+ {
+ final int length = array.length;
+ if (DO_CHECKS && length >= needSize) {
+ return array;
+ }
+ if (DO_STATS) {
+ cache.stats.resize++;
+ }
+
+ // maybe change bucket:
+ // ensure getNewSize() > newSize:
+ final float[] res = getArray(ArrayCacheConst.getNewSize(usedSize, needSize));
+
+ // use wrapper to ensure proper copy:
+ System.arraycopy(array, 0, res, 0, usedSize); // copy only used elements
+
+ // maybe return current array:
+ putArray(array, 0, usedSize); // ensure array is cleared
+
+ if (DO_LOG_WIDEN_ARRAY) {
+ logInfo(getLogPrefix(clean) + "FloatArrayCache: "
+ + "widenArray[" + res.length
+ + "]: usedSize=\t" + usedSize + "\tlength=\t" + length
+ + "\tneeded length=\t" + needSize);
+ }
+ return res;
+ }
+
+ float[] putArray(final float[] array)
+ {
+ // dirty array helper:
+ return putArray(array, 0, array.length);
+ }
+
+ float[] putArray(final float[] array, final int fromIndex,
+ final int toIndex)
+ {
+ if (array.length <= MAX_ARRAY_SIZE) {
+ if ((clean || DO_CLEAN_DIRTY) && (toIndex != 0)) {
+ // clean-up array of dirty part[fromIndex; toIndex[
+ fill(array, fromIndex, toIndex, (float) 0);
+ }
+ // ensure to never store initial arrays in cache:
+ if (array != initial) {
+ cache.getCacheBucket(array.length).putArray(array);
+ }
+ }
+ return initial;
}
}
- FloatArrayCache(final int arraySize) {
- this.arraySize = arraySize;
- // small but enough: almost 1 cache line
- this.floatArrays = new ArrayDeque<float[]>(6);
- }
+ static final class Bucket {
+
+ private int tail = 0;
+ private final int arraySize;
+ private final boolean clean;
+ private final float[][] arrays;
+ private final BucketStats stats;
- float[] getArray() {
- if (DO_STATS) {
- getOp++;
+ Bucket(final boolean clean, final int arraySize,
+ final int capacity, final BucketStats stats)
+ {
+ this.arraySize = arraySize;
+ this.clean = clean;
+ this.stats = stats;
+ this.arrays = new float[capacity][];
}
- // use cache
- final float[] array = floatArrays.pollLast();
-
- if (array != null) {
- return array;
+ float[] getArray() {
+ if (DO_STATS) {
+ stats.getOp++;
+ }
+ // use cache:
+ if (tail != 0) {
+ final float[] array = arrays[--tail];
+ arrays[tail] = null;
+ return array;
+ }
+ if (DO_STATS) {
+ stats.createOp++;
+ }
+ return createArray(arraySize, clean);
}
- if (DO_STATS) {
- createOp++;
+ void putArray(final float[] array)
+ {
+ if (DO_CHECKS && (array.length != arraySize)) {
+ logInfo(getLogPrefix(clean) + "FloatArrayCache: "
+ + "bad length = " + array.length);
+ return;
+ }
+ if (DO_STATS) {
+ stats.returnOp++;
+ }
+ // fill cache:
+ if (arrays.length > tail) {
+ arrays[tail++] = array;
+
+ if (DO_STATS) {
+ stats.updateMaxSize(tail);
+ }
+ } else if (DO_CHECKS) {
+ logInfo(getLogPrefix(clean) + "FloatArrayCache: "
+ + "array capacity exceeded !");
+ }
}
-
- return new float[arraySize];
}
- void putDirtyArray(final float[] array, final int length) {
- if (length != arraySize) {
- if (DO_CHECKS) {
- MarlinUtils.logInfo("ArrayCache: bad length = " + length);
- }
- return;
- }
- if (DO_STATS) {
- returnOp++;
- }
-
- // NO clean-up of array data = DIRTY ARRAY
-
- if (DO_CLEAN_DIRTY) {
- // Force zero-fill dirty arrays:
- Arrays.fill(array, 0, array.length, 0f);
+ static float[] createArray(final int length, final boolean clean) {
+ if (clean) {
+ return new float[length];
}
-
- // fill cache:
- floatArrays.addLast(array);
- }
-
- void putArray(final float[] array, final int length,
- final int fromIndex, final int toIndex)
- {
- if (length != arraySize) {
- if (DO_CHECKS) {
- MarlinUtils.logInfo("ArrayCache: bad length = " + length);
- }
- return;
- }
- if (DO_STATS) {
- returnOp++;
- }
-
- // clean-up array of dirty part[fromIndex; toIndex[
- fill(array, fromIndex, toIndex, 0f);
-
- // fill cache:
- floatArrays.addLast(array);
+ // use JDK9 Unsafe.allocateUninitializedArray(class, length):
+ return (float[]) OffHeapArray.UNSAFE.allocateUninitializedArray(float.class, length);
}
static void fill(final float[] array, final int fromIndex,
final int toIndex, final float value)
{
// clear array data:
- /*
- * Arrays.fill is faster than System.arraycopy(empty array)
- * or Unsafe.setMemory(byte 0)
- */
- if (toIndex != 0) {
- Arrays.fill(array, fromIndex, toIndex, value);
- }
-
+ Arrays.fill(array, fromIndex, toIndex, value);
if (DO_CHECKS) {
check(array, fromIndex, toIndex, value);
}
@@ -150,4 +264,8 @@
}
}
}
+
+ static String getLogPrefix(final boolean clean) {
+ return (clean) ? "Clean" : "Dirty";
+ }
}
--- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/IntArrayCache.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/IntArrayCache.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,109 +22,224 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
-
package sun.java2d.marlin;
-import java.util.ArrayDeque;
+import static sun.java2d.marlin.ArrayCacheConst.ARRAY_SIZES;
+import static sun.java2d.marlin.ArrayCacheConst.BUCKETS;
+import static sun.java2d.marlin.ArrayCacheConst.MAX_ARRAY_SIZE;
+import static sun.java2d.marlin.MarlinUtils.logInfo;
+import static sun.java2d.marlin.MarlinUtils.logException;
+
+import java.lang.ref.WeakReference;
import java.util.Arrays;
-import static sun.java2d.marlin.MarlinUtils.logException;
-import static sun.java2d.marlin.MarlinUtils.logInfo;
+
+import sun.java2d.marlin.ArrayCacheConst.BucketStats;
+import sun.java2d.marlin.ArrayCacheConst.CacheStats;
+
+/*
+ * Note that the [BYTE/INT/FLOAT]ArrayCache files are nearly identical except
+ * for a few type and name differences. Typically, the [BYTE]ArrayCache.java file
+ * is edited manually and then [INT]ArrayCache.java and [FLOAT]ArrayCache.java
+ * files are generated with the following command lines:
+ */
+// % sed -e 's/(b\yte)[ ]*//g' -e 's/b\yte/int/g' -e 's/B\yte/Int/g' < B\yteArrayCache.java > IntArrayCache.java
+// % sed -e 's/(b\yte)[ ]*/(float) /g' -e 's/b\yte/float/g' -e 's/B\yte/Float/g' < B\yteArrayCache.java > FloatArrayCache.java
final class IntArrayCache implements MarlinConst {
- private final int arraySize;
- private final ArrayDeque<int[]> intArrays;
- // stats
- private int getOp = 0;
- private int createOp = 0;
- private int returnOp = 0;
+ final boolean clean;
+ private final int bucketCapacity;
+ private WeakReference<Bucket[]> refBuckets = null;
+ final CacheStats stats;
+
+ IntArrayCache(final boolean clean, final int bucketCapacity) {
+ this.clean = clean;
+ this.bucketCapacity = bucketCapacity;
+ this.stats = (DO_STATS) ?
+ new CacheStats(getLogPrefix(clean) + "IntArrayCache") : null;
+ }
+
+ Bucket getCacheBucket(final int length) {
+ final int bucket = ArrayCacheConst.getBucket(length);
+ return getBuckets()[bucket];
+ }
+
+ private Bucket[] getBuckets() {
+ // resolve reference:
+ Bucket[] buckets = (refBuckets != null) ? refBuckets.get() : null;
+
+ // create a new buckets ?
+ if (buckets == null) {
+ buckets = new Bucket[BUCKETS];
+
+ for (int i = 0; i < BUCKETS; i++) {
+ buckets[i] = new Bucket(clean, ARRAY_SIZES[i], bucketCapacity,
+ (DO_STATS) ? stats.bucketStats[i] : null);
+ }
+
+ // update weak reference:
+ refBuckets = new WeakReference<Bucket[]>(buckets);
+ }
+ return buckets;
+ }
+
+ Reference createRef(final int initialSize) {
+ return new Reference(this, initialSize);
+ }
+
+ static final class Reference {
+
+ // initial array reference (direct access)
+ final int[] initial;
+ private final boolean clean;
+ private final IntArrayCache cache;
+
+ Reference(final IntArrayCache cache, final int initialSize) {
+ this.cache = cache;
+ this.clean = cache.clean;
+ this.initial = createArray(initialSize, clean);
+ if (DO_STATS) {
+ cache.stats.totalInitial += initialSize;
+ }
+ }
- void dumpStats() {
- if (getOp > 0) {
- logInfo("IntArrayCache[" + arraySize + "]: get: " + getOp
- + " created: " + createOp + " - returned: " + returnOp
- + " :: cache size: " + intArrays.size());
+ int[] getArray(final int length) {
+ if (length <= MAX_ARRAY_SIZE) {
+ return cache.getCacheBucket(length).getArray();
+ }
+ if (DO_STATS) {
+ cache.stats.oversize++;
+ }
+ if (DO_LOG_OVERSIZE) {
+ logInfo(getLogPrefix(clean) + "IntArrayCache: "
+ + "getArray[oversize]: length=\t" + length);
+ }
+ return createArray(length, clean);
+ }
+
+ int[] widenArray(final int[] array, final int usedSize,
+ final int needSize)
+ {
+ final int length = array.length;
+ if (DO_CHECKS && length >= needSize) {
+ return array;
+ }
+ if (DO_STATS) {
+ cache.stats.resize++;
+ }
+
+ // maybe change bucket:
+ // ensure getNewSize() > newSize:
+ final int[] res = getArray(ArrayCacheConst.getNewSize(usedSize, needSize));
+
+ // use wrapper to ensure proper copy:
+ System.arraycopy(array, 0, res, 0, usedSize); // copy only used elements
+
+ // maybe return current array:
+ putArray(array, 0, usedSize); // ensure array is cleared
+
+ if (DO_LOG_WIDEN_ARRAY) {
+ logInfo(getLogPrefix(clean) + "IntArrayCache: "
+ + "widenArray[" + res.length
+ + "]: usedSize=\t" + usedSize + "\tlength=\t" + length
+ + "\tneeded length=\t" + needSize);
+ }
+ return res;
+ }
+
+ int[] putArray(final int[] array)
+ {
+ // dirty array helper:
+ return putArray(array, 0, array.length);
+ }
+
+ int[] putArray(final int[] array, final int fromIndex,
+ final int toIndex)
+ {
+ if (array.length <= MAX_ARRAY_SIZE) {
+ if ((clean || DO_CLEAN_DIRTY) && (toIndex != 0)) {
+ // clean-up array of dirty part[fromIndex; toIndex[
+ fill(array, fromIndex, toIndex, 0);
+ }
+ // ensure to never store initial arrays in cache:
+ if (array != initial) {
+ cache.getCacheBucket(array.length).putArray(array);
+ }
+ }
+ return initial;
}
}
- IntArrayCache(final int arraySize) {
- this.arraySize = arraySize;
- // small but enough: almost 1 cache line
- this.intArrays = new ArrayDeque<int[]>(6);
- }
+ static final class Bucket {
+
+ private int tail = 0;
+ private final int arraySize;
+ private final boolean clean;
+ private final int[][] arrays;
+ private final BucketStats stats;
- int[] getArray() {
- if (DO_STATS) {
- getOp++;
+ Bucket(final boolean clean, final int arraySize,
+ final int capacity, final BucketStats stats)
+ {
+ this.arraySize = arraySize;
+ this.clean = clean;
+ this.stats = stats;
+ this.arrays = new int[capacity][];
}
- // use cache:
- final int[] array = intArrays.pollLast();
- if (array != null) {
- return array;
+ int[] getArray() {
+ if (DO_STATS) {
+ stats.getOp++;
+ }
+ // use cache:
+ if (tail != 0) {
+ final int[] array = arrays[--tail];
+ arrays[tail] = null;
+ return array;
+ }
+ if (DO_STATS) {
+ stats.createOp++;
+ }
+ return createArray(arraySize, clean);
}
- if (DO_STATS) {
- createOp++;
+ void putArray(final int[] array)
+ {
+ if (DO_CHECKS && (array.length != arraySize)) {
+ logInfo(getLogPrefix(clean) + "IntArrayCache: "
+ + "bad length = " + array.length);
+ return;
+ }
+ if (DO_STATS) {
+ stats.returnOp++;
+ }
+ // fill cache:
+ if (arrays.length > tail) {
+ arrays[tail++] = array;
+
+ if (DO_STATS) {
+ stats.updateMaxSize(tail);
+ }
+ } else if (DO_CHECKS) {
+ logInfo(getLogPrefix(clean) + "IntArrayCache: "
+ + "array capacity exceeded !");
+ }
}
-
- return new int[arraySize];
}
- void putDirtyArray(final int[] array, final int length) {
- if (length != arraySize) {
- if (DO_CHECKS) {
- MarlinUtils.logInfo("ArrayCache: bad length = " + length);
- }
- return;
- }
- if (DO_STATS) {
- returnOp++;
- }
-
- // NO clean-up of array data = DIRTY ARRAY
-
- if (DO_CLEAN_DIRTY) {
- // Force zero-fill dirty arrays:
- Arrays.fill(array, 0, array.length, 0);
+ static int[] createArray(final int length, final boolean clean) {
+ if (clean) {
+ return new int[length];
}
-
- // fill cache:
- intArrays.addLast(array);
- }
-
- void putArray(final int[] array, final int length,
- final int fromIndex, final int toIndex)
- {
- if (length != arraySize) {
- if (DO_CHECKS) {
- MarlinUtils.logInfo("ArrayCache: bad length = " + length);
- }
- return;
- }
- if (DO_STATS) {
- returnOp++;
- }
-
- // clean-up array of dirty part[fromIndex; toIndex[
- fill(array, fromIndex, toIndex, 0);
-
- // fill cache:
- intArrays.addLast(array);
+ // use JDK9 Unsafe.allocateUninitializedArray(class, length):
+ return (int[]) OffHeapArray.UNSAFE.allocateUninitializedArray(int.class, length);
}
static void fill(final int[] array, final int fromIndex,
final int toIndex, final int value)
{
// clear array data:
- /*
- * Arrays.fill is faster than System.arraycopy(empty array)
- * or Unsafe.setMemory(byte 0)
- */
- if (toIndex != 0) {
- Arrays.fill(array, fromIndex, toIndex, value);
- }
-
+ Arrays.fill(array, fromIndex, toIndex, value);
if (DO_CHECKS) {
check(array, fromIndex, toIndex, value);
}
@@ -149,4 +264,8 @@
}
}
}
+
+ static String getLogPrefix(final boolean clean) {
+ return (clean) ? "Clean" : "Dirty";
+ }
}
--- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinCache.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinCache.java Fri Aug 26 10:14:15 2016 -0700
@@ -100,8 +100,8 @@
// per-thread renderer context
final RendererContext rdrCtx;
- // large cached touchedTile (dirty)
- final int[] touchedTile_initial = new int[INITIAL_ARRAY]; // 1 tile line
+ // touchedTile ref (clean)
+ private final IntArrayCache.Reference touchedTile_ref;
int tileMin, tileMax;
@@ -110,9 +110,10 @@
MarlinCache(final RendererContext rdrCtx) {
this.rdrCtx = rdrCtx;
- rowAAChunk = new OffHeapArray(rdrCtx.cleanerObj, INITIAL_CHUNK_ARRAY); // 64K
+ rowAAChunk = rdrCtx.newOffHeapArray(INITIAL_CHUNK_ARRAY); // 64K
- touchedTile = touchedTile_initial;
+ touchedTile_ref = rdrCtx.newCleanIntArrayRef(INITIAL_ARRAY); // 1K = 1 tile line
+ touchedTile = touchedTile_ref.initial;
// tile used marks:
tileMin = Integer.MAX_VALUE;
@@ -181,10 +182,9 @@
if (nxTiles > INITIAL_ARRAY) {
if (DO_STATS) {
- rdrCtx.stats.stat_array_marlincache_touchedTile
- .add(nxTiles);
+ rdrCtx.stats.stat_array_marlincache_touchedTile.add(nxTiles);
}
- touchedTile = rdrCtx.getIntArray(nxTiles);
+ touchedTile = touchedTile_ref.getArray(nxTiles);
}
}
@@ -196,11 +196,13 @@
// Reset touchedTile if needed:
resetTileLine(0);
+ if (DO_STATS) {
+ rdrCtx.stats.totalOffHeap += rowAAChunk.length;
+ }
+
// Return arrays:
- if (touchedTile != touchedTile_initial) {
- rdrCtx.putIntArray(touchedTile, 0, 0); // already zero filled
- touchedTile = touchedTile_initial;
- }
+ touchedTile = touchedTile_ref.putArray(touchedTile, 0, 0); // already zero filled
+
// At last: resize back off-heap rowAA to initial size
if (rowAAChunk.length != INITIAL_CHUNK_ARRAY) {
// note: may throw OOME:
@@ -554,8 +556,7 @@
addr_off += SIZE_INT;
if (DO_STATS) {
- rdrCtx.stats.hist_tile_generator_encoding_runLen
- .add(runLen);
+ rdrCtx.stats.hist_tile_generator_encoding_runLen.add(runLen);
}
long len = (addr_off - _rowAAChunk.address);
@@ -612,12 +613,12 @@
private void expandRowAAChunk(final long needSize) {
if (DO_STATS) {
- rdrCtx.stats.stat_array_marlincache_rowAAChunk
- .add(needSize);
+ rdrCtx.stats.stat_array_marlincache_rowAAChunk.add(needSize);
}
// note: throw IOOB if neededSize > 2Gb:
- final long newSize = ArrayCache.getNewLargeSize(rowAAChunk.length, needSize);
+ final long newSize = ArrayCacheConst.getNewLargeSize(rowAAChunk.length,
+ needSize);
rowAAChunk.resize(newSize);
}
--- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinConst.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinConst.java Fri Aug 26 10:14:15 2016 -0700
@@ -62,6 +62,8 @@
// enable traces
static final boolean DO_TRACE = ENABLE_LOGS && false;
+ // do flush stats
+ static final boolean DO_FLUSH_STATS = true;
// do flush monitors
static final boolean DO_FLUSH_MONITORS = true;
// use one polling thread to dump statistics/monitors
@@ -78,7 +80,7 @@
// flag to enable logs related bounds checks
static final boolean DO_LOG_BOUNDS = ENABLE_LOGS && false;
- // Initial Array sizing (initial context capacity) ~ 350K
+ // Initial Array sizing (initial context capacity) ~ 450K
// 2048 pixel (width x height) for initial capacity
static final int INITIAL_PIXEL_DIM
@@ -86,14 +88,17 @@
// typical array sizes: only odd numbers allowed below
static final int INITIAL_ARRAY = 256;
- static final int INITIAL_SMALL_ARRAY = 1024;
- static final int INITIAL_MEDIUM_ARRAY = 4096;
- static final int INITIAL_LARGE_ARRAY = 8192;
+
// alpha row dimension
static final int INITIAL_AA_ARRAY = INITIAL_PIXEL_DIM;
- // initial edges (24 bytes) = 24K [ints] = 96K
- static final int INITIAL_EDGES_CAPACITY = 4096 * 24; // 6 ints per edges
+ // 4096 edges for initial capacity
+ static final int INITIAL_EDGES_COUNT = MarlinProperties.getInitialEdges();
+
+ // initial edges = 3/4 * edges count (4096)
+ // 6 ints per edges = 24 bytes
+ // edges capacity = 24 x initial edges = 18 * edges count (4096) = 72K
+ static final int INITIAL_EDGES_CAPACITY = INITIAL_EDGES_COUNT * 18;
// zero value as byte
static final byte BYTE_0 = (byte) 0;
--- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinProperties.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinProperties.java Fri Aug 26 10:14:15 2016 -0700
@@ -42,13 +42,27 @@
}
/**
+ * Return the initial edge capacity used to define initial arrays
+ * (edges, polystack, crossings)
+ *
+ * @return 256 < initial edges < 65536 (4096 by default)
+ */
+ public static int getInitialEdges() {
+ return align(
+ getInteger("sun.java2d.renderer.edges", 4096, 64, 64 * 1024),
+ 64);
+ }
+
+ /**
* Return the initial pixel size used to define initial arrays
* (tile AA chunk, alpha line, buckets)
*
* @return 64 < initial pixel size < 32768 (2048 by default)
*/
public static int getInitialImageSize() {
- return getInteger("sun.java2d.renderer.pixelsize", 2048, 64, 32 * 1024);
+ return align(
+ getInteger("sun.java2d.renderer.pixelsize", 2048, 64, 32 * 1024),
+ 64);
}
/**
@@ -182,4 +196,8 @@
return value;
}
+ static int align(final int val, final int norm) {
+ final int ceil = FloatMath.ceil_int( ((float)val) / norm);
+ return ceil * norm;
+ }
}
--- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinRenderingEngine.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinRenderingEngine.java Fri Aug 26 10:14:15 2016 -0700
@@ -47,7 +47,38 @@
public class MarlinRenderingEngine extends RenderingEngine
implements MarlinConst
{
- private static enum NormMode {ON_WITH_AA, ON_NO_AA, OFF}
+ private static enum NormMode {
+ ON_WITH_AA {
+ @Override
+ PathIterator getNormalizingPathIterator(final RendererContext rdrCtx,
+ final PathIterator src)
+ {
+ // NormalizingPathIterator NearestPixelCenter:
+ return rdrCtx.nPCPathIterator.init(src);
+ }
+ },
+ ON_NO_AA{
+ @Override
+ PathIterator getNormalizingPathIterator(final RendererContext rdrCtx,
+ final PathIterator src)
+ {
+ // NearestPixel NormalizingPathIterator:
+ return rdrCtx.nPQPathIterator.init(src);
+ }
+ },
+ OFF{
+ @Override
+ PathIterator getNormalizingPathIterator(final RendererContext rdrCtx,
+ final PathIterator src)
+ {
+ // return original path iterator if normalization is disabled:
+ return src;
+ }
+ };
+
+ abstract PathIterator getNormalizingPathIterator(RendererContext rdrCtx,
+ PathIterator src);
+ }
private static final float MIN_PEN_SIZE = 1f / NORM_SUBPIXELS;
@@ -91,13 +122,7 @@
final RendererContext rdrCtx = getRendererContext();
try {
// initialize a large copyable Path2D to avoid a lot of array growing:
- final Path2D.Float p2d =
- (rdrCtx.p2d == null) ?
- (rdrCtx.p2d = new Path2D.Float(Path2D.WIND_NON_ZERO,
- INITIAL_MEDIUM_ARRAY))
- : rdrCtx.p2d;
- // reset
- p2d.reset();
+ final Path2D.Float p2d = rdrCtx.getPath2D();
strokeTo(rdrCtx,
src,
@@ -274,7 +299,7 @@
Shape src,
AffineTransform at,
float width,
- NormMode normalize,
+ NormMode norm,
int caps,
int join,
float miterlimit,
@@ -338,13 +363,12 @@
dashLen = dashes.length;
final float[] newDashes;
if (dashLen <= INITIAL_ARRAY) {
- newDashes = rdrCtx.dasher.dashes_initial;
+ newDashes = rdrCtx.dasher.dashes_ref.initial;
} else {
if (DO_STATS) {
- rdrCtx.stats.stat_array_dasher_dasher
- .add(dashLen);
+ rdrCtx.stats.stat_array_dasher_dasher.add(dashLen);
}
- newDashes = rdrCtx.getDirtyFloatArray(dashLen);
+ newDashes = rdrCtx.dasher.dashes_ref.getArray(dashLen);
}
System.arraycopy(dashes, 0, newDashes, 0, dashLen);
dashes = newDashes;
@@ -400,8 +424,8 @@
}
pc2d = transformerPC2D.inverseDeltaTransformConsumer(pc2d, strokerat);
- final PathIterator pi = getNormalizingPathIterator(rdrCtx, normalize,
- src.getPathIterator(at));
+ final PathIterator pi = norm.getNormalizingPathIterator(rdrCtx,
+ src.getPathIterator(at));
pathTo(rdrCtx, pi, pc2d);
@@ -424,25 +448,6 @@
return Math.abs(num) < 2.0 * Math.ulp(num);
}
- PathIterator getNormalizingPathIterator(final RendererContext rdrCtx,
- final NormMode mode,
- final PathIterator src)
- {
- switch (mode) {
- case ON_WITH_AA:
- // NormalizingPathIterator NearestPixelCenter:
- return rdrCtx.nPCPathIterator.init(src);
- case ON_NO_AA:
- // NearestPixel NormalizingPathIterator:
- return rdrCtx.nPQPathIterator.init(src);
- case OFF:
- // return original path iterator if normalization is disabled:
- return src;
- default:
- throw new InternalError("Unrecognized normalization mode");
- }
- }
-
abstract static class NormalizingPathIterator implements PathIterator {
private PathIterator src;
@@ -792,8 +797,8 @@
if (bs == null) {
// fill shape:
- final PathIterator pi = getNormalizingPathIterator(rdrCtx, norm,
- s.getPathIterator(_at));
+ final PathIterator pi = norm.getNormalizingPathIterator(rdrCtx,
+ s.getPathIterator(_at));
// note: Winding rule may be EvenOdd ONLY for fill operations !
r = rdrCtx.renderer.init(clip.getLoX(), clip.getLoY(),
@@ -1021,8 +1026,11 @@
logInfo("sun.java2d.renderer.useRef = "
+ refType);
+ logInfo("sun.java2d.renderer.edges = "
+ + MarlinConst.INITIAL_EDGES_COUNT);
logInfo("sun.java2d.renderer.pixelsize = "
+ MarlinConst.INITIAL_PIXEL_DIM);
+
logInfo("sun.java2d.renderer.subPixel_log2_X = "
+ MarlinConst.SUBPIXEL_LG_POSITIONS_X);
logInfo("sun.java2d.renderer.subPixel_log2_Y = "
@@ -1076,6 +1084,11 @@
logInfo("CUB_INC_BND = " + Renderer.CUB_INC_BND);
logInfo("QUAD_DEC_BND = " + Renderer.QUAD_DEC_BND);
+ logInfo("INITIAL_EDGES_CAPACITY = "
+ + MarlinConst.INITIAL_EDGES_CAPACITY);
+ logInfo("INITIAL_CROSSING_COUNT = "
+ + Renderer.INITIAL_CROSSING_COUNT);
+
logInfo("=========================================================="
+ "=====================");
}
--- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Renderer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Renderer.java Fri Aug 26 10:14:15 2016 -0700
@@ -43,9 +43,9 @@
private static final double POWER_2_TO_32 = 0x1.0p32;
// use float to make tosubpix methods faster (no int to float conversion)
- public static final float f_SUBPIXEL_POSITIONS_X
+ public static final float F_SUBPIXEL_POSITIONS_X
= (float) SUBPIXEL_POSITIONS_X;
- public static final float f_SUBPIXEL_POSITIONS_Y
+ public static final float F_SUBPIXEL_POSITIONS_Y
= (float) SUBPIXEL_POSITIONS_Y;
public static final int SUBPIXEL_MASK_X = SUBPIXEL_POSITIONS_X - 1;
public static final int SUBPIXEL_MASK_Y = SUBPIXEL_POSITIONS_Y - 1;
@@ -58,6 +58,9 @@
static final int INITIAL_BUCKET_ARRAY
= INITIAL_PIXEL_DIM * SUBPIXEL_POSITIONS_Y;
+ // crossing capacity = edges count / 8 ~ 512
+ static final int INITIAL_CROSSING_COUNT = INITIAL_EDGES_COUNT >> 3;
+
public static final int WIND_EVEN_ODD = 0;
public static final int WIND_NON_ZERO = 1;
@@ -136,14 +139,15 @@
// max used for both edgePtrs and crossings (stats only)
private int activeEdgeMaxUsed;
- // per-thread initial arrays (large enough to satisfy most usages) (1024)
- private final int[] crossings_initial = new int[INITIAL_SMALL_ARRAY]; // 4K
- // +1 to avoid recycling in Helpers.widenArray()
- private final int[] edgePtrs_initial = new int[INITIAL_SMALL_ARRAY + 1]; // 4K
+ // crossings ref (dirty)
+ private final IntArrayCache.Reference crossings_ref;
+ // edgePtrs ref (dirty)
+ private final IntArrayCache.Reference edgePtrs_ref;
// merge sort initial arrays (large enough to satisfy most usages) (1024)
- private final int[] aux_crossings_initial = new int[INITIAL_SMALL_ARRAY]; // 4K
- // +1 to avoid recycling in Helpers.widenArray()
- private final int[] aux_edgePtrs_initial = new int[INITIAL_SMALL_ARRAY + 1]; // 4K
+ // aux_crossings ref (dirty)
+ private final IntArrayCache.Reference aux_crossings_ref;
+ // aux_edgePtrs ref (dirty)
+ private final IntArrayCache.Reference aux_edgePtrs_ref;
//////////////////////////////////////////////////////////////////////////////
// EDGE LIST
@@ -164,11 +168,10 @@
// sum of each edge delta Y (subpixels)
private int edgeSumDeltaY;
- // +1 to avoid recycling in Helpers.widenArray()
- private final int[] edgeBuckets_initial
- = new int[INITIAL_BUCKET_ARRAY + 1]; // 64K
- private final int[] edgeBucketCounts_initial
- = new int[INITIAL_BUCKET_ARRAY + 1]; // 64K
+ // edgeBuckets ref (clean)
+ private final IntArrayCache.Reference edgeBuckets_ref;
+ // edgeBucketCounts ref (clean)
+ private final IntArrayCache.Reference edgeBucketCounts_ref;
// Flattens using adaptive forward differencing. This only carries out
// one iteration of the AFD loop. All it does is update AFD variables (i.e.
@@ -402,7 +405,8 @@
// suppose _edges.length > _SIZEOF_EDGE_BYTES
// so doubling size is enough to add needed bytes
// note: throw IOOB if neededSize > 2Gb:
- final long edgeNewSize = ArrayCache.getNewLargeSize(_edges.length,
+ final long edgeNewSize = ArrayCacheConst.getNewLargeSize(
+ _edges.length,
edgePtr + _SIZEOF_EDGE_BYTES);
if (DO_STATS) {
@@ -514,28 +518,52 @@
// dirty curve
private final Curve curve;
+ // clean alpha array (zero filled)
+ private int[] alphaLine;
+
+ // alphaLine ref (clean)
+ private final IntArrayCache.Reference alphaLine_ref;
+
+ private boolean enableBlkFlags = false;
+ private boolean prevUseBlkFlags = false;
+
+ /* block flags (0|1) */
+ private int[] blkFlags;
+
+ // blkFlags ref (clean)
+ private final IntArrayCache.Reference blkFlags_ref;
+
Renderer(final RendererContext rdrCtx) {
this.rdrCtx = rdrCtx;
- this.edges = new OffHeapArray(rdrCtx.cleanerObj, INITIAL_EDGES_CAPACITY); // 96K
+ this.edges = rdrCtx.newOffHeapArray(INITIAL_EDGES_CAPACITY); // 96K
this.curve = rdrCtx.curve;
- edgeBuckets = edgeBuckets_initial;
- edgeBucketCounts = edgeBucketCounts_initial;
+ edgeBuckets_ref = rdrCtx.newCleanIntArrayRef(INITIAL_BUCKET_ARRAY); // 64K
+ edgeBucketCounts_ref = rdrCtx.newCleanIntArrayRef(INITIAL_BUCKET_ARRAY); // 64K
- alphaLine = alphaLine_initial;
+ edgeBuckets = edgeBuckets_ref.initial;
+ edgeBucketCounts = edgeBucketCounts_ref.initial;
+
+ // 2048 (pixelsize) pixel large
+ alphaLine_ref = rdrCtx.newCleanIntArrayRef(INITIAL_AA_ARRAY); // 8K
+ alphaLine = alphaLine_ref.initial;
this.cache = rdrCtx.cache;
- // ScanLine:
- crossings = crossings_initial;
- aux_crossings = aux_crossings_initial;
- edgePtrs = edgePtrs_initial;
- aux_edgePtrs = aux_edgePtrs_initial;
+ crossings_ref = rdrCtx.newDirtyIntArrayRef(INITIAL_CROSSING_COUNT); // 2K
+ aux_crossings_ref = rdrCtx.newDirtyIntArrayRef(INITIAL_CROSSING_COUNT); // 2K
+ edgePtrs_ref = rdrCtx.newDirtyIntArrayRef(INITIAL_CROSSING_COUNT); // 2K
+ aux_edgePtrs_ref = rdrCtx.newDirtyIntArrayRef(INITIAL_CROSSING_COUNT); // 2K
- edgeCount = 0;
- activeEdgeMaxUsed = 0;
+ crossings = crossings_ref.initial;
+ aux_crossings = aux_crossings_ref.initial;
+ edgePtrs = edgePtrs_ref.initial;
+ aux_edgePtrs = aux_edgePtrs_ref.initial;
+
+ blkFlags_ref = rdrCtx.newCleanIntArrayRef(INITIAL_ARRAY); // 1K = 1 tile line
+ blkFlags = blkFlags_ref.initial;
}
Renderer init(final int pix_boundsX, final int pix_boundsY,
@@ -569,8 +597,8 @@
rdrCtx.stats.stat_array_renderer_edgeBucketCounts
.add(edgeBucketsLength);
}
- edgeBuckets = rdrCtx.getIntArray(edgeBucketsLength);
- edgeBucketCounts = rdrCtx.getIntArray(edgeBucketsLength);
+ edgeBuckets = edgeBuckets_ref.getArray(edgeBucketsLength);
+ edgeBucketCounts = edgeBucketCounts_ref.getArray(edgeBucketsLength);
}
edgeMinY = Integer.MAX_VALUE;
@@ -595,41 +623,19 @@
if (DO_STATS) {
rdrCtx.stats.stat_rdr_activeEdges.add(activeEdgeMaxUsed);
rdrCtx.stats.stat_rdr_edges.add(edges.used);
- rdrCtx.stats.stat_rdr_edges_count
- .add(edges.used / SIZEOF_EDGE_BYTES);
- }
- if (DO_CLEAN_DIRTY) {
- // Force zero-fill dirty arrays:
- Arrays.fill(crossings, 0);
- Arrays.fill(aux_crossings, 0);
- Arrays.fill(edgePtrs, 0);
- Arrays.fill(aux_edgePtrs, 0);
+ rdrCtx.stats.stat_rdr_edges_count.add(edges.used / SIZEOF_EDGE_BYTES);
+ rdrCtx.stats.hist_rdr_edges_count.add(edges.used / SIZEOF_EDGE_BYTES);
+ rdrCtx.stats.totalOffHeap += edges.length;
}
// Return arrays:
- if (crossings != crossings_initial) {
- rdrCtx.putDirtyIntArray(crossings);
- crossings = crossings_initial;
- if (aux_crossings != aux_crossings_initial) {
- rdrCtx.putDirtyIntArray(aux_crossings);
- aux_crossings = aux_crossings_initial;
- }
- }
- if (edgePtrs != edgePtrs_initial) {
- rdrCtx.putDirtyIntArray(edgePtrs);
- edgePtrs = edgePtrs_initial;
- if (aux_edgePtrs != aux_edgePtrs_initial) {
- rdrCtx.putDirtyIntArray(aux_edgePtrs);
- aux_edgePtrs = aux_edgePtrs_initial;
- }
- }
- if (alphaLine != alphaLine_initial) {
- rdrCtx.putIntArray(alphaLine, 0, 0); // already zero filled
- alphaLine = alphaLine_initial;
- }
- if (blkFlags != blkFlags_initial) {
- rdrCtx.putIntArray(blkFlags, 0, 0); // already zero filled
- blkFlags = blkFlags_initial;
- }
+ crossings = crossings_ref.putArray(crossings);
+ aux_crossings = aux_crossings_ref.putArray(aux_crossings);
+
+ edgePtrs = edgePtrs_ref.putArray(edgePtrs);
+ aux_edgePtrs = aux_edgePtrs_ref.putArray(aux_edgePtrs);
+
+ alphaLine = alphaLine_ref.putArray(alphaLine, 0, 0); // already zero filled
+ blkFlags = blkFlags_ref.putArray(blkFlags, 0, 0); // already zero filled
if (edgeMinY != Integer.MAX_VALUE) {
// if context is maked as DIRTY:
@@ -639,30 +645,16 @@
buckets_minY = 0;
buckets_maxY = boundsMaxY - boundsMinY;
}
- // clear used part
- if (edgeBuckets == edgeBuckets_initial) {
- // fill only used part
- IntArrayCache.fill(edgeBuckets, buckets_minY,
- buckets_maxY, 0);
- IntArrayCache.fill(edgeBucketCounts, buckets_minY,
- buckets_maxY + 1, 0);
- } else {
- // clear only used part
- rdrCtx.putIntArray(edgeBuckets, buckets_minY,
- buckets_maxY);
- edgeBuckets = edgeBuckets_initial;
-
- rdrCtx.putIntArray(edgeBucketCounts, buckets_minY,
- buckets_maxY + 1);
- edgeBucketCounts = edgeBucketCounts_initial;
- }
- } else if (edgeBuckets != edgeBuckets_initial) {
+ // clear only used part
+ edgeBuckets = edgeBuckets_ref.putArray(edgeBuckets, buckets_minY,
+ buckets_maxY);
+ edgeBucketCounts = edgeBucketCounts_ref.putArray(edgeBucketCounts,
+ buckets_minY,
+ buckets_maxY + 1);
+ } else {
// unused arrays
- rdrCtx.putIntArray(edgeBuckets, 0, 0);
- edgeBuckets = edgeBuckets_initial;
-
- rdrCtx.putIntArray(edgeBucketCounts, 0, 0);
- edgeBucketCounts = edgeBucketCounts_initial;
+ edgeBuckets = edgeBuckets_ref.putArray(edgeBuckets, 0, 0);
+ edgeBucketCounts = edgeBucketCounts_ref.putArray(edgeBucketCounts, 0, 0);
}
// At last: resize back off-heap edges to initial size
@@ -680,12 +672,12 @@
}
private static float tosubpixx(final float pix_x) {
- return f_SUBPIXEL_POSITIONS_X * pix_x;
+ return F_SUBPIXEL_POSITIONS_X * pix_x;
}
private static float tosubpixy(final float pix_y) {
// shift y by -0.5 for fast ceil(y - 0.5):
- return f_SUBPIXEL_POSITIONS_Y * pix_y - 0.5f;
+ return F_SUBPIXEL_POSITIONS_Y * pix_y - 0.5f;
}
@Override
@@ -749,11 +741,6 @@
throw new InternalError("Renderer does not use a native consumer.");
}
- // clean alpha array (zero filled)
- private int[] alphaLine;
- // 2048 (pixelsize) pixel large
- private final int[] alphaLine_initial = new int[INITIAL_AA_ARRAY]; // 8K
-
private void _endRendering(final int ymin, final int ymax) {
if (DISABLE_RENDER) {
return;
@@ -857,8 +844,7 @@
// bucketCount indicates new edge / edge end:
if (bucketcount != 0) {
if (DO_STATS) {
- rdrCtx.stats.stat_rdr_activeEdges_updates
- .add(numCrossings);
+ rdrCtx.stats.stat_rdr_activeEdges_updates.add(numCrossings);
}
// last bit set to 1 means that edges ends
@@ -883,38 +869,33 @@
if (ptrLen != 0) {
if (DO_STATS) {
- rdrCtx.stats.stat_rdr_activeEdges_adds
- .add(ptrLen);
+ rdrCtx.stats.stat_rdr_activeEdges_adds.add(ptrLen);
if (ptrLen > 10) {
- rdrCtx.stats.stat_rdr_activeEdges_adds_high
- .add(ptrLen);
+ rdrCtx.stats.stat_rdr_activeEdges_adds_high.add(ptrLen);
}
}
ptrEnd = numCrossings + ptrLen;
if (edgePtrsLen < ptrEnd) {
if (DO_STATS) {
- rdrCtx.stats.stat_array_renderer_edgePtrs
- .add(ptrEnd);
+ rdrCtx.stats.stat_array_renderer_edgePtrs.add(ptrEnd);
}
this.edgePtrs = _edgePtrs
- = rdrCtx.widenDirtyIntArray(_edgePtrs, numCrossings,
- ptrEnd);
+ = edgePtrs_ref.widenArray(_edgePtrs, numCrossings,
+ ptrEnd);
edgePtrsLen = _edgePtrs.length;
// Get larger auxiliary storage:
- if (_aux_edgePtrs != aux_edgePtrs_initial) {
- rdrCtx.putDirtyIntArray(_aux_edgePtrs);
- }
+ aux_edgePtrs_ref.putArray(_aux_edgePtrs);
+
// use ArrayCache.getNewSize() to use the same growing
- // factor than widenDirtyIntArray():
+ // factor than widenArray():
if (DO_STATS) {
- rdrCtx.stats.stat_array_renderer_aux_edgePtrs
- .add(ptrEnd);
+ rdrCtx.stats.stat_array_renderer_aux_edgePtrs.add(ptrEnd);
}
this.aux_edgePtrs = _aux_edgePtrs
- = rdrCtx.getDirtyIntArray(
- ArrayCache.getNewSize(numCrossings, ptrEnd)
+ = aux_edgePtrs_ref.getArray(
+ ArrayCacheConst.getNewSize(numCrossings, ptrEnd)
);
}
@@ -933,26 +914,24 @@
if (crossingsLen < numCrossings) {
// Get larger array:
- if (_crossings != crossings_initial) {
- rdrCtx.putDirtyIntArray(_crossings);
- }
+ crossings_ref.putArray(_crossings);
+
if (DO_STATS) {
rdrCtx.stats.stat_array_renderer_crossings
.add(numCrossings);
}
this.crossings = _crossings
- = rdrCtx.getDirtyIntArray(numCrossings);
+ = crossings_ref.getArray(numCrossings);
// Get larger auxiliary storage:
- if (_aux_crossings != aux_crossings_initial) {
- rdrCtx.putDirtyIntArray(_aux_crossings);
- }
+ aux_crossings_ref.putArray(_aux_crossings);
+
if (DO_STATS) {
rdrCtx.stats.stat_array_renderer_aux_crossings
.add(numCrossings);
}
this.aux_crossings = _aux_crossings
- = rdrCtx.getDirtyIntArray(numCrossings);
+ = aux_crossings_ref.getArray(numCrossings);
crossingsLen = _crossings.length;
}
@@ -973,10 +952,8 @@
*/
if ((ptrLen < 10) || (numCrossings < 40)) {
if (DO_STATS) {
- rdrCtx.stats.hist_rdr_crossings
- .add(numCrossings);
- rdrCtx.stats.hist_rdr_crossings_adds
- .add(ptrLen);
+ rdrCtx.stats.hist_rdr_crossings.add(numCrossings);
+ rdrCtx.stats.hist_rdr_crossings_adds.add(ptrLen);
}
/*
@@ -1019,23 +996,20 @@
_unsafe.putInt(addr + _OFF_ERROR, (err & _ERR_STEP_MAX));
if (DO_STATS) {
- rdrCtx.stats.stat_rdr_crossings_updates
- .add(numCrossings);
+ rdrCtx.stats.stat_rdr_crossings_updates.add(numCrossings);
}
// insertion sort of crossings:
if (cross < lastCross) {
if (DO_STATS) {
- rdrCtx.stats.stat_rdr_crossings_sorts
- .add(i);
+ rdrCtx.stats.stat_rdr_crossings_sorts.add(i);
}
/* use binary search for newly added edges
in crossings if arrays are large enough */
if (useBinarySearch && (i >= prevNumCrossings)) {
if (DO_STATS) {
- rdrCtx.stats.
- stat_rdr_crossings_bsearch.add(i);
+ rdrCtx.stats.stat_rdr_crossings_bsearch.add(i);
}
low = 0;
high = i - 1;
@@ -1078,14 +1052,11 @@
}
} else {
if (DO_STATS) {
- rdrCtx.stats.stat_rdr_crossings_msorts
- .add(numCrossings);
+ rdrCtx.stats.stat_rdr_crossings_msorts.add(numCrossings);
rdrCtx.stats.hist_rdr_crossings_ratio
.add((1000 * ptrLen) / numCrossings);
- rdrCtx.stats.hist_rdr_crossings_msorts
- .add(numCrossings);
- rdrCtx.stats.hist_rdr_crossings_msorts_adds
- .add(ptrLen);
+ rdrCtx.stats.hist_rdr_crossings_msorts.add(numCrossings);
+ rdrCtx.stats.hist_rdr_crossings_msorts_adds.add(ptrLen);
}
// Copy sorted data in auxiliary arrays
@@ -1125,8 +1096,7 @@
_unsafe.putInt(addr + _OFF_ERROR, (err & _ERR_STEP_MAX));
if (DO_STATS) {
- rdrCtx.stats.stat_rdr_crossings_updates
- .add(numCrossings);
+ rdrCtx.stats.stat_rdr_crossings_updates.add(numCrossings);
}
if (i >= prevNumCrossings) {
@@ -1136,8 +1106,7 @@
} else if (cross < lastCross) {
if (DO_STATS) {
- rdrCtx.stats.stat_rdr_crossings_sorts
- .add(i);
+ rdrCtx.stats.stat_rdr_crossings_sorts.add(i);
}
// (straight) insertion sort of crossings:
@@ -1462,7 +1431,7 @@
// note: +2 to ensure enough space left at end
final int nxTiles = ((pmaxX - pminX) >> TILE_SIZE_LG) + 2;
if (nxTiles > INITIAL_ARRAY) {
- blkFlags = rdrCtx.getIntArray(nxTiles);
+ blkFlags = blkFlags_ref.getArray(nxTiles);
}
}
}
@@ -1494,10 +1463,9 @@
// Useful when processing tile line by tile line
if (width > INITIAL_AA_ARRAY) {
if (DO_STATS) {
- rdrCtx.stats.stat_array_renderer_alphaline
- .add(width);
+ rdrCtx.stats.stat_array_renderer_alphaline.add(width);
}
- alphaLine = rdrCtx.getIntArray(width);
+ alphaLine = alphaLine_ref.getArray(width);
}
// process first tile line:
@@ -1532,13 +1500,6 @@
}
}
- private boolean enableBlkFlags = false;
- private boolean prevUseBlkFlags = false;
-
- private final int[] blkFlags_initial = new int[INITIAL_ARRAY]; // 1 tile line
- /* block flags (0|1) */
- private int[] blkFlags = blkFlags_initial;
-
void copyAARow(final int[] alphaRow,
final int pix_y, final int pix_from, final int pix_to,
final boolean useBlockFlags)
--- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/RendererContext.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/RendererContext.java Fri Aug 26 10:14:15 2016 -0700
@@ -29,10 +29,8 @@
import java.lang.ref.WeakReference;
import java.util.concurrent.atomic.AtomicInteger;
import sun.java2d.ReentrantContext;
-import sun.java2d.ReentrantContextProvider;
-import static sun.java2d.marlin.ArrayCache.*;
+import sun.java2d.marlin.ArrayCacheConst.CacheStats;
import sun.java2d.marlin.MarlinRenderingEngine.NormalizingPathIterator;
-import static sun.java2d.marlin.MarlinUtils.logInfo;
/**
* This class is a renderer context dedicated to a single thread
@@ -41,12 +39,6 @@
// RendererContext creation counter
private static final AtomicInteger CTX_COUNT = new AtomicInteger(1);
- // RendererContext statistics
- final RendererStats stats = (DO_STATS || DO_MONITORS)
- ? RendererStats.getInstance(): null;
-
- private static final boolean USE_CACHE_HARD_REF = DO_STATS
- || (MarlinRenderingEngine.REF_TYPE == ReentrantContextProvider.REF_WEAK);
/**
* Create a new renderer context
@@ -54,25 +46,14 @@
* @return new RendererContext instance
*/
static RendererContext createContext() {
- final RendererContext newCtx = new RendererContext("ctx"
- + Integer.toString(CTX_COUNT.getAndIncrement()));
-
- if (DO_STATS || DO_MONITORS) {
- RendererStats.ALL_CONTEXTS.add(newCtx);
- }
- return newCtx;
+ return new RendererContext("ctx"
+ + Integer.toString(CTX_COUNT.getAndIncrement()));
}
- // context name (debugging purposes)
- final String name;
// Smallest object used as Cleaner's parent reference
- final Object cleanerObj = new Object();
+ private final Object cleanerObj;
// dirty flag indicating an exception occured during pipeline in pathTo()
boolean dirty = false;
- // dynamic array caches kept using weak reference (low memory footprint)
- WeakReference<ArrayCachesHolder> refArrayCaches = null;
- // hard reference to array caches (for statistics)
- ArrayCachesHolder hardRefArrayCaches = null;
// shared data
final float[] float6 = new float[6];
// shared curve (dirty) (Renderer / Stroker)
@@ -83,8 +64,8 @@
final NormalizingPathIterator nPQPathIterator;
// MarlinRenderingEngine.TransformingPathConsumer2D
final TransformingPathConsumer2D transformerPC2D;
- // recycled Path2D instance
- Path2D.Float p2d = null;
+ // recycled Path2D instance (weak)
+ private WeakReference<Path2D.Float> refPath2D = null;
final Renderer renderer;
final Stroker stroker;
// Simplifies out collinear lines
@@ -95,6 +76,19 @@
// flag indicating the shape is stroked (1) or filled (0)
int stroking = 0;
+ // Array caches:
+ /* clean int[] cache (zero-filled) = 5 refs */
+ private final IntArrayCache cleanIntCache = new IntArrayCache(true, 5);
+ /* dirty int[] cache = 4 refs */
+ private final IntArrayCache dirtyIntCache = new IntArrayCache(false, 4);
+ /* dirty float[] cache = 3 refs */
+ private final FloatArrayCache dirtyFloatCache = new FloatArrayCache(false, 3);
+ /* dirty byte[] cache = 1 ref */
+ private final ByteArrayCache dirtyByteCache = new ByteArrayCache(false, 1);
+
+ // RendererContext statistics
+ final RendererStats stats;
+
/**
* Constructor
*
@@ -104,8 +98,18 @@
if (LOG_CREATE_CONTEXT) {
MarlinUtils.logInfo("new RendererContext = " + name);
}
+ this.cleanerObj = new Object();
- this.name = name;
+ // create first stats (needed by newOffHeapArray):
+ if (DO_STATS || DO_MONITORS) {
+ stats = RendererStats.createInstance(cleanerObj, name);
+ // push cache stats:
+ stats.cacheStats = new CacheStats[] { cleanIntCache.stats,
+ dirtyIntCache.stats, dirtyFloatCache.stats, dirtyByteCache.stats
+ };
+ } else {
+ stats = null;
+ }
// NormalizingPathIterator instances:
nPCPathIterator = new NormalizingPathIterator.NearestPixelCenter(float6);
@@ -128,11 +132,13 @@
* clean up before reusing this context
*/
void dispose() {
+ if (DO_STATS) {
+ if (stats.totalOffHeap > stats.totalOffHeapMax) {
+ stats.totalOffHeapMax = stats.totalOffHeap;
+ }
+ stats.totalOffHeap = 0L;
+ }
stroking = 0;
- // reset hard reference to array caches if needed:
- if (!USE_CACHE_HARD_REF) {
- hardRefArrayCaches = null;
- }
// if context is maked as DIRTY:
if (dirty) {
// may happen if an exception if thrown in the pipeline processing:
@@ -151,300 +157,43 @@
}
}
- // Array caches
- ArrayCachesHolder getArrayCachesHolder() {
- // Use hard reference first (cached resolved weak reference):
- ArrayCachesHolder holder = hardRefArrayCaches;
- if (holder == null) {
- // resolve reference:
- holder = (refArrayCaches != null)
- ? refArrayCaches.get()
- : null;
- // create a new ArrayCachesHolder if none is available
- if (holder == null) {
- if (LOG_CREATE_CONTEXT) {
- MarlinUtils.logInfo("new ArrayCachesHolder for "
- + "RendererContext = " + name);
- }
-
- holder = new ArrayCachesHolder();
-
- if (USE_CACHE_HARD_REF) {
- // update hard reference:
- hardRefArrayCaches = holder;
- } else {
- // update weak reference:
- refArrayCaches = new WeakReference<ArrayCachesHolder>(holder);
- }
- }
- }
- return holder;
- }
+ Path2D.Float getPath2D() {
+ // resolve reference:
+ Path2D.Float p2d
+ = (refPath2D != null) ? refPath2D.get() : null;
- // dirty byte array cache
- ByteArrayCache getDirtyByteArrayCache(final int length) {
- final int bucket = ArrayCache.getBucketDirtyBytes(length);
- return getArrayCachesHolder().dirtyByteArrayCaches[bucket];
- }
-
- byte[] getDirtyByteArray(final int length) {
- if (length <= MAX_DIRTY_BYTE_ARRAY_SIZE) {
- return getDirtyByteArrayCache(length).getArray();
- }
-
- if (DO_STATS) {
- incOversize();
- }
-
- if (DO_LOG_OVERSIZE) {
- logInfo("getDirtyByteArray[oversize]: length=\t" + length);
- }
+ // create a new Path2D ?
+ if (p2d == null) {
+ p2d = new Path2D.Float(Path2D.WIND_NON_ZERO, INITIAL_EDGES_COUNT); // 32K
- return new byte[length];
- }
-
- void putDirtyByteArray(final byte[] array) {
- final int length = array.length;
- // odd sized array are non-cached arrays (initial arrays)
- // ensure to never store initial arrays in cache:
- if (((length & 0x1) == 0) && (length <= MAX_DIRTY_BYTE_ARRAY_SIZE)) {
- getDirtyByteArrayCache(length).putDirtyArray(array, length);
- }
- }
-
- byte[] widenDirtyByteArray(final byte[] in,
- final int usedSize, final int needSize)
- {
- final int length = in.length;
- if (DO_CHECKS && length >= needSize) {
- return in;
+ // update weak reference:
+ refPath2D = new WeakReference<Path2D.Float>(p2d);
}
- if (DO_STATS) {
- incResizeDirtyByte();
- }
-
- // maybe change bucket:
- // ensure getNewSize() > newSize:
- final byte[] res = getDirtyByteArray(getNewSize(usedSize, needSize));
-
- System.arraycopy(in, 0, res, 0, usedSize); // copy only used elements
-
- // maybe return current array:
- // NO clean-up of array data = DIRTY ARRAY
- putDirtyByteArray(in);
-
- if (DO_LOG_WIDEN_ARRAY) {
- logInfo("widenDirtyByteArray[" + res.length + "]: usedSize=\t"
- + usedSize + "\tlength=\t" + length + "\tneeded length=\t"
- + needSize);
- }
- return res;
- }
-
- // int array cache
- IntArrayCache getIntArrayCache(final int length) {
- final int bucket = ArrayCache.getBucket(length);
- return getArrayCachesHolder().intArrayCaches[bucket];
- }
-
- int[] getIntArray(final int length) {
- if (length <= MAX_ARRAY_SIZE) {
- return getIntArrayCache(length).getArray();
- }
-
- if (DO_STATS) {
- incOversize();
- }
-
- if (DO_LOG_OVERSIZE) {
- logInfo("getIntArray[oversize]: length=\t" + length);
- }
-
- return new int[length];
- }
-
- // unused
- int[] widenIntArray(final int[] in, final int usedSize,
- final int needSize, final int clearTo)
- {
- final int length = in.length;
- if (DO_CHECKS && length >= needSize) {
- return in;
- }
- if (DO_STATS) {
- incResizeInt();
- }
-
- // maybe change bucket:
- // ensure getNewSize() > newSize:
- final int[] res = getIntArray(getNewSize(usedSize, needSize));
-
- System.arraycopy(in, 0, res, 0, usedSize); // copy only used elements
-
- // maybe return current array:
- putIntArray(in, 0, clearTo); // ensure all array is cleared (grow-reduce algo)
-
- if (DO_LOG_WIDEN_ARRAY) {
- logInfo("widenIntArray[" + res.length + "]: usedSize=\t"
- + usedSize + "\tlength=\t" + length + "\tneeded length=\t"
- + needSize);
- }
- return res;
+ // reset the path anyway:
+ p2d.reset();
+ return p2d;
}
- void putIntArray(final int[] array, final int fromIndex,
- final int toIndex)
- {
- final int length = array.length;
- // odd sized array are non-cached arrays (initial arrays)
- // ensure to never store initial arrays in cache:
- if (((length & 0x1) == 0) && (length <= MAX_ARRAY_SIZE)) {
- getIntArrayCache(length).putArray(array, length, fromIndex, toIndex);
+ OffHeapArray newOffHeapArray(final long initialSize) {
+ if (DO_STATS) {
+ stats.totalOffHeapInitial += initialSize;
}
- }
-
- // dirty int array cache
- IntArrayCache getDirtyIntArrayCache(final int length) {
- final int bucket = ArrayCache.getBucket(length);
- return getArrayCachesHolder().dirtyIntArrayCaches[bucket];
- }
-
- int[] getDirtyIntArray(final int length) {
- if (length <= MAX_ARRAY_SIZE) {
- return getDirtyIntArrayCache(length).getArray();
- }
-
- if (DO_STATS) {
- incOversize();
- }
-
- if (DO_LOG_OVERSIZE) {
- logInfo("getDirtyIntArray[oversize]: length=\t" + length);
- }
-
- return new int[length];
+ return new OffHeapArray(cleanerObj, initialSize);
}
- int[] widenDirtyIntArray(final int[] in,
- final int usedSize, final int needSize)
- {
- final int length = in.length;
- if (DO_CHECKS && length >= needSize) {
- return in;
- }
- if (DO_STATS) {
- incResizeDirtyInt();
- }
-
- // maybe change bucket:
- // ensure getNewSize() > newSize:
- final int[] res = getDirtyIntArray(getNewSize(usedSize, needSize));
-
- System.arraycopy(in, 0, res, 0, usedSize); // copy only used elements
-
- // maybe return current array:
- // NO clean-up of array data = DIRTY ARRAY
- putDirtyIntArray(in);
-
- if (DO_LOG_WIDEN_ARRAY) {
- logInfo("widenDirtyIntArray[" + res.length + "]: usedSize=\t"
- + usedSize + "\tlength=\t" + length + "\tneeded length=\t"
- + needSize);
- }
- return res;
- }
-
- void putDirtyIntArray(final int[] array) {
- final int length = array.length;
- // odd sized array are non-cached arrays (initial arrays)
- // ensure to never store initial arrays in cache:
- if (((length & 0x1) == 0) && (length <= MAX_ARRAY_SIZE)) {
- getDirtyIntArrayCache(length).putDirtyArray(array, length);
- }
- }
-
- // dirty float array cache
- FloatArrayCache getDirtyFloatArrayCache(final int length) {
- final int bucket = ArrayCache.getBucket(length);
- return getArrayCachesHolder().dirtyFloatArrayCaches[bucket];
+ IntArrayCache.Reference newCleanIntArrayRef(final int initialSize) {
+ return cleanIntCache.createRef(initialSize);
}
- float[] getDirtyFloatArray(final int length) {
- if (length <= MAX_ARRAY_SIZE) {
- return getDirtyFloatArrayCache(length).getArray();
- }
-
- if (DO_STATS) {
- incOversize();
- }
-
- if (DO_LOG_OVERSIZE) {
- logInfo("getDirtyFloatArray[oversize]: length=\t" + length);
- }
-
- return new float[length];
+ IntArrayCache.Reference newDirtyIntArrayRef(final int initialSize) {
+ return dirtyIntCache.createRef(initialSize);
}
- float[] widenDirtyFloatArray(final float[] in,
- final int usedSize, final int needSize)
- {
- final int length = in.length;
- if (DO_CHECKS && length >= needSize) {
- return in;
- }
- if (DO_STATS) {
- incResizeDirtyFloat();
- }
-
- // maybe change bucket:
- // ensure getNewSize() > newSize:
- final float[] res = getDirtyFloatArray(getNewSize(usedSize, needSize));
-
- System.arraycopy(in, 0, res, 0, usedSize); // copy only used elements
-
- // maybe return current array:
- // NO clean-up of array data = DIRTY ARRAY
- putDirtyFloatArray(in);
-
- if (DO_LOG_WIDEN_ARRAY) {
- logInfo("widenDirtyFloatArray[" + res.length + "]: usedSize=\t"
- + usedSize + "\tlength=\t" + length + "\tneeded length=\t"
- + needSize);
- }
- return res;
+ FloatArrayCache.Reference newDirtyFloatArrayRef(final int initialSize) {
+ return dirtyFloatCache.createRef(initialSize);
}
- void putDirtyFloatArray(final float[] array) {
- final int length = array.length;
- // odd sized array are non-cached arrays (initial arrays)
- // ensure to never store initial arrays in cache:
- if (((length & 0x1) == 0) && (length <= MAX_ARRAY_SIZE)) {
- getDirtyFloatArrayCache(length).putDirtyArray(array, length);
- }
- }
-
- /* class holding all array cache instances */
- static final class ArrayCachesHolder {
- // zero-filled int array cache:
- final IntArrayCache[] intArrayCaches;
- // dirty array caches:
- final IntArrayCache[] dirtyIntArrayCaches;
- final FloatArrayCache[] dirtyFloatArrayCaches;
- final ByteArrayCache[] dirtyByteArrayCaches;
-
- ArrayCachesHolder() {
- intArrayCaches = new IntArrayCache[BUCKETS];
- dirtyIntArrayCaches = new IntArrayCache[BUCKETS];
- dirtyFloatArrayCaches = new FloatArrayCache[BUCKETS];
- dirtyByteArrayCaches = new ByteArrayCache[BUCKETS];
-
- for (int i = 0; i < BUCKETS; i++) {
- intArrayCaches[i] = new IntArrayCache(ARRAY_SIZES[i]);
- // dirty array caches:
- dirtyIntArrayCaches[i] = new IntArrayCache(ARRAY_SIZES[i]);
- dirtyFloatArrayCaches[i] = new FloatArrayCache(ARRAY_SIZES[i]);
- dirtyByteArrayCaches[i] = new ByteArrayCache(DIRTY_BYTE_ARRAY_SIZES[i]);
- }
- }
+ ByteArrayCache.Reference newDirtyByteArrayRef(final int initialSize) {
+ return dirtyByteCache.createRef(initialSize);
}
}
--- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/RendererStats.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/RendererStats.java Fri Aug 26 10:14:15 2016 -0700
@@ -30,6 +30,8 @@
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ConcurrentLinkedQueue;
+import jdk.internal.ref.CleanerFactory;
+import sun.java2d.marlin.ArrayCacheConst.CacheStats;
import static sun.java2d.marlin.MarlinUtils.logInfo;
import sun.java2d.marlin.stats.Histogram;
import sun.java2d.marlin.stats.Monitor;
@@ -41,26 +43,22 @@
*/
public final class RendererStats implements MarlinConst {
- // singleton
- private static volatile RendererStats SINGLETON = null;
+ static RendererStats createInstance(final Object parent, final String name)
+ {
+ final RendererStats stats = new RendererStats(name);
- static RendererStats getInstance() {
- if (SINGLETON == null) {
- SINGLETON = new RendererStats();
- }
- return SINGLETON;
+ // Keep a strong reference to dump it later:
+ RendererStatsHolder.getInstance().add(parent, stats);
+
+ return stats;
}
public static void dumpStats() {
- if (SINGLETON != null) {
- SINGLETON.dump();
- }
+ RendererStatsHolder.dumpStats();
}
- /* RendererContext collection as hard references
- (only used for debugging purposes) */
- static final ConcurrentLinkedQueue<RendererContext> ALL_CONTEXTS
- = new ConcurrentLinkedQueue<RendererContext>();
+ // context name (debugging purposes)
+ final String name;
// stats
final StatLong stat_cache_rowAA
= new StatLong("cache.rowAA");
@@ -118,7 +116,7 @@
final StatLong stat_array_stroker_polystack_curveTypes
= new StatLong("array.stroker.polystack.curveTypes.d_byte");
final StatLong stat_array_marlincache_rowAAChunk
- = new StatLong("array.marlincache.rowAAChunk.d_byte");
+ = new StatLong("array.marlincache.rowAAChunk.resize");
final StatLong stat_array_marlincache_touchedTile
= new StatLong("array.marlincache.touchedTile.int");
final StatLong stat_array_renderer_alphaline
@@ -136,6 +134,10 @@
final StatLong stat_array_renderer_aux_edgePtrs
= new StatLong("array.renderer.aux_edgePtrs.int");
// histograms
+ final Histogram hist_rdr_edges_count
+ = new Histogram("renderer.edges.count");
+ final Histogram hist_rdr_poly_stack_curves
+ = new Histogram("renderer.polystack.curves");
final Histogram hist_rdr_crossings
= new Histogram("renderer.crossings");
final Histogram hist_rdr_crossings_ratio
@@ -181,6 +183,8 @@
stat_rdr_crossings_sorts,
stat_rdr_crossings_bsearch,
stat_rdr_crossings_msorts,
+ hist_rdr_edges_count,
+ hist_rdr_poly_stack_curves,
hist_rdr_crossings,
hist_rdr_crossings_ratio,
hist_rdr_crossings_adds,
@@ -233,95 +237,145 @@
mon_ptg_getAlpha,
mon_debug
};
-
- private RendererStats() {
- super();
+ // offheap stats
+ long totalOffHeapInitial = 0L;
+ // live accumulator
+ long totalOffHeap = 0L;
+ long totalOffHeapMax = 0L;
+ // cache stats
+ CacheStats[] cacheStats = null;
- AccessController.doPrivileged(
- (PrivilegedAction<Void>) () -> {
- final Thread hook = new Thread(
- ThreadGroupUtils.getRootThreadGroup(),
- new Runnable() {
- @Override
- public void run() {
- dump();
- }
- },
- "MarlinStatsHook"
- );
- hook.setContextClassLoader(null);
- Runtime.getRuntime().addShutdownHook(hook);
-
- if (USE_DUMP_THREAD) {
- final Timer statTimer = new Timer("RendererStats");
- statTimer.scheduleAtFixedRate(new TimerTask() {
- @Override
- public void run() {
- dump();
- }
- }, DUMP_INTERVAL, DUMP_INTERVAL);
- }
- return null;
- }
- );
+ private RendererStats(final String name) {
+ this.name = name;
}
void dump() {
- if (DO_STATS) {
- ArrayCache.dumpStats();
- }
- for (RendererContext rdrCtx : ALL_CONTEXTS) {
- logInfo("RendererContext: " + rdrCtx.name);
+ logInfo("RendererContext: " + name);
- if (DO_MONITORS) {
+ if (DO_MONITORS) {
+ for (Monitor monitor : monitors) {
+ if (monitor.count != 0) {
+ logInfo(monitor.toString());
+ }
+ }
+ // As getAATileGenerator percents:
+ final long total = mon_pre_getAATileGenerator.sum;
+ if (total != 0L) {
for (Monitor monitor : monitors) {
- if (monitor.count != 0) {
- logInfo(monitor.toString());
- }
+ logInfo(monitor.name + " : "
+ + ((100d * monitor.sum) / total) + " %");
}
- // As getAATileGenerator percents:
- final long total = mon_pre_getAATileGenerator.sum;
- if (total != 0L) {
- for (Monitor monitor : monitors) {
- logInfo(monitor.name + " : "
- + ((100d * monitor.sum) / total) + " %");
- }
+ }
+ if (DO_FLUSH_MONITORS) {
+ for (Monitor m : monitors) {
+ m.reset();
}
- if (DO_FLUSH_MONITORS) {
- for (Monitor m : monitors) {
- m.reset();
+ }
+ }
+
+ if (DO_STATS) {
+ for (StatLong stat : statistics) {
+ if (stat.count != 0) {
+ logInfo(stat.toString());
+ if (DO_FLUSH_STATS) {
+ stat.reset();
}
}
}
- if (DO_STATS) {
- for (StatLong stat : statistics) {
- if (stat.count != 0) {
- logInfo(stat.toString());
+ logInfo("OffHeap footprint: initial: " + totalOffHeapInitial
+ + " bytes - max: " + totalOffHeapMax + " bytes");
+ if (DO_FLUSH_STATS) {
+ totalOffHeapMax = 0L;
+ }
+
+ logInfo("Array caches for RendererContext: " + name);
+
+ long totalInitialBytes = totalOffHeapInitial;
+ long totalCacheBytes = 0L;
+
+ if (cacheStats != null) {
+ for (CacheStats stat : cacheStats) {
+ totalCacheBytes += stat.dumpStats();
+ totalInitialBytes += stat.getTotalInitialBytes();
+ if (DO_FLUSH_STATS) {
stat.reset();
}
}
- // IntArrayCaches stats:
- final RendererContext.ArrayCachesHolder holder
- = rdrCtx.getArrayCachesHolder();
+ }
+ logInfo("Heap footprint: initial: " + totalInitialBytes
+ + " bytes - cache: " + totalCacheBytes + " bytes");
+ }
+ }
+
+ static final class RendererStatsHolder {
+
+ // singleton
+ private static volatile RendererStatsHolder SINGLETON = null;
- logInfo("Array caches for thread: " + rdrCtx.name);
+ static synchronized RendererStatsHolder getInstance() {
+ if (SINGLETON == null) {
+ SINGLETON = new RendererStatsHolder();
+ }
+ return SINGLETON;
+ }
- for (IntArrayCache cache : holder.intArrayCaches) {
- cache.dumpStats();
- }
+ static void dumpStats() {
+ if (SINGLETON != null) {
+ SINGLETON.dump();
+ }
+ }
+
+ /* RendererStats collection as hard references
+ (only used for debugging purposes) */
+ private final ConcurrentLinkedQueue<RendererStats> allStats
+ = new ConcurrentLinkedQueue<RendererStats>();
- logInfo("Dirty Array caches for thread: " + rdrCtx.name);
+ private RendererStatsHolder() {
+ AccessController.doPrivileged(
+ (PrivilegedAction<Void>) () -> {
+ final Thread hook = new Thread(
+ ThreadGroupUtils.getRootThreadGroup(),
+ new Runnable() {
+ @Override
+ public void run() {
+ dump();
+ }
+ },
+ "MarlinStatsHook"
+ );
+ hook.setContextClassLoader(null);
+ Runtime.getRuntime().addShutdownHook(hook);
- for (IntArrayCache cache : holder.dirtyIntArrayCaches) {
- cache.dumpStats();
+ if (USE_DUMP_THREAD) {
+ final Timer statTimer = new Timer("RendererStats");
+ statTimer.scheduleAtFixedRate(new TimerTask() {
+ @Override
+ public void run() {
+ dump();
+ }
+ }, DUMP_INTERVAL, DUMP_INTERVAL);
+ }
+ return null;
}
- for (FloatArrayCache cache : holder.dirtyFloatArrayCaches) {
- cache.dumpStats();
- }
- for (ByteArrayCache cache : holder.dirtyByteArrayCaches) {
- cache.dumpStats();
- }
+ );
+ }
+
+ void add(final Object parent, final RendererStats stats) {
+ allStats.add(stats);
+
+ // Register a cleaning function to ensure removing dead entries:
+ CleanerFactory.cleaner().register(parent, () -> remove(stats));
+ }
+
+ void remove(final RendererStats stats) {
+ stats.dump(); // dump anyway
+ allStats.remove(stats);
+ }
+
+ void dump() {
+ for (RendererStats stats : allStats) {
+ stats.dump();
}
}
}
--- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Stroker.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Stroker.java Fri Aug 26 10:14:15 2016 -0700
@@ -1205,6 +1205,12 @@
private static final byte TYPE_QUADTO = (byte) 1;
private static final byte TYPE_CUBICTO = (byte) 2;
+ // curves capacity = edges count (4096) = half edges x 2 (coords)
+ private static final int INITIAL_CURVES_COUNT = INITIAL_EDGES_COUNT;
+
+ // types capacity = half edges count (2048)
+ private static final int INITIAL_TYPES_COUNT = INITIAL_EDGES_COUNT >> 1;
+
float[] curves;
int end;
byte[] curveTypes;
@@ -1213,10 +1219,10 @@
// per-thread renderer context
final RendererContext rdrCtx;
- // per-thread initial arrays (large enough to satisfy most usages: 8192)
- // +1 to avoid recycling in Helpers.widenArray()
- private final float[] curves_initial = new float[INITIAL_LARGE_ARRAY + 1]; // 32K
- private final byte[] curveTypes_initial = new byte[INITIAL_LARGE_ARRAY + 1]; // 8K
+ // curves ref (dirty)
+ final FloatArrayCache.Reference curves_ref;
+ // curveTypes ref (dirty)
+ final ByteArrayCache.Reference curveTypes_ref;
// used marks (stats only)
int curveTypesUseMark;
@@ -1229,10 +1235,13 @@
PolyStack(final RendererContext rdrCtx) {
this.rdrCtx = rdrCtx;
- curves = curves_initial;
- curveTypes = curveTypes_initial;
+ curves_ref = rdrCtx.newDirtyFloatArrayRef(INITIAL_CURVES_COUNT); // 16K
+ curves = curves_ref.initial;
+
+ curveTypes_ref = rdrCtx.newDirtyByteArrayRef(INITIAL_TYPES_COUNT); // 2K
+ curveTypes = curveTypes_ref.initial;
+ numCurves = 0;
end = 0;
- numCurves = 0;
if (DO_STATS) {
curveTypesUseMark = 0;
@@ -1249,10 +1258,10 @@
numCurves = 0;
if (DO_STATS) {
- rdrCtx.stats.stat_rdr_poly_stack_types
- .add(curveTypesUseMark);
- rdrCtx.stats.stat_rdr_poly_stack_curves
- .add(curvesUseMark);
+ rdrCtx.stats.stat_rdr_poly_stack_types.add(curveTypesUseMark);
+ rdrCtx.stats.stat_rdr_poly_stack_curves.add(curvesUseMark);
+ rdrCtx.stats.hist_rdr_poly_stack_curves.add(curvesUseMark);
+
// reset marks
curveTypesUseMark = 0;
curvesUseMark = 0;
@@ -1260,15 +1269,8 @@
// Return arrays:
// curves and curveTypes are kept dirty
- if (curves != curves_initial) {
- rdrCtx.putDirtyFloatArray(curves);
- curves = curves_initial;
- }
-
- if (curveTypes != curveTypes_initial) {
- rdrCtx.putDirtyByteArray(curveTypes);
- curveTypes = curveTypes_initial;
- }
+ curves = curves_ref.putArray(curves);
+ curveTypes = curveTypes_ref.putArray(curveTypes);
}
private void ensureSpace(final int n) {
@@ -1278,16 +1280,16 @@
rdrCtx.stats.stat_array_stroker_polystack_curves
.add(end + n);
}
- curves = rdrCtx.widenDirtyFloatArray(curves, end, end + n);
+ curves = curves_ref.widenArray(curves, end, end + n);
}
if (curveTypes.length <= numCurves) {
if (DO_STATS) {
rdrCtx.stats.stat_array_stroker_polystack_curveTypes
.add(numCurves + 1);
}
- curveTypes = rdrCtx.widenDirtyByteArray(curveTypes,
- numCurves,
- numCurves + 1);
+ curveTypes = curveTypes_ref.widenArray(curveTypes,
+ numCurves,
+ numCurves + 1);
}
}
--- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Version.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Version.java Fri Aug 26 10:14:15 2016 -0700
@@ -27,7 +27,7 @@
public final class Version {
- private static final String VERSION = "marlin-0.7.3.4-Unsafe-OpenJDK";
+ private static final String VERSION = "marlin-0.7.4-Unsafe-OpenJDK";
public static String getVersion() {
return VERSION;
--- a/jdk/src/java.desktop/share/classes/sun/print/ServiceDialog.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/sun/print/ServiceDialog.java Fri Aug 26 10:14:15 2016 -0700
@@ -977,6 +977,7 @@
private JFormattedTextField tfRangeFrom, tfRangeTo;
private JLabel lblRangeTo;
private boolean prSupported;
+ private boolean prPgRngSupported;
public PrintRangePanel() {
super();
@@ -1090,7 +1091,7 @@
public void focusGained(FocusEvent e) {}
private void setupRangeWidgets() {
- boolean rangeEnabled = (rbPages.isSelected() && prSupported);
+ boolean rangeEnabled = (rbPages.isSelected() && prPgRngSupported);
tfRangeFrom.setEnabled(rangeEnabled);
tfRangeTo.setEnabled(rangeEnabled);
lblRangeTo.setEnabled(rangeEnabled);
@@ -1136,6 +1137,9 @@
if (psCurrent.isAttributeCategorySupported(prCategory) ||
isAWT) {
prSupported = true;
+ prPgRngSupported = psCurrent.isAttributeValueSupported(prAll,
+ docFlavor,
+ asCurrent);
}
SunPageSelection select = SunPageSelection.ALL;
@@ -1175,7 +1179,7 @@
tfRangeFrom.setValue(min);
tfRangeTo.setValue(max);
rbAll.setEnabled(prSupported);
- rbPages.setEnabled(prSupported);
+ rbPages.setEnabled(prPgRngSupported);
setupRangeWidgets();
}
}
--- a/jdk/src/java.desktop/share/classes/sun/swing/CachedPainter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/classes/sun/swing/CachedPainter.java Fri Aug 26 10:14:15 2016 -0700
@@ -100,7 +100,9 @@
}
}
- private Image getImage(Object key, Component c, int w, int h, Object... args) {
+ private Image getImage(Object key, Component c,
+ int baseWidth, int baseHeight,
+ int w, int h, Object... args) {
GraphicsConfiguration config = getGraphicsConfiguration(c);
ImageCache cache = getCache(key);
Image image = cache.getImage(key, config, w, h, args);
@@ -127,8 +129,11 @@
}
if (draw) {
// Render to the Image
- Graphics g2 = image.getGraphics();
- paintToImage(c, image, g2, w, h, args);
+ Graphics2D g2 = (Graphics2D) image.getGraphics();
+ if (w != baseWidth || h != baseHeight) {
+ g2.scale((double) w / baseWidth, (double) h / baseHeight);
+ }
+ paintToImage(c, image, g2, baseWidth, baseHeight, args);
g2.dispose();
}
@@ -149,14 +154,7 @@
Image image = cache.getImage(key, config, w, h, args);
if (image == null) {
- double sx = 1;
- double sy = 1;
- if (g instanceof Graphics2D) {
- AffineTransform tx = ((Graphics2D) g).getTransform();
- sx = tx.getScaleX();
- sy = tx.getScaleY();
- }
- image = new PainterMultiResolutionCachedImage(sx, sy, w, h);
+ image = new PainterMultiResolutionCachedImage(w, h);
cache.setImage(key, config, w, h, args, image);
}
@@ -238,17 +236,12 @@
class PainterMultiResolutionCachedImage extends AbstractMultiResolutionImage {
- private final double scaleX;
- private final double scaleY;
private final int baseWidth;
private final int baseHeight;
private Component c;
private Object[] args;
- public PainterMultiResolutionCachedImage(double scaleX, double scaleY,
- int baseWidth, int baseHeight) {
- this.scaleX = scaleX;
- this.scaleY = scaleY;
+ public PainterMultiResolutionCachedImage(int baseWidth, int baseHeight) {
this.baseWidth = baseWidth;
this.baseHeight = baseHeight;
}
@@ -272,7 +265,7 @@
public Image getResolutionVariant(double destWidth, double destHeight) {
int w = (int) Math.ceil(destWidth);
int h = (int) Math.ceil(destHeight);
- return getImage(this, c, w, h, args);
+ return getImage(this, c, baseWidth, baseHeight, w, h, args);
}
@Override
@@ -282,15 +275,7 @@
@Override
public java.util.List<Image> getResolutionVariants() {
-
- if (scaleX == 1 && scaleY == 1) {
- return Arrays.asList(getResolutionVariant(baseWidth, baseHeight));
- }
-
- return Arrays.asList(
- getResolutionVariant(baseWidth, baseHeight),
- getResolutionVariant(scaleX * baseWidth, scaleY * baseHeight)
- );
+ return Arrays.asList(getResolutionVariant(baseWidth, baseHeight));
}
}
}
\ No newline at end of file
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.cc Fri Aug 26 10:14:15 2016 -0700
@@ -104,7 +104,6 @@
if (!length ||
length >= 1u << 31 ||
- data + length < data /* overflows */ ||
!(blob = hb_object_create<hb_blob_t> ())) {
if (destroy)
destroy (user_data);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.h Fri Aug 26 10:14:15 2016 -0700
@@ -64,7 +64,7 @@
typedef struct hb_blob_t hb_blob_t;
-hb_blob_t *
+HB_EXTERN hb_blob_t *
hb_blob_create (const char *data,
unsigned int length,
hb_memory_mode_t mode,
@@ -77,21 +77,21 @@
* modify the parent data as that data may be
* shared among multiple sub-blobs.
*/
-hb_blob_t *
+HB_EXTERN hb_blob_t *
hb_blob_create_sub_blob (hb_blob_t *parent,
unsigned int offset,
unsigned int length);
-hb_blob_t *
+HB_EXTERN hb_blob_t *
hb_blob_get_empty (void);
-hb_blob_t *
+HB_EXTERN hb_blob_t *
hb_blob_reference (hb_blob_t *blob);
-void
+HB_EXTERN void
hb_blob_destroy (hb_blob_t *blob);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_blob_set_user_data (hb_blob_t *blob,
hb_user_data_key_t *key,
void * data,
@@ -99,25 +99,25 @@
hb_bool_t replace);
-void *
+HB_EXTERN void *
hb_blob_get_user_data (hb_blob_t *blob,
hb_user_data_key_t *key);
-void
+HB_EXTERN void
hb_blob_make_immutable (hb_blob_t *blob);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_blob_is_immutable (hb_blob_t *blob);
-unsigned int
+HB_EXTERN unsigned int
hb_blob_get_length (hb_blob_t *blob);
-const char *
+HB_EXTERN const char *
hb_blob_get_data (hb_blob_t *blob, unsigned int *length);
-char *
+HB_EXTERN char *
hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-private.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-private.hh Fri Aug 26 10:14:15 2016 -0700
@@ -35,9 +35,36 @@
#include "hb-unicode-private.hh"
+#ifndef HB_BUFFER_MAX_EXPANSION_FACTOR
+#define HB_BUFFER_MAX_EXPANSION_FACTOR 32
+#endif
+#ifndef HB_BUFFER_MAX_LEN_MIN
+#define HB_BUFFER_MAX_LEN_MIN 8192
+#endif
+#ifndef HB_BUFFER_MAX_LEN_DEFAULT
+#define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */
+#endif
+
ASSERT_STATIC (sizeof (hb_glyph_info_t) == 20);
ASSERT_STATIC (sizeof (hb_glyph_info_t) == sizeof (hb_glyph_position_t));
+HB_MARK_AS_FLAG_T (hb_buffer_flags_t);
+HB_MARK_AS_FLAG_T (hb_buffer_serialize_flags_t);
+
+enum hb_buffer_scratch_flags_t {
+ HB_BUFFER_SCRATCH_FLAG_DEFAULT = 0x00000000u,
+ HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII = 0x00000001u,
+ HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES = 0x00000002u,
+ HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK = 0x00000004u,
+ HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT = 0x00000008u,
+ /* Reserved for complex shapers' internal use. */
+ HB_BUFFER_SCRATCH_FLAG_COMPLEX0 = 0x01000000u,
+ HB_BUFFER_SCRATCH_FLAG_COMPLEX1 = 0x02000000u,
+ HB_BUFFER_SCRATCH_FLAG_COMPLEX2 = 0x04000000u,
+ HB_BUFFER_SCRATCH_FLAG_COMPLEX3 = 0x08000000u,
+};
+HB_MARK_AS_FLAG_T (hb_buffer_scratch_flags_t);
+
/*
* hb_buffer_t
@@ -52,6 +79,8 @@
hb_buffer_flags_t flags; /* BOT / EOT / etc. */
hb_buffer_cluster_level_t cluster_level;
hb_codepoint_t replacement; /* U+FFFD or something else. */
+ hb_buffer_scratch_flags_t scratch_flags; /* Have space-flallback, etc. */
+ unsigned int max_len; /* Maximum allowed len. */
/* Buffer contents */
hb_buffer_content_type_t content_type;
@@ -76,17 +105,13 @@
inline hb_glyph_position_t &cur_pos (unsigned int i = 0) { return pos[idx + i]; }
inline hb_glyph_position_t cur_pos (unsigned int i = 0) const { return pos[idx + i]; }
- inline hb_glyph_info_t &prev (void) { return out_info[out_len - 1]; }
- inline hb_glyph_info_t prev (void) const { return info[out_len - 1]; }
+ inline hb_glyph_info_t &prev (void) { return out_info[out_len ? out_len - 1 : 0]; }
+ inline hb_glyph_info_t prev (void) const { return out_info[out_len ? out_len - 1 : 0]; }
inline bool has_separate_output (void) const { return info != out_info; }
unsigned int serial;
- /* These reflect current allocations of the bytes in glyph_info_t's var1 and var2. */
- uint8_t allocated_var_bytes[8];
- const char *allocated_var_owner[8];
-
/* Text before / after the main buffer contents.
* Always in Unicode, and ordered outward.
* Index 0 is for "pre-context", 1 for "post-context". */
@@ -94,6 +119,52 @@
hb_codepoint_t context[2][CONTEXT_LENGTH];
unsigned int context_len[2];
+ /* Debugging API */
+ hb_buffer_message_func_t message_func;
+ void *message_data;
+ hb_destroy_func_t message_destroy;
+
+ /* Internal debugging. */
+ /* The bits here reflect current allocations of the bytes in glyph_info_t's var1 and var2. */
+#ifndef HB_NDEBUG
+ uint8_t allocated_var_bits;
+#endif
+ inline void allocate_var (unsigned int start, unsigned int count)
+ {
+#ifndef HB_NDEBUG
+ unsigned int end = start + count;
+ assert (end <= 8);
+ unsigned int bits = (1<<end) - (1<<start);
+ assert (0 == (allocated_var_bits & bits));
+ allocated_var_bits |= bits;
+#endif
+ }
+ inline void deallocate_var (unsigned int start, unsigned int count)
+ {
+#ifndef HB_NDEBUG
+ unsigned int end = start + count;
+ assert (end <= 8);
+ unsigned int bits = (1<<end) - (1<<start);
+ assert (bits == (allocated_var_bits & bits));
+ allocated_var_bits &= ~bits;
+#endif
+ }
+ inline void assert_var (unsigned int start, unsigned int count)
+ {
+#ifndef HB_NDEBUG
+ unsigned int end = start + count;
+ assert (end <= 8);
+ unsigned int bits = (1<<end) - (1<<start);
+ assert (bits == (allocated_var_bits & bits));
+#endif
+ }
+ inline void deallocate_var_all (void)
+ {
+#ifndef HB_NDEBUG
+ allocated_var_bits = 0;
+#endif
+ }
+
/* Methods */
@@ -106,11 +177,6 @@
{ return len - idx; }
inline unsigned int next_serial (void) { return serial++; }
- HB_INTERNAL void allocate_var (unsigned int byte_i, unsigned int count, const char *owner);
- HB_INTERNAL void deallocate_var (unsigned int byte_i, unsigned int count, const char *owner);
- HB_INTERNAL void assert_var (unsigned int byte_i, unsigned int count, const char *owner);
- HB_INTERNAL void deallocate_var_all (void);
-
HB_INTERNAL void add (hb_codepoint_t codepoint,
unsigned int cluster);
HB_INTERNAL void add_info (const hb_glyph_info_t &glyph_info);
@@ -203,18 +269,28 @@
inline void clear_context (unsigned int side) { context_len[side] = 0; }
HB_INTERNAL void sort (unsigned int start, unsigned int end, int(*compar)(const hb_glyph_info_t *, const hb_glyph_info_t *));
+
+ inline bool messaging (void) { return unlikely (message_func); }
+ inline bool message (hb_font_t *font, const char *fmt, ...) HB_PRINTF_FUNC(3, 4)
+ {
+ if (!messaging ())
+ return true;
+ va_list ap;
+ va_start (ap, fmt);
+ bool ret = message_impl (font, fmt, ap);
+ va_end (ap);
+ return ret;
+ }
+ HB_INTERNAL bool message_impl (hb_font_t *font, const char *fmt, va_list ap) HB_PRINTF_FUNC(3, 0);
};
-#define HB_BUFFER_XALLOCATE_VAR(b, func, var, owner) \
+#define HB_BUFFER_XALLOCATE_VAR(b, func, var) \
b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \
- sizeof (b->info[0].var), owner)
-#define HB_BUFFER_ALLOCATE_VAR(b, var) \
- HB_BUFFER_XALLOCATE_VAR (b, allocate_var, var (), #var)
-#define HB_BUFFER_DEALLOCATE_VAR(b, var) \
- HB_BUFFER_XALLOCATE_VAR (b, deallocate_var, var (), #var)
-#define HB_BUFFER_ASSERT_VAR(b, var) \
- HB_BUFFER_XALLOCATE_VAR (b, assert_var, var (), #var)
+ sizeof (b->info[0].var))
+#define HB_BUFFER_ALLOCATE_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, allocate_var, var ())
+#define HB_BUFFER_DEALLOCATE_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, deallocate_var, var ())
+#define HB_BUFFER_ASSERT_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, assert_var, var ())
#endif /* HB_BUFFER_PRIVATE_HH */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-serialize.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-serialize.cc Fri Aug 26 10:14:15 2016 -0700
@@ -36,11 +36,12 @@
/**
* hb_buffer_serialize_list_formats:
*
- *
+ * Returns a list of supported buffer serialization formats.
*
* Return value: (transfer none):
+ * A string array of buffer serialization formats. Should not be freed.
*
- * Since: 0.9.2
+ * Since: 0.9.7
**/
const char **
hb_buffer_serialize_list_formats (void)
@@ -50,14 +51,17 @@
/**
* hb_buffer_serialize_format_from_string:
- * @str:
- * @len:
+ * @str: (array length=len) (element-type uint8_t): a string to parse
+ * @len: length of @str, or -1 if string is %NULL terminated
*
- *
+ * Parses a string into an #hb_buffer_serialize_format_t. Does not check if
+ * @str is a valid buffer serialization format, use
+ * hb_buffer_serialize_list_formats() to get the list of supported formats.
*
* Return value:
+ * The parsed #hb_buffer_serialize_format_t.
*
- * Since: 0.9.2
+ * Since: 0.9.7
**/
hb_buffer_serialize_format_t
hb_buffer_serialize_format_from_string (const char *str, int len)
@@ -68,13 +72,15 @@
/**
* hb_buffer_serialize_format_to_string:
- * @format:
+ * @format: an #hb_buffer_serialize_format_t to convert.
*
- *
+ * Converts @format to the string corresponding it, or %NULL if it is not a valid
+ * #hb_buffer_serialize_format_t.
*
- * Return value:
+ * Return value: (transfer none):
+ * A %NULL terminated string corresponding to @format. Should not be freed.
*
- * Since: 0.9.2
+ * Since: 0.9.7
**/
const char *
hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format)
@@ -242,24 +248,51 @@
return end - start;
}
-/* Returns number of items, starting at start, that were serialized. */
/**
* hb_buffer_serialize_glyphs:
- * @buffer: a buffer.
- * @start:
- * @end:
- * @buf: (array length=buf_size):
- * @buf_size:
- * @buf_consumed: (out):
- * @font:
- * @format:
- * @flags:
+ * @buffer: an #hb_buffer_t buffer.
+ * @start: the first item in @buffer to serialize.
+ * @end: the last item in @buffer to serialize.
+ * @buf: (out) (array length=buf_size) (element-type uint8_t): output string to
+ * write serialized buffer into.
+ * @buf_size: the size of @buf.
+ * @buf_consumed: (out) (allow-none): if not %NULL, will be set to the number of byes written into @buf.
+ * @font: (allow-none): the #hb_font_t used to shape this buffer, needed to
+ * read glyph names and extents. If %NULL, and empty font will be used.
+ * @format: the #hb_buffer_serialize_format_t to use for formatting the output.
+ * @flags: the #hb_buffer_serialize_flags_t that control what glyph properties
+ * to serialize.
+ *
+ * Serializes @buffer into a textual representation of its glyph content,
+ * useful for showing the contents of the buffer, for example during debugging.
+ * There are currently two supported serialization formats:
*
+ * ## text
+ * A human-readable, plain text format.
+ * The serialized glyphs will look something like:
*
+ * ```
+ * [uni0651=0@518,0+0|uni0628=0+1897]
+ * ```
+ * - The serialized glyphs are delimited with `[` and `]`.
+ * - Glyphs are separated with `|`
+ * - Each glyph starts with glyph name, or glyph index if
+ * #HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES flag is set. Then,
+ * - If #HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS is not set, `=` then #hb_glyph_info_t.cluster.
+ * - If #HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS is not set, the #hb_glyph_position_t in the format:
+ * - If both #hb_glyph_position_t.x_offset and #hb_glyph_position_t.y_offset are not 0, `@x_offset,y_offset`. Then,
+ * - `+x_advance`, then `,y_advance` if #hb_glyph_position_t.y_advance is not 0. Then,
+ * - If #HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS is set, the
+ * #hb_glyph_extents_t in the format
+ * `<x_bearing,y_bearing,width,height>`
+ *
+ * ## json
+ * TODO.
*
* Return value:
+ * The number of serialized items.
*
- * Since: 0.9.2
+ * Since: 0.9.7
**/
unsigned int
hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
@@ -267,8 +300,8 @@
unsigned int end,
char *buf,
unsigned int buf_size,
- unsigned int *buf_consumed, /* May be NULL */
- hb_font_t *font, /* May be NULL */
+ unsigned int *buf_consumed,
+ hb_font_t *font,
hb_buffer_serialize_format_t format,
hb_buffer_serialize_flags_t flags)
{
@@ -282,6 +315,9 @@
assert ((!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID) ||
buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS);
+ if (!buffer->have_positions)
+ flags |= HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS;
+
if (unlikely (start == end))
return 0;
@@ -355,7 +391,7 @@
/**
* hb_buffer_deserialize_glyphs:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t buffer.
* @buf: (array length=buf_len):
* @buf_len:
* @end_ptr: (out):
@@ -366,7 +402,7 @@
*
* Return value:
*
- * Since: 0.9.2
+ * Since: 0.9.7
**/
hb_bool_t
hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.cc Fri Aug 26 10:14:15 2016 -0700
@@ -35,8 +35,26 @@
#define HB_DEBUG_BUFFER (HB_DEBUG+0)
#endif
+/**
+ * SECTION: hb-buffer
+ * @title: Buffers
+ * @short_description: Input and output buffers
+ * @include: hb.h
+ *
+ * Buffers serve dual role in HarfBuzz; they hold the input characters that are
+ * passed hb_shape(), and after shaping they hold the output glyphs.
+ **/
/**
+ * hb_segment_properties_equal:
+ * @a: first #hb_segment_properties_t to compare.
+ * @b: second #hb_segment_properties_t to compare.
+ *
+ * Checks the equality of two #hb_segment_properties_t's.
+ *
+ * Return value:
+ * %true if all properties of @a equal those of @b, false otherwise.
+ *
* Since: 0.9.7
**/
hb_bool_t
@@ -52,6 +70,14 @@
}
/**
+ * hb_segment_properties_hash:
+ * @p: #hb_segment_properties_t to hash.
+ *
+ * Creates a hash representing @p.
+ *
+ * Return value:
+ * A hash of @p.
+ *
* Since: 0.9.7
**/
unsigned int
@@ -91,6 +117,11 @@
{
if (unlikely (in_error))
return false;
+ if (unlikely (size > max_len))
+ {
+ in_error = true;
+ return false;
+ }
unsigned int new_allocated = allocated;
hb_glyph_position_t *new_pos = NULL;
@@ -152,6 +183,12 @@
if (unlikely (!ensure (len + count))) return false;
memmove (info + idx + count, info + idx, (len - idx) * sizeof (info[0]));
+ if (idx + count > len)
+ {
+ /* Under memory failure we might expose this area. At least
+ * clean it up. Oh well... */
+ memset (info + len, 0, (idx + count - len) * sizeof (info[0]));
+ }
len += count;
idx += count;
@@ -198,6 +235,7 @@
hb_segment_properties_t default_props = HB_SEGMENT_PROPERTIES_DEFAULT;
props = default_props;
+ scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
content_type = HB_BUFFER_CONTENT_TYPE_INVALID;
in_error = false;
@@ -210,11 +248,11 @@
out_info = info;
serial = 0;
- memset (allocated_var_bytes, 0, sizeof allocated_var_bytes);
- memset (allocated_var_owner, 0, sizeof allocated_var_owner);
memset (context, 0, sizeof context);
memset (context_len, 0, sizeof context_len);
+
+ deallocate_var_all ();
}
void
@@ -375,6 +413,8 @@
idx = i;
return true;
}
+ if (unlikely (in_error))
+ return false;
assert (i <= out_len + (len - idx));
@@ -392,6 +432,8 @@
/* Tricky part: rewinding... */
unsigned int count = out_len - i;
+ /* This will blow in our face if memory allocation fails later
+ * in this same lookup... */
if (unlikely (idx < count && !shift_forward (count + 32))) return false;
assert (idx >= count);
@@ -627,82 +669,19 @@
}
-static inline void
-dump_var_allocation (const hb_buffer_t *buffer)
-{
- char buf[80];
- for (unsigned int i = 0; i < 8; i++)
- buf[i] = '0' + buffer->allocated_var_bytes[7 - i];
- buf[8] = '\0';
- DEBUG_MSG (BUFFER, buffer,
- "Current var allocation: %s",
- buf);
-}
-
-void hb_buffer_t::allocate_var (unsigned int byte_i, unsigned int count, const char *owner)
-{
- assert (byte_i < 8 && byte_i + count <= 8);
-
- if (DEBUG_ENABLED (BUFFER))
- dump_var_allocation (this);
- DEBUG_MSG (BUFFER, this,
- "Allocating var bytes %d..%d for %s",
- byte_i, byte_i + count - 1, owner);
-
- for (unsigned int i = byte_i; i < byte_i + count; i++) {
- assert (!allocated_var_bytes[i]);
- allocated_var_bytes[i]++;
- allocated_var_owner[i] = owner;
- }
-}
-
-void hb_buffer_t::deallocate_var (unsigned int byte_i, unsigned int count, const char *owner)
-{
- if (DEBUG_ENABLED (BUFFER))
- dump_var_allocation (this);
-
- DEBUG_MSG (BUFFER, this,
- "Deallocating var bytes %d..%d for %s",
- byte_i, byte_i + count - 1, owner);
-
- assert (byte_i < 8 && byte_i + count <= 8);
- for (unsigned int i = byte_i; i < byte_i + count; i++) {
- assert (allocated_var_bytes[i]);
- assert (0 == strcmp (allocated_var_owner[i], owner));
- allocated_var_bytes[i]--;
- }
-}
-
-void hb_buffer_t::assert_var (unsigned int byte_i, unsigned int count, const char *owner)
-{
- if (DEBUG_ENABLED (BUFFER))
- dump_var_allocation (this);
-
- DEBUG_MSG (BUFFER, this,
- "Asserting var bytes %d..%d for %s",
- byte_i, byte_i + count - 1, owner);
-
- assert (byte_i < 8 && byte_i + count <= 8);
- for (unsigned int i = byte_i; i < byte_i + count; i++) {
- assert (allocated_var_bytes[i]);
- assert (0 == strcmp (allocated_var_owner[i], owner));
- }
-}
-
-void hb_buffer_t::deallocate_var_all (void)
-{
- memset (allocated_var_bytes, 0, sizeof (allocated_var_bytes));
- memset (allocated_var_owner, 0, sizeof (allocated_var_owner));
-}
-
/* Public API */
/**
* hb_buffer_create: (Xconstructor)
*
- *
+ * Creates a new #hb_buffer_t with all properties to defaults.
*
- * Return value: (transfer full)
+ * Return value: (transfer full):
+ * A newly allocated #hb_buffer_t with a reference count of 1. The initial
+ * reference count should be released with hb_buffer_destroy() when you are done
+ * using the #hb_buffer_t. This function never returns %NULL. If memory cannot
+ * be allocated, a special #hb_buffer_t object will be returned on which
+ * hb_buffer_allocation_successful() returns %false.
*
* Since: 0.9.2
**/
@@ -714,6 +693,8 @@
if (!(buffer = hb_object_create<hb_buffer_t> ()))
return hb_buffer_get_empty ();
+ buffer->max_len = HB_BUFFER_MAX_LEN_DEFAULT;
+
buffer->reset ();
return buffer;
@@ -738,6 +719,8 @@
HB_BUFFER_FLAG_DEFAULT,
HB_BUFFER_CLUSTER_LEVEL_DEFAULT,
HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT,
+ HB_BUFFER_SCRATCH_FLAG_DEFAULT,
+ HB_BUFFER_MAX_LEN_DEFAULT,
HB_BUFFER_CONTENT_TYPE_INVALID,
HB_SEGMENT_PROPERTIES_DEFAULT,
@@ -753,11 +736,13 @@
/**
* hb_buffer_reference: (skip)
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
- *
+ * Increases the reference count on @buffer by one. This prevents @buffer from
+ * being destroyed until a matching call to hb_buffer_destroy() is made.
*
* Return value: (transfer full):
+ * The referenced #hb_buffer_t.
*
* Since: 0.9.2
**/
@@ -769,9 +754,11 @@
/**
* hb_buffer_destroy: (skip)
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
- *
+ * Deallocate the @buffer.
+ * Decreases the reference count on @buffer by one. If the result is zero, then
+ * @buffer and all associated resources are freed. See hb_buffer_reference().
*
* Since: 0.9.2
**/
@@ -784,13 +771,15 @@
free (buffer->info);
free (buffer->pos);
+ if (buffer->message_destroy)
+ buffer->message_destroy (buffer->message_data);
free (buffer);
}
/**
* hb_buffer_set_user_data: (skip)
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
* @key:
* @data:
* @destroy:
@@ -814,7 +803,7 @@
/**
* hb_buffer_get_user_data: (skip)
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
* @key:
*
*
@@ -833,10 +822,11 @@
/**
* hb_buffer_set_content_type:
- * @buffer: a buffer.
- * @content_type:
+ * @buffer: an #hb_buffer_t.
+ * @content_type: the type of buffer contents to set
*
- *
+ * Sets the type of @buffer contents, buffers are either empty, contain
+ * characters (before shaping) or glyphs (the result of shaping).
*
* Since: 0.9.5
**/
@@ -849,11 +839,12 @@
/**
* hb_buffer_get_content_type:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
- *
+ * see hb_buffer_set_content_type().
*
* Return value:
+ * The type of @buffer contents.
*
* Since: 0.9.5
**/
@@ -866,7 +857,7 @@
/**
* hb_buffer_set_unicode_funcs:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
* @unicode_funcs:
*
*
@@ -891,7 +882,7 @@
/**
* hb_buffer_get_unicode_funcs:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
*
*
@@ -907,10 +898,16 @@
/**
* hb_buffer_set_direction:
- * @buffer: a buffer.
- * @direction:
+ * @buffer: an #hb_buffer_t.
+ * @direction: the #hb_direction_t of the @buffer
*
- *
+ * Set the text flow direction of the buffer. No shaping can happen without
+ * setting @buffer direction, and it controls the visual direction for the
+ * output glyphs; for RTL direction the glyphs will be reversed. Many layout
+ * features depend on the proper setting of the direction, for example,
+ * reversing RTL text before shaping, then shaping with LTR direction is not
+ * the same as keeping the text in logical order and shaping with RTL
+ * direction.
*
* Since: 0.9.2
**/
@@ -927,11 +924,12 @@
/**
* hb_buffer_get_direction:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
- *
+ * See hb_buffer_set_direction()
*
* Return value:
+ * The direction of the @buffer.
*
* Since: 0.9.2
**/
@@ -943,10 +941,18 @@
/**
* hb_buffer_set_script:
- * @buffer: a buffer.
- * @script:
+ * @buffer: an #hb_buffer_t.
+ * @script: an #hb_script_t to set.
+ *
+ * Sets the script of @buffer to @script.
*
+ * Script is crucial for choosing the proper shaping behaviour for scripts that
+ * require it (e.g. Arabic) and the which OpenType features defined in the font
+ * to be applied.
*
+ * You can pass one of the predefined #hb_script_t values, or use
+ * hb_script_from_string() or hb_script_from_iso15924_tag() to get the
+ * corresponding script from an ISOÂ 15924 script tag.
*
* Since: 0.9.2
**/
@@ -962,11 +968,12 @@
/**
* hb_buffer_get_script:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
- *
+ * See hb_buffer_set_script().
*
* Return value:
+ * The #hb_script_t of the @buffer.
*
* Since: 0.9.2
**/
@@ -978,10 +985,18 @@
/**
* hb_buffer_set_language:
- * @buffer: a buffer.
- * @language:
+ * @buffer: an #hb_buffer_t.
+ * @language: an hb_language_t to set.
+ *
+ * Sets the language of @buffer to @language.
*
+ * Languages are crucial for selecting which OpenType feature to apply to the
+ * buffer which can result in applying language-specific behaviour. Languages
+ * are orthogonal to the scripts, and though they are related, they are
+ * different concepts and should not be confused with each other.
*
+ * Use hb_language_from_string() to convert from ISOÂ 639 language codes to
+ * #hb_language_t.
*
* Since: 0.9.2
**/
@@ -997,11 +1012,12 @@
/**
* hb_buffer_get_language:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
- *
+ * See hb_buffer_set_language().
*
* Return value: (transfer none):
+ * The #hb_language_t of the buffer. Must not be freed by the caller.
*
* Since: 0.9.2
**/
@@ -1013,10 +1029,12 @@
/**
* hb_buffer_set_segment_properties:
- * @buffer: a buffer.
- * @props:
+ * @buffer: an #hb_buffer_t.
+ * @props: an #hb_segment_properties_t to use.
*
- *
+ * Sets the segment properties of the buffer, a shortcut for calling
+ * hb_buffer_set_direction(), hb_buffer_set_script() and
+ * hb_buffer_set_language() individually.
*
* Since: 0.9.7
**/
@@ -1032,10 +1050,10 @@
/**
* hb_buffer_get_segment_properties:
- * @buffer: a buffer.
- * @props: (out):
+ * @buffer: an #hb_buffer_t.
+ * @props: (out): the output #hb_segment_properties_t.
*
- *
+ * Sets @props to the #hb_segment_properties_t of @buffer.
*
* Since: 0.9.7
**/
@@ -1049,10 +1067,10 @@
/**
* hb_buffer_set_flags:
- * @buffer: a buffer.
- * @flags:
+ * @buffer: an #hb_buffer_t.
+ * @flags: the buffer flags to set.
*
- *
+ * Sets @buffer flags to @flags. See #hb_buffer_flags_t.
*
* Since: 0.9.7
**/
@@ -1068,11 +1086,12 @@
/**
* hb_buffer_get_flags:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
- *
+ * See hb_buffer_set_flags().
*
* Return value:
+ * The @buffer flags.
*
* Since: 0.9.7
**/
@@ -1084,7 +1103,7 @@
/**
* hb_buffer_set_cluster_level:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
* @cluster_level:
*
*
@@ -1103,7 +1122,7 @@
/**
* hb_buffer_get_cluster_level:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
*
*
@@ -1120,10 +1139,13 @@
/**
* hb_buffer_set_replacement_codepoint:
- * @buffer: a buffer.
- * @replacement:
+ * @buffer: an #hb_buffer_t.
+ * @replacement: the replacement #hb_codepoint_t
*
+ * Sets the #hb_codepoint_t that replaces invalid entries for a given encoding
+ * when adding text to @buffer.
*
+ * Default is %HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT.
*
* Since: 0.9.31
**/
@@ -1139,11 +1161,12 @@
/**
* hb_buffer_get_replacement_codepoint:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
- *
+ * See hb_buffer_set_replacement_codepoint().
*
* Return value:
+ * The @buffer replacement #hb_codepoint_t.
*
* Since: 0.9.31
**/
@@ -1156,9 +1179,10 @@
/**
* hb_buffer_reset:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
- *
+ * Resets the buffer to its initial status, as if it was just newly created
+ * with hb_buffer_create().
*
* Since: 0.9.2
**/
@@ -1170,9 +1194,10 @@
/**
* hb_buffer_clear_contents:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
- *
+ * Similar to hb_buffer_reset(), but does not clear the Unicode functions and
+ * the replacement code point.
*
* Since: 0.9.11
**/
@@ -1184,12 +1209,13 @@
/**
* hb_buffer_pre_allocate:
- * @buffer: a buffer.
- * @size:
+ * @buffer: an #hb_buffer_t.
+ * @size: number of items to pre allocate.
*
- *
+ * Pre allocates memory for @buffer to fit at least @size number of items.
*
* Return value:
+ * %true if @buffer memory allocation succeeded, %false otherwise.
*
* Since: 0.9.2
**/
@@ -1201,11 +1227,12 @@
/**
* hb_buffer_allocation_successful:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
- *
+ * Check if allocating memory for the buffer succeeded.
*
* Return value:
+ * %true if @buffer memory allocation succeeded, %false otherwise.
*
* Since: 0.9.2
**/
@@ -1217,11 +1244,18 @@
/**
* hb_buffer_add:
- * @buffer: a buffer.
- * @codepoint:
- * @cluster:
+ * @buffer: an #hb_buffer_t.
+ * @codepoint: a Unicode code point.
+ * @cluster: the cluster value of @codepoint.
*
+ * Appends a character with the Unicode value of @codepoint to @buffer, and
+ * gives it the initial cluster value of @cluster. Clusters can be any thing
+ * the client wants, they are usually used to refer to the index of the
+ * character in the input text stream and are output in
+ * #hb_glyph_info_t.cluster field.
*
+ * This function does not check the validity of @codepoint, it is up to the
+ * caller to ensure it is a valid Unicode code point.
*
* Since: 0.9.7
**/
@@ -1236,12 +1270,14 @@
/**
* hb_buffer_set_length:
- * @buffer: a buffer.
- * @length:
+ * @buffer: an #hb_buffer_t.
+ * @length: the new length of @buffer.
*
- *
+ * Similar to hb_buffer_pre_allocate(), but clears any new items added at the
+ * end.
*
* Return value:
+ * %true if @buffer memory allocation succeeded, %false otherwise.
*
* Since: 0.9.2
**/
@@ -1276,11 +1312,13 @@
/**
* hb_buffer_get_length:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
* Returns the number of items in the buffer.
*
- * Return value: buffer length.
+ * Return value:
+ * The @buffer length.
+ * The value valid as long as buffer has not been modified.
*
* Since: 0.9.2
**/
@@ -1292,13 +1330,15 @@
/**
* hb_buffer_get_glyph_infos:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
* @length: (out): output array length.
*
- * Returns buffer glyph information array. Returned pointer
- * is valid as long as buffer contents are not modified.
+ * Returns @buffer glyph information array. Returned pointer
+ * is valid as long as @buffer contents are not modified.
*
- * Return value: (transfer none) (array length=length): buffer glyph information array.
+ * Return value: (transfer none) (array length=length):
+ * The @buffer glyph information array.
+ * The value valid as long as buffer has not been modified.
*
* Since: 0.9.2
**/
@@ -1314,13 +1354,15 @@
/**
* hb_buffer_get_glyph_positions:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
* @length: (out): output length.
*
- * Returns buffer glyph position array. Returned pointer
- * is valid as long as buffer contents are not modified.
+ * Returns @buffer glyph position array. Returned pointer
+ * is valid as long as @buffer contents are not modified.
*
- * Return value: (transfer none) (array length=length): buffer glyph position array.
+ * Return value: (transfer none) (array length=length):
+ * The @buffer glyph position array.
+ * The value valid as long as buffer has not been modified.
*
* Since: 0.9.2
**/
@@ -1339,7 +1381,7 @@
/**
* hb_buffer_reverse:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
* Reverses buffer contents.
*
@@ -1353,7 +1395,7 @@
/**
* hb_buffer_reverse_range:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
* @start: start index.
* @end: end index.
*
@@ -1370,7 +1412,7 @@
/**
* hb_buffer_reverse_clusters:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
* Reverses buffer clusters. That is, the buffer contents are
* reversed, then each cluster (consecutive items having the
@@ -1386,7 +1428,7 @@
/**
* hb_buffer_guess_segment_properties:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
* Sets unset buffer segment properties based on buffer Unicode
* contents. If buffer is not empty, it must have content type
@@ -1485,13 +1527,18 @@
/**
* hb_buffer_add_utf8:
- * @buffer: a buffer.
- * @text: (array length=text_length) (element-type uint8_t):
- * @text_length:
- * @item_offset:
- * @item_length:
+ * @buffer: an #hb_buffer_t.
+ * @text: (array length=text_length) (element-type uint8_t): an array of UTF-8
+ * characters to append.
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: the offset of the first character to add to the @buffer.
+ * @item_length: the number of characters to add to the @buffer, or -1 for the
+ * end of @text (assuming it is %NULL terminated).
*
+ * See hb_buffer_add_codepoints().
*
+ * Replaces invalid UTF-8 characters with the @buffer replacement code point,
+ * see hb_buffer_set_replacement_codepoint().
*
* Since: 0.9.2
**/
@@ -1507,13 +1554,17 @@
/**
* hb_buffer_add_utf16:
- * @buffer: a buffer.
- * @text: (array length=text_length):
- * @text_length:
- * @item_offset:
- * @item_length:
+ * @buffer: an #hb_buffer_t.
+ * @text: (array length=text_length): an array of UTF-16 characters to append.
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: the offset of the first character to add to the @buffer.
+ * @item_length: the number of characters to add to the @buffer, or -1 for the
+ * end of @text (assuming it is %NULL terminated).
*
+ * See hb_buffer_add_codepoints().
*
+ * Replaces invalid UTF-16 characters with the @buffer replacement code point,
+ * see hb_buffer_set_replacement_codepoint().
*
* Since: 0.9.2
**/
@@ -1529,13 +1580,17 @@
/**
* hb_buffer_add_utf32:
- * @buffer: a buffer.
- * @text: (array length=text_length):
- * @text_length:
- * @item_offset:
- * @item_length:
+ * @buffer: an #hb_buffer_t.
+ * @text: (array length=text_length): an array of UTF-32 characters to append.
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: the offset of the first character to add to the @buffer.
+ * @item_length: the number of characters to add to the @buffer, or -1 for the
+ * end of @text (assuming it is %NULL terminated).
*
+ * See hb_buffer_add_codepoints().
*
+ * Replaces invalid UTF-32 characters with the @buffer replacement code point,
+ * see hb_buffer_set_replacement_codepoint().
*
* Since: 0.9.2
**/
@@ -1551,13 +1606,18 @@
/**
* hb_buffer_add_latin1:
- * @buffer: a buffer.
- * @text: (array length=text_length) (element-type uint8_t):
- * @text_length:
- * @item_offset:
- * @item_length:
+ * @buffer: an #hb_buffer_t.
+ * @text: (array length=text_length) (element-type uint8_t): an array of UTF-8
+ * characters to append.
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: the offset of the first character to add to the @buffer.
+ * @item_length: the number of characters to add to the @buffer, or -1 for the
+ * end of @text (assuming it is %NULL terminated).
*
+ * Similar to hb_buffer_add_codepoints(), but allows only access to first 256
+ * Unicode code points that can fit in 8-bit strings.
*
+ * <note>Has nothing to do with non-Unicode Latin-1 encoding.</note>
*
* Since: 0.9.39
**/
@@ -1573,13 +1633,25 @@
/**
* hb_buffer_add_codepoints:
- * @buffer: a buffer.
- * @text: (array length=text_length):
- * @text_length:
- * @item_offset:
- * @item_length:
+ * @buffer: a #hb_buffer_t to append characters to.
+ * @text: (array length=text_length): an array of Unicode code points to append.
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: the offset of the first code point to add to the @buffer.
+ * @item_length: the number of code points to add to the @buffer, or -1 for the
+ * end of @text (assuming it is %NULL terminated).
*
+ * Appends characters from @text array to @buffer. The @item_offset is the
+ * position of the first character from @text that will be appended, and
+ * @item_length is the number of character. When shaping part of a larger text
+ * (e.g. a run of text from a paragraph), instead of passing just the substring
+ * corresponding to the run, it is preferable to pass the whole
+ * paragraph and specify the run start and length as @item_offset and
+ * @item_length, respectively, to give HarfBuzz the full context to be able,
+ * for example, to do cross-run Arabic shaping or properly handle combining
+ * marks at stat of run.
*
+ * This function does not check the validity of @text, it is up to the caller
+ * to ensure it contains a valid Unicode code points.
*
* Since: 0.9.31
**/
@@ -1651,9 +1723,12 @@
/**
* hb_buffer_normalize_glyphs:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
+ * Reorders a glyph buffer to have canonical in-cluster glyph order / position.
+ * The resulting clusters should behave identical to pre-reordering clusters.
*
+ * <note>This has nothing to do with Unicode normalization.</note>
*
* Since: 0.9.2
**/
@@ -1699,3 +1774,45 @@
}
}
}
+
+/*
+ * Debugging.
+ */
+
+/**
+ * hb_buffer_set_message_func:
+ * @buffer: an #hb_buffer_t.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Since: 1.1.3
+ **/
+void
+hb_buffer_set_message_func (hb_buffer_t *buffer,
+ hb_buffer_message_func_t func,
+ void *user_data, hb_destroy_func_t destroy)
+{
+ if (buffer->message_destroy)
+ buffer->message_destroy (buffer->message_data);
+
+ if (func) {
+ buffer->message_func = func;
+ buffer->message_data = user_data;
+ buffer->message_destroy = destroy;
+ } else {
+ buffer->message_func = NULL;
+ buffer->message_data = NULL;
+ buffer->message_destroy = NULL;
+ }
+}
+
+bool
+hb_buffer_t::message_impl (hb_font_t *font, const char *fmt, va_list ap)
+{
+ char buf[100];
+ vsnprintf (buf, sizeof (buf), fmt, ap);
+ return (bool) this->message_func (this, font, buf, this->message_data);
+}
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.h Fri Aug 26 10:14:15 2016 -0700
@@ -40,7 +40,27 @@
HB_BEGIN_DECLS
-
+/**
+ * hb_glyph_info_t:
+ * @codepoint: either a Unicode code point (before shaping) or a glyph index
+ * (after shaping).
+ * @mask:
+ * @cluster: the index of the character in the original text that corresponds
+ * to this #hb_glyph_info_t, or whatever the client passes to
+ * hb_buffer_add(). More than one #hb_glyph_info_t can have the same
+ * @cluster value, if they resulted from the same character (e.g. one
+ * to many glyph substitution), and when more than one character gets
+ * merged in the same glyph (e.g. many to one glyph substitution) the
+ * #hb_glyph_info_t will have the smallest cluster value of them.
+ * By default some characters are merged into the same cluster
+ * (e.g. combining marks have the same cluster as their bases)
+ * even if they are separate glyphs, hb_buffer_set_cluster_level()
+ * allow selecting more fine-grained cluster handling.
+ *
+ * The #hb_glyph_info_t is the structure that holds information about the
+ * glyphs and their relation to input text.
+ *
+ */
typedef struct hb_glyph_info_t {
hb_codepoint_t codepoint;
hb_mask_t mask;
@@ -51,6 +71,22 @@
hb_var_int_t var2;
} hb_glyph_info_t;
+/**
+ * hb_glyph_position_t:
+ * @x_advance: how much the line advances after drawing this glyph when setting
+ * text in horizontal direction.
+ * @y_advance: how much the line advances after drawing this glyph when setting
+ * text in vertical direction.
+ * @x_offset: how much the glyph moves on the X-axis before drawing it, this
+ * should not affect how much the line advances.
+ * @y_offset: how much the glyph moves on the Y-axis before drawing it, this
+ * should not affect how much the line advances.
+ *
+ * The #hb_glyph_position_t is the structure that holds the positions of the
+ * glyph in both horizontal and vertical directions. All positions in
+ * #hb_glyph_position_t are relative to the current point.
+ *
+ */
typedef struct hb_glyph_position_t {
hb_position_t x_advance;
hb_position_t y_advance;
@@ -61,7 +97,16 @@
hb_var_int_t var;
} hb_glyph_position_t;
-
+/**
+ * hb_segment_properties_t:
+ * @direction: the #hb_direction_t of the buffer, see hb_buffer_set_direction().
+ * @script: the #hb_script_t of the buffer, see hb_buffer_set_script().
+ * @language: the #hb_language_t of the buffer, see hb_buffer_set_language().
+ *
+ * The structure that holds various text properties of an #hb_buffer_t. Can be
+ * set and retrieved using hb_buffer_set_segment_properties() and
+ * hb_buffer_get_segment_properties(), respectively.
+ */
typedef struct hb_segment_properties_t {
hb_direction_t direction;
hb_script_t script;
@@ -77,101 +122,125 @@
NULL, \
NULL}
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_segment_properties_equal (const hb_segment_properties_t *a,
const hb_segment_properties_t *b);
-unsigned int
+HB_EXTERN unsigned int
hb_segment_properties_hash (const hb_segment_properties_t *p);
-/*
- * hb_buffer_t
+/**
+ * hb_buffer_t:
+ *
+ * The main structure holding the input text and its properties before shaping,
+ * and output glyphs and their information after shaping.
*/
typedef struct hb_buffer_t hb_buffer_t;
-hb_buffer_t *
+HB_EXTERN hb_buffer_t *
hb_buffer_create (void);
-hb_buffer_t *
+HB_EXTERN hb_buffer_t *
hb_buffer_get_empty (void);
-hb_buffer_t *
+HB_EXTERN hb_buffer_t *
hb_buffer_reference (hb_buffer_t *buffer);
-void
+HB_EXTERN void
hb_buffer_destroy (hb_buffer_t *buffer);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_buffer_set_user_data (hb_buffer_t *buffer,
hb_user_data_key_t *key,
void * data,
hb_destroy_func_t destroy,
hb_bool_t replace);
-void *
+HB_EXTERN void *
hb_buffer_get_user_data (hb_buffer_t *buffer,
hb_user_data_key_t *key);
-
+/**
+ * hb_buffer_content_type_t:
+ * @HB_BUFFER_CONTENT_TYPE_INVALID: Initial value for new buffer.
+ * @HB_BUFFER_CONTENT_TYPE_UNICODE: The buffer contains input characters (before shaping).
+ * @HB_BUFFER_CONTENT_TYPE_GLYPHS: The buffer contains output glyphs (after shaping).
+ */
typedef enum {
HB_BUFFER_CONTENT_TYPE_INVALID = 0,
HB_BUFFER_CONTENT_TYPE_UNICODE,
HB_BUFFER_CONTENT_TYPE_GLYPHS
} hb_buffer_content_type_t;
-void
+HB_EXTERN void
hb_buffer_set_content_type (hb_buffer_t *buffer,
hb_buffer_content_type_t content_type);
-hb_buffer_content_type_t
+HB_EXTERN hb_buffer_content_type_t
hb_buffer_get_content_type (hb_buffer_t *buffer);
-void
+HB_EXTERN void
hb_buffer_set_unicode_funcs (hb_buffer_t *buffer,
hb_unicode_funcs_t *unicode_funcs);
-hb_unicode_funcs_t *
+HB_EXTERN hb_unicode_funcs_t *
hb_buffer_get_unicode_funcs (hb_buffer_t *buffer);
-void
+HB_EXTERN void
hb_buffer_set_direction (hb_buffer_t *buffer,
hb_direction_t direction);
-hb_direction_t
+HB_EXTERN hb_direction_t
hb_buffer_get_direction (hb_buffer_t *buffer);
-void
+HB_EXTERN void
hb_buffer_set_script (hb_buffer_t *buffer,
hb_script_t script);
-hb_script_t
+HB_EXTERN hb_script_t
hb_buffer_get_script (hb_buffer_t *buffer);
-void
+HB_EXTERN void
hb_buffer_set_language (hb_buffer_t *buffer,
hb_language_t language);
-hb_language_t
+HB_EXTERN hb_language_t
hb_buffer_get_language (hb_buffer_t *buffer);
-void
+HB_EXTERN void
hb_buffer_set_segment_properties (hb_buffer_t *buffer,
const hb_segment_properties_t *props);
-void
+HB_EXTERN void
hb_buffer_get_segment_properties (hb_buffer_t *buffer,
hb_segment_properties_t *props);
-void
+HB_EXTERN void
hb_buffer_guess_segment_properties (hb_buffer_t *buffer);
-/*
+/**
+ * hb_buffer_flags_t:
+ * @HB_BUFFER_FLAG_DEFAULT: the default buffer flag.
+ * @HB_BUFFER_FLAG_BOT: flag indicating that special handling of the beginning
+ * of text paragraph can be applied to this buffer. Should usually
+ * be set, unless you are passing to the buffer only part
+ * of the text without the full context.
+ * @HB_BUFFER_FLAG_EOT: flag indicating that special handling of the end of text
+ * paragraph can be applied to this buffer, similar to
+ * @HB_BUFFER_FLAG_EOT.
+ * @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES:
+ * flag indication that character with Default_Ignorable
+ * Unicode property should use the corresponding glyph
+ * from the font, instead of hiding them (currently done
+ * by replacing them with the space glyph and zeroing the
+ * advance width.)
+ *
* Since: 0.9.20
*/
typedef enum { /*< flags >*/
@@ -181,11 +250,11 @@
HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES = 0x00000004u
} hb_buffer_flags_t;
-void
+HB_EXTERN void
hb_buffer_set_flags (hb_buffer_t *buffer,
hb_buffer_flags_t flags);
-hb_buffer_flags_t
+HB_EXTERN hb_buffer_flags_t
hb_buffer_get_flags (hb_buffer_t *buffer);
/*
@@ -198,93 +267,92 @@
HB_BUFFER_CLUSTER_LEVEL_DEFAULT = HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES
} hb_buffer_cluster_level_t;
-void
+HB_EXTERN void
hb_buffer_set_cluster_level (hb_buffer_t *buffer,
hb_buffer_cluster_level_t cluster_level);
-hb_buffer_cluster_level_t
+HB_EXTERN hb_buffer_cluster_level_t
hb_buffer_get_cluster_level (hb_buffer_t *buffer);
+/**
+ * HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT:
+ *
+ * The default code point for replacing invalid characters in a given encoding.
+ * Set to U+FFFD REPLACEMENT CHARACTER.
+ *
+ * Since: 0.9.31
+ */
#define HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT 0xFFFDu
-/* Sets codepoint used to replace invalid UTF-8/16/32 entries.
- * Default is 0xFFFDu. */
-void
+HB_EXTERN void
hb_buffer_set_replacement_codepoint (hb_buffer_t *buffer,
hb_codepoint_t replacement);
-hb_codepoint_t
+HB_EXTERN hb_codepoint_t
hb_buffer_get_replacement_codepoint (hb_buffer_t *buffer);
-/* Resets the buffer. Afterwards it's as if it was just created,
- * except that it has a larger buffer allocated perhaps... */
-void
+HB_EXTERN void
hb_buffer_reset (hb_buffer_t *buffer);
-/* Like reset, but does NOT clear unicode_funcs and replacement_codepoint. */
-void
+HB_EXTERN void
hb_buffer_clear_contents (hb_buffer_t *buffer);
-/* Returns false if allocation failed */
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_buffer_pre_allocate (hb_buffer_t *buffer,
unsigned int size);
-/* Returns false if allocation has failed before */
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_buffer_allocation_successful (hb_buffer_t *buffer);
-void
+HB_EXTERN void
hb_buffer_reverse (hb_buffer_t *buffer);
-void
+HB_EXTERN void
hb_buffer_reverse_range (hb_buffer_t *buffer,
unsigned int start, unsigned int end);
-void
+HB_EXTERN void
hb_buffer_reverse_clusters (hb_buffer_t *buffer);
/* Filling the buffer in */
-void
+HB_EXTERN void
hb_buffer_add (hb_buffer_t *buffer,
hb_codepoint_t codepoint,
unsigned int cluster);
-void
+HB_EXTERN void
hb_buffer_add_utf8 (hb_buffer_t *buffer,
const char *text,
int text_length,
unsigned int item_offset,
int item_length);
-void
+HB_EXTERN void
hb_buffer_add_utf16 (hb_buffer_t *buffer,
const uint16_t *text,
int text_length,
unsigned int item_offset,
int item_length);
-void
+HB_EXTERN void
hb_buffer_add_utf32 (hb_buffer_t *buffer,
const uint32_t *text,
int text_length,
unsigned int item_offset,
int item_length);
-/* Allows only access to first 256 Unicode codepoints. */
-void
+HB_EXTERN void
hb_buffer_add_latin1 (hb_buffer_t *buffer,
const uint8_t *text,
int text_length,
unsigned int item_offset,
int item_length);
-/* Like add_utf32 but does NOT check for invalid Unicode codepoints. */
-void
+HB_EXTERN void
hb_buffer_add_codepoints (hb_buffer_t *buffer,
const hb_codepoint_t *text,
int text_length,
@@ -292,32 +360,25 @@
int item_length);
-/* Clears any new items added at the end */
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_buffer_set_length (hb_buffer_t *buffer,
unsigned int length);
-/* Return value valid as long as buffer not modified */
-unsigned int
+HB_EXTERN unsigned int
hb_buffer_get_length (hb_buffer_t *buffer);
/* Getting glyphs out of the buffer */
-/* Return value valid as long as buffer not modified */
-hb_glyph_info_t *
+HB_EXTERN hb_glyph_info_t *
hb_buffer_get_glyph_infos (hb_buffer_t *buffer,
unsigned int *length);
-/* Return value valid as long as buffer not modified */
-hb_glyph_position_t *
+HB_EXTERN hb_glyph_position_t *
hb_buffer_get_glyph_positions (hb_buffer_t *buffer,
unsigned int *length);
-/* Reorders a glyph buffer to have canonical in-cluster glyph order / position.
- * The resulting clusters should behave identical to pre-reordering clusters.
- * NOTE: This has nothing to do with Unicode normalization. */
-void
+HB_EXTERN void
hb_buffer_normalize_glyphs (hb_buffer_t *buffer);
@@ -325,7 +386,16 @@
* Serialize
*/
-/*
+/**
+ * hb_buffer_serialize_flags_t:
+ * @HB_BUFFER_SERIALIZE_FLAG_DEFAULT: serialize glyph names, clusters and positions.
+ * @HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS: do not serialize glyph cluster.
+ * @HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS: do not serialize glyph position information.
+ * @HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES: do no serialize glyph name.
+ * @HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS: serialize glyph extents.
+ *
+ * Flags that control what glyph information are serialized in hb_buffer_serialize_glyphs().
+ *
* Since: 0.9.20
*/
typedef enum { /*< flags >*/
@@ -336,43 +406,67 @@
HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS = 0x00000008u
} hb_buffer_serialize_flags_t;
+/**
+ * hb_buffer_serialize_format_t:
+ * @HB_BUFFER_SERIALIZE_FORMAT_TEXT: a human-readable, plain text format.
+ * @HB_BUFFER_SERIALIZE_FORMAT_JSON: a machine-readable JSON format.
+ * @HB_BUFFER_SERIALIZE_FORMAT_INVALID: invalid format.
+ *
+ * The buffer serialization and de-serialization format used in
+ * hb_buffer_serialize_glyphs() and hb_buffer_deserialize_glyphs().
+ *
+ * Since: 0.9.2
+ */
typedef enum {
HB_BUFFER_SERIALIZE_FORMAT_TEXT = HB_TAG('T','E','X','T'),
HB_BUFFER_SERIALIZE_FORMAT_JSON = HB_TAG('J','S','O','N'),
HB_BUFFER_SERIALIZE_FORMAT_INVALID = HB_TAG_NONE
} hb_buffer_serialize_format_t;
-/* len=-1 means str is NUL-terminated. */
-hb_buffer_serialize_format_t
+HB_EXTERN hb_buffer_serialize_format_t
hb_buffer_serialize_format_from_string (const char *str, int len);
-const char *
+HB_EXTERN const char *
hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format);
-const char **
+HB_EXTERN const char **
hb_buffer_serialize_list_formats (void);
-/* Returns number of items, starting at start, that were serialized. */
-unsigned int
+HB_EXTERN unsigned int
hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
unsigned int start,
unsigned int end,
char *buf,
unsigned int buf_size,
- unsigned int *buf_consumed, /* May be NULL */
- hb_font_t *font, /* May be NULL */
+ unsigned int *buf_consumed,
+ hb_font_t *font,
hb_buffer_serialize_format_t format,
hb_buffer_serialize_flags_t flags);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
const char *buf,
- int buf_len, /* -1 means nul-terminated */
- const char **end_ptr, /* May be NULL */
- hb_font_t *font, /* May be NULL */
+ int buf_len,
+ const char **end_ptr,
+ hb_font_t *font,
hb_buffer_serialize_format_t format);
+/*
+ * Debugging.
+ */
+
+typedef hb_bool_t (*hb_buffer_message_func_t) (hb_buffer_t *buffer,
+ hb_font_t *font,
+ const char *message,
+ void *user_data);
+
+HB_EXTERN void
+hb_buffer_set_message_func (hb_buffer_t *buffer,
+ hb_buffer_message_func_t func,
+ void *user_data, hb_destroy_func_t destroy);
+
+
HB_END_DECLS
#endif /* HB_BUFFER_H */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.cc Fri Aug 26 10:14:15 2016 -0700
@@ -88,7 +88,7 @@
/**
* hb_tag_to_string:
* @tag:
- * @buf: (array fixed-size=4):
+ * @buf: (out caller-allocates) (array fixed-size=4) (element-type uint8_t):
*
*
*
@@ -281,12 +281,15 @@
/**
* hb_language_from_string:
- * @str: (array length=len) (element-type uint8_t):
- * @len:
+ * @str: (array length=len) (element-type uint8_t): a string representing
+ * ISOÂ 639 language code
+ * @len: length of the @str, or -1 if it is %NULL-terminated.
*
- *
+ * Converts @str representing an ISOÂ 639 language code to the corresponding
+ * #hb_language_t.
*
* Return value: (transfer none):
+ * The #hb_language_t corresponding to the ISOÂ 639 language code.
*
* Since: 0.9.2
**/
@@ -314,11 +317,13 @@
/**
* hb_language_to_string:
- * @language:
+ * @language: an #hb_language_t to convert.
*
- *
+ * See hb_language_from_string().
*
* Return value: (transfer none):
+ * A %NULL-terminated string representing the @language. Must not be freed by
+ * the caller.
*
* Since: 0.9.2
**/
@@ -357,11 +362,12 @@
/**
* hb_script_from_iso15924_tag:
- * @tag:
+ * @tag: an #hb_tag_t representing an ISOÂ 15924 tag.
*
- *
+ * Converts an ISOÂ 15924 script tag to a corresponding #hb_script_t.
*
* Return value:
+ * An #hb_script_t corresponding to the ISOÂ 15924 tag.
*
* Since: 0.9.2
**/
@@ -401,28 +407,33 @@
/**
* hb_script_from_string:
- * @s: (array length=len) (element-type uint8_t):
- * @len:
+ * @str: (array length=len) (element-type uint8_t): a string representing an
+ * ISOÂ 15924 tag.
+ * @len: length of the @str, or -1 if it is %NULL-terminated.
*
- *
+ * Converts a string @str representing an ISOÂ 15924 script tag to a
+ * corresponding #hb_script_t. Shorthand for hb_tag_from_string() then
+ * hb_script_from_iso15924_tag().
*
* Return value:
+ * An #hb_script_t corresponding to the ISOÂ 15924 tag.
*
* Since: 0.9.2
**/
hb_script_t
-hb_script_from_string (const char *s, int len)
+hb_script_from_string (const char *str, int len)
{
- return hb_script_from_iso15924_tag (hb_tag_from_string (s, len));
+ return hb_script_from_iso15924_tag (hb_tag_from_string (str, len));
}
/**
* hb_script_to_iso15924_tag:
- * @script:
+ * @script: an #hb_script_ to convert.
*
- *
+ * See hb_script_from_iso15924_tag().
*
* Return value:
+ * An #hb_tag_t representing an ISOÂ 15924 script tag.
*
* Since: 0.9.2
**/
@@ -496,6 +507,9 @@
/* Unicode-8.0 additions */
case HB_SCRIPT_OLD_HUNGARIAN:
+ /* Unicode-9.0 additions */
+ case HB_SCRIPT_ADLAM:
+
return HB_DIRECTION_RTL;
}
@@ -521,7 +535,7 @@
}
}
hb_user_data_item_t item = {key, data, destroy};
- bool ret = !!items.replace_or_insert (item, lock, replace);
+ bool ret = !!items.replace_or_insert (item, lock, (bool) replace);
return ret;
}
@@ -529,7 +543,7 @@
void *
hb_user_data_array_t::get (hb_user_data_key_t *key)
{
- hb_user_data_item_t item = {NULL };
+ hb_user_data_item_t item = {NULL, NULL, NULL};
return items.find (key, &item, lock) ? item.data : NULL;
}
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.h Fri Aug 26 10:14:15 2016 -0700
@@ -98,16 +98,22 @@
#define HB_TAG_MAX_SIGNED HB_TAG(0x7f,0xff,0xff,0xff)
/* len=-1 means str is NUL-terminated. */
-hb_tag_t
+HB_EXTERN hb_tag_t
hb_tag_from_string (const char *str, int len);
/* buf should have 4 bytes. */
-void
+HB_EXTERN void
hb_tag_to_string (hb_tag_t tag, char *buf);
-/* hb_direction_t */
-
+/**
+ * hb_direction_t:
+ * @HB_DIRECTION_INVALID: Initial, unset direction.
+ * @HB_DIRECTION_LTR: Text is set horizontally from left to right.
+ * @HB_DIRECTION_RTL: Text is set horizontally from right to left.
+ * @HB_DIRECTION_TTB: Text is set vertically from top to bottom.
+ * @HB_DIRECTION_BTT: Text is set vertically from bottom to top.
+ */
typedef enum {
HB_DIRECTION_INVALID = 0,
HB_DIRECTION_LTR = 4,
@@ -117,10 +123,10 @@
} hb_direction_t;
/* len=-1 means str is NUL-terminated */
-hb_direction_t
+HB_EXTERN hb_direction_t
hb_direction_from_string (const char *str, int len);
-const char *
+HB_EXTERN const char *
hb_direction_to_string (hb_direction_t direction);
#define HB_DIRECTION_IS_VALID(dir) ((((unsigned int) (dir)) & ~3U) == 4)
@@ -136,16 +142,15 @@
typedef const struct hb_language_impl_t *hb_language_t;
-/* len=-1 means str is NUL-terminated */
-hb_language_t
+HB_EXTERN hb_language_t
hb_language_from_string (const char *str, int len);
-const char *
+HB_EXTERN const char *
hb_language_to_string (hb_language_t language);
#define HB_LANGUAGE_INVALID ((hb_language_t) NULL)
-hb_language_t
+HB_EXTERN hb_language_t
hb_language_get_default (void);
@@ -306,6 +311,16 @@
/*8.0*/ HB_SCRIPT_OLD_HUNGARIAN = HB_TAG ('H','u','n','g'),
/*8.0*/ HB_SCRIPT_SIGNWRITING = HB_TAG ('S','g','n','w'),
+ /*
+ * Since 1.3.0
+ */
+ /*9.0*/ HB_SCRIPT_ADLAM = HB_TAG ('A','d','l','m'),
+ /*9.0*/ HB_SCRIPT_BHAIKSUKI = HB_TAG ('B','h','k','s'),
+ /*9.0*/ HB_SCRIPT_MARCHEN = HB_TAG ('M','a','r','c'),
+ /*9.0*/ HB_SCRIPT_OSAGE = HB_TAG ('O','s','g','e'),
+ /*9.0*/ HB_SCRIPT_TANGUT = HB_TAG ('T','a','n','g'),
+ /*9.0*/ HB_SCRIPT_NEWA = HB_TAG ('N','e','w','a'),
+
/* No script set. */
HB_SCRIPT_INVALID = HB_TAG_NONE,
@@ -324,18 +339,16 @@
/* Script functions */
-hb_script_t
+HB_EXTERN hb_script_t
hb_script_from_iso15924_tag (hb_tag_t tag);
-/* sugar for tag_from_string() then script_from_iso15924_tag */
-/* len=-1 means s is NUL-terminated */
-hb_script_t
-hb_script_from_string (const char *s, int len);
+HB_EXTERN hb_script_t
+hb_script_from_string (const char *str, int len);
-hb_tag_t
+HB_EXTERN hb_tag_t
hb_script_to_iso15924_tag (hb_script_t script);
-hb_direction_t
+HB_EXTERN hb_direction_t
hb_script_get_horizontal_direction (hb_script_t script);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.cc Fri Aug 26 10:14:15 2016 -0700
@@ -27,7 +27,6 @@
*/
#define HB_SHAPER coretext
-#define hb_coretext_shaper_face_data_t CGFont
#include "hb-shaper-impl-private.hh"
#include "hb-coretext.h"
@@ -78,6 +77,29 @@
* shaper face data
*/
+static CTFontDescriptorRef
+get_last_resort_font_desc (void)
+{
+ // TODO Handle allocation failures?
+ CTFontDescriptorRef last_resort = CTFontDescriptorCreateWithNameAndSize (CFSTR("LastResort"), 0);
+ CFArrayRef cascade_list = CFArrayCreate (kCFAllocatorDefault,
+ (const void **) &last_resort,
+ 1,
+ &kCFTypeArrayCallBacks);
+ CFRelease (last_resort);
+ CFDictionaryRef attributes = CFDictionaryCreate (kCFAllocatorDefault,
+ (const void **) &kCTFontCascadeListAttribute,
+ (const void **) &cascade_list,
+ 1,
+ &kCFTypeDictionaryKeyCallBacks,
+ &kCFTypeDictionaryValueCallBacks);
+ CFRelease (cascade_list);
+
+ CTFontDescriptorRef font_desc = CTFontDescriptorCreateWithAttributes (attributes);
+ CFRelease (attributes);
+ return font_desc;
+}
+
static void
release_data (void *info, const void *data, size_t size)
{
@@ -87,14 +109,13 @@
hb_blob_destroy ((hb_blob_t *) info);
}
-hb_coretext_shaper_face_data_t *
-_hb_coretext_shaper_face_data_create (hb_face_t *face)
+static CGFontRef
+create_cg_font (hb_face_t *face)
{
- hb_coretext_shaper_face_data_t *data = NULL;
-
+ CGFontRef cg_font = NULL;
if (face->destroy == (hb_destroy_func_t) CGFontRelease)
{
- data = CGFontRetain ((CGFontRef) face->user_data);
+ cg_font = CGFontRetain ((CGFontRef) face->user_data);
}
else
{
@@ -107,13 +128,98 @@
CGDataProviderRef provider = CGDataProviderCreateWithData (blob, blob_data, blob_length, &release_data);
if (likely (provider))
{
- data = CGFontCreateWithDataProvider (provider);
+ cg_font = CGFontCreateWithDataProvider (provider);
+ if (unlikely (!cg_font))
+ DEBUG_MSG (CORETEXT, face, "Face CGFontCreateWithDataProvider() failed");
CGDataProviderRelease (provider);
}
}
+ return cg_font;
+}
- if (unlikely (!data)) {
- DEBUG_MSG (CORETEXT, face, "Face CGFontCreateWithDataProvider() failed");
+static CTFontRef
+create_ct_font (CGFontRef cg_font, CGFloat font_size)
+{
+ CTFontRef ct_font = CTFontCreateWithGraphicsFont (cg_font, font_size, NULL, NULL);
+ if (unlikely (!ct_font)) {
+ DEBUG_MSG (CORETEXT, cg_font, "Font CTFontCreateWithGraphicsFont() failed");
+ return NULL;
+ }
+ CFURLRef original_url = (CFURLRef)CTFontCopyAttribute(ct_font, kCTFontURLAttribute);
+
+ /* Create font copy with cascade list that has LastResort first; this speeds up CoreText
+ * font fallback which we don't need anyway. */
+ {
+ CTFontDescriptorRef last_resort_font_desc = get_last_resort_font_desc ();
+ CTFontRef new_ct_font = CTFontCreateCopyWithAttributes (ct_font, 0.0, NULL, last_resort_font_desc);
+ CFRelease (last_resort_font_desc);
+ if (new_ct_font)
+ {
+ /* The CTFontCreateCopyWithAttributes call fails to stay on the same font
+ * when reconfiguring the cascade list and may switch to a different font
+ * when there are fonts that go by the same name, since the descriptor is
+ * just name and size.
+ *
+ * Avoid reconfiguring the cascade lists if the new font is outside the
+ * system locations that we cannot access from the sandboxed renderer
+ * process in Blink. This can be detected by the new file URL location
+ * that the newly found font points to. */
+ CFURLRef new_url = (CFURLRef) CTFontCopyAttribute (new_ct_font, kCTFontURLAttribute);
+ // Keep reconfigured font if URL cannot be retrieved (seems to be the case
+ // on Mac OS 10.12 Sierra), speculative fix for crbug.com/625606
+ if (!original_url || !new_url || CFEqual (original_url, new_url)) {
+ CFRelease (ct_font);
+ ct_font = new_ct_font;
+ } else {
+ CFRelease (new_ct_font);
+ DEBUG_MSG (CORETEXT, ct_font, "Discarding reconfigured CTFont, location changed.");
+ }
+ if (new_url)
+ CFRelease (new_url);
+ }
+ else
+ DEBUG_MSG (CORETEXT, ct_font, "Font copy with empty cascade list failed");
+ }
+
+ if (original_url)
+ CFRelease (original_url);
+ return ct_font;
+}
+
+struct hb_coretext_shaper_face_data_t {
+ CGFontRef cg_font;
+ CTFontRef ct_font;
+};
+
+hb_coretext_shaper_face_data_t *
+_hb_coretext_shaper_face_data_create (hb_face_t *face)
+{
+ hb_coretext_shaper_face_data_t *data = (hb_coretext_shaper_face_data_t *) calloc (1, sizeof (hb_coretext_shaper_face_data_t));
+ if (unlikely (!data))
+ return NULL;
+
+ data->cg_font = create_cg_font (face);
+ if (unlikely (!data->cg_font))
+ {
+ DEBUG_MSG (CORETEXT, face, "CGFont creation failed..");
+ free (data);
+ return NULL;
+ }
+
+ /* We use 36pt size instead of UPEM, because CoreText implements the 'trak' table,
+ * which can make the font too tight at large sizes. 36pt should be a good semi-neutral
+ * size.
+ *
+ * Since we always create CTFont at a fixed size, our CTFont lives in face_data
+ * instead of font_data. Which is good, because when people change scale on
+ * hb_font_t, we won't need to update our CTFont. */
+ data->ct_font = create_ct_font (data->cg_font, 36.);
+ if (unlikely (!data->ct_font))
+ {
+ DEBUG_MSG (CORETEXT, face, "CTFont creation failed.");
+ CFRelease (data->cg_font);
+ free (data);
+ return NULL;
}
return data;
@@ -122,7 +228,9 @@
void
_hb_coretext_shaper_face_data_destroy (hb_coretext_shaper_face_data_t *data)
{
- CFRelease (data);
+ CFRelease (data->ct_font);
+ CFRelease (data->cg_font);
+ free (data);
}
/*
@@ -133,7 +241,7 @@
{
if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return NULL;
hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
- return face_data;
+ return face_data->cg_font;
}
@@ -141,49 +249,17 @@
* shaper font data
*/
-struct hb_coretext_shaper_font_data_t {
- CTFontRef ct_font;
- CGFloat x_mult, y_mult; /* From CT space to HB space. */
-};
+struct hb_coretext_shaper_font_data_t {};
hb_coretext_shaper_font_data_t *
-_hb_coretext_shaper_font_data_create (hb_font_t *font)
+_hb_coretext_shaper_font_data_create (hb_font_t *font HB_UNUSED)
{
- if (unlikely (!hb_coretext_shaper_face_data_ensure (font->face))) return NULL;
-
- hb_coretext_shaper_font_data_t *data = (hb_coretext_shaper_font_data_t *) calloc (1, sizeof (hb_coretext_shaper_font_data_t));
- if (unlikely (!data))
- return NULL;
-
- hb_face_t *face = font->face;
- hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
-
- /* Choose a CoreText font size and calculate multipliers to convert to HarfBuzz space. */
- /* TODO: use upem instead of 36? */
- CGFloat font_size = 36.; /* Default... */
- /* No idea if the following is even a good idea. */
- if (font->y_ppem)
- font_size = font->y_ppem;
-
- if (font_size < 0)
- font_size = -font_size;
- data->x_mult = (CGFloat) font->x_scale / font_size;
- data->y_mult = (CGFloat) font->y_scale / font_size;
- data->ct_font = CTFontCreateWithGraphicsFont (face_data, font_size, NULL, NULL);
- if (unlikely (!data->ct_font)) {
- DEBUG_MSG (CORETEXT, font, "Font CTFontCreateWithGraphicsFont() failed");
- free (data);
- return NULL;
- }
-
- return data;
+ return (hb_coretext_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
}
void
_hb_coretext_shaper_font_data_destroy (hb_coretext_shaper_font_data_t *data)
{
- CFRelease (data->ct_font);
- free (data);
}
@@ -209,9 +285,10 @@
CTFontRef
hb_coretext_font_get_ct_font (hb_font_t *font)
{
- if (unlikely (!hb_coretext_shaper_font_data_ensure (font))) return NULL;
- hb_coretext_shaper_font_data_t *font_data = HB_SHAPER_DATA_GET (font);
- return font_data->ct_font;
+ hb_face_t *face = font->face;
+ if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return NULL;
+ hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
+ return face_data->ct_font;
}
@@ -444,7 +521,10 @@
{
hb_face_t *face = font->face;
hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
- hb_coretext_shaper_font_data_t *font_data = HB_SHAPER_DATA_GET (font);
+
+ CGFloat ct_font_size = CTFontGetSize (face_data->ct_font);
+ CGFloat x_mult = (CGFloat) font->x_scale / ct_font_size;
+ CGFloat y_mult = (CGFloat) font->y_scale / ct_font_size;
/* Attach marks to their bases, to match the 'ot' shaper.
* Adapted from hb-ot-shape:hb_form_clusters().
@@ -453,6 +533,7 @@
* B1 M1 B2 M2, and B1-B2 form a ligature, M2's cluster will
* continue pointing to B2 even though B2 was merged into B1's
* cluster... */
+ if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
{
hb_unicode_funcs_t *unicode = buffer->unicode;
unsigned int count = buffer->len;
@@ -575,7 +656,7 @@
CTFontDescriptorRef font_desc = CTFontDescriptorCreateWithAttributes (attributes);
CFRelease (attributes);
- range->font = CTFontCreateCopyWithAttributes (font_data->ct_font, 0.0, NULL, font_desc);
+ range->font = CTFontCreateCopyWithAttributes (face_data->ct_font, 0.0, NULL, font_desc);
CFRelease (font_desc);
}
else
@@ -693,7 +774,6 @@
scratch += old_scratch_used;
scratch_size -= old_scratch_used;
}
-retry:
{
string_ref = CFStringCreateWithCharactersNoCopy (NULL,
pchars, chars_len,
@@ -733,7 +813,7 @@
CFRelease (lang);
}
CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len),
- kCTFontAttributeName, font_data->ct_font);
+ kCTFontAttributeName, face_data->ct_font);
if (num_features)
{
@@ -826,7 +906,7 @@
*/
CFDictionaryRef attributes = CTRunGetAttributes (run);
CTFontRef run_ct_font = static_cast<CTFontRef>(CFDictionaryGetValue (attributes, kCTFontAttributeName));
- if (!CFEqual (run_ct_font, font_data->ct_font))
+ if (!CFEqual (run_ct_font, face_data->ct_font))
{
/* The run doesn't use our main font instance. We have to figure out
* whether font fallback happened, or this is just CoreText giving us
@@ -846,15 +926,11 @@
* backend.
*
* However, even that wouldn't work if we were passed in the CGFont to
- * begin with.
- *
- * Webkit uses a slightly different approach: it installs LastResort
- * as fallback chain, and then checks PS name of used font against
- * LastResort. That one is safe for any font except for LastResort,
- * as opposed to ours, which can fail if we are using any uninstalled
- * font that has the same name as an installed font.
+ * construct a hb_face to begin with.
*
* See: http://github.com/behdad/harfbuzz/pull/36
+ *
+ * Also see: https://bugs.chromium.org/p/chromium/issues/detail?id=597098
*/
bool matched = false;
for (unsigned int i = 0; i < range_records.len; i++)
@@ -868,13 +944,13 @@
CGFontRef run_cg_font = CTFontCopyGraphicsFont (run_ct_font, 0);
if (run_cg_font)
{
- matched = CFEqual (run_cg_font, face_data);
+ matched = CFEqual (run_cg_font, face_data->cg_font);
CFRelease (run_cg_font);
}
}
if (!matched)
{
- CFStringRef font_ps_name = CTFontCopyName (font_data->ct_font, kCTFontPostScriptNameKey);
+ CFStringRef font_ps_name = CTFontCopyName (face_data->ct_font, kCTFontPostScriptNameKey);
CFStringRef run_ps_name = CTFontCopyName (run_ct_font, kCTFontPostScriptNameKey);
CFComparisonResult result = CFStringCompare (run_ps_name, font_ps_name, 0);
CFRelease (run_ps_name);
@@ -994,7 +1070,6 @@
positions = position_buf;
}
hb_glyph_info_t *info = run_info;
- CGFloat x_mult = font_data->x_mult, y_mult = font_data->y_mult;
if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
{
hb_position_t x_offset = (positions[0].x - advances_so_far) * x_mult;
@@ -1129,10 +1204,6 @@
* AAT shaper
*/
-HB_SHAPER_DATA_ENSURE_DECLARE(coretext_aat, face)
-HB_SHAPER_DATA_ENSURE_DECLARE(coretext_aat, font)
-
-
/*
* shaper face data
*/
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.h Fri Aug 26 10:14:15 2016 -0700
@@ -44,14 +44,14 @@
#define HB_CORETEXT_TAG_MORX HB_TAG('m','o','r','x')
-hb_face_t *
+HB_EXTERN hb_face_t *
hb_coretext_face_create (CGFontRef cg_font);
-CGFontRef
+HB_EXTERN CGFontRef
hb_coretext_face_get_cg_font (hb_face_t *face);
-CTFontRef
+HB_EXTERN CTFontRef
hb_coretext_font_get_ct_font (hb_font_t *font);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-deprecated.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-deprecated.h Fri Aug 26 10:14:15 2016 -0700
@@ -44,6 +44,16 @@
#define HB_BUFFER_FLAGS_DEFAULT HB_BUFFER_FLAG_DEFAULT
#define HB_BUFFER_SERIALIZE_FLAGS_DEFAULT HB_BUFFER_SERIALIZE_FLAG_DEFAULT
+typedef hb_bool_t (*hb_font_get_glyph_func_t) (hb_font_t *font, void *font_data,
+ hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph,
+ void *user_data);
+
+HB_EXTERN void
+hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
+ hb_font_get_glyph_func_t func,
+ void *user_data, hb_destroy_func_t destroy);
+
#endif
HB_END_DECLS
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-face.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-face.h Fri Aug 26 10:14:15 2016 -0700
@@ -43,28 +43,28 @@
typedef struct hb_face_t hb_face_t;
-hb_face_t *
+HB_EXTERN hb_face_t *
hb_face_create (hb_blob_t *blob,
unsigned int index);
typedef hb_blob_t * (*hb_reference_table_func_t) (hb_face_t *face, hb_tag_t tag, void *user_data);
/* calls destroy() when not needing user_data anymore */
-hb_face_t *
+HB_EXTERN hb_face_t *
hb_face_create_for_tables (hb_reference_table_func_t reference_table_func,
void *user_data,
hb_destroy_func_t destroy);
-hb_face_t *
+HB_EXTERN hb_face_t *
hb_face_get_empty (void);
-hb_face_t *
+HB_EXTERN hb_face_t *
hb_face_reference (hb_face_t *face);
-void
+HB_EXTERN void
hb_face_destroy (hb_face_t *face);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_face_set_user_data (hb_face_t *face,
hb_user_data_key_t *key,
void * data,
@@ -72,43 +72,43 @@
hb_bool_t replace);
-void *
+HB_EXTERN void *
hb_face_get_user_data (hb_face_t *face,
hb_user_data_key_t *key);
-void
+HB_EXTERN void
hb_face_make_immutable (hb_face_t *face);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_face_is_immutable (hb_face_t *face);
-hb_blob_t *
+HB_EXTERN hb_blob_t *
hb_face_reference_table (hb_face_t *face,
hb_tag_t tag);
-hb_blob_t *
+HB_EXTERN hb_blob_t *
hb_face_reference_blob (hb_face_t *face);
-void
+HB_EXTERN void
hb_face_set_index (hb_face_t *face,
unsigned int index);
-unsigned int
+HB_EXTERN unsigned int
hb_face_get_index (hb_face_t *face);
-void
+HB_EXTERN void
hb_face_set_upem (hb_face_t *face,
unsigned int upem);
-unsigned int
+HB_EXTERN unsigned int
hb_face_get_upem (hb_face_t *face);
-void
+HB_EXTERN void
hb_face_set_glyph_count (hb_face_t *face,
unsigned int glyph_count);
-unsigned int
+HB_EXTERN unsigned int
hb_face_get_glyph_count (hb_face_t *face);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-fallback-shape.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-fallback-shape.cc Fri Aug 26 10:14:15 2016 -0700
@@ -106,7 +106,7 @@
*/
hb_codepoint_t space;
- bool has_space = font->get_glyph (' ', 0, &space);
+ bool has_space = (bool) font->get_nominal_glyph (' ', &space);
buffer->clear_positions ();
@@ -123,7 +123,7 @@
pos[i].y_advance = 0;
continue;
}
- font->get_glyph (info[i].codepoint, 0, &info[i].codepoint);
+ font->get_nominal_glyph (info[i].codepoint, &info[i].codepoint);
font->get_glyph_advance_for_direction (info[i].codepoint,
direction,
&pos[i].x_advance,
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font-private.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font-private.hh Fri Aug 26 10:14:15 2016 -0700
@@ -42,7 +42,10 @@
*/
#define HB_FONT_FUNCS_IMPLEMENT_CALLBACKS \
- HB_FONT_FUNC_IMPLEMENT (glyph) \
+ HB_FONT_FUNC_IMPLEMENT (font_h_extents) \
+ HB_FONT_FUNC_IMPLEMENT (font_v_extents) \
+ HB_FONT_FUNC_IMPLEMENT (nominal_glyph) \
+ HB_FONT_FUNC_IMPLEMENT (variation_glyph) \
HB_FONT_FUNC_IMPLEMENT (glyph_h_advance) \
HB_FONT_FUNC_IMPLEMENT (glyph_v_advance) \
HB_FONT_FUNC_IMPLEMENT (glyph_h_origin) \
@@ -61,14 +64,6 @@
hb_bool_t immutable;
- /* Don't access these directly. Call hb_font_get_*() instead. */
-
- struct {
-#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_func_t name;
- HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
-#undef HB_FONT_FUNC_IMPLEMENT
- } get;
-
struct {
#define HB_FONT_FUNC_IMPLEMENT(name) void *name;
HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
@@ -80,6 +75,16 @@
HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
#undef HB_FONT_FUNC_IMPLEMENT
} destroy;
+
+ /* Don't access these directly. Call font->get_*() instead. */
+ union get_t {
+ struct get_funcs_t {
+#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_func_t name;
+ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+ } f;
+ void (*array[VAR]) (void);
+ } get;
};
@@ -144,95 +149,133 @@
/* Public getters */
- inline hb_bool_t has_glyph (hb_codepoint_t unicode)
+ HB_INTERNAL bool has_func (unsigned int i);
+
+ /* has_* ... */
+#define HB_FONT_FUNC_IMPLEMENT(name) \
+ bool \
+ has_##name##_func (void) \
+ { \
+ hb_font_funcs_t *funcs = this->klass; \
+ unsigned int i = offsetof (hb_font_funcs_t::get_t::get_funcs_t, name) / sizeof (funcs->get.array[0]); \
+ return has_func (i); \
+ }
+ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+
+ inline hb_bool_t get_font_h_extents (hb_font_extents_t *extents)
{
- hb_codepoint_t glyph;
- return get_glyph (unicode, 0, &glyph);
+ memset (extents, 0, sizeof (*extents));
+ return klass->get.f.font_h_extents (this, user_data,
+ extents,
+ klass->user_data.font_h_extents);
+ }
+ inline hb_bool_t get_font_v_extents (hb_font_extents_t *extents)
+ {
+ memset (extents, 0, sizeof (*extents));
+ return klass->get.f.font_v_extents (this, user_data,
+ extents,
+ klass->user_data.font_v_extents);
}
- inline hb_bool_t get_glyph (hb_codepoint_t unicode, hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph)
+ inline bool has_glyph (hb_codepoint_t unicode)
+ {
+ hb_codepoint_t glyph;
+ return get_nominal_glyph (unicode, &glyph);
+ }
+
+ inline hb_bool_t get_nominal_glyph (hb_codepoint_t unicode,
+ hb_codepoint_t *glyph)
{
*glyph = 0;
- return klass->get.glyph (this, user_data,
- unicode, variation_selector, glyph,
- klass->user_data.glyph);
+ return klass->get.f.nominal_glyph (this, user_data,
+ unicode, glyph,
+ klass->user_data.nominal_glyph);
+ }
+
+ inline hb_bool_t get_variation_glyph (hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph)
+ {
+ *glyph = 0;
+ return klass->get.f.variation_glyph (this, user_data,
+ unicode, variation_selector, glyph,
+ klass->user_data.variation_glyph);
}
inline hb_position_t get_glyph_h_advance (hb_codepoint_t glyph)
{
- return klass->get.glyph_h_advance (this, user_data,
- glyph,
- klass->user_data.glyph_h_advance);
+ return klass->get.f.glyph_h_advance (this, user_data,
+ glyph,
+ klass->user_data.glyph_h_advance);
}
inline hb_position_t get_glyph_v_advance (hb_codepoint_t glyph)
{
- return klass->get.glyph_v_advance (this, user_data,
- glyph,
- klass->user_data.glyph_v_advance);
+ return klass->get.f.glyph_v_advance (this, user_data,
+ glyph,
+ klass->user_data.glyph_v_advance);
}
inline hb_bool_t get_glyph_h_origin (hb_codepoint_t glyph,
hb_position_t *x, hb_position_t *y)
{
*x = *y = 0;
- return klass->get.glyph_h_origin (this, user_data,
- glyph, x, y,
- klass->user_data.glyph_h_origin);
+ return klass->get.f.glyph_h_origin (this, user_data,
+ glyph, x, y,
+ klass->user_data.glyph_h_origin);
}
inline hb_bool_t get_glyph_v_origin (hb_codepoint_t glyph,
hb_position_t *x, hb_position_t *y)
{
*x = *y = 0;
- return klass->get.glyph_v_origin (this, user_data,
- glyph, x, y,
- klass->user_data.glyph_v_origin);
+ return klass->get.f.glyph_v_origin (this, user_data,
+ glyph, x, y,
+ klass->user_data.glyph_v_origin);
}
inline hb_position_t get_glyph_h_kerning (hb_codepoint_t left_glyph, hb_codepoint_t right_glyph)
{
- return klass->get.glyph_h_kerning (this, user_data,
- left_glyph, right_glyph,
- klass->user_data.glyph_h_kerning);
+ return klass->get.f.glyph_h_kerning (this, user_data,
+ left_glyph, right_glyph,
+ klass->user_data.glyph_h_kerning);
}
inline hb_position_t get_glyph_v_kerning (hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph)
{
- return klass->get.glyph_v_kerning (this, user_data,
- top_glyph, bottom_glyph,
- klass->user_data.glyph_v_kerning);
+ return klass->get.f.glyph_v_kerning (this, user_data,
+ top_glyph, bottom_glyph,
+ klass->user_data.glyph_v_kerning);
}
inline hb_bool_t get_glyph_extents (hb_codepoint_t glyph,
hb_glyph_extents_t *extents)
{
memset (extents, 0, sizeof (*extents));
- return klass->get.glyph_extents (this, user_data,
- glyph,
- extents,
- klass->user_data.glyph_extents);
+ return klass->get.f.glyph_extents (this, user_data,
+ glyph,
+ extents,
+ klass->user_data.glyph_extents);
}
inline hb_bool_t get_glyph_contour_point (hb_codepoint_t glyph, unsigned int point_index,
hb_position_t *x, hb_position_t *y)
{
*x = *y = 0;
- return klass->get.glyph_contour_point (this, user_data,
- glyph, point_index,
- x, y,
- klass->user_data.glyph_contour_point);
+ return klass->get.f.glyph_contour_point (this, user_data,
+ glyph, point_index,
+ x, y,
+ klass->user_data.glyph_contour_point);
}
inline hb_bool_t get_glyph_name (hb_codepoint_t glyph,
char *name, unsigned int size)
{
if (size) *name = '\0';
- return klass->get.glyph_name (this, user_data,
- glyph,
- name, size,
- klass->user_data.glyph_name);
+ return klass->get.f.glyph_name (this, user_data,
+ glyph,
+ name, size,
+ klass->user_data.glyph_name);
}
inline hb_bool_t get_glyph_from_name (const char *name, int len, /* -1 means nul-terminated */
@@ -240,15 +283,35 @@
{
*glyph = 0;
if (len == -1) len = strlen (name);
- return klass->get.glyph_from_name (this, user_data,
- name, len,
- glyph,
- klass->user_data.glyph_from_name);
+ return klass->get.f.glyph_from_name (this, user_data,
+ name, len,
+ glyph,
+ klass->user_data.glyph_from_name);
}
/* A bit higher-level, and with fallback */
+ inline void get_extents_for_direction (hb_direction_t direction,
+ hb_font_extents_t *extents)
+ {
+ if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) {
+ if (!get_font_h_extents (extents))
+ {
+ extents->ascender = y_scale * .8;
+ extents->descender = y_scale - extents->ascender;
+ extents->line_gap = 0;
+ }
+ } else {
+ if (!get_font_v_extents (extents))
+ {
+ extents->ascender = x_scale / 2;
+ extents->descender = x_scale - extents->ascender;
+ extents->line_gap = 0;
+ }
+ }
+ }
+
inline void get_glyph_advance_for_direction (hb_codepoint_t glyph,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y)
@@ -268,7 +331,7 @@
{
*x = get_glyph_h_advance (glyph) / 2;
- /* TODO use font_metrics.ascent */
+ /* TODO use font_extents.ascender */
*y = y_scale;
}
@@ -298,6 +361,26 @@
}
}
+ inline void add_glyph_h_origin (hb_codepoint_t glyph,
+ hb_position_t *x, hb_position_t *y)
+ {
+ hb_position_t origin_x, origin_y;
+
+ get_glyph_h_origin (glyph, &origin_x, &origin_y);
+
+ *x += origin_x;
+ *y += origin_y;
+ }
+ inline void add_glyph_v_origin (hb_codepoint_t glyph,
+ hb_position_t *x, hb_position_t *y)
+ {
+ hb_position_t origin_x, origin_y;
+
+ get_glyph_v_origin (glyph, &origin_x, &origin_y);
+
+ *x += origin_x;
+ *y += origin_y;
+ }
inline void add_glyph_origin_for_direction (hb_codepoint_t glyph,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y)
@@ -310,6 +393,26 @@
*y += origin_y;
}
+ inline void subtract_glyph_h_origin (hb_codepoint_t glyph,
+ hb_position_t *x, hb_position_t *y)
+ {
+ hb_position_t origin_x, origin_y;
+
+ get_glyph_h_origin (glyph, &origin_x, &origin_y);
+
+ *x -= origin_x;
+ *y -= origin_y;
+ }
+ inline void subtract_glyph_v_origin (hb_codepoint_t glyph,
+ hb_position_t *x, hb_position_t *y)
+ {
+ hb_position_t origin_x, origin_y;
+
+ get_glyph_v_origin (glyph, &origin_x, &origin_y);
+
+ *x -= origin_x;
+ *y -= origin_y;
+ }
inline void subtract_glyph_origin_for_direction (hb_codepoint_t glyph,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y)
@@ -394,7 +497,7 @@
hb_codepoint_t unichar;
if (0 == strncmp (s, "uni", 3) &&
hb_codepoint_parse (s + 3, len - 3, 16, &unichar) &&
- get_glyph (unichar, 0, glyph))
+ get_nominal_glyph (unichar, glyph))
return true;
}
@@ -402,7 +505,13 @@
}
private:
- inline hb_position_t em_scale (int16_t v, int scale) { return (hb_position_t) (v * (int64_t) scale / face->get_upem ()); }
+ inline hb_position_t em_scale (int16_t v, int scale)
+ {
+ int upem = face->get_upem ();
+ int64_t scaled = v * (int64_t) scale;
+ scaled += scaled >= 0 ? upem/2 : -upem/2; /* Round. */
+ return (hb_position_t) (scaled / upem);
+ }
};
#define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.cc Fri Aug 26 10:14:15 2016 -0700
@@ -45,130 +45,246 @@
*/
static hb_bool_t
-hb_font_get_glyph_nil (hb_font_t *font,
- void *font_data HB_UNUSED,
- hb_codepoint_t unicode,
- hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph,
- void *user_data HB_UNUSED)
+hb_font_get_font_h_extents_nil (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_font_extents_t *metrics,
+ void *user_data HB_UNUSED)
+{
+ memset (metrics, 0, sizeof (*metrics));
+ return false;
+}
+static hb_bool_t
+hb_font_get_font_h_extents_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_font_extents_t *metrics,
+ void *user_data HB_UNUSED)
{
- if (font->parent)
- return font->parent->get_glyph (unicode, variation_selector, glyph);
+ hb_bool_t ret = font->parent->get_font_h_extents (metrics);
+ if (ret) {
+ metrics->ascender = font->parent_scale_y_distance (metrics->ascender);
+ metrics->descender = font->parent_scale_y_distance (metrics->descender);
+ metrics->line_gap = font->parent_scale_y_distance (metrics->line_gap);
+ }
+ return ret;
+}
+static hb_bool_t
+hb_font_get_font_v_extents_nil (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_font_extents_t *metrics,
+ void *user_data HB_UNUSED)
+{
+ memset (metrics, 0, sizeof (*metrics));
+ return false;
+}
+static hb_bool_t
+hb_font_get_font_v_extents_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_font_extents_t *metrics,
+ void *user_data HB_UNUSED)
+{
+ hb_bool_t ret = font->parent->get_font_v_extents (metrics);
+ if (ret) {
+ metrics->ascender = font->parent_scale_x_distance (metrics->ascender);
+ metrics->descender = font->parent_scale_x_distance (metrics->descender);
+ metrics->line_gap = font->parent_scale_x_distance (metrics->line_gap);
+ }
+ return ret;
+}
+
+static hb_bool_t
+hb_font_get_nominal_glyph_nil (hb_font_t *font HB_UNUSED,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t unicode,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
+{
*glyph = 0;
return false;
}
+static hb_bool_t
+hb_font_get_nominal_glyph_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t unicode,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
+{
+ return font->parent->get_nominal_glyph (unicode, glyph);
+}
+
+static hb_bool_t
+hb_font_get_variation_glyph_nil (hb_font_t *font HB_UNUSED,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t unicode,
+ hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
+{
+ *glyph = 0;
+ return false;
+}
+static hb_bool_t
+hb_font_get_variation_glyph_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t unicode,
+ hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
+{
+ return font->parent->get_variation_glyph (unicode, variation_selector, glyph);
+}
+
static hb_position_t
-hb_font_get_glyph_h_advance_nil (hb_font_t *font,
+hb_font_get_glyph_h_advance_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
hb_codepoint_t glyph,
void *user_data HB_UNUSED)
{
- if (font->parent)
- return font->parent_scale_x_distance (font->parent->get_glyph_h_advance (glyph));
-
return font->x_scale;
}
+static hb_position_t
+hb_font_get_glyph_h_advance_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ void *user_data HB_UNUSED)
+{
+ return font->parent_scale_x_distance (font->parent->get_glyph_h_advance (glyph));
+}
static hb_position_t
-hb_font_get_glyph_v_advance_nil (hb_font_t *font,
+hb_font_get_glyph_v_advance_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
hb_codepoint_t glyph,
void *user_data HB_UNUSED)
{
- if (font->parent)
- return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph));
-
+ /* TODO use font_extents.ascender+descender */
return font->y_scale;
}
+static hb_position_t
+hb_font_get_glyph_v_advance_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ void *user_data HB_UNUSED)
+{
+ return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph));
+}
static hb_bool_t
-hb_font_get_glyph_h_origin_nil (hb_font_t *font,
+hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
hb_codepoint_t glyph,
hb_position_t *x,
hb_position_t *y,
void *user_data HB_UNUSED)
{
- if (font->parent) {
- hb_bool_t ret = font->parent->get_glyph_h_origin (glyph, x, y);
- if (ret)
- font->parent_scale_position (x, y);
- return ret;
- }
-
*x = *y = 0;
- return false;
+ return true;
+}
+static hb_bool_t
+hb_font_get_glyph_h_origin_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ hb_position_t *x,
+ hb_position_t *y,
+ void *user_data HB_UNUSED)
+{
+ hb_bool_t ret = font->parent->get_glyph_h_origin (glyph, x, y);
+ if (ret)
+ font->parent_scale_position (x, y);
+ return ret;
}
static hb_bool_t
-hb_font_get_glyph_v_origin_nil (hb_font_t *font,
+hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
hb_codepoint_t glyph,
hb_position_t *x,
hb_position_t *y,
void *user_data HB_UNUSED)
{
- if (font->parent) {
- hb_bool_t ret = font->parent->get_glyph_v_origin (glyph, x, y);
- if (ret)
- font->parent_scale_position (x, y);
- return ret;
- }
-
*x = *y = 0;
return false;
}
+static hb_bool_t
+hb_font_get_glyph_v_origin_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ hb_position_t *x,
+ hb_position_t *y,
+ void *user_data HB_UNUSED)
+{
+ hb_bool_t ret = font->parent->get_glyph_v_origin (glyph, x, y);
+ if (ret)
+ font->parent_scale_position (x, y);
+ return ret;
+}
static hb_position_t
-hb_font_get_glyph_h_kerning_nil (hb_font_t *font,
+hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
hb_codepoint_t left_glyph,
hb_codepoint_t right_glyph,
void *user_data HB_UNUSED)
{
- if (font->parent)
- return font->parent_scale_x_distance (font->parent->get_glyph_h_kerning (left_glyph, right_glyph));
-
return 0;
}
+static hb_position_t
+hb_font_get_glyph_h_kerning_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t left_glyph,
+ hb_codepoint_t right_glyph,
+ void *user_data HB_UNUSED)
+{
+ return font->parent_scale_x_distance (font->parent->get_glyph_h_kerning (left_glyph, right_glyph));
+}
static hb_position_t
-hb_font_get_glyph_v_kerning_nil (hb_font_t *font,
+hb_font_get_glyph_v_kerning_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
hb_codepoint_t top_glyph,
hb_codepoint_t bottom_glyph,
void *user_data HB_UNUSED)
{
- if (font->parent)
- return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top_glyph, bottom_glyph));
-
return 0;
}
+static hb_position_t
+hb_font_get_glyph_v_kerning_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t top_glyph,
+ hb_codepoint_t bottom_glyph,
+ void *user_data HB_UNUSED)
+{
+ return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top_glyph, bottom_glyph));
+}
static hb_bool_t
-hb_font_get_glyph_extents_nil (hb_font_t *font,
+hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
hb_codepoint_t glyph,
hb_glyph_extents_t *extents,
void *user_data HB_UNUSED)
{
- if (font->parent) {
- hb_bool_t ret = font->parent->get_glyph_extents (glyph, extents);
- if (ret) {
- font->parent_scale_position (&extents->x_bearing, &extents->y_bearing);
- font->parent_scale_distance (&extents->width, &extents->height);
- }
- return ret;
- }
-
memset (extents, 0, sizeof (*extents));
return false;
}
+static hb_bool_t
+hb_font_get_glyph_extents_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ hb_glyph_extents_t *extents,
+ void *user_data HB_UNUSED)
+{
+ hb_bool_t ret = font->parent->get_glyph_extents (glyph, extents);
+ if (ret) {
+ font->parent_scale_position (&extents->x_bearing, &extents->y_bearing);
+ font->parent_scale_distance (&extents->width, &extents->height);
+ }
+ return ret;
+}
static hb_bool_t
-hb_font_get_glyph_contour_point_nil (hb_font_t *font,
+hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
hb_codepoint_t glyph,
unsigned int point_index,
@@ -176,45 +292,63 @@
hb_position_t *y,
void *user_data HB_UNUSED)
{
- if (font->parent) {
- hb_bool_t ret = font->parent->get_glyph_contour_point (glyph, point_index, x, y);
- if (ret)
- font->parent_scale_position (x, y);
- return ret;
- }
-
*x = *y = 0;
return false;
}
+static hb_bool_t
+hb_font_get_glyph_contour_point_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ unsigned int point_index,
+ hb_position_t *x,
+ hb_position_t *y,
+ void *user_data HB_UNUSED)
+{
+ hb_bool_t ret = font->parent->get_glyph_contour_point (glyph, point_index, x, y);
+ if (ret)
+ font->parent_scale_position (x, y);
+ return ret;
+}
static hb_bool_t
-hb_font_get_glyph_name_nil (hb_font_t *font,
+hb_font_get_glyph_name_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
hb_codepoint_t glyph,
char *name, unsigned int size,
void *user_data HB_UNUSED)
{
- if (font->parent)
- return font->parent->get_glyph_name (glyph, name, size);
-
if (size) *name = '\0';
return false;
}
+static hb_bool_t
+hb_font_get_glyph_name_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ char *name, unsigned int size,
+ void *user_data HB_UNUSED)
+{
+ return font->parent->get_glyph_name (glyph, name, size);
+}
static hb_bool_t
-hb_font_get_glyph_from_name_nil (hb_font_t *font,
+hb_font_get_glyph_from_name_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
const char *name, int len, /* -1 means nul-terminated */
hb_codepoint_t *glyph,
void *user_data HB_UNUSED)
{
- if (font->parent)
- return font->parent->get_glyph_from_name (name, len, glyph);
-
*glyph = 0;
return false;
}
-
+static hb_bool_t
+hb_font_get_glyph_from_name_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ const char *name, int len, /* -1 means nul-terminated */
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
+{
+ return font->parent->get_glyph_from_name (name, len, glyph);
+}
static const hb_font_funcs_t _hb_font_funcs_nil = {
HB_OBJECT_HEADER_STATIC,
@@ -222,9 +356,44 @@
true, /* immutable */
{
-#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_nil,
+#define HB_FONT_FUNC_IMPLEMENT(name) NULL,
+ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+ },
+ {
+#define HB_FONT_FUNC_IMPLEMENT(name) NULL,
HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
#undef HB_FONT_FUNC_IMPLEMENT
+ },
+ {
+ {
+#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_nil,
+ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+ }
+ }
+};
+static const hb_font_funcs_t _hb_font_funcs_parent = {
+ HB_OBJECT_HEADER_STATIC,
+
+ true, /* immutable */
+
+ {
+#define HB_FONT_FUNC_IMPLEMENT(name) NULL,
+ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+ },
+ {
+#define HB_FONT_FUNC_IMPLEMENT(name) NULL,
+ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+ },
+ {
+ {
+#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_parent,
+ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+ }
}
};
@@ -246,7 +415,7 @@
if (!(ffuncs = hb_object_create<hb_font_funcs_t> ()))
return hb_font_funcs_get_empty ();
- ffuncs->get = _hb_font_funcs_nil.get;
+ ffuncs->get = _hb_font_funcs_parent.get;
return ffuncs;
}
@@ -263,7 +432,7 @@
hb_font_funcs_t *
hb_font_funcs_get_empty (void)
{
- return const_cast<hb_font_funcs_t *> (&_hb_font_funcs_nil);
+ return const_cast<hb_font_funcs_t *> (&_hb_font_funcs_parent);
}
/**
@@ -398,11 +567,11 @@
ffuncs->destroy.name (ffuncs->user_data.name); \
\
if (func) { \
- ffuncs->get.name = func; \
+ ffuncs->get.f.name = func; \
ffuncs->user_data.name = user_data; \
ffuncs->destroy.name = destroy; \
} else { \
- ffuncs->get.name = hb_font_get_##name##_nil; \
+ ffuncs->get.f.name = hb_font_get_##name##_parent; \
ffuncs->user_data.name = NULL; \
ffuncs->destroy.name = NULL; \
} \
@@ -411,10 +580,53 @@
HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
#undef HB_FONT_FUNC_IMPLEMENT
+bool
+hb_font_t::has_func (unsigned int i)
+{
+ if (parent && parent != hb_font_get_empty () && parent->has_func (i))
+ return true;
+ return this->klass->get.array[i] != _hb_font_funcs_parent.get.array[i];
+}
/* Public getters */
/**
+ * hb_font_get_h_extents:
+ * @font: a font.
+ * @extents: (out):
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 1.1.3
+ **/
+hb_bool_t
+hb_font_get_h_extents (hb_font_t *font,
+ hb_font_extents_t *extents)
+{
+ return font->get_font_h_extents (extents);
+}
+
+/**
+ * hb_font_get_v_extents:
+ * @font: a font.
+ * @extents: (out):
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 1.1.3
+ **/
+hb_bool_t
+hb_font_get_v_extents (hb_font_t *font,
+ hb_font_extents_t *extents)
+{
+ return font->get_font_v_extents (extents);
+}
+
+/**
* hb_font_get_glyph:
* @font: a font.
* @unicode:
@@ -432,7 +644,50 @@
hb_codepoint_t unicode, hb_codepoint_t variation_selector,
hb_codepoint_t *glyph)
{
- return font->get_glyph (unicode, variation_selector, glyph);
+ if (unlikely (variation_selector))
+ return font->get_variation_glyph (unicode, variation_selector, glyph);
+ return font->get_nominal_glyph (unicode, glyph);
+}
+
+/**
+ * hb_font_get_nominal_glyph:
+ * @font: a font.
+ * @unicode:
+ * @glyph: (out):
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 1.2.3
+ **/
+hb_bool_t
+hb_font_get_nominal_glyph (hb_font_t *font,
+ hb_codepoint_t unicode,
+ hb_codepoint_t *glyph)
+{
+ return font->get_nominal_glyph (unicode, glyph);
+}
+
+/**
+ * hb_font_get_variation_glyph:
+ * @font: a font.
+ * @unicode:
+ * @variation_selector:
+ * @glyph: (out):
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 1.2.3
+ **/
+hb_bool_t
+hb_font_get_variation_glyph (hb_font_t *font,
+ hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph)
+{
+ return font->get_variation_glyph (unicode, variation_selector, glyph);
}
/**
@@ -639,6 +894,23 @@
/* A bit higher-level, and with fallback */
/**
+ * hb_font_get_extents_for_direction:
+ * @font: a font.
+ * @direction:
+ * @extents:
+ *
+ *
+ *
+ * Since: 1.1.3
+ **/
+void
+hb_font_get_extents_for_direction (hb_font_t *font,
+ hb_direction_t direction,
+ hb_font_extents_t *extents)
+{
+ return font->get_extents_for_direction (direction, extents);
+}
+/**
* hb_font_get_glyph_advance_for_direction:
* @font: a font.
* @glyph:
@@ -858,6 +1130,7 @@
return hb_font_get_empty ();
hb_face_make_immutable (face);
+ font->parent = hb_font_get_empty ();
font->face = hb_face_reference (face);
font->klass = hb_font_funcs_get_empty ();
@@ -917,8 +1190,8 @@
NULL, /* parent */
const_cast<hb_face_t *> (&_hb_face_nil),
- 0, /* x_scale */
- 0, /* y_scale */
+ 1000, /* x_scale */
+ 1000, /* y_scale */
0, /* x_ppem */
0, /* y_ppem */
@@ -1264,3 +1537,131 @@
if (x_ppem) *x_ppem = font->x_ppem;
if (y_ppem) *y_ppem = font->y_ppem;
}
+
+
+#ifndef HB_DISABLE_DEPRECATED
+
+/*
+ * Deprecated get_glyph_func():
+ */
+
+struct hb_trampoline_closure_t
+{
+ void *user_data;
+ hb_destroy_func_t destroy;
+ unsigned int ref_count;
+};
+
+template <typename FuncType>
+struct hb_trampoline_t
+{
+ hb_trampoline_closure_t closure; /* Must be first. */
+ FuncType func;
+};
+
+template <typename FuncType>
+static hb_trampoline_t<FuncType> *
+trampoline_create (FuncType func,
+ void *user_data,
+ hb_destroy_func_t destroy)
+{
+ typedef hb_trampoline_t<FuncType> trampoline_t;
+
+ trampoline_t *trampoline = (trampoline_t *) calloc (1, sizeof (trampoline_t));
+
+ if (unlikely (!trampoline))
+ return NULL;
+
+ trampoline->closure.user_data = user_data;
+ trampoline->closure.destroy = destroy;
+ trampoline->closure.ref_count = 1;
+ trampoline->func = func;
+
+ return trampoline;
+}
+
+static void
+trampoline_reference (hb_trampoline_closure_t *closure)
+{
+ closure->ref_count++;
+}
+
+static void
+trampoline_destroy (void *user_data)
+{
+ hb_trampoline_closure_t *closure = (hb_trampoline_closure_t *) user_data;
+
+ if (--closure->ref_count)
+ return;
+
+ if (closure->destroy)
+ closure->destroy (closure->user_data);
+ free (closure);
+}
+
+typedef hb_trampoline_t<hb_font_get_glyph_func_t> hb_font_get_glyph_trampoline_t;
+
+static hb_bool_t
+hb_font_get_nominal_glyph_trampoline (hb_font_t *font,
+ void *font_data,
+ hb_codepoint_t unicode,
+ hb_codepoint_t *glyph,
+ void *user_data)
+{
+ hb_font_get_glyph_trampoline_t *trampoline = (hb_font_get_glyph_trampoline_t *) user_data;
+ return trampoline->func (font, font_data, unicode, 0, glyph, trampoline->closure.user_data);
+}
+
+static hb_bool_t
+hb_font_get_variation_glyph_trampoline (hb_font_t *font,
+ void *font_data,
+ hb_codepoint_t unicode,
+ hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph,
+ void *user_data)
+{
+ hb_font_get_glyph_trampoline_t *trampoline = (hb_font_get_glyph_trampoline_t *) user_data;
+ return trampoline->func (font, font_data, unicode, variation_selector, glyph, trampoline->closure.user_data);
+}
+
+/**
+ * hb_font_funcs_set_glyph_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * Deprecated. Use hb_font_funcs_set_nominal_glyph_func() and
+ * hb_font_funcs_set_variation_glyph_func() instead.
+ *
+ * Since: 0.9.2
+ * Deprecated: 1.2.3
+ **/
+void
+hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
+ hb_font_get_glyph_func_t func,
+ void *user_data, hb_destroy_func_t destroy)
+{
+ hb_font_get_glyph_trampoline_t *trampoline;
+
+ trampoline = trampoline_create (func, user_data, destroy);
+ if (unlikely (!trampoline))
+ {
+ if (destroy)
+ destroy (user_data);
+ return;
+ }
+
+ hb_font_funcs_set_nominal_glyph_func (ffuncs,
+ hb_font_get_nominal_glyph_trampoline,
+ trampoline,
+ trampoline_destroy);
+
+ trampoline_reference (&trampoline->closure);
+ hb_font_funcs_set_variation_glyph_func (ffuncs,
+ hb_font_get_variation_glyph_trampoline,
+ trampoline,
+ trampoline_destroy);
+}
+
+#endif /* HB_DISABLE_DEPRECATED */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.h Fri Aug 26 10:14:15 2016 -0700
@@ -46,19 +46,19 @@
typedef struct hb_font_funcs_t hb_font_funcs_t;
-hb_font_funcs_t *
+HB_EXTERN hb_font_funcs_t *
hb_font_funcs_create (void);
-hb_font_funcs_t *
+HB_EXTERN hb_font_funcs_t *
hb_font_funcs_get_empty (void);
-hb_font_funcs_t *
+HB_EXTERN hb_font_funcs_t *
hb_font_funcs_reference (hb_font_funcs_t *ffuncs);
-void
+HB_EXTERN void
hb_font_funcs_destroy (hb_font_funcs_t *ffuncs);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_funcs_set_user_data (hb_font_funcs_t *ffuncs,
hb_user_data_key_t *key,
void * data,
@@ -66,19 +66,37 @@
hb_bool_t replace);
-void *
+HB_EXTERN void *
hb_font_funcs_get_user_data (hb_font_funcs_t *ffuncs,
hb_user_data_key_t *key);
-void
+HB_EXTERN void
hb_font_funcs_make_immutable (hb_font_funcs_t *ffuncs);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_funcs_is_immutable (hb_font_funcs_t *ffuncs);
-/* glyph extents */
+/* font and glyph extents */
+
+/* Note that typically ascender is positive and descender negative in coordinate systems that grow up. */
+typedef struct hb_font_extents_t
+{
+ hb_position_t ascender; /* typographic ascender. */
+ hb_position_t descender; /* typographic descender. */
+ hb_position_t line_gap; /* suggested line spacing gap. */
+ /*< private >*/
+ hb_position_t reserved9;
+ hb_position_t reserved8;
+ hb_position_t reserved7;
+ hb_position_t reserved6;
+ hb_position_t reserved5;
+ hb_position_t reserved4;
+ hb_position_t reserved3;
+ hb_position_t reserved2;
+ hb_position_t reserved1;
+} hb_font_extents_t;
/* Note that height is negative in coordinate systems that grow up. */
typedef struct hb_glyph_extents_t
@@ -89,13 +107,23 @@
hb_position_t height; /* distance from top to bottom side. */
} hb_glyph_extents_t;
-
/* func types */
-typedef hb_bool_t (*hb_font_get_glyph_func_t) (hb_font_t *font, void *font_data,
- hb_codepoint_t unicode, hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph,
- void *user_data);
+typedef hb_bool_t (*hb_font_get_font_extents_func_t) (hb_font_t *font, void *font_data,
+ hb_font_extents_t *metrics,
+ void *user_data);
+typedef hb_font_get_font_extents_func_t hb_font_get_font_h_extents_func_t;
+typedef hb_font_get_font_extents_func_t hb_font_get_font_v_extents_func_t;
+
+
+typedef hb_bool_t (*hb_font_get_nominal_glyph_func_t) (hb_font_t *font, void *font_data,
+ hb_codepoint_t unicode,
+ hb_codepoint_t *glyph,
+ void *user_data);
+typedef hb_bool_t (*hb_font_get_variation_glyph_func_t) (hb_font_t *font, void *font_data,
+ hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph,
+ void *user_data);
typedef hb_position_t (*hb_font_get_glyph_advance_func_t) (hb_font_t *font, void *font_data,
@@ -141,7 +169,23 @@
/* func setters */
/**
- * hb_font_funcs_set_glyph_func:
+ * hb_font_funcs_set_font_h_extents_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Since: 1.1.2
+ **/
+HB_EXTERN void
+hb_font_funcs_set_font_h_extents_func (hb_font_funcs_t *ffuncs,
+ hb_font_get_font_h_extents_func_t func,
+ void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_font_v_extents_func:
* @ffuncs: font functions.
* @func: (closure user_data) (destroy destroy) (scope notified):
* @user_data:
@@ -149,12 +193,44 @@
*
*
*
- * Since: 0.9.2
+ * Since: 1.1.2
+ **/
+HB_EXTERN void
+hb_font_funcs_set_font_v_extents_func (hb_font_funcs_t *ffuncs,
+ hb_font_get_font_v_extents_func_t func,
+ void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_nominal_glyph_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Since: 1.2.3
**/
-void
-hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
- hb_font_get_glyph_func_t func,
- void *user_data, hb_destroy_func_t destroy);
+HB_EXTERN void
+hb_font_funcs_set_nominal_glyph_func (hb_font_funcs_t *ffuncs,
+ hb_font_get_nominal_glyph_func_t func,
+ void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_variation_glyph_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Since: 1.2.3
+ **/
+HB_EXTERN void
+hb_font_funcs_set_variation_glyph_func (hb_font_funcs_t *ffuncs,
+ hb_font_get_variation_glyph_func_t func,
+ void *user_data, hb_destroy_func_t destroy);
/**
* hb_font_funcs_set_glyph_h_advance_func:
@@ -167,7 +243,7 @@
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_font_funcs_set_glyph_h_advance_func (hb_font_funcs_t *ffuncs,
hb_font_get_glyph_h_advance_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -183,7 +259,7 @@
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_font_funcs_set_glyph_v_advance_func (hb_font_funcs_t *ffuncs,
hb_font_get_glyph_v_advance_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -199,7 +275,7 @@
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_font_funcs_set_glyph_h_origin_func (hb_font_funcs_t *ffuncs,
hb_font_get_glyph_h_origin_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -215,7 +291,7 @@
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_font_funcs_set_glyph_v_origin_func (hb_font_funcs_t *ffuncs,
hb_font_get_glyph_v_origin_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -231,7 +307,7 @@
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_font_funcs_set_glyph_h_kerning_func (hb_font_funcs_t *ffuncs,
hb_font_get_glyph_h_kerning_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -247,7 +323,7 @@
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_font_funcs_set_glyph_v_kerning_func (hb_font_funcs_t *ffuncs,
hb_font_get_glyph_v_kerning_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -263,7 +339,7 @@
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_font_funcs_set_glyph_extents_func (hb_font_funcs_t *ffuncs,
hb_font_get_glyph_extents_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -279,7 +355,7 @@
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_font_funcs_set_glyph_contour_point_func (hb_font_funcs_t *ffuncs,
hb_font_get_glyph_contour_point_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -295,7 +371,7 @@
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_font_funcs_set_glyph_name_func (hb_font_funcs_t *ffuncs,
hb_font_get_glyph_name_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -311,57 +387,67 @@
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_font_funcs_set_glyph_from_name_func (hb_font_funcs_t *ffuncs,
hb_font_get_glyph_from_name_func_t func,
void *user_data, hb_destroy_func_t destroy);
-
/* func dispatch */
-hb_bool_t
-hb_font_get_glyph (hb_font_t *font,
- hb_codepoint_t unicode, hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph);
+HB_EXTERN hb_bool_t
+hb_font_get_h_extents (hb_font_t *font,
+ hb_font_extents_t *extents);
+HB_EXTERN hb_bool_t
+hb_font_get_v_extents (hb_font_t *font,
+ hb_font_extents_t *extents);
-hb_position_t
+HB_EXTERN hb_bool_t
+hb_font_get_nominal_glyph (hb_font_t *font,
+ hb_codepoint_t unicode,
+ hb_codepoint_t *glyph);
+HB_EXTERN hb_bool_t
+hb_font_get_variation_glyph (hb_font_t *font,
+ hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph);
+
+HB_EXTERN hb_position_t
hb_font_get_glyph_h_advance (hb_font_t *font,
hb_codepoint_t glyph);
-hb_position_t
+HB_EXTERN hb_position_t
hb_font_get_glyph_v_advance (hb_font_t *font,
hb_codepoint_t glyph);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_get_glyph_h_origin (hb_font_t *font,
hb_codepoint_t glyph,
hb_position_t *x, hb_position_t *y);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_get_glyph_v_origin (hb_font_t *font,
hb_codepoint_t glyph,
hb_position_t *x, hb_position_t *y);
-hb_position_t
+HB_EXTERN hb_position_t
hb_font_get_glyph_h_kerning (hb_font_t *font,
hb_codepoint_t left_glyph, hb_codepoint_t right_glyph);
-hb_position_t
+HB_EXTERN hb_position_t
hb_font_get_glyph_v_kerning (hb_font_t *font,
hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_get_glyph_extents (hb_font_t *font,
hb_codepoint_t glyph,
hb_glyph_extents_t *extents);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_get_glyph_contour_point (hb_font_t *font,
hb_codepoint_t glyph, unsigned int point_index,
hb_position_t *x, hb_position_t *y);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_get_glyph_name (hb_font_t *font,
hb_codepoint_t glyph,
char *name, unsigned int size);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_get_glyph_from_name (hb_font_t *font,
const char *name, int len, /* -1 means nul-terminated */
hb_codepoint_t *glyph);
@@ -369,52 +455,63 @@
/* high-level funcs, with fallback */
-void
+/* Calls either hb_font_get_nominal_glyph() if variation_selector is 0,
+ * otherwise callse hb_font_get_variation_glyph(). */
+HB_EXTERN hb_bool_t
+hb_font_get_glyph (hb_font_t *font,
+ hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph);
+
+HB_EXTERN void
+hb_font_get_extents_for_direction (hb_font_t *font,
+ hb_direction_t direction,
+ hb_font_extents_t *extents);
+HB_EXTERN void
hb_font_get_glyph_advance_for_direction (hb_font_t *font,
hb_codepoint_t glyph,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y);
-void
+HB_EXTERN void
hb_font_get_glyph_origin_for_direction (hb_font_t *font,
hb_codepoint_t glyph,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y);
-void
+HB_EXTERN void
hb_font_add_glyph_origin_for_direction (hb_font_t *font,
hb_codepoint_t glyph,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y);
-void
+HB_EXTERN void
hb_font_subtract_glyph_origin_for_direction (hb_font_t *font,
hb_codepoint_t glyph,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y);
-void
+HB_EXTERN void
hb_font_get_glyph_kerning_for_direction (hb_font_t *font,
hb_codepoint_t first_glyph, hb_codepoint_t second_glyph,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_get_glyph_extents_for_origin (hb_font_t *font,
hb_codepoint_t glyph,
hb_direction_t direction,
hb_glyph_extents_t *extents);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_get_glyph_contour_point_for_origin (hb_font_t *font,
hb_codepoint_t glyph, unsigned int point_index,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y);
/* Generates gidDDD if glyph has no name. */
-void
+HB_EXTERN void
hb_font_glyph_to_string (hb_font_t *font,
hb_codepoint_t glyph,
char *s, unsigned int size);
/* Parses gidDDD and uniUUUU strings automatically. */
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_glyph_from_string (hb_font_t *font,
const char *s, int len, /* -1 means nul-terminated */
hb_codepoint_t *glyph);
@@ -426,22 +523,22 @@
/* Fonts are very light-weight objects */
-hb_font_t *
+HB_EXTERN hb_font_t *
hb_font_create (hb_face_t *face);
-hb_font_t *
+HB_EXTERN hb_font_t *
hb_font_create_sub_font (hb_font_t *parent);
-hb_font_t *
+HB_EXTERN hb_font_t *
hb_font_get_empty (void);
-hb_font_t *
+HB_EXTERN hb_font_t *
hb_font_reference (hb_font_t *font);
-void
+HB_EXTERN void
hb_font_destroy (hb_font_t *font);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_set_user_data (hb_font_t *font,
hb_user_data_key_t *key,
void * data,
@@ -449,46 +546,46 @@
hb_bool_t replace);
-void *
+HB_EXTERN void *
hb_font_get_user_data (hb_font_t *font,
hb_user_data_key_t *key);
-void
+HB_EXTERN void
hb_font_make_immutable (hb_font_t *font);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_is_immutable (hb_font_t *font);
-void
+HB_EXTERN void
hb_font_set_parent (hb_font_t *font,
hb_font_t *parent);
-hb_font_t *
+HB_EXTERN hb_font_t *
hb_font_get_parent (hb_font_t *font);
-hb_face_t *
+HB_EXTERN hb_face_t *
hb_font_get_face (hb_font_t *font);
-void
+HB_EXTERN void
hb_font_set_funcs (hb_font_t *font,
hb_font_funcs_t *klass,
void *font_data,
hb_destroy_func_t destroy);
/* Be *very* careful with this function! */
-void
+HB_EXTERN void
hb_font_set_funcs_data (hb_font_t *font,
void *font_data,
hb_destroy_func_t destroy);
-void
+HB_EXTERN void
hb_font_set_scale (hb_font_t *font,
int x_scale,
int y_scale);
-void
+HB_EXTERN void
hb_font_get_scale (hb_font_t *font,
int *x_scale,
int *y_scale);
@@ -496,12 +593,12 @@
/*
* A zero value means "no hinting in that direction"
*/
-void
+HB_EXTERN void
hb_font_set_ppem (hb_font_t *font,
unsigned int x_ppem,
unsigned int y_ppem);
-void
+HB_EXTERN void
hb_font_get_ppem (hb_font_t *font,
unsigned int *x_ppem,
unsigned int *y_ppem);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.cc Fri Aug 26 10:14:15 2016 -0700
@@ -70,11 +70,12 @@
{
FT_Face ft_face;
int load_flags;
+ bool symbol; /* Whether selected cmap is symbol cmap. */
bool unref; /* Whether to destroy ft_face when done. */
};
static hb_ft_font_t *
-_hb_ft_font_create (FT_Face ft_face, bool unref)
+_hb_ft_font_create (FT_Face ft_face, bool symbol, bool unref)
{
hb_ft_font_t *ft_font = (hb_ft_font_t *) calloc (1, sizeof (hb_ft_font_t));
@@ -82,6 +83,7 @@
return NULL;
ft_font->ft_face = ft_face;
+ ft_font->symbol = symbol;
ft_font->unref = unref;
ft_font->load_flags = FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING;
@@ -90,10 +92,16 @@
}
static void
+_hb_ft_face_destroy (FT_Face ft_face)
+{
+ FT_Done_Face (ft_face);
+}
+
+static void
_hb_ft_font_destroy (hb_ft_font_t *ft_font)
{
if (ft_font->unref)
- FT_Done_Face (ft_font->ft_face);
+ _hb_ft_face_destroy (ft_font->ft_face);
free (ft_font);
}
@@ -155,21 +163,46 @@
static hb_bool_t
-hb_ft_get_glyph (hb_font_t *font HB_UNUSED,
- void *font_data,
- hb_codepoint_t unicode,
- hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph,
- void *user_data HB_UNUSED)
-
+hb_ft_get_nominal_glyph (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ hb_codepoint_t unicode,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
{
const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
- unsigned int g;
+ unsigned int g = FT_Get_Char_Index (ft_font->ft_face, unicode);
- if (likely (!variation_selector))
- g = FT_Get_Char_Index (ft_font->ft_face, unicode);
- else
- g = FT_Face_GetCharVariantIndex (ft_font->ft_face, unicode, variation_selector);
+ if (unlikely (!g))
+ {
+ if (unlikely (ft_font->symbol) && unicode <= 0x00FFu)
+ {
+ /* For symbol-encoded OpenType fonts, we duplicate the
+ * U+F000..F0FF range at U+0000..U+00FF. That's what
+ * Windows seems to do, and that's hinted about at:
+ * http://www.microsoft.com/typography/otspec/recom.htm
+ * under "Non-Standard (Symbol) Fonts". */
+ g = FT_Get_Char_Index (ft_font->ft_face, 0xF000u + unicode);
+ if (!g)
+ return false;
+ }
+ else
+ return false;
+ }
+
+ *glyph = g;
+ return true;
+}
+
+static hb_bool_t
+hb_ft_get_variation_glyph (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ hb_codepoint_t unicode,
+ hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
+{
+ const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+ unsigned int g = FT_Face_GetCharVariantIndex (ft_font->ft_face, unicode, variation_selector);
if (unlikely (!g))
return false;
@@ -217,18 +250,6 @@
}
static hb_bool_t
-hb_ft_get_glyph_h_origin (hb_font_t *font HB_UNUSED,
- void *font_data HB_UNUSED,
- hb_codepoint_t glyph HB_UNUSED,
- hb_position_t *x HB_UNUSED,
- hb_position_t *y HB_UNUSED,
- void *user_data HB_UNUSED)
-{
- /* We always work in the horizontal coordinates. */
- return true;
-}
-
-static hb_bool_t
hb_ft_get_glyph_v_origin (hb_font_t *font HB_UNUSED,
void *font_data,
hb_codepoint_t glyph,
@@ -272,17 +293,6 @@
return kerningv.x;
}
-static hb_position_t
-hb_ft_get_glyph_v_kerning (hb_font_t *font HB_UNUSED,
- void *font_data HB_UNUSED,
- hb_codepoint_t top_glyph HB_UNUSED,
- hb_codepoint_t bottom_glyph HB_UNUSED,
- void *user_data HB_UNUSED)
-{
- /* FreeType API doesn't support vertical kerning */
- return 0;
-}
-
static hb_bool_t
hb_ft_get_glyph_extents (hb_font_t *font HB_UNUSED,
void *font_data,
@@ -300,6 +310,16 @@
extents->y_bearing = ft_face->glyph->metrics.horiBearingY;
extents->width = ft_face->glyph->metrics.width;
extents->height = -ft_face->glyph->metrics.height;
+ if (font->x_scale < 0)
+ {
+ extents->x_bearing = -extents->x_bearing;
+ extents->width = -extents->width;
+ }
+ if (font->y_scale < 0)
+ {
+ extents->y_bearing = -extents->y_bearing;
+ extents->height = -extents->height;
+ }
return true;
}
@@ -379,25 +399,78 @@
return *glyph != 0;
}
+static hb_bool_t
+hb_ft_get_font_h_extents (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ hb_font_extents_t *metrics,
+ void *user_data HB_UNUSED)
+{
+ const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+ FT_Face ft_face = ft_font->ft_face;
+ metrics->ascender = ft_face->size->metrics.ascender;
+ metrics->descender = ft_face->size->metrics.descender;
+ metrics->line_gap = ft_face->size->metrics.height - (ft_face->size->metrics.ascender - ft_face->size->metrics.descender);
+ if (font->y_scale < 0)
+ {
+ metrics->ascender = -metrics->ascender;
+ metrics->descender = -metrics->descender;
+ metrics->line_gap = -metrics->line_gap;
+ }
+ return true;
+}
+
+static hb_font_funcs_t *static_ft_funcs = NULL;
+
+#ifdef HB_USE_ATEXIT
+static
+void free_static_ft_funcs (void)
+{
+ hb_font_funcs_destroy (static_ft_funcs);
+}
+#endif
static void
_hb_ft_font_set_funcs (hb_font_t *font, FT_Face ft_face, bool unref)
{
- static const hb_font_funcs_t ft_ffuncs = {
- HB_OBJECT_HEADER_STATIC,
+retry:
+ hb_font_funcs_t *funcs = (hb_font_funcs_t *) hb_atomic_ptr_get (&static_ft_funcs);
- true, /* immutable */
+ if (unlikely (!funcs))
+ {
+ funcs = hb_font_funcs_create ();
- {
-#define HB_FONT_FUNC_IMPLEMENT(name) hb_ft_get_##name,
- HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
-#undef HB_FONT_FUNC_IMPLEMENT
+ hb_font_funcs_set_font_h_extents_func (funcs, hb_ft_get_font_h_extents, NULL, NULL);
+ //hb_font_funcs_set_font_v_extents_func (funcs, hb_ft_get_font_v_extents, NULL, NULL);
+ hb_font_funcs_set_nominal_glyph_func (funcs, hb_ft_get_nominal_glyph, NULL, NULL);
+ hb_font_funcs_set_variation_glyph_func (funcs, hb_ft_get_variation_glyph, NULL, NULL);
+ hb_font_funcs_set_glyph_h_advance_func (funcs, hb_ft_get_glyph_h_advance, NULL, NULL);
+ hb_font_funcs_set_glyph_v_advance_func (funcs, hb_ft_get_glyph_v_advance, NULL, NULL);
+ //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ft_get_glyph_h_origin, NULL, NULL);
+ hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ft_get_glyph_v_origin, NULL, NULL);
+ hb_font_funcs_set_glyph_h_kerning_func (funcs, hb_ft_get_glyph_h_kerning, NULL, NULL);
+ //hb_font_funcs_set_glyph_v_kerning_func (funcs, hb_ft_get_glyph_v_kerning, NULL, NULL);
+ hb_font_funcs_set_glyph_extents_func (funcs, hb_ft_get_glyph_extents, NULL, NULL);
+ hb_font_funcs_set_glyph_contour_point_func (funcs, hb_ft_get_glyph_contour_point, NULL, NULL);
+ hb_font_funcs_set_glyph_name_func (funcs, hb_ft_get_glyph_name, NULL, NULL);
+ hb_font_funcs_set_glyph_from_name_func (funcs, hb_ft_get_glyph_from_name, NULL, NULL);
+
+ hb_font_funcs_make_immutable (funcs);
+
+ if (!hb_atomic_ptr_cmpexch (&static_ft_funcs, NULL, funcs)) {
+ hb_font_funcs_destroy (funcs);
+ goto retry;
}
+
+#ifdef HB_USE_ATEXIT
+ atexit (free_static_ft_funcs); /* First person registers atexit() callback. */
+#endif
};
+ bool symbol = ft_face->charmap && ft_face->charmap->encoding == FT_ENCODING_MS_SYMBOL;
+
hb_font_set_funcs (font,
- const_cast<hb_font_funcs_t *> (&ft_ffuncs),
- _hb_ft_font_create (ft_face, unref),
+ funcs,
+ _hb_ft_font_create (ft_face, symbol, unref),
(hb_destroy_func_t) _hb_ft_font_destroy);
}
@@ -477,7 +550,7 @@
hb_ft_face_create_referenced (FT_Face ft_face)
{
FT_Reference_Face (ft_face);
- return hb_ft_face_create (ft_face, (hb_destroy_func_t) FT_Done_Face);
+ return hb_ft_face_create (ft_face, (hb_destroy_func_t) _hb_ft_face_destroy);
}
static void
@@ -557,7 +630,7 @@
hb_ft_font_create_referenced (FT_Face ft_face)
{
FT_Reference_Face (ft_face);
- return hb_ft_font_create (ft_face, (hb_destroy_func_t) FT_Done_Face);
+ return hb_ft_font_create (ft_face, (hb_destroy_func_t) _hb_ft_face_destroy);
}
@@ -626,7 +699,8 @@
return;
}
- FT_Select_Charmap (ft_face, FT_ENCODING_UNICODE);
+ if (FT_Select_Charmap (ft_face, FT_ENCODING_UNICODE))
+ FT_Select_Charmap (ft_face, FT_ENCODING_MS_SYMBOL);
FT_Set_Char_Size (ft_face,
abs (font->x_scale), abs (font->y_scale),
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.h Fri Aug 26 10:14:15 2016 -0700
@@ -59,7 +59,7 @@
* probably should use (the more recent) hb_ft_face_create_referenced()
* instead.
*/
-hb_face_t *
+HB_EXTERN hb_face_t *
hb_ft_face_create (FT_Face ft_face,
hb_destroy_func_t destroy);
@@ -71,7 +71,7 @@
* Client is still responsible for making sure that ft-face is destroyed
* after hb-face is.
*/
-hb_face_t *
+HB_EXTERN hb_face_t *
hb_ft_face_create_cached (FT_Face ft_face);
/* This version is like hb_ft_face_create(), except that it calls
@@ -81,7 +81,7 @@
* This is the most convenient version to use. Use it unless you have
* very good reasons not to.
*/
-hb_face_t *
+HB_EXTERN hb_face_t *
hb_ft_face_create_referenced (FT_Face ft_face);
@@ -98,26 +98,26 @@
/* See notes on hb_ft_face_create(). Same issues re lifecycle-management
* apply here. Use hb_ft_font_create_referenced() if you can. */
-hb_font_t *
+HB_EXTERN hb_font_t *
hb_ft_font_create (FT_Face ft_face,
hb_destroy_func_t destroy);
/* See notes on hb_ft_face_create_referenced() re lifecycle-management
* issues. */
-hb_font_t *
+HB_EXTERN hb_font_t *
hb_ft_font_create_referenced (FT_Face ft_face);
-FT_Face
+HB_EXTERN FT_Face
hb_ft_font_get_face (hb_font_t *font);
-void
+HB_EXTERN void
hb_ft_font_set_load_flags (hb_font_t *font, int load_flags);
-int
+HB_EXTERN int
hb_ft_font_get_load_flags (hb_font_t *font);
/* Makes an hb_font_t use FreeType internally to implement font functions. */
-void
+HB_EXTERN void
hb_ft_font_set_funcs (hb_font_t *font);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-file-private.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-file-private.hh Fri Aug 26 10:14:15 2016 -0700
@@ -140,7 +140,7 @@
protected:
Tag ttcTag; /* TrueType Collection ID string: 'ttcf' */
- FixedVersion version; /* Version of the TTC Header (1.0),
+ FixedVersion<>version; /* Version of the TTC Header (1.0),
* 0x00010000u */
ArrayOf<OffsetTo<OffsetTable, ULONG>, ULONG>
table; /* Array of offsets to the OffsetTable for each font
@@ -187,7 +187,7 @@
union {
struct {
Tag ttcTag; /* TrueType Collection ID string: 'ttcf' */
- FixedVersion version; /* Version of the TTC Header (1.0 or 2.0),
+ FixedVersion<>version; /* Version of the TTC Header (1.0 or 2.0),
* 0x00010000u or 0x00020000u */
} header;
TTCHeaderVersion1 version1;
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-type-private.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-type-private.hh Fri Aug 26 10:14:15 2016 -0700
@@ -101,10 +101,8 @@
#define DEFINE_SIZE_STATIC(size) \
DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size)); \
static const unsigned int static_size = (size); \
- static const unsigned int min_size = (size)
-
-/* Size signifying variable-sized array */
-#define VAR 1
+ static const unsigned int min_size = (size); \
+ inline unsigned int get_size (void) const { return (size); }
#define DEFINE_SIZE_UNION(size, _member) \
DEFINE_INSTANCE_ASSERTION (this->u._member.static_size == (size)); \
@@ -185,7 +183,7 @@
/* This limits sanitizing time on really broken fonts. */
#ifndef HB_SANITIZE_MAX_EDITS
-#define HB_SANITIZE_MAX_EDITS 100
+#define HB_SANITIZE_MAX_EDITS 32
#endif
struct hb_sanitize_context_t :
@@ -399,9 +397,9 @@
struct hb_serialize_context_t
{
- inline hb_serialize_context_t (void *start, unsigned int size)
+ inline hb_serialize_context_t (void *start_, unsigned int size)
{
- this->start = (char *) start;
+ this->start = (char *) start_;
this->end = this->start + size;
this->ran_out_of_room = false;
@@ -495,10 +493,10 @@
return reinterpret_cast<Type *> (&obj);
}
- inline void truncate (void *head)
+ inline void truncate (void *new_head)
{
- assert (this->start < head && head <= this->head);
- this->head = (char *) head;
+ assert (this->start < new_head && new_head <= this->head);
+ this->head = (char *) new_head;
}
unsigned int debug_depth;
@@ -665,6 +663,24 @@
/* 16-bit unsigned integer (USHORT) that describes a quantity in FUnits. */
typedef USHORT UFWORD;
+/* 16-bit signed fixed number with the low 14 bits of fraction (2.14). */
+struct F2DOT14 : SHORT
+{
+ //inline float to_float (void) const { return ???; }
+ //inline void set_float (float f) { v.set (f * ???); }
+ public:
+ DEFINE_SIZE_STATIC (2);
+};
+
+/* 32-bit signed fixed-point number (16.16). */
+struct Fixed: LONG
+{
+ //inline float to_float (void) const { return ???; }
+ //inline void set_float (float f) { v.set (f * ???); }
+ public:
+ DEFINE_SIZE_STATIC (4);
+};
+
/* Date represented in number of seconds since 12:00 midnight, January 1,
* 1904. The value is represented as a signed 64-bit integer. */
struct LONGDATETIME
@@ -742,9 +758,10 @@
* Version Numbers
*/
+template <typename FixedType=USHORT>
struct FixedVersion
{
- inline uint32_t to_int (void) const { return (major << 16) + minor; }
+ inline uint32_t to_int (void) const { return (major << (sizeof(FixedType) * 8)) + minor; }
inline bool sanitize (hb_sanitize_context_t *c) const
{
@@ -752,10 +769,10 @@
return_trace (c->check_struct (this));
}
- USHORT major;
- USHORT minor;
+ FixedType major;
+ FixedType minor;
public:
- DEFINE_SIZE_STATIC (4);
+ DEFINE_SIZE_STATIC (2 * sizeof(FixedType));
};
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-cmap-table.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-cmap-table.hh Fri Aug 26 10:14:15 2016 -0700
@@ -69,61 +69,78 @@
struct CmapSubtableFormat4
{
- inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
+ struct accelerator_t
{
- unsigned int segCount;
+ inline void init (const CmapSubtableFormat4 *subtable)
+ {
+ segCount = subtable->segCountX2 / 2;
+ endCount = subtable->values;
+ startCount = endCount + segCount + 1;
+ idDelta = startCount + segCount;
+ idRangeOffset = idDelta + segCount;
+ glyphIdArray = idRangeOffset + segCount;
+ glyphIdArrayLength = (subtable->length - 16 - 8 * segCount) / 2;
+ }
+
+ static inline bool get_glyph_func (const void *obj, hb_codepoint_t codepoint, hb_codepoint_t *glyph)
+ {
+ const accelerator_t *thiz = (const accelerator_t *) obj;
+
+ /* Custom two-array bsearch. */
+ int min = 0, max = (int) thiz->segCount - 1;
+ const USHORT *startCount = thiz->startCount;
+ const USHORT *endCount = thiz->endCount;
+ unsigned int i;
+ while (min <= max)
+ {
+ int mid = (min + max) / 2;
+ if (codepoint < startCount[mid])
+ max = mid - 1;
+ else if (codepoint > endCount[mid])
+ min = mid + 1;
+ else
+ {
+ i = mid;
+ goto found;
+ }
+ }
+ return false;
+
+ found:
+ hb_codepoint_t gid;
+ unsigned int rangeOffset = thiz->idRangeOffset[i];
+ if (rangeOffset == 0)
+ gid = codepoint + thiz->idDelta[i];
+ else
+ {
+ /* Somebody has been smoking... */
+ unsigned int index = rangeOffset / 2 + (codepoint - thiz->startCount[i]) + i - thiz->segCount;
+ if (unlikely (index >= thiz->glyphIdArrayLength))
+ return false;
+ gid = thiz->glyphIdArray[index];
+ if (unlikely (!gid))
+ return false;
+ gid += thiz->idDelta[i];
+ }
+
+ *glyph = gid & 0xFFFFu;
+ return true;
+ }
+
const USHORT *endCount;
const USHORT *startCount;
const USHORT *idDelta;
const USHORT *idRangeOffset;
const USHORT *glyphIdArray;
+ unsigned int segCount;
unsigned int glyphIdArrayLength;
-
- segCount = this->segCountX2 / 2;
- endCount = this->values;
- startCount = endCount + segCount + 1;
- idDelta = startCount + segCount;
- idRangeOffset = idDelta + segCount;
- glyphIdArray = idRangeOffset + segCount;
- glyphIdArrayLength = (this->length - 16 - 8 * segCount) / 2;
+ };
- /* Custom two-array bsearch. */
- int min = 0, max = (int) segCount - 1;
- unsigned int i;
- while (min <= max)
- {
- int mid = (min + max) / 2;
- if (codepoint < startCount[mid])
- max = mid - 1;
- else if (codepoint > endCount[mid])
- min = mid + 1;
- else
- {
- i = mid;
- goto found;
- }
- }
- return false;
-
- found:
- hb_codepoint_t gid;
- unsigned int rangeOffset = idRangeOffset[i];
- if (rangeOffset == 0)
- gid = codepoint + idDelta[i];
- else
- {
- /* Somebody has been smoking... */
- unsigned int index = rangeOffset / 2 + (codepoint - startCount[i]) + i - segCount;
- if (unlikely (index >= glyphIdArrayLength))
- return false;
- gid = glyphIdArray[index];
- if (unlikely (!gid))
- return false;
- gid += idDelta[i];
- }
-
- *glyph = gid & 0xFFFFu;
- return true;
+ inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
+ {
+ accelerator_t accel;
+ accel.init (this);
+ return accel.get_glyph_func (&accel, codepoint, glyph);
}
inline bool sanitize (hb_sanitize_context_t *c) const
@@ -388,7 +405,7 @@
}
protected:
- USHORT format; /* Format number is set to 0. */
+ USHORT format; /* Format number is set to 14. */
ULONG lengthZ; /* Byte length of this subtable. */
SortedArrayOf<VariationSelectorRecord, ULONG>
record; /* Variation selector records; sorted
@@ -416,16 +433,6 @@
}
}
- inline glyph_variant_t get_glyph_variant (hb_codepoint_t codepoint,
- hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph) const
- {
- switch (u.format) {
- case 14: return u.format14.get_glyph_variant(codepoint, variation_selector, glyph);
- default: return GLYPH_VARIANT_NOT_FOUND;
- }
- }
-
inline bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
@@ -442,7 +449,7 @@
}
}
- protected:
+ public:
union {
USHORT format; /* Format identifier */
CmapSubtableFormat0 format0;
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.cc Fri Aug 26 10:14:15 2016 -0700
@@ -35,6 +35,8 @@
#include "hb-ot-head-table.hh"
#include "hb-ot-hhea-table.hh"
#include "hb-ot-hmtx-table.hh"
+#include "hb-ot-os2-table.hh"
+//#include "hb-ot-post-table.hh"
struct hb_ot_face_metrics_accelerator_t
@@ -42,24 +44,58 @@
unsigned int num_metrics;
unsigned int num_advances;
unsigned int default_advance;
+ unsigned short ascender;
+ unsigned short descender;
+ unsigned short line_gap;
+
const OT::_mtx *table;
hb_blob_t *blob;
inline void init (hb_face_t *face,
- hb_tag_t _hea_tag, hb_tag_t _mtx_tag,
- unsigned int default_advance_)
+ hb_tag_t _hea_tag,
+ hb_tag_t _mtx_tag,
+ hb_tag_t os2_tag)
{
- this->default_advance = default_advance_;
- this->num_metrics = face->get_num_glyphs ();
+ this->default_advance = face->get_upem ();
+
+ bool got_font_extents = false;
+ if (os2_tag)
+ {
+ hb_blob_t *os2_blob = OT::Sanitizer<OT::os2>::sanitize (face->reference_table (os2_tag));
+ const OT::os2 *os2 = OT::Sanitizer<OT::os2>::lock_instance (os2_blob);
+#define USE_TYPO_METRICS (1u<<7)
+ if (0 != (os2->fsSelection & USE_TYPO_METRICS))
+ {
+ this->ascender = os2->sTypoAscender;
+ this->descender = os2->sTypoDescender;
+ this->line_gap = os2->sTypoLineGap;
+ got_font_extents = (this->ascender | this->descender) != 0;
+ }
+ hb_blob_destroy (os2_blob);
+ }
hb_blob_t *_hea_blob = OT::Sanitizer<OT::_hea>::sanitize (face->reference_table (_hea_tag));
const OT::_hea *_hea = OT::Sanitizer<OT::_hea>::lock_instance (_hea_blob);
this->num_advances = _hea->numberOfLongMetrics;
+ if (!got_font_extents)
+ {
+ this->ascender = _hea->ascender;
+ this->descender = _hea->descender;
+ this->line_gap = _hea->lineGap;
+ }
hb_blob_destroy (_hea_blob);
this->blob = OT::Sanitizer<OT::_mtx>::sanitize (face->reference_table (_mtx_tag));
- if (unlikely (!this->num_advances ||
- 2 * (this->num_advances + this->num_metrics) > hb_blob_get_length (this->blob)))
+
+ /* Cap num_metrics() and num_advances() based on table length. */
+ unsigned int len = hb_blob_get_length (this->blob);
+ if (unlikely (this->num_advances * 4 > len))
+ this->num_advances = len / 4;
+ this->num_metrics = this->num_advances + (len - 4 * this->num_advances) / 2;
+
+ /* We MUST set num_metrics to zero if num_advances is zero.
+ * Our get_advance() depends on that. */
+ if (unlikely (!this->num_advances))
{
this->num_metrics = this->num_advances = 0;
hb_blob_destroy (this->blob);
@@ -166,10 +202,48 @@
}
};
+typedef bool (*hb_cmap_get_glyph_func_t) (const void *obj,
+ hb_codepoint_t codepoint,
+ hb_codepoint_t *glyph);
+
+template <typename Type>
+static inline bool get_glyph_from (const void *obj,
+ hb_codepoint_t codepoint,
+ hb_codepoint_t *glyph)
+{
+ const Type *typed_obj = (const Type *) obj;
+ return typed_obj->get_glyph (codepoint, glyph);
+}
+
+template <typename Type>
+static inline bool get_glyph_from_symbol (const void *obj,
+ hb_codepoint_t codepoint,
+ hb_codepoint_t *glyph)
+{
+ const Type *typed_obj = (const Type *) obj;
+ if (likely (typed_obj->get_glyph (codepoint, glyph)))
+ return true;
+
+ if (codepoint <= 0x00FFu)
+ {
+ /* For symbol-encoded OpenType fonts, we duplicate the
+ * U+F000..F0FF range at U+0000..U+00FF. That's what
+ * Windows seems to do, and that's hinted about at:
+ * http://www.microsoft.com/typography/otspec/recom.htm
+ * under "Non-Standard (Symbol) Fonts". */
+ return typed_obj->get_glyph (0xF000u + codepoint, glyph);
+ }
+
+ return false;
+}
+
struct hb_ot_face_cmap_accelerator_t
{
- const OT::CmapSubtable *table;
- const OT::CmapSubtable *uvs_table;
+ hb_cmap_get_glyph_func_t get_glyph_func;
+ const void *get_glyph_data;
+ OT::CmapSubtableFormat4::accelerator_t format4_accel;
+
+ const OT::CmapSubtableFormat14 *uvs_table;
hb_blob_t *blob;
inline void init (hb_face_t *face)
@@ -177,8 +251,9 @@
this->blob = OT::Sanitizer<OT::cmap>::sanitize (face->reference_table (HB_OT_TAG_cmap));
const OT::cmap *cmap = OT::Sanitizer<OT::cmap>::lock_instance (this->blob);
const OT::CmapSubtable *subtable = NULL;
- const OT::CmapSubtable *subtable_uvs = NULL;
+ const OT::CmapSubtableFormat14 *subtable_uvs = NULL;
+ bool symbol = false;
/* 32-bit subtables. */
if (!subtable) subtable = cmap->find_subtable (3, 10);
if (!subtable) subtable = cmap->find_subtable (0, 6);
@@ -189,17 +264,38 @@
if (!subtable) subtable = cmap->find_subtable (0, 2);
if (!subtable) subtable = cmap->find_subtable (0, 1);
if (!subtable) subtable = cmap->find_subtable (0, 0);
- if (!subtable) subtable = cmap->find_subtable (3, 0);
+ if (!subtable)(subtable = cmap->find_subtable (3, 0)) && (symbol = true);
/* Meh. */
if (!subtable) subtable = &OT::Null(OT::CmapSubtable);
/* UVS subtable. */
- if (!subtable_uvs) subtable_uvs = cmap->find_subtable (0, 5);
+ if (!subtable_uvs)
+ {
+ const OT::CmapSubtable *st = cmap->find_subtable (0, 5);
+ if (st && st->u.format == 14)
+ subtable_uvs = &st->u.format14;
+ }
/* Meh. */
- if (!subtable_uvs) subtable_uvs = &OT::Null(OT::CmapSubtable);
+ if (!subtable_uvs) subtable_uvs = &OT::Null(OT::CmapSubtableFormat14);
+
+ this->uvs_table = subtable_uvs;
- this->table = subtable;
- this->uvs_table = subtable_uvs;
+ this->get_glyph_data = subtable;
+ if (unlikely (symbol))
+ this->get_glyph_func = get_glyph_from_symbol<OT::CmapSubtable>;
+ else
+ switch (subtable->u.format) {
+ /* Accelerate format 4 and format 12. */
+ default: this->get_glyph_func = get_glyph_from<OT::CmapSubtable>; break;
+ case 12: this->get_glyph_func = get_glyph_from<OT::CmapSubtableFormat12>; break;
+ case 4:
+ {
+ this->format4_accel.init (&subtable->u.format4);
+ this->get_glyph_data = &this->format4_accel;
+ this->get_glyph_func = this->format4_accel.get_glyph_func;
+ }
+ break;
+ }
}
inline void fini (void)
@@ -207,33 +303,77 @@
hb_blob_destroy (this->blob);
}
- inline bool get_glyph (hb_codepoint_t unicode,
- hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph) const
+ inline bool get_nominal_glyph (hb_codepoint_t unicode,
+ hb_codepoint_t *glyph) const
{
- if (unlikely (variation_selector))
+ return this->get_glyph_func (this->get_glyph_data, unicode, glyph);
+ }
+
+ inline bool get_variation_glyph (hb_codepoint_t unicode,
+ hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph) const
+ {
+ switch (this->uvs_table->get_glyph_variant (unicode,
+ variation_selector,
+ glyph))
{
- switch (this->uvs_table->get_glyph_variant (unicode,
- variation_selector,
- glyph))
- {
- case OT::GLYPH_VARIANT_NOT_FOUND: return false;
- case OT::GLYPH_VARIANT_FOUND: return true;
- case OT::GLYPH_VARIANT_USE_DEFAULT: break;
- }
+ case OT::GLYPH_VARIANT_NOT_FOUND: return false;
+ case OT::GLYPH_VARIANT_FOUND: return true;
+ case OT::GLYPH_VARIANT_USE_DEFAULT: break;
}
- return this->table->get_glyph (unicode, glyph);
+ return get_nominal_glyph (unicode, glyph);
}
};
+template <typename T>
+struct hb_lazy_loader_t
+{
+ inline void init (hb_face_t *face_)
+ {
+ face = face_;
+ instance = NULL;
+ }
+
+ inline void fini (void)
+ {
+ if (instance && instance != &OT::Null(T))
+ {
+ instance->fini();
+ free (instance);
+ }
+ }
+
+ inline const T* operator-> (void) const
+ {
+ retry:
+ T *p = (T *) hb_atomic_ptr_get (&instance);
+ if (unlikely (!p))
+ {
+ p = (T *) calloc (1, sizeof (T));
+ if (unlikely (!p))
+ return &OT::Null(T);
+ p->init (face);
+ if (unlikely (!hb_atomic_ptr_cmpexch (const_cast<T **>(&instance), NULL, p)))
+ {
+ p->fini ();
+ goto retry;
+ }
+ }
+ return p;
+ }
+
+ private:
+ hb_face_t *face;
+ T *instance;
+};
struct hb_ot_font_t
{
hb_ot_face_cmap_accelerator_t cmap;
hb_ot_face_metrics_accelerator_t h_metrics;
hb_ot_face_metrics_accelerator_t v_metrics;
- hb_ot_face_glyf_accelerator_t glyf;
+ hb_lazy_loader_t<hb_ot_face_glyf_accelerator_t> glyf;
};
@@ -245,11 +385,9 @@
if (unlikely (!ot_font))
return NULL;
- unsigned int upem = face->get_upem ();
-
ot_font->cmap.init (face);
- ot_font->h_metrics.init (face, HB_OT_TAG_hhea, HB_OT_TAG_hmtx, upem>>1);
- ot_font->v_metrics.init (face, HB_OT_TAG_vhea, HB_OT_TAG_vmtx, upem); /* TODO Can we do this lazily? */
+ ot_font->h_metrics.init (face, HB_OT_TAG_hhea, HB_OT_TAG_hmtx, HB_OT_TAG_os2);
+ ot_font->v_metrics.init (face, HB_OT_TAG_vhea, HB_OT_TAG_vmtx, HB_TAG_NONE); /* TODO Can we do this lazily? */
ot_font->glyf.init (face);
return ot_font;
@@ -268,16 +406,27 @@
static hb_bool_t
-hb_ot_get_glyph (hb_font_t *font HB_UNUSED,
- void *font_data,
- hb_codepoint_t unicode,
- hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph,
- void *user_data HB_UNUSED)
+hb_ot_get_nominal_glyph (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ hb_codepoint_t unicode,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
{
const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
- return ot_font->cmap.get_glyph (unicode, variation_selector, glyph);
+ return ot_font->cmap.get_nominal_glyph (unicode, glyph);
+}
+
+static hb_bool_t
+hb_ot_get_variation_glyph (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ hb_codepoint_t unicode,
+ hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
+{
+ const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
+ return ot_font->cmap.get_variation_glyph (unicode, variation_selector, glyph);
}
static hb_position_t
@@ -301,52 +450,6 @@
}
static hb_bool_t
-hb_ot_get_glyph_h_origin (hb_font_t *font HB_UNUSED,
- void *font_data HB_UNUSED,
- hb_codepoint_t glyph HB_UNUSED,
- hb_position_t *x HB_UNUSED,
- hb_position_t *y HB_UNUSED,
- void *user_data HB_UNUSED)
-{
- /* We always work in the horizontal coordinates. */
- return true;
-}
-
-static hb_bool_t
-hb_ot_get_glyph_v_origin (hb_font_t *font HB_UNUSED,
- void *font_data,
- hb_codepoint_t glyph,
- hb_position_t *x,
- hb_position_t *y,
- void *user_data HB_UNUSED)
-{
- /* TODO */
- return false;
-}
-
-static hb_position_t
-hb_ot_get_glyph_h_kerning (hb_font_t *font,
- void *font_data,
- hb_codepoint_t left_glyph,
- hb_codepoint_t right_glyph,
- void *user_data HB_UNUSED)
-{
- /* TODO */
- return 0;
-}
-
-static hb_position_t
-hb_ot_get_glyph_v_kerning (hb_font_t *font HB_UNUSED,
- void *font_data HB_UNUSED,
- hb_codepoint_t top_glyph HB_UNUSED,
- hb_codepoint_t bottom_glyph HB_UNUSED,
- void *user_data HB_UNUSED)
-{
- /* OpenType doesn't have vertical-kerning other than GPOS. */
- return 0;
-}
-
-static hb_bool_t
hb_ot_get_glyph_extents (hb_font_t *font HB_UNUSED,
void *font_data,
hb_codepoint_t glyph,
@@ -354,7 +457,7 @@
void *user_data HB_UNUSED)
{
const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
- bool ret = ot_font->glyf.get_extents (glyph, extents);
+ bool ret = ot_font->glyf->get_extents (glyph, extents);
extents->x_bearing = font->em_scale_x (extents->x_bearing);
extents->y_bearing = font->em_scale_y (extents->y_bearing);
extents->width = font->em_scale_x (extents->width);
@@ -363,61 +466,85 @@
}
static hb_bool_t
-hb_ot_get_glyph_contour_point (hb_font_t *font HB_UNUSED,
- void *font_data,
- hb_codepoint_t glyph,
- unsigned int point_index,
- hb_position_t *x,
- hb_position_t *y,
- void *user_data HB_UNUSED)
+hb_ot_get_font_h_extents (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ hb_font_extents_t *metrics,
+ void *user_data HB_UNUSED)
{
- /* TODO */
- return false;
+ const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
+ metrics->ascender = font->em_scale_y (ot_font->h_metrics.ascender);
+ metrics->descender = font->em_scale_y (ot_font->h_metrics.descender);
+ metrics->line_gap = font->em_scale_y (ot_font->h_metrics.line_gap);
+ return true;
}
static hb_bool_t
-hb_ot_get_glyph_name (hb_font_t *font HB_UNUSED,
- void *font_data,
- hb_codepoint_t glyph,
- char *name, unsigned int size,
- void *user_data HB_UNUSED)
+hb_ot_get_font_v_extents (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ hb_font_extents_t *metrics,
+ void *user_data HB_UNUSED)
{
- /* TODO */
- return false;
+ const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
+ metrics->ascender = font->em_scale_x (ot_font->v_metrics.ascender);
+ metrics->descender = font->em_scale_x (ot_font->v_metrics.descender);
+ metrics->line_gap = font->em_scale_x (ot_font->v_metrics.line_gap);
+ return true;
}
-static hb_bool_t
-hb_ot_get_glyph_from_name (hb_font_t *font HB_UNUSED,
- void *font_data,
- const char *name, int len, /* -1 means nul-terminated */
- hb_codepoint_t *glyph,
- void *user_data HB_UNUSED)
+static hb_font_funcs_t *static_ot_funcs = NULL;
+
+#ifdef HB_USE_ATEXIT
+static
+void free_static_ot_funcs (void)
{
- /* TODO */
- return false;
+ hb_font_funcs_destroy (static_ot_funcs);
}
-
+#endif
static hb_font_funcs_t *
_hb_ot_get_font_funcs (void)
{
- static const hb_font_funcs_t ot_ffuncs = {
- HB_OBJECT_HEADER_STATIC,
+retry:
+ hb_font_funcs_t *funcs = (hb_font_funcs_t *) hb_atomic_ptr_get (&static_ot_funcs);
- true, /* immutable */
+ if (unlikely (!funcs))
+ {
+ funcs = hb_font_funcs_create ();
- {
-#define HB_FONT_FUNC_IMPLEMENT(name) hb_ot_get_##name,
- HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
-#undef HB_FONT_FUNC_IMPLEMENT
+ hb_font_funcs_set_font_h_extents_func (funcs, hb_ot_get_font_h_extents, NULL, NULL);
+ hb_font_funcs_set_font_v_extents_func (funcs, hb_ot_get_font_v_extents, NULL, NULL);
+ hb_font_funcs_set_nominal_glyph_func (funcs, hb_ot_get_nominal_glyph, NULL, NULL);
+ hb_font_funcs_set_variation_glyph_func (funcs, hb_ot_get_variation_glyph, NULL, NULL);
+ hb_font_funcs_set_glyph_h_advance_func (funcs, hb_ot_get_glyph_h_advance, NULL, NULL);
+ hb_font_funcs_set_glyph_v_advance_func (funcs, hb_ot_get_glyph_v_advance, NULL, NULL);
+ //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ot_get_glyph_h_origin, NULL, NULL);
+ //hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ot_get_glyph_v_origin, NULL, NULL);
+ //hb_font_funcs_set_glyph_h_kerning_func (funcs, hb_ot_get_glyph_h_kerning, NULL, NULL); TODO
+ //hb_font_funcs_set_glyph_v_kerning_func (funcs, hb_ot_get_glyph_v_kerning, NULL, NULL);
+ hb_font_funcs_set_glyph_extents_func (funcs, hb_ot_get_glyph_extents, NULL, NULL);
+ //hb_font_funcs_set_glyph_contour_point_func (funcs, hb_ot_get_glyph_contour_point, NULL, NULL); TODO
+ //hb_font_funcs_set_glyph_name_func (funcs, hb_ot_get_glyph_name, NULL, NULL); TODO
+ //hb_font_funcs_set_glyph_from_name_func (funcs, hb_ot_get_glyph_from_name, NULL, NULL); TODO
+
+ hb_font_funcs_make_immutable (funcs);
+
+ if (!hb_atomic_ptr_cmpexch (&static_ot_funcs, NULL, funcs)) {
+ hb_font_funcs_destroy (funcs);
+ goto retry;
}
+
+#ifdef HB_USE_ATEXIT
+ atexit (free_static_ot_funcs); /* First person registers atexit() callback. */
+#endif
};
- return const_cast<hb_font_funcs_t *> (&ot_ffuncs);
+ return funcs;
}
/**
+ * hb_ot_font_set_funcs:
+ *
* Since: 0.9.28
**/
void
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.h Fri Aug 26 10:14:15 2016 -0700
@@ -36,7 +36,7 @@
HB_BEGIN_DECLS
-void
+HB_EXTERN void
hb_ot_font_set_funcs (hb_font_t *font);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-glyf-table.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-glyf-table.hh Fri Aug 26 10:14:15 2016 -0700
@@ -90,10 +90,10 @@
* greater than or equal to zero,
* this is a simple glyph; if negative,
* this is a composite glyph. */
- SHORT xMin; /* Minimum x for coordinate data. */
- SHORT yMin; /* Minimum y for coordinate data. */
- SHORT xMax; /* Maximum x for coordinate data. */
- SHORT yMax; /* Maximum y for coordinate data. */
+ FWORD xMin; /* Minimum x for coordinate data. */
+ FWORD yMin; /* Minimum y for coordinate data. */
+ FWORD xMax; /* Maximum x for coordinate data. */
+ FWORD yMax; /* Maximum y for coordinate data. */
DEFINE_SIZE_STATIC (10);
};
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-head-table.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-head-table.hh Fri Aug 26 10:14:15 2016 -0700
@@ -55,13 +55,15 @@
inline bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) && likely (version.major == 1));
+ return_trace (c->check_struct (this) &&
+ version.major == 1 &&
+ magicNumber == 0x5F0F3CF5u);
}
protected:
- FixedVersion version; /* Version of the head table--currently
+ FixedVersion<>version; /* Version of the head table--currently
* 0x00010000u for version 1.0. */
- FixedVersion fontRevision; /* Set by font manufacturer. */
+ FixedVersion<>fontRevision; /* Set by font manufacturer. */
ULONG checkSumAdjustment; /* To compute: set it to 0, sum the
* entire font as ULONG, then store
* 0xB1B0AFBAu - sum. */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hhea-table.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hhea-table.hh Fri Aug 26 10:14:15 2016 -0700
@@ -56,7 +56,7 @@
}
public:
- FixedVersion version; /* 0x00010000u for version 1.0. */
+ FixedVersion<>version; /* 0x00010000u for version 1.0. */
FWORD ascender; /* Typographic ascent. */
FWORD descender; /* Typographic descent. */
FWORD lineGap; /* Typographic line gap. */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hmtx-table.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hmtx-table.hh Fri Aug 26 10:14:15 2016 -0700
@@ -44,8 +44,8 @@
struct LongMetric
{
- USHORT advance; /* Advance width/height. */
- SHORT lsb; /* Leading (left/top) side bearing. */
+ UFWORD advance; /* Advance width/height. */
+ FWORD lsb; /* Leading (left/top) side bearing. */
public:
DEFINE_SIZE_STATIC (4);
};
@@ -74,7 +74,7 @@
* be in the array, but that entry is
* required. The last entry applies to
* all subsequent glyphs. */
- SHORT leadingBearingX[VAR]; /* Here the advance is assumed
+ FWORD leadingBearingX[VAR]; /* Here the advance is assumed
* to be the same as the advance
* for the last entry above. The
* number of entries in this array is
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-common-private.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-common-private.hh Fri Aug 26 10:14:15 2016 -0700
@@ -34,6 +34,14 @@
#include "hb-set-private.hh"
+#ifndef HB_MAX_NESTING_LEVEL
+#define HB_MAX_NESTING_LEVEL 6
+#endif
+#ifndef HB_MAX_CONTEXT_LENGTH
+#define HB_MAX_CONTEXT_LENGTH 64
+#endif
+
+
namespace OT {
@@ -44,8 +52,6 @@
#define NOT_COVERED ((unsigned int) -1)
-#define MAX_NESTING_LEVEL 6
-#define MAX_CONTEXT_LENGTH 64
@@ -539,6 +545,9 @@
c->try_set (&featureParams, new_offset) &&
!featureParams.sanitize (c, this, closure ? closure->tag : HB_TAG_NONE))
return_trace (false);
+
+ if (c->edit_count > 1)
+ c->edit_count--; /* This was a "legitimate" edit; don't contribute to error count. */
}
return_trace (true);
@@ -573,6 +582,11 @@
DEFINE_SIZE_STATIC (2);
};
+} /* namespace OT */
+/* This has to be outside the namespace. */
+HB_MARK_AS_FLAG_T (OT::LookupFlag::Flags);
+namespace OT {
+
struct Lookup
{
inline unsigned int get_subtable_count (void) const { return subTable.len; }
@@ -756,7 +770,11 @@
TRACE_SERIALIZE (this);
if (unlikely (!c->extend_min (*this))) return_trace (false);
- if (unlikely (!num_glyphs)) return_trace (true);
+ if (unlikely (!num_glyphs))
+ {
+ rangeRecord.len.set (0);
+ return_trace (true);
+ }
unsigned int num_ranges = 1;
for (unsigned int i = 1; i < num_glyphs; i++)
@@ -1156,6 +1174,21 @@
inline hb_position_t get_y_delta (hb_font_t *font) const
{ return get_delta (font->y_ppem, font->y_scale); }
+ inline unsigned int get_size (void) const
+ {
+ unsigned int f = deltaFormat;
+ if (unlikely (f < 1 || f > 3 || startSize > endSize)) return 3 * USHORT::static_size;
+ return USHORT::static_size * (4 + ((endSize - startSize) >> (4 - f)));
+ }
+
+ inline bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) && c->check_range (this, this->get_size ()));
+ }
+
+ private:
+
inline int get_delta (unsigned int ppem, int scale) const
{
if (!ppem) return 0;
@@ -1166,8 +1199,6 @@
return (int) (pixels * (int64_t) scale / ppem);
}
-
-
inline int get_delta_pixels (unsigned int ppem_size) const
{
unsigned int f = deltaFormat;
@@ -1191,19 +1222,6 @@
return delta;
}
- inline unsigned int get_size (void) const
- {
- unsigned int f = deltaFormat;
- if (unlikely (f < 1 || f > 3 || startSize > endSize)) return 3 * USHORT::static_size;
- return USHORT::static_size * (4 + ((endSize - startSize) >> (4 - f)));
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) && c->check_range (this, this->get_size ()));
- }
-
protected:
USHORT startSize; /* Smallest size to correct--in ppem */
USHORT endSize; /* Largest size to correct--in ppem */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gdef-table.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gdef-table.hh Fri Aug 26 10:14:15 2016 -0700
@@ -409,7 +409,7 @@
protected:
- FixedVersion version; /* Version of the GDEF table--currently
+ FixedVersion<>version; /* Version of the GDEF table--currently
* 0x00010002u */
OffsetTo<ClassDef>
glyphClassDef; /* Offset to class definition table
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gpos-table.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gpos-table.hh Fri Aug 26 10:14:15 2016 -0700
@@ -36,8 +36,17 @@
/* buffer **position** var allocations */
-#define attach_lookback() var.u16[0] /* number of glyphs to go back to attach this glyph to its base */
-#define cursive_chain() var.i16[1] /* character to which this connects, may be positive or negative */
+#define attach_chain() var.i16[0] /* glyph to which this attaches to, relative to current glyphs; negative for going back, positive for forward. */
+#define attach_type() var.u8[2] /* attachment type */
+/* Note! if attach_chain() is zero, the value of attach_type() is irrelevant. */
+
+enum attach_type_t {
+ ATTACH_TYPE_NONE = 0X00,
+
+ /* Each attachment should be either a mark or a cursive; can't be both. */
+ ATTACH_TYPE_MARK = 0X01,
+ ATTACH_TYPE_CURSIVE = 0X02,
+};
/* Shared Tables: ValueRecord, Anchor Table, and MarkArray */
@@ -425,7 +434,9 @@
hb_glyph_position_t &o = buffer->cur_pos();
o.x_offset = base_x - mark_x;
o.y_offset = base_y - mark_y;
- o.attach_lookback() = buffer->idx - glyph_pos;
+ o.attach_type() = ATTACH_TYPE_MARK;
+ o.attach_chain() = (int) glyph_pos - (int) buffer->idx;
+ buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
buffer->idx++;
return_trace (true);
@@ -741,7 +752,7 @@
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
TRACE_COLLECT_GLYPHS (this);
- /* (this+coverage).add_coverage (c->input); // Don't need this. */
+ (this+coverage).add_coverage (c->input);
unsigned int count1 = class1Count;
const ClassDef &klass1 = this+classDef1;
@@ -906,9 +917,6 @@
TRACE_APPLY (this);
hb_buffer_t *buffer = c->buffer;
- /* We don't handle mark glyphs here. */
- if (unlikely (_hb_glyph_info_is_mark (&buffer->cur()))) return_trace (false);
-
const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage (buffer->cur().codepoint)];
if (!this_record.exitAnchor) return_trace (false);
@@ -992,7 +1000,9 @@
*/
reverse_cursive_minor_offset (pos, child, c->direction, parent);
- pos[child].cursive_chain() = parent - child;
+ pos[child].attach_type() = ATTACH_TYPE_CURSIVE;
+ pos[child].attach_chain() = (int) parent - (int) child;
+ buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
if (likely (HB_DIRECTION_IS_HORIZONTAL (c->direction)))
pos[child].y_offset = y_offset;
else
@@ -1067,7 +1077,7 @@
unsigned int mark_index = (this+markCoverage).get_coverage (buffer->cur().codepoint);
if (likely (mark_index == NOT_COVERED)) return_trace (false);
- /* now we search backwards for a non-mark glyph */
+ /* Now we search backwards for a non-mark glyph */
hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
skippy_iter.reset (buffer->idx, 1);
skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
@@ -1079,7 +1089,7 @@
} while (1);
/* Checking that matched glyph is actually a base glyph by GDEF is too strong; disabled */
- if (!_hb_glyph_info_is_base_glyph (&buffer->info[skippy_iter.idx])) { /*return_trace (false);*/ }
+ //if (!_hb_glyph_info_is_base_glyph (&buffer->info[skippy_iter.idx])) { return_trace (false); }
unsigned int base_index = (this+baseCoverage).get_coverage (buffer->info[skippy_iter.idx].codepoint);
if (base_index == NOT_COVERED) return_trace (false);
@@ -1168,14 +1178,14 @@
unsigned int mark_index = (this+markCoverage).get_coverage (buffer->cur().codepoint);
if (likely (mark_index == NOT_COVERED)) return_trace (false);
- /* now we search backwards for a non-mark glyph */
+ /* Now we search backwards for a non-mark glyph */
hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
skippy_iter.reset (buffer->idx, 1);
skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
if (!skippy_iter.prev ()) return_trace (false);
/* Checking that matched glyph is actually a ligature by GDEF is too strong; disabled */
- if (!_hb_glyph_info_is_ligature (&buffer->info[skippy_iter.idx])) { /*return_trace (false);*/ }
+ //if (!_hb_glyph_info_is_ligature (&buffer->info[skippy_iter.idx])) { return_trace (false); }
unsigned int j = skippy_iter.idx;
unsigned int lig_index = (this+ligatureCoverage).get_coverage (buffer->info[j].codepoint);
@@ -1499,7 +1509,8 @@
{ return CastR<PosLookup> (GSUBGPOS::get_lookup (i)); }
static inline void position_start (hb_font_t *font, hb_buffer_t *buffer);
- static inline void position_finish (hb_font_t *font, hb_buffer_t *buffer);
+ static inline void position_finish_advances (hb_font_t *font, hb_buffer_t *buffer);
+ static inline void position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer);
inline bool sanitize (hb_sanitize_context_t *c) const
{
@@ -1516,13 +1527,13 @@
static void
reverse_cursive_minor_offset (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction, unsigned int new_parent)
{
- unsigned int j = pos[i].cursive_chain();
- if (likely (!j))
+ int chain = pos[i].attach_chain(), type = pos[i].attach_type();
+ if (likely (!chain || 0 == (type & ATTACH_TYPE_CURSIVE)))
return;
- j += i;
+ pos[i].attach_chain() = 0;
- pos[i].cursive_chain() = 0;
+ unsigned int j = (int) i + chain;
/* Stop if we see new parent in the chain. */
if (j == new_parent)
@@ -1535,62 +1546,68 @@
else
pos[j].x_offset = -pos[i].x_offset;
- pos[j].cursive_chain() = i - j;
+ pos[j].attach_chain() = -chain;
+ pos[j].attach_type() = type;
}
static void
-fix_cursive_minor_offset (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction)
+propagate_attachment_offsets (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction)
{
- unsigned int j = pos[i].cursive_chain();
- if (likely (!j))
+ /* Adjusts offsets of attached glyphs (both cursive and mark) to accumulate
+ * offset of glyph they are attached to. */
+ int chain = pos[i].attach_chain(), type = pos[i].attach_type();
+ if (likely (!chain))
return;
- j += i;
+ unsigned int j = (int) i + chain;
- pos[i].cursive_chain() = 0;
-
- fix_cursive_minor_offset (pos, j, direction);
+ pos[i].attach_chain() = 0;
- if (HB_DIRECTION_IS_HORIZONTAL (direction))
- pos[i].y_offset += pos[j].y_offset;
- else
- pos[i].x_offset += pos[j].x_offset;
-}
+ propagate_attachment_offsets (pos, j, direction);
+
+ assert (!!(type & ATTACH_TYPE_MARK) ^ !!(type & ATTACH_TYPE_CURSIVE));
-static void
-fix_mark_attachment (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction)
-{
- if (likely (!(pos[i].attach_lookback())))
- return;
-
- unsigned int j = i - pos[i].attach_lookback();
-
- pos[i].x_offset += pos[j].x_offset;
- pos[i].y_offset += pos[j].y_offset;
+ if (type & ATTACH_TYPE_CURSIVE)
+ {
+ if (HB_DIRECTION_IS_HORIZONTAL (direction))
+ pos[i].y_offset += pos[j].y_offset;
+ else
+ pos[i].x_offset += pos[j].x_offset;
+ }
+ else /*if (type & ATTACH_TYPE_MARK)*/
+ {
+ pos[i].x_offset += pos[j].x_offset;
+ pos[i].y_offset += pos[j].y_offset;
- if (HB_DIRECTION_IS_FORWARD (direction))
- for (unsigned int k = j; k < i; k++) {
- pos[i].x_offset -= pos[k].x_advance;
- pos[i].y_offset -= pos[k].y_advance;
- }
- else
- for (unsigned int k = j + 1; k < i + 1; k++) {
- pos[i].x_offset += pos[k].x_advance;
- pos[i].y_offset += pos[k].y_advance;
- }
+ assert (j < i);
+ if (HB_DIRECTION_IS_FORWARD (direction))
+ for (unsigned int k = j; k < i; k++) {
+ pos[i].x_offset -= pos[k].x_advance;
+ pos[i].y_offset -= pos[k].y_advance;
+ }
+ else
+ for (unsigned int k = j + 1; k < i + 1; k++) {
+ pos[i].x_offset += pos[k].x_advance;
+ pos[i].y_offset += pos[k].y_advance;
+ }
+ }
}
void
GPOS::position_start (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
{
- buffer->clear_positions ();
-
unsigned int count = buffer->len;
for (unsigned int i = 0; i < count; i++)
- buffer->pos[i].attach_lookback() = buffer->pos[i].cursive_chain() = 0;
+ buffer->pos[i].attach_chain() = buffer->pos[i].attach_type() = 0;
}
void
-GPOS::position_finish (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
+GPOS::position_finish_advances (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
+{
+ //_hb_buffer_assert_gsubgpos_vars (buffer);
+}
+
+void
+GPOS::position_finish_offsets (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
{
_hb_buffer_assert_gsubgpos_vars (buffer);
@@ -1598,13 +1615,10 @@
hb_glyph_position_t *pos = hb_buffer_get_glyph_positions (buffer, &len);
hb_direction_t direction = buffer->props.direction;
- /* Handle cursive connections */
- for (unsigned int i = 0; i < len; i++)
- fix_cursive_minor_offset (pos, i, direction);
-
/* Handle attachments */
- for (unsigned int i = 0; i < len; i++)
- fix_mark_attachment (pos, i, direction);
+ if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT)
+ for (unsigned int i = 0; i < len; i++)
+ propagate_attachment_offsets (pos, i, direction);
}
@@ -1633,8 +1647,8 @@
}
-#undef attach_lookback
-#undef cursive_chain
+#undef attach_chain
+#undef attach_type
} /* namespace OT */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsub-table.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsub-table.hh Fri Aug 26 10:14:15 2016 -0700
@@ -265,16 +265,6 @@
TRACE_APPLY (this);
unsigned int count = substitute.len;
- /* TODO:
- * Testing shows that Uniscribe actually allows zero-len susbstitute,
- * which essentially deletes a glyph. We don't allow for now. It
- * can be confusing to the client since the cluster from the deleted
- * glyph won't be merged with any output cluster... Also, currently
- * buffer->move_to() makes assumptions about this too. Perhaps fix
- * in the future after figuring out what to do with the clusters.
- */
- if (unlikely (!count)) return_trace (false);
-
/* Special-case to make it in-place and not consider this
* as a "multiplied" substitution. */
if (unlikely (count == 1))
@@ -282,6 +272,13 @@
c->replace_glyph (substitute.array[0]);
return_trace (true);
}
+ /* Spec disallows this, but Uniscribe allows it.
+ * https://github.com/behdad/harfbuzz/issues/253 */
+ else if (unlikely (count == 0))
+ {
+ c->buffer->delete_glyph ();
+ return_trace (true);
+ }
unsigned int klass = _hb_glyph_info_is_ligature (&c->buffer->cur()) ?
HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH : 0;
@@ -630,7 +627,7 @@
unsigned int total_component_count = 0;
unsigned int match_length = 0;
- unsigned int match_positions[MAX_CONTEXT_LENGTH];
+ unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
if (likely (!match_input (c, count,
&component[1],
@@ -970,7 +967,7 @@
inline bool apply (hb_apply_context_t *c) const
{
TRACE_APPLY (this);
- if (unlikely (c->nesting_level_left != MAX_NESTING_LEVEL))
+ if (unlikely (c->nesting_level_left != HB_MAX_NESTING_LEVEL))
return_trace (false); /* No chaining to this type */
unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
@@ -1268,7 +1265,6 @@
{ return CastR<SubstLookup> (GSUBGPOS::get_lookup (i)); }
static inline void substitute_start (hb_font_t *font, hb_buffer_t *buffer);
- static inline void substitute_finish (hb_font_t *font, hb_buffer_t *buffer);
inline bool sanitize (hb_sanitize_context_t *c) const
{
@@ -1289,19 +1285,32 @@
const GDEF &gdef = *hb_ot_layout_from_face (font->face)->gdef;
unsigned int count = buffer->len;
+ hb_glyph_info_t *info = buffer->info;
for (unsigned int i = 0; i < count; i++)
{
- _hb_glyph_info_set_glyph_props (&buffer->info[i], gdef.get_glyph_props (buffer->info[i].codepoint));
- _hb_glyph_info_clear_lig_props (&buffer->info[i]);
+ unsigned int props = gdef.get_glyph_props (info[i].codepoint);
+ if (!props)
+ {
+ /* Never mark default-ignorables as marks.
+ * They won't get in the way of lookups anyway,
+ * but having them as mark will cause them to be skipped
+ * over if the lookup-flag says so, but at least for the
+ * Mongolian variation selectors, looks like Uniscribe
+ * marks them as non-mark. Some Mongolian fonts without
+ * GDEF rely on this. Another notable character that
+ * this applies to is COMBINING GRAPHEME JOINER. */
+ props = (_hb_glyph_info_get_general_category (&info[i]) !=
+ HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK ||
+ _hb_glyph_info_is_default_ignorable (&info[i])) ?
+ HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH :
+ HB_OT_LAYOUT_GLYPH_PROPS_MARK;
+ }
+ _hb_glyph_info_set_glyph_props (&info[i], props);
+ _hb_glyph_info_clear_lig_props (&info[i]);
buffer->info[i].syllable() = 0;
}
}
-void
-GSUB::substitute_finish (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer HB_UNUSED)
-{
-}
-
/* Out-of-class implementation for methods recursing */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsubgpos-private.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsubgpos-private.hh Fri Aug 26 10:14:15 2016 -0700
@@ -74,7 +74,7 @@
hb_closure_context_t (hb_face_t *face_,
hb_set_t *glyphs_,
- unsigned int nesting_level_left_ = MAX_NESTING_LEVEL) :
+ unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) :
face (face_),
glyphs (glyphs_),
recurse_func (NULL),
@@ -196,7 +196,7 @@
hb_set_t *glyphs_input, /* OUT. May be NULL */
hb_set_t *glyphs_after, /* OUT. May be NULL */
hb_set_t *glyphs_output, /* OUT. May be NULL */
- unsigned int nesting_level_left_ = MAX_NESTING_LEVEL) :
+ unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) :
face (face_),
before (glyphs_before ? glyphs_before : hb_set_get_empty ()),
input (glyphs_input ? glyphs_input : hb_set_get_empty ()),
@@ -319,7 +319,7 @@
if (!c->check_glyph_property (&info, lookup_props))
return SKIP_YES;
- if (unlikely (_hb_glyph_info_is_default_ignorable (&info) &&
+ if (unlikely (_hb_glyph_info_is_default_ignorable_and_not_fvs (&info) &&
(ignore_zwnj || !_hb_glyph_info_is_zwnj (&info)) &&
(ignore_zwj || !_hb_glyph_info_is_zwj (&info))))
return SKIP_MAYBE;
@@ -355,11 +355,11 @@
{
matcher.set_lookup_props (lookup_props);
}
- inline void set_match_func (matcher_t::match_func_t match_func,
- const void *match_data,
+ inline void set_match_func (matcher_t::match_func_t match_func_,
+ const void *match_data_,
const USHORT glyph_data[])
{
- matcher.set_match_func (match_func, match_data);
+ matcher.set_match_func (match_func_, match_data_);
match_glyph_data = glyph_data;
}
@@ -483,7 +483,7 @@
lookup_mask (1),
auto_zwj (true),
recurse_func (NULL),
- nesting_level_left (MAX_NESTING_LEVEL),
+ nesting_level_left (HB_MAX_NESTING_LEVEL),
lookup_props (0),
gdef (*hb_ot_layout_from_face (face)->gdef),
has_glyph_classes (gdef.has_glyph_classes ()),
@@ -704,13 +704,13 @@
match_func_t match_func,
const void *match_data,
unsigned int *end_offset,
- unsigned int match_positions[MAX_CONTEXT_LENGTH],
+ unsigned int match_positions[HB_MAX_CONTEXT_LENGTH],
bool *p_is_mark_ligature = NULL,
unsigned int *p_total_component_count = NULL)
{
TRACE_APPLY (NULL);
- if (unlikely (count > MAX_CONTEXT_LENGTH)) return_trace (false);
+ if (unlikely (count > HB_MAX_CONTEXT_LENGTH)) return_trace (false);
hb_buffer_t *buffer = c->buffer;
@@ -784,7 +784,7 @@
}
static inline bool ligate_input (hb_apply_context_t *c,
unsigned int count, /* Including the first glyph */
- unsigned int match_positions[MAX_CONTEXT_LENGTH], /* Including the first glyph */
+ unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */
unsigned int match_length,
hb_codepoint_t lig_glyph,
bool is_mark_ligature,
@@ -836,19 +836,21 @@
if (_hb_glyph_info_get_general_category (&buffer->cur()) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)
{
_hb_glyph_info_set_general_category (&buffer->cur(), HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER);
- _hb_glyph_info_set_modified_combining_class (&buffer->cur(), 0);
}
}
c->replace_glyph_with_ligature (lig_glyph, klass);
for (unsigned int i = 1; i < count; i++)
{
- while (buffer->idx < match_positions[i])
+ while (buffer->idx < match_positions[i] && !buffer->in_error)
{
if (!is_mark_ligature) {
+ unsigned int this_comp = _hb_glyph_info_get_lig_comp (&buffer->cur());
+ if (this_comp == 0)
+ this_comp = last_num_components;
unsigned int new_lig_comp = components_so_far - last_num_components +
- MIN (MAX (_hb_glyph_info_get_lig_comp (&buffer->cur()), 1u), last_num_components);
- _hb_glyph_info_set_lig_props_for_mark (&buffer->cur(), lig_id, new_lig_comp);
+ MIN (this_comp, last_num_components);
+ _hb_glyph_info_set_lig_props_for_mark (&buffer->cur(), lig_id, new_lig_comp);
}
buffer->next_glyph ();
}
@@ -865,8 +867,11 @@
/* Re-adjust components for any marks following. */
for (unsigned int i = buffer->idx; i < buffer->len; i++) {
if (last_lig_id == _hb_glyph_info_get_lig_id (&buffer->info[i])) {
+ unsigned int this_comp = _hb_glyph_info_get_lig_comp (&buffer->info[i]);
+ if (!this_comp)
+ break;
unsigned int new_lig_comp = components_so_far - last_num_components +
- MIN (MAX (_hb_glyph_info_get_lig_comp (&buffer->info[i]), 1u), last_num_components);
+ MIN (this_comp, last_num_components);
_hb_glyph_info_set_lig_props_for_mark (&buffer->info[i], lig_id, new_lig_comp);
} else
break;
@@ -944,7 +949,7 @@
static inline bool apply_lookup (hb_apply_context_t *c,
unsigned int count, /* Including the first glyph */
- unsigned int match_positions[MAX_CONTEXT_LENGTH], /* Including the first glyph */
+ unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */
unsigned int lookupCount,
const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */
unsigned int match_length)
@@ -966,12 +971,17 @@
match_positions[j] += delta;
}
- for (unsigned int i = 0; i < lookupCount; i++)
+ for (unsigned int i = 0; i < lookupCount && !buffer->in_error; i++)
{
unsigned int idx = lookupRecord[i].sequenceIndex;
if (idx >= count)
continue;
+ /* Don't recurse to ourself at same position.
+ * Note that this test is too naive, it doesn't catch longer loops. */
+ if (idx == 0 && lookupRecord[i].lookupListIndex == c->lookup_index)
+ continue;
+
buffer->move_to (match_positions[idx]);
unsigned int orig_len = buffer->backtrack_len () + buffer->lookahead_len ();
@@ -986,16 +996,19 @@
/* Recursed lookup changed buffer len. Adjust. */
- /* end can't go back past the current match position.
- * Note: this is only true because we do NOT allow MultipleSubst
- * with zero sequence len. */
- end = MAX ((int) match_positions[idx] + 1, int (end) + delta);
+ end = int (end) + delta;
+ if (end <= match_positions[idx])
+ {
+ /* There can't be any further changes. */
+ assert (end == match_positions[idx]);
+ break;
+ }
unsigned int next = idx + 1; /* next now is the position after the recursed lookup. */
if (delta > 0)
{
- if (unlikely (delta + count > MAX_CONTEXT_LENGTH))
+ if (unlikely (delta + count > HB_MAX_CONTEXT_LENGTH))
break;
}
else
@@ -1094,7 +1107,7 @@
ContextApplyLookupContext &lookup_context)
{
unsigned int match_length = 0;
- unsigned int match_positions[MAX_CONTEXT_LENGTH];
+ unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
return match_input (c,
inputCount, input,
lookup_context.funcs.match, lookup_context.match_data,
@@ -1621,7 +1634,7 @@
ChainContextApplyLookupContext &lookup_context)
{
unsigned int match_length = 0;
- unsigned int match_positions[MAX_CONTEXT_LENGTH];
+ unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
return match_input (c,
inputCount, input,
lookup_context.funcs.match, lookup_context.match_data[1],
@@ -2267,7 +2280,7 @@
}
protected:
- FixedVersion version; /* Version of the GSUB/GPOS table--initially set
+ FixedVersion<>version; /* Version of the GSUB/GPOS table--initially set
* to 0x00010000u */
OffsetTo<ScriptList>
scriptList; /* ScriptList table */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-jstf-table.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-jstf-table.hh Fri Aug 26 10:14:15 2016 -0700
@@ -218,7 +218,7 @@
}
protected:
- FixedVersion version; /* Version of the JSTF table--initially set
+ FixedVersion<>version; /* Version of the JSTF table--initially set
* to 0x00010000u */
RecordArrayOf<JstfScript>
scriptList; /* Array of JstfScripts--listed
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-private.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-private.hh Fri Aug 26 10:14:15 2016 -0700
@@ -49,7 +49,7 @@
* GDEF
*/
-typedef enum
+enum hb_ot_layout_glyph_props_flags_t
{
/* The following three match LookupFlags::Ignore* numbers. */
HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH = 0x02u,
@@ -64,7 +64,8 @@
HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE = HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED |
HB_OT_LAYOUT_GLYPH_PROPS_LIGATED |
HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED
-} hb_ot_layout_glyph_class_mask_t;
+};
+HB_MARK_AS_FLAG_T (hb_ot_layout_glyph_props_flags_t);
/*
@@ -98,21 +99,20 @@
const hb_ot_layout_lookup_accelerator_t &accel);
-/* Should be called after all the substitute_lookup's are done */
-HB_INTERNAL void
-hb_ot_layout_substitute_finish (hb_font_t *font,
- hb_buffer_t *buffer);
-
-
-/* Should be called before all the position_lookup's are done. Resets positions to zero. */
+/* Should be called before all the position_lookup's are done. */
HB_INTERNAL void
hb_ot_layout_position_start (hb_font_t *font,
hb_buffer_t *buffer);
-/* Should be called after all the position_lookup's are done */
+/* Should be called after all the position_lookup's are done, to finish advances. */
HB_INTERNAL void
-hb_ot_layout_position_finish (hb_font_t *font,
- hb_buffer_t *buffer);
+hb_ot_layout_position_finish_advances (hb_font_t *font,
+ hb_buffer_t *buffer);
+
+/* Should be called after hb_ot_layout_position_finish_advances, to finish offsets. */
+HB_INTERNAL void
+hb_ot_layout_position_finish_offsets (hb_font_t *font,
+ hb_buffer_t *buffer);
@@ -180,8 +180,7 @@
*/
/* buffer var allocations, used during the entire shaping process */
-#define unicode_props0() var2.u8[0]
-#define unicode_props1() var2.u8[1]
+#define unicode_props() var2.u16[0]
/* buffer var allocations, used during the GSUB/GPOS processing */
#define glyph_props() var1.u16[0] /* GDEF glyph properties */
@@ -214,48 +213,146 @@
/* unicode_props */
-enum {
- MASK0_ZWJ = 0x20u,
- MASK0_ZWNJ = 0x40u,
- MASK0_IGNORABLE = 0x80u,
- MASK0_GEN_CAT = 0x1Fu
+/* Design:
+ * unicode_props() is a two-byte number. The low byte includes:
+ * - General_Category: 5 bits.
+ * - A bit each for:
+ * * Is it Default_Ignorable(); we have a modified Default_Ignorable().
+ * * Whether it's one of the three Mongolian Free Variation Selectors.
+ * * One free bit right now.
+ *
+ * The high-byte has different meanings, switched by the Gen-Cat:
+ * - For Mn,Mc,Me: the modified Combining_Class.
+ * - For Cf: whether it's ZWJ, ZWNJ, or something else.
+ * - For Ws: index of which space character this is, if space fallback
+ * is needed, ie. we don't set this by default, only if asked to.
+ */
+
+enum hb_unicode_props_flags_t {
+ UPROPS_MASK_GEN_CAT = 0x001Fu,
+ UPROPS_MASK_IGNORABLE = 0x0020u,
+ UPROPS_MASK_FVS = 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..3 */
+
+ /* If GEN_CAT=FORMAT, top byte masks: */
+ UPROPS_MASK_Cf_ZWJ = 0x0100u,
+ UPROPS_MASK_Cf_ZWNJ = 0x0200u
};
+HB_MARK_AS_FLAG_T (hb_unicode_props_flags_t);
static inline void
-_hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_unicode_funcs_t *unicode)
+_hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer)
{
- /* XXX This shouldn't be inlined, or at least not while is_default_ignorable() is inline. */
- info->unicode_props0() = ((unsigned int) unicode->general_category (info->codepoint)) |
- (unicode->is_default_ignorable (info->codepoint) ? MASK0_IGNORABLE : 0) |
- (info->codepoint == 0x200Cu ? MASK0_ZWNJ : 0) |
- (info->codepoint == 0x200Du ? MASK0_ZWJ : 0);
- info->unicode_props1() = unicode->modified_combining_class (info->codepoint);
+ hb_unicode_funcs_t *unicode = buffer->unicode;
+ unsigned int u = info->codepoint;
+ unsigned int gen_cat = (unsigned int) unicode->general_category (u);
+ unsigned int props = gen_cat;
+
+ if (u >= 0x80)
+ {
+ buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII;
+ if (unlikely (unicode->is_default_ignorable (u)))
+ {
+ buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES;
+ props |= UPROPS_MASK_IGNORABLE;
+ if (u == 0x200Cu) props |= UPROPS_MASK_Cf_ZWNJ;
+ if (u == 0x200Du) props |= UPROPS_MASK_Cf_ZWJ;
+ /* Mongolian Free Variation Selectors need to be remembered
+ * because although we need to hide them like default-ignorables,
+ * they need to non-ignorable during shaping. This is similar to
+ * what we do for joiners in Indic-like shapers, but since the
+ * FVSes are GC=Mn, we have use a separate bit to remember them.
+ * Fixes:
+ * https://github.com/behdad/harfbuzz/issues/234
+ */
+ if (unlikely (hb_in_range (u, 0x180Bu, 0x180Du))) props |= UPROPS_MASK_FVS;
+ }
+ else if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL (gen_cat)))
+ {
+ /* The above check is just an optimization to let in only things we need further
+ * processing on. */
+
+ /* Only Mn and Mc can have non-zero ccc:
+ * http://www.unicode.org/policies/stability_policy.html#Property_Value
+ * """
+ * Canonical_Combining_Class, General_Category
+ * All characters other than those with General_Category property values
+ * Spacing_Mark (Mc) and Nonspacing_Mark (Mn) have the Canonical_Combining_Class
+ * property value 0.
+ * 1.1.5+
+ * """
+ *
+ * Also, all Mn's that are Default_Ignorable, have ccc=0, hence
+ * the "else if".
+ */
+ props |= unicode->modified_combining_class (info->codepoint)<<8;
+
+ /* Recategorize emoji skin-tone modifiers as Unicode mark, so they
+ * behave correctly in non-native directionality. They originally
+ * are MODIFIER_SYMBOL. Fixes:
+ * https://github.com/behdad/harfbuzz/issues/169
+ */
+ if (unlikely (hb_in_range (u, 0x1F3FBu, 0x1F3FFu)))
+ {
+ props = gen_cat = HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK;
+ }
+ }
+ }
+
+ info->unicode_props() = props;
}
static inline void
_hb_glyph_info_set_general_category (hb_glyph_info_t *info,
hb_unicode_general_category_t gen_cat)
{
- info->unicode_props0() = (unsigned int) gen_cat | ((info->unicode_props0()) & ~MASK0_GEN_CAT);
+ /* Clears top-byte. */
+ info->unicode_props() = (unsigned int) gen_cat | (info->unicode_props() & (0xFF & ~UPROPS_MASK_GEN_CAT));
}
static inline hb_unicode_general_category_t
_hb_glyph_info_get_general_category (const hb_glyph_info_t *info)
{
- return (hb_unicode_general_category_t) (info->unicode_props0() & MASK0_GEN_CAT);
+ return (hb_unicode_general_category_t) (info->unicode_props() & UPROPS_MASK_GEN_CAT);
}
+static inline bool
+_hb_glyph_info_is_unicode_mark (const hb_glyph_info_t *info)
+{
+ return HB_UNICODE_GENERAL_CATEGORY_IS_MARK (info->unicode_props() & UPROPS_MASK_GEN_CAT);
+}
static inline void
_hb_glyph_info_set_modified_combining_class (hb_glyph_info_t *info,
unsigned int modified_class)
{
- info->unicode_props1() = modified_class;
+ if (unlikely (!_hb_glyph_info_is_unicode_mark (info)))
+ return;
+ info->unicode_props() = (modified_class<<8) | (info->unicode_props() & 0xFF);
}
-
static inline unsigned int
_hb_glyph_info_get_modified_combining_class (const hb_glyph_info_t *info)
{
- return info->unicode_props1();
+ return _hb_glyph_info_is_unicode_mark (info) ? info->unicode_props()>>8 : 0;
+}
+
+static inline bool
+_hb_glyph_info_is_unicode_space (const hb_glyph_info_t *info)
+{
+ return _hb_glyph_info_get_general_category (info) ==
+ HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR;
+}
+static inline void
+_hb_glyph_info_set_unicode_space_fallback_type (hb_glyph_info_t *info, hb_unicode_funcs_t::space_t s)
+{
+ if (unlikely (!_hb_glyph_info_is_unicode_space (info)))
+ return;
+ info->unicode_props() = (((unsigned int) s)<<8) | (info->unicode_props() & 0xFF);
+}
+static inline hb_unicode_funcs_t::space_t
+_hb_glyph_info_get_unicode_space_fallback_type (const hb_glyph_info_t *info)
+{
+ return _hb_glyph_info_is_unicode_space (info) ?
+ (hb_unicode_funcs_t::space_t) (info->unicode_props()>>8) :
+ hb_unicode_funcs_t::NOT_SPACE;
}
static inline bool _hb_glyph_info_ligated (const hb_glyph_info_t *info);
@@ -263,25 +360,44 @@
static inline hb_bool_t
_hb_glyph_info_is_default_ignorable (const hb_glyph_info_t *info)
{
- return (info->unicode_props0() & MASK0_IGNORABLE) && !_hb_glyph_info_ligated (info);
+ return (info->unicode_props() & UPROPS_MASK_IGNORABLE) &&
+ !_hb_glyph_info_ligated (info);
+}
+static inline hb_bool_t
+_hb_glyph_info_is_default_ignorable_and_not_fvs (const hb_glyph_info_t *info)
+{
+ return ((info->unicode_props() & (UPROPS_MASK_IGNORABLE|UPROPS_MASK_FVS))
+ == UPROPS_MASK_IGNORABLE) &&
+ !_hb_glyph_info_ligated (info);
}
+static inline bool
+_hb_glyph_info_is_unicode_format (const hb_glyph_info_t *info)
+{
+ return _hb_glyph_info_get_general_category (info) ==
+ HB_UNICODE_GENERAL_CATEGORY_FORMAT;
+}
static inline hb_bool_t
_hb_glyph_info_is_zwnj (const hb_glyph_info_t *info)
{
- return !!(info->unicode_props0() & MASK0_ZWNJ);
+ return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWNJ);
}
-
static inline hb_bool_t
_hb_glyph_info_is_zwj (const hb_glyph_info_t *info)
{
- return !!(info->unicode_props0() & MASK0_ZWJ);
+ return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWJ);
}
-
+static inline hb_bool_t
+_hb_glyph_info_is_joiner (const hb_glyph_info_t *info)
+{
+ return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & (UPROPS_MASK_Cf_ZWNJ|UPROPS_MASK_Cf_ZWJ));
+}
static inline void
_hb_glyph_info_flip_joiners (hb_glyph_info_t *info)
{
- info->unicode_props0() ^= MASK0_ZWNJ | MASK0_ZWJ;
+ if (!_hb_glyph_info_is_unicode_format (info))
+ return;
+ info->unicode_props() ^= UPROPS_MASK_Cf_ZWNJ | UPROPS_MASK_Cf_ZWJ;
}
/* lig_props: aka lig_id / lig_comp
@@ -442,11 +558,9 @@
}
static inline void
-_hb_glyph_info_clear_substituted_and_ligated_and_multiplied (hb_glyph_info_t *info)
+_hb_glyph_info_clear_substituted (hb_glyph_info_t *info)
{
- info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED |
- HB_OT_LAYOUT_GLYPH_PROPS_LIGATED |
- HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED);
+ info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED);
}
@@ -455,22 +569,19 @@
static inline void
_hb_buffer_allocate_unicode_vars (hb_buffer_t *buffer)
{
- HB_BUFFER_ALLOCATE_VAR (buffer, unicode_props0);
- HB_BUFFER_ALLOCATE_VAR (buffer, unicode_props1);
+ HB_BUFFER_ALLOCATE_VAR (buffer, unicode_props);
}
static inline void
_hb_buffer_deallocate_unicode_vars (hb_buffer_t *buffer)
{
- HB_BUFFER_DEALLOCATE_VAR (buffer, unicode_props0);
- HB_BUFFER_DEALLOCATE_VAR (buffer, unicode_props1);
+ HB_BUFFER_DEALLOCATE_VAR (buffer, unicode_props);
}
static inline void
_hb_buffer_assert_unicode_vars (hb_buffer_t *buffer)
{
- HB_BUFFER_ASSERT_VAR (buffer, unicode_props0);
- HB_BUFFER_ASSERT_VAR (buffer, unicode_props1);
+ HB_BUFFER_ASSERT_VAR (buffer, unicode_props);
}
static inline void
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.cc Fri Aug 26 10:14:15 2016 -0700
@@ -60,6 +60,80 @@
layout->gpos_blob = OT::Sanitizer<OT::GPOS>::sanitize (face->reference_table (HB_OT_TAG_GPOS));
layout->gpos = OT::Sanitizer<OT::GPOS>::lock_instance (layout->gpos_blob);
+ {
+ /*
+ * The ugly business of blacklisting individual fonts' tables happen here!
+ * See this thread for why we finally had to bend in and do this:
+ * https://lists.freedesktop.org/archives/harfbuzz/2016-February/005489.html
+ */
+ unsigned int gdef_len = hb_blob_get_length (layout->gdef_blob);
+ unsigned int gsub_len = hb_blob_get_length (layout->gsub_blob);
+ unsigned int gpos_len = hb_blob_get_length (layout->gpos_blob);
+ if (0
+ /* sha1sum:c5ee92f0bca4bfb7d06c4d03e8cf9f9cf75d2e8a Windows 7? timesi.ttf */
+ || (442 == gdef_len && 42038 == gpos_len && 2874 == gsub_len)
+ /* sha1sum:37fc8c16a0894ab7b749e35579856c73c840867b Windows 7? timesbi.ttf */
+ || (430 == gdef_len && 40662 == gpos_len && 2874 == gsub_len)
+ /* sha1sum:19fc45110ea6cd3cdd0a5faca256a3797a069a80 Windows 7 timesi.ttf */
+ || (442 == gdef_len && 39116 == gpos_len && 2874 == gsub_len)
+ /* sha1sum:6d2d3c9ed5b7de87bc84eae0df95ee5232ecde26 Windows 7 timesbi.ttf */
+ || (430 == gdef_len && 39374 == gpos_len && 2874 == gsub_len)
+ /* sha1sum:8583225a8b49667c077b3525333f84af08c6bcd8 OS X 10.11.3 Times New Roman Italic.ttf */
+ || (490 == gdef_len && 41638 == gpos_len && 3046 == gsub_len)
+ /* sha1sum:ec0f5a8751845355b7c3271d11f9918a966cb8c9 OS X 10.11.3 Times New Roman Bold Italic.ttf */
+ || (478 == gdef_len && 41902 == gpos_len && 3046 == gsub_len)
+ )
+ {
+ /* In certain versions of Times New Roman Italic and Bold Italic,
+ * ASCII double quotation mark U+0022, mapped to glyph 5, has wrong
+ * glyph class 3 (mark) in GDEF. Nuke the GDEF to avoid zero-width
+ * double-quote. See:
+ * https://lists.freedesktop.org/archives/harfbuzz/2016-February/005489.html
+ */
+ if (3 == layout->gdef->get_glyph_class (5))
+ layout->gdef = &OT::Null(OT::GDEF);
+ }
+ else if (0
+ /* sha1sum:96eda93f7d33e79962451c6c39a6b51ee893ce8c tahoma.ttf from Windows 8 */
+ || (898 == gdef_len && 46470 == gpos_len && 12554 == gsub_len)
+ /* sha1sum:20928dc06014e0cd120b6fc942d0c3b1a46ac2bc tahomabd.ttf from Windows 8 */
+ || (910 == gdef_len && 47732 == gpos_len && 12566 == gsub_len)
+ /* sha1sum:4f95b7e4878f60fa3a39ca269618dfde9721a79e tahoma.ttf from Windows 8.1 */
+ || (928 == gdef_len && 59332 == gpos_len && 23298 == gsub_len)
+ /* sha1sum:6d400781948517c3c0441ba42acb309584b73033 tahomabd.ttf from Windows 8.1 */
+ || (940 == gdef_len && 60732 == gpos_len && 23310 == gsub_len)
+ /* sha1sum:e55fa2dfe957a9f7ec26be516a0e30b0c925f846 tahoma.ttf from Windows 10 */
+ || (994 == gdef_len && 60336 == gpos_len && 24474 == gsub_len)
+ /* sha1sum:7199385abb4c2cc81c83a151a7599b6368e92343 tahomabd.ttf from Windows 10 */
+ || (1006 == gdef_len && 61740 == gpos_len && 24470 == gsub_len)
+ /* sha1sum:b0d36cf5a2fbe746a3dd277bffc6756a820807a7 Tahoma.ttf from Mac OS X 10.9 */
+ || (832 == gdef_len && 47162 == gpos_len && 7324 == gsub_len)
+ /* sha1sum:12fc4538e84d461771b30c18b5eb6bd434e30fba Tahoma Bold.ttf from Mac OS X 10.9 */
+ || (844 == gdef_len && 45474 == gpos_len && 7302 == gsub_len)
+ /* sha1sum:73da7f025b238a3f737aa1fde22577a6370f77b0 himalaya.ttf from Windows 8 */
+ || (192 == gdef_len && 7254 == gpos_len && 12638 == gsub_len)
+ /* sha1sum:6e80fd1c0b059bbee49272401583160dc1e6a427 himalaya.ttf from Windows 8.1 */
+ || (192 == gdef_len && 7254 == gpos_len && 12690 == gsub_len)
+ /* 8d9267aea9cd2c852ecfb9f12a6e834bfaeafe44 cantarell-fonts-0.0.21/otf/Cantarell-Regular.otf */
+ /* 983988ff7b47439ab79aeaf9a45bd4a2c5b9d371 cantarell-fonts-0.0.21/otf/Cantarell-Oblique.otf */
+ || (188 == gdef_len && 3852 == gpos_len && 248 == gsub_len)
+ /* 2c0c90c6f6087ffbfea76589c93113a9cbb0e75f cantarell-fonts-0.0.21/otf/Cantarell-Bold.otf */
+ /* 55461f5b853c6da88069ffcdf7f4dd3f8d7e3e6b cantarell-fonts-0.0.21/otf/Cantarell-Bold-Oblique.otf */
+ || (188 == gdef_len && 3426 == gpos_len && 264 == gsub_len)
+ )
+ {
+ /* Many versions of Tahoma have bad GDEF tables that incorrectly classify some spacing marks
+ * such as certain IPA symbols as glyph class 3. So do older versions of Microsoft Himalaya,
+ * and the version of Cantarell shipped by Ubuntu 16.04.
+ * Nuke the GDEF tables of these fonts to avoid unwanted width-zeroing.
+ * See https://bugzilla.mozilla.org/show_bug.cgi?id=1279925
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=1279693
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=1279875
+ */
+ layout->gdef = &OT::Null(OT::GDEF);
+ }
+ }
+
layout->gsub_lookup_count = layout->gsub->get_lookup_count ();
layout->gpos_lookup_count = layout->gpos->get_lookup_count ();
@@ -130,6 +204,8 @@
}
/**
+ * hb_ot_layout_get_glyph_class:
+ *
* Since: 0.9.7
**/
hb_ot_layout_glyph_class_t
@@ -140,6 +216,8 @@
}
/**
+ * hb_ot_layout_get_glyphs_in_class:
+ *
* Since: 0.9.7
**/
void
@@ -365,6 +443,8 @@
}
/**
+ * hb_ot_layout_language_get_required_feature:
+ *
* Since: 0.9.30
**/
hb_bool_t
@@ -452,6 +532,8 @@
}
/**
+ * hb_ot_layout_feature_get_lookups:
+ *
* Since: 0.9.7
**/
unsigned int
@@ -469,6 +551,8 @@
}
/**
+ * hb_ot_layout_table_get_lookup_count:
+ *
* Since: 0.9.22
**/
unsigned int
@@ -629,6 +713,8 @@
}
/**
+ * hb_ot_layout_collect_lookups:
+ *
* Since: 0.9.8
**/
void
@@ -673,6 +759,8 @@
}
/**
+ * hb_ot_layout_lookup_collect_glyphs:
+ *
* Since: 0.9.7
**/
void
@@ -721,6 +809,8 @@
}
/**
+ * hb_ot_layout_lookup_would_substitute:
+ *
* Since: 0.9.7
**/
hb_bool_t
@@ -742,7 +832,7 @@
hb_bool_t zero_context)
{
if (unlikely (lookup_index >= hb_ot_layout_from_face (face)->gsub_lookup_count)) return false;
- OT::hb_would_apply_context_t c (face, glyphs, glyphs_length, zero_context);
+ OT::hb_would_apply_context_t c (face, glyphs, glyphs_length, (bool) zero_context);
const OT::SubstLookup& l = hb_ot_layout_from_face (face)->gsub->get_lookup (lookup_index);
@@ -755,13 +845,9 @@
OT::GSUB::substitute_start (font, buffer);
}
-void
-hb_ot_layout_substitute_finish (hb_font_t *font, hb_buffer_t *buffer)
-{
- OT::GSUB::substitute_finish (font, buffer);
-}
-
/**
+ * hb_ot_layout_lookup_substitute_closure:
+ *
* Since: 0.9.7
**/
void
@@ -793,12 +879,20 @@
}
void
-hb_ot_layout_position_finish (hb_font_t *font, hb_buffer_t *buffer)
+hb_ot_layout_position_finish_advances (hb_font_t *font, hb_buffer_t *buffer)
{
- OT::GPOS::position_finish (font, buffer);
+ OT::GPOS::position_finish_advances (font, buffer);
+}
+
+void
+hb_ot_layout_position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer)
+{
+ OT::GPOS::position_finish_offsets (font, buffer);
}
/**
+ * hb_ot_layout_get_size_params:
+ *
* Since: 0.9.10
**/
hb_bool_t
@@ -882,20 +976,79 @@
};
-template <typename Obj>
+struct hb_get_subtables_context_t :
+ OT::hb_dispatch_context_t<hb_get_subtables_context_t, hb_void_t, HB_DEBUG_APPLY>
+{
+ template <typename Type>
+ static inline bool apply_to (const void *obj, OT::hb_apply_context_t *c)
+ {
+ const Type *typed_obj = (const Type *) obj;
+ return typed_obj->apply (c);
+ }
+
+ typedef bool (*hb_apply_func_t) (const void *obj, OT::hb_apply_context_t *c);
+
+ struct hb_applicable_t
+ {
+ inline void init (const void *obj_, hb_apply_func_t apply_func_)
+ {
+ obj = obj_;
+ apply_func = apply_func_;
+ }
+
+ inline bool apply (OT::hb_apply_context_t *c) const { return apply_func (obj, c); }
+
+ private:
+ const void *obj;
+ hb_apply_func_t apply_func;
+ };
+
+ typedef hb_auto_array_t<hb_applicable_t> array_t;
+
+ /* Dispatch interface. */
+ inline const char *get_name (void) { return "GET_SUBTABLES"; }
+ template <typename T>
+ inline return_t dispatch (const T &obj)
+ {
+ hb_applicable_t *entry = array.push();
+ if (likely (entry))
+ entry->init (&obj, apply_to<T>);
+ return HB_VOID;
+ }
+ static return_t default_return_value (void) { return HB_VOID; }
+ bool stop_sublookup_iteration (return_t r HB_UNUSED) const { return false; }
+
+ hb_get_subtables_context_t (array_t &array_) :
+ array (array_),
+ debug_depth (0) {}
+
+ array_t &array;
+ unsigned int debug_depth;
+};
+
static inline bool
apply_forward (OT::hb_apply_context_t *c,
- const Obj &obj,
- const hb_ot_layout_lookup_accelerator_t &accel)
+ const hb_ot_layout_lookup_accelerator_t &accel,
+ const hb_get_subtables_context_t::array_t &subtables)
{
bool ret = false;
hb_buffer_t *buffer = c->buffer;
- while (buffer->idx < buffer->len)
+ while (buffer->idx < buffer->len && !buffer->in_error)
{
+ bool applied = false;
if (accel.may_have (buffer->cur().codepoint) &&
(buffer->cur().mask & c->lookup_mask) &&
- c->check_glyph_property (&buffer->cur(), c->lookup_props) &&
- obj.apply (c))
+ c->check_glyph_property (&buffer->cur(), c->lookup_props))
+ {
+ for (unsigned int i = 0; i < subtables.len; i++)
+ if (subtables[i].apply (c))
+ {
+ applied = true;
+ break;
+ }
+ }
+
+ if (applied)
ret = true;
else
buffer->next_glyph ();
@@ -903,11 +1056,10 @@
return ret;
}
-template <typename Obj>
static inline bool
apply_backward (OT::hb_apply_context_t *c,
- const Obj &obj,
- const hb_ot_layout_lookup_accelerator_t &accel)
+ const hb_ot_layout_lookup_accelerator_t &accel,
+ const hb_get_subtables_context_t::array_t &subtables)
{
bool ret = false;
hb_buffer_t *buffer = c->buffer;
@@ -915,9 +1067,15 @@
{
if (accel.may_have (buffer->cur().codepoint) &&
(buffer->cur().mask & c->lookup_mask) &&
- c->check_glyph_property (&buffer->cur(), c->lookup_props) &&
- obj.apply (c))
- ret = true;
+ c->check_glyph_property (&buffer->cur(), c->lookup_props))
+ {
+ for (unsigned int i = 0; i < subtables.len; i++)
+ if (subtables[i].apply (c))
+ {
+ ret = true;
+ break;
+ }
+ }
/* The reverse lookup doesn't "advance" cursor (for good reason). */
buffer->idx--;
@@ -926,26 +1084,6 @@
return ret;
}
-struct hb_apply_forward_context_t :
- OT::hb_dispatch_context_t<hb_apply_forward_context_t, bool, HB_DEBUG_APPLY>
-{
- inline const char *get_name (void) { return "APPLY_FWD"; }
- template <typename T>
- inline return_t dispatch (const T &obj) { return apply_forward (c, obj, accel); }
- static return_t default_return_value (void) { return false; }
- bool stop_sublookup_iteration (return_t r HB_UNUSED) const { return true; }
-
- hb_apply_forward_context_t (OT::hb_apply_context_t *c_,
- const hb_ot_layout_lookup_accelerator_t &accel_) :
- c (c_),
- accel (accel_),
- debug_depth (0) {}
-
- OT::hb_apply_context_t *c;
- const hb_ot_layout_lookup_accelerator_t &accel;
- unsigned int debug_depth;
-};
-
template <typename Proxy>
static inline void
apply_string (OT::hb_apply_context_t *c,
@@ -959,6 +1097,10 @@
c->set_lookup_props (lookup.get_props ());
+ hb_get_subtables_context_t::array_t subtables;
+ hb_get_subtables_context_t c_get_subtables (subtables);
+ lookup.dispatch (&c_get_subtables);
+
if (likely (!lookup.is_reverse ()))
{
/* in/out forward substitution/positioning */
@@ -967,13 +1109,7 @@
buffer->idx = 0;
bool ret;
- if (lookup.get_subtable_count () == 1)
- {
- hb_apply_forward_context_t c_forward (c, accel);
- ret = lookup.dispatch (&c_forward);
- }
- else
- ret = apply_forward (c, lookup, accel);
+ ret = apply_forward (c, accel, subtables);
if (ret)
{
if (!Proxy::inplace)
@@ -989,7 +1125,7 @@
buffer->remove_output ();
buffer->idx = buffer->len - 1;
- apply_backward (c, lookup, accel);
+ apply_backward (c, accel, subtables);
}
}
@@ -1008,25 +1144,15 @@
const stage_map_t *stage = &stages[table_index][stage_index];
for (; i < stage->last_lookup; i++)
{
-#if 0
- char buf[4096];
- hb_buffer_serialize_glyphs (buffer, 0, buffer->len,
- buf, sizeof (buf), NULL,
- font,
- HB_BUFFER_SERIALIZE_FORMAT_TEXT,
- Proxy::table_index == 0 ?
- HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS :
- HB_BUFFER_SERIALIZE_FLAG_DEFAULT);
- printf ("buf: [%s]\n", buf);
-#endif
-
unsigned int lookup_index = lookups[table_index][i].index;
+ if (!buffer->message (font, "start lookup %d", lookup_index)) continue;
c.set_lookup_index (lookup_index);
c.set_lookup_mask (lookups[table_index][i].mask);
c.set_auto_zwj (lookups[table_index][i].auto_zwj);
apply_string<Proxy> (&c,
proxy.table.get_lookup (lookup_index),
proxy.accels[lookup_index]);
+ (void) buffer->message (font, "end lookup %d", lookup_index);
}
if (stage->pause_func)
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.h Fri Aug 26 10:14:15 2016 -0700
@@ -48,7 +48,7 @@
* GDEF
*/
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_has_glyph_classes (hb_face_t *face);
typedef enum {
@@ -59,11 +59,11 @@
HB_OT_LAYOUT_GLYPH_CLASS_COMPONENT = 4
} hb_ot_layout_glyph_class_t;
-hb_ot_layout_glyph_class_t
+HB_EXTERN hb_ot_layout_glyph_class_t
hb_ot_layout_get_glyph_class (hb_face_t *face,
hb_codepoint_t glyph);
-void
+HB_EXTERN void
hb_ot_layout_get_glyphs_in_class (hb_face_t *face,
hb_ot_layout_glyph_class_t klass,
hb_set_t *glyphs /* OUT */);
@@ -71,7 +71,7 @@
/* Not that useful. Provides list of attach points for a glyph that a
* client may want to cache */
-unsigned int
+HB_EXTERN unsigned int
hb_ot_layout_get_attach_points (hb_face_t *face,
hb_codepoint_t glyph,
unsigned int start_offset,
@@ -79,7 +79,7 @@
unsigned int *point_array /* OUT */);
/* Ligature caret positions */
-unsigned int
+HB_EXTERN unsigned int
hb_ot_layout_get_ligature_carets (hb_font_t *font,
hb_direction_t direction,
hb_codepoint_t glyph,
@@ -96,35 +96,35 @@
#define HB_OT_LAYOUT_NO_FEATURE_INDEX 0xFFFFu
#define HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX 0xFFFFu
-unsigned int
+HB_EXTERN unsigned int
hb_ot_layout_table_get_script_tags (hb_face_t *face,
hb_tag_t table_tag,
unsigned int start_offset,
unsigned int *script_count /* IN/OUT */,
hb_tag_t *script_tags /* OUT */);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_table_find_script (hb_face_t *face,
hb_tag_t table_tag,
hb_tag_t script_tag,
unsigned int *script_index);
/* Like find_script, but takes zero-terminated array of scripts to test */
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_table_choose_script (hb_face_t *face,
hb_tag_t table_tag,
const hb_tag_t *script_tags,
unsigned int *script_index,
hb_tag_t *chosen_script);
-unsigned int
+HB_EXTERN unsigned int
hb_ot_layout_table_get_feature_tags (hb_face_t *face,
hb_tag_t table_tag,
unsigned int start_offset,
unsigned int *feature_count /* IN/OUT */,
hb_tag_t *feature_tags /* OUT */);
-unsigned int
+HB_EXTERN unsigned int
hb_ot_layout_script_get_language_tags (hb_face_t *face,
hb_tag_t table_tag,
unsigned int script_index,
@@ -132,21 +132,21 @@
unsigned int *language_count /* IN/OUT */,
hb_tag_t *language_tags /* OUT */);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_script_find_language (hb_face_t *face,
hb_tag_t table_tag,
unsigned int script_index,
hb_tag_t language_tag,
unsigned int *language_index);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_language_get_required_feature_index (hb_face_t *face,
hb_tag_t table_tag,
unsigned int script_index,
unsigned int language_index,
unsigned int *feature_index);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_language_get_required_feature (hb_face_t *face,
hb_tag_t table_tag,
unsigned int script_index,
@@ -154,7 +154,7 @@
unsigned int *feature_index,
hb_tag_t *feature_tag);
-unsigned int
+HB_EXTERN unsigned int
hb_ot_layout_language_get_feature_indexes (hb_face_t *face,
hb_tag_t table_tag,
unsigned int script_index,
@@ -163,7 +163,7 @@
unsigned int *feature_count /* IN/OUT */,
unsigned int *feature_indexes /* OUT */);
-unsigned int
+HB_EXTERN unsigned int
hb_ot_layout_language_get_feature_tags (hb_face_t *face,
hb_tag_t table_tag,
unsigned int script_index,
@@ -172,7 +172,7 @@
unsigned int *feature_count /* IN/OUT */,
hb_tag_t *feature_tags /* OUT */);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_language_find_feature (hb_face_t *face,
hb_tag_t table_tag,
unsigned int script_index,
@@ -180,7 +180,7 @@
hb_tag_t feature_tag,
unsigned int *feature_index);
-unsigned int
+HB_EXTERN unsigned int
hb_ot_layout_feature_get_lookups (hb_face_t *face,
hb_tag_t table_tag,
unsigned int feature_index,
@@ -188,12 +188,12 @@
unsigned int *lookup_count /* IN/OUT */,
unsigned int *lookup_indexes /* OUT */);
-unsigned int
+HB_EXTERN unsigned int
hb_ot_layout_table_get_lookup_count (hb_face_t *face,
hb_tag_t table_tag);
-void
+HB_EXTERN void
hb_ot_layout_collect_lookups (hb_face_t *face,
hb_tag_t table_tag,
const hb_tag_t *scripts,
@@ -201,7 +201,7 @@
const hb_tag_t *features,
hb_set_t *lookup_indexes /* OUT */);
-void
+HB_EXTERN void
hb_ot_layout_lookup_collect_glyphs (hb_face_t *face,
hb_tag_t table_tag,
unsigned int lookup_index,
@@ -228,7 +228,7 @@
const hb_ot_layout_glyph_sequence_t *sequence,
void *user_data);
-void
+HB_EXTERN void
Xhb_ot_layout_lookup_enumerate_sequences (hb_face_t *face,
hb_tag_t table_tag,
unsigned int lookup_index,
@@ -241,17 +241,17 @@
* GSUB
*/
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_has_substitution (hb_face_t *face);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_lookup_would_substitute (hb_face_t *face,
unsigned int lookup_index,
const hb_codepoint_t *glyphs,
unsigned int glyphs_length,
hb_bool_t zero_context);
-void
+HB_EXTERN void
hb_ot_layout_lookup_substitute_closure (hb_face_t *face,
unsigned int lookup_index,
hb_set_t *glyphs
@@ -259,7 +259,7 @@
#ifdef HB_NOT_IMPLEMENTED
/* Note: You better have GDEF when using this API, or marks won't do much. */
-hb_bool_t
+HB_EXTERN hb_bool_t
Xhb_ot_layout_lookup_substitute (hb_font_t *font,
unsigned int lookup_index,
const hb_ot_layout_glyph_sequence_t *sequence,
@@ -274,12 +274,12 @@
* GPOS
*/
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_has_positioning (hb_face_t *face);
#ifdef HB_NOT_IMPLEMENTED
/* Note: You better have GDEF when using this API, or marks won't do much. */
-hb_bool_t
+HB_EXTERN hb_bool_t
Xhb_ot_layout_lookup_position (hb_font_t *font,
unsigned int lookup_index,
const hb_ot_layout_glyph_sequence_t *sequence,
@@ -288,7 +288,7 @@
/* Optical 'size' feature info. Returns true if found.
* http://www.microsoft.com/typography/otspec/features_pt.htm#size */
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_get_size_params (hb_face_t *face,
unsigned int *design_size, /* OUT. May be NULL */
unsigned int *subfamily_id, /* OUT. May be NULL */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map-private.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map-private.hh Fri Aug 26 10:14:15 2016 -0700
@@ -159,23 +159,9 @@
F_MANUAL_ZWJ = 0x0004u, /* Don't skip over ZWJ when matching. */
F_GLOBAL_SEARCH = 0x0008u /* If feature not found in LangSys, look for it in global feature list and pick one. */
};
+HB_MARK_AS_FLAG_T (hb_ot_map_feature_flags_t);
/* Macro version for where const is desired. */
#define F_COMBINE(l,r) (hb_ot_map_feature_flags_t ((unsigned int) (l) | (unsigned int) (r)))
-static inline hb_ot_map_feature_flags_t
-operator | (hb_ot_map_feature_flags_t l, hb_ot_map_feature_flags_t r)
-{ return hb_ot_map_feature_flags_t ((unsigned int) l | (unsigned int) r); }
-static inline hb_ot_map_feature_flags_t
-operator & (hb_ot_map_feature_flags_t l, hb_ot_map_feature_flags_t r)
-{ return hb_ot_map_feature_flags_t ((unsigned int) l & (unsigned int) r); }
-static inline hb_ot_map_feature_flags_t
-operator ~ (hb_ot_map_feature_flags_t r)
-{ return hb_ot_map_feature_flags_t (~(unsigned int) r); }
-static inline hb_ot_map_feature_flags_t&
-operator |= (hb_ot_map_feature_flags_t &l, hb_ot_map_feature_flags_t r)
-{ l = l | r; return l; }
-static inline hb_ot_map_feature_flags_t&
-operator &= (hb_ot_map_feature_flags_t& l, hb_ot_map_feature_flags_t r)
-{ l = l & r; return l; }
struct hb_ot_map_builder_t
@@ -217,7 +203,8 @@
unsigned int stage[2]; /* GSUB/GPOS */
static int cmp (const feature_info_t *a, const feature_info_t *b)
- { return (a->tag != b->tag) ? (a->tag < b->tag ? -1 : 1) : (a->seq < b->seq ? -1 : 1); }
+ { return (a->tag != b->tag) ? (a->tag < b->tag ? -1 : 1) :
+ (a->seq < b->seq ? -1 : a->seq > b->seq ? 1 : 0); }
};
struct stage_info_t {
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map.cc Fri Aug 26 10:14:15 2016 -0700
@@ -89,7 +89,7 @@
for (unsigned int table_index = 0; table_index < 2; table_index++) {
hb_tag_t table_tag = table_tags[table_index];
- found_script[table_index] = hb_ot_layout_table_choose_script (face, table_tag, script_tags, &script_index[table_index], &chosen_script[table_index]);
+ found_script[table_index] = (bool) hb_ot_layout_table_choose_script (face, table_tag, script_tags, &script_index[table_index], &chosen_script[table_index]);
hb_ot_layout_script_find_language (face, table_tag, script_index[table_index], language_tag, &language_index[table_index]);
}
}
@@ -204,11 +204,8 @@
for (unsigned int table_index = 0; table_index < 2; table_index++)
{
if (required_feature_tag[table_index] == info->tag)
- {
required_feature_stage[table_index] = info->stage[table_index];
- found = true;
- continue;
- }
+
found |= hb_ot_layout_language_find_feature (face,
table_tags[table_index],
script_index[table_index],
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-maxp-table.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-maxp-table.hh Fri Aug 26 10:14:15 2016 -0700
@@ -58,7 +58,7 @@
/* We only implement version 0.5 as none of the extra fields in version 1.0 are useful. */
protected:
- FixedVersion version; /* Version of the maxp table (0.5 or 1.0),
+ FixedVersion<>version; /* Version of the maxp table (0.5 or 1.0),
* 0x00005000u or 0x00010000u. */
USHORT numGlyphs; /* The number of glyphs in the font. */
public:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-os2-table.hh Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,105 @@
+/*
+ * Copyright © 2011,2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_OS2_TABLE_HH
+#define HB_OT_OS2_TABLE_HH
+
+#include "hb-open-type-private.hh"
+
+
+namespace OT {
+
+/*
+ * OS/2 and Windows Metrics
+ * http://www.microsoft.com/typography/otspec/os2.htm
+ */
+
+#define HB_OT_TAG_os2 HB_TAG('O','S','/','2')
+
+struct os2
+{
+ static const hb_tag_t tableTag = HB_OT_TAG_os2;
+
+ inline bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ public:
+ USHORT version;
+
+ /* Version 0 */
+ SHORT xAvgCharWidth;
+ USHORT usWeightClass;
+ USHORT usWidthClass;
+ USHORT fsType;
+ SHORT ySubscriptXSize;
+ SHORT ySubscriptYSize;
+ SHORT ySubscriptXOffset;
+ SHORT ySubscriptYOffset;
+ SHORT ySuperscriptXSize;
+ SHORT ySuperscriptYSize;
+ SHORT ySuperscriptXOffset;
+ SHORT ySuperscriptYOffset;
+ SHORT yStrikeoutSize;
+ SHORT yStrikeoutPosition;
+ SHORT sFamilyClass;
+ BYTE panose[10];
+ ULONG ulUnicodeRange[4];
+ Tag achVendID;
+ USHORT fsSelection;
+ USHORT usFirstCharIndex;
+ USHORT usLastCharIndex;
+ SHORT sTypoAscender;
+ SHORT sTypoDescender;
+ SHORT sTypoLineGap;
+ USHORT usWinAscent;
+ USHORT usWinDescent;
+
+ /* Version 1 */
+ //ULONG ulCodePageRange1;
+ //ULONG ulCodePageRange2;
+
+ /* Version 2 */
+ //SHORT sxHeight;
+ //SHORT sCapHeight;
+ //USHORT usDefaultChar;
+ //USHORT usBreakChar;
+ //USHORT usMaxContext;
+
+ /* Version 5 */
+ //USHORT usLowerOpticalPointSize;
+ //USHORT usUpperOpticalPointSize;
+
+ public:
+ DEFINE_SIZE_STATIC (78);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_OS2_TABLE_HH */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic-table.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic-table.hh Fri Aug 26 10:14:15 2016 -0700
@@ -6,10 +6,10 @@
*
* on files with these headers:
*
- * # ArabicShaping-8.0.0.txt
- * # Date: 2015-02-17, 23:33:00 GMT [RP]
- * # Blocks-8.0.0.txt
- * # Date: 2014-11-10, 23:04:00 GMT [KW]
+ * # ArabicShaping-9.0.0.txt
+ * # Date: 2016-02-24, 22:25:00 GMT [RP]
+ * # Blocks-9.0.0.txt
+ * # Date: 2016-02-05, 23:48:00 GMT [KW]
* UnicodeData.txt does not have a header.
*/
@@ -19,6 +19,7 @@
#define X JOINING_TYPE_X
#define R JOINING_TYPE_R
+#define T JOINING_TYPE_T
#define U JOINING_TYPE_U
#define A JOINING_GROUP_ALAPH
#define DR JOINING_GROUP_DALATH_RISH
@@ -76,9 +77,11 @@
/* Arabic Extended-A */
- /* 08A0 */ D,D,D,D,D,D,D,D,D,D,R,R,R,U,R,D,D,R,R,D,D,
+ /* 08A0 */ D,D,D,D,D,D,D,D,D,D,R,R,R,U,R,D,D,R,R,D,D,X,D,D,D,R,D,D,D,D,X,X,
+ /* 08C0 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+ /* 08E0 */ X,X,U,
-#define joining_offset_0x1806u 693
+#define joining_offset_0x1806u 739
/* Mongolian */
@@ -86,43 +89,48 @@
/* 1820 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
/* 1840 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
/* 1860 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,X,X,X,X,X,X,X,X,
- /* 1880 */ U,U,U,U,U,U,U,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
+ /* 1880 */ U,U,U,U,U,T,T,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
/* 18A0 */ D,D,D,D,D,D,D,D,D,X,D,
-#define joining_offset_0x200cu 858
+#define joining_offset_0x200cu 904
/* General Punctuation */
- /* 2000 */ U,C,
-
-#define joining_offset_0x2066u 860
+ /* 2000 */ U,C,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+ /* 2020 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,U,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+ /* 2040 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+ /* 2060 */ X,X,X,X,X,X,U,U,U,U,
- /* General Punctuation */
-
- /* 2060 */ U,U,U,U,
-
-#define joining_offset_0xa840u 864
+#define joining_offset_0xa840u 998
/* Phags-pa */
/* A840 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
/* A860 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,L,U,
-#define joining_offset_0x10ac0u 916
+#define joining_offset_0x10ac0u 1050
/* Manichaean */
/* 10AC0 */ D,D,D,D,D,R,U,R,U,R,R,U,U,L,R,R,R,R,R,D,D,D,D,L,D,D,D,D,D,R,D,D,
/* 10AE0 */ D,R,U,U,R,X,X,X,X,X,X,D,D,D,D,R,
-#define joining_offset_0x10b80u 964
+#define joining_offset_0x10b80u 1098
/* Psalter Pahlavi */
/* 10B80 */ D,R,D,R,R,R,D,D,D,R,D,D,R,D,R,R,D,R,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/* 10BA0 */ X,X,X,X,X,X,X,X,X,R,R,R,R,D,D,U,
-}; /* Table items: 1012; occupancy: 57% */
+#define joining_offset_0x1e900u 1146
+
+ /* Adlam */
+
+ /* 1E900 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
+ /* 1E920 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
+ /* 1E940 */ D,D,D,D,
+
+}; /* Table items: 1214; occupancy: 54% */
static unsigned int
@@ -131,7 +139,7 @@
switch (u >> 12)
{
case 0x0u:
- if (hb_in_range (u, 0x0600u, 0x08B4u)) return joining_table[u - 0x0600u + joining_offset_0x0600u];
+ if (hb_in_range (u, 0x0600u, 0x08E2u)) return joining_table[u - 0x0600u + joining_offset_0x0600u];
break;
case 0x1u:
@@ -139,8 +147,7 @@
break;
case 0x2u:
- if (hb_in_range (u, 0x200Cu, 0x200Du)) return joining_table[u - 0x200Cu + joining_offset_0x200cu];
- if (hb_in_range (u, 0x2066u, 0x2069u)) return joining_table[u - 0x2066u + joining_offset_0x2066u];
+ if (hb_in_range (u, 0x200Cu, 0x2069u)) return joining_table[u - 0x200Cu + joining_offset_0x200cu];
break;
case 0xAu:
@@ -152,6 +159,10 @@
if (hb_in_range (u, 0x10B80u, 0x10BAFu)) return joining_table[u - 0x10B80u + joining_offset_0x10b80u];
break;
+ case 0x1Eu:
+ if (hb_in_range (u, 0x1E900u, 0x1E943u)) return joining_table[u - 0x1E900u + joining_offset_0x1e900u];
+ break;
+
default:
break;
}
@@ -160,6 +171,7 @@
#undef X
#undef R
+#undef T
#undef U
#undef A
#undef DR
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic.cc Fri Aug 26 10:14:15 2016 -0700
@@ -28,9 +28,38 @@
#include "hb-ot-shape-private.hh"
+#ifndef HB_DEBUG_ARABIC
+#define HB_DEBUG_ARABIC (HB_DEBUG+0)
+#endif
+
+
/* buffer var allocations */
#define arabic_shaping_action() complex_var_u8_0() /* arabic shaping action */
+#define HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH HB_BUFFER_SCRATCH_FLAG_COMPLEX0
+
+/* See:
+ * https://github.com/behdad/harfbuzz/commit/6e6f82b6f3dde0fc6c3c7d991d9ec6cfff57823d#commitcomment-14248516 */
+#define HB_ARABIC_GENERAL_CATEGORY_IS_WORD(gen_cat) \
+ (FLAG_SAFE (gen_cat) & \
+ (FLAG (HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_PRIVATE_USE) | \
+ /*FLAG (HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER) |*/ \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER) | \
+ /*FLAG (HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER) |*/ \
+ /*FLAG (HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER) |*/ \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_LETTER_NUMBER) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_NUMBER) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_MATH_SYMBOL) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL)))
+
/*
* Joining types:
@@ -84,7 +113,7 @@
/* Same order as the feature array */
-enum {
+enum arabic_action_t {
ISOL,
FINA,
FIN2,
@@ -95,7 +124,11 @@
NONE,
- ARABIC_NUM_FEATURES = NONE
+ ARABIC_NUM_FEATURES = NONE,
+
+ /* We abuse the same byte for other things... */
+ STCH_FIXED,
+ STCH_REPEATING,
};
static const struct arabic_state_table_entry {
@@ -140,6 +173,11 @@
hb_buffer_t *buffer);
static void
+record_stch (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer);
+
+static void
collect_features_arabic (hb_ot_shape_planner_t *plan)
{
hb_ot_map_builder_t *map = &plan->map;
@@ -165,6 +203,9 @@
map->add_gsub_pause (nuke_joiners);
+ map->add_global_bool_feature (HB_TAG('s','t','c','h'));
+ map->add_gsub_pause (record_stch);
+
map->add_global_bool_feature (HB_TAG('c','c','m','p'));
map->add_global_bool_feature (HB_TAG('l','o','c','l'));
@@ -182,7 +223,6 @@
map->add_gsub_pause (arabic_fallback_shape);
map->add_global_bool_feature (HB_TAG('c','a','l','t'));
- map->add_gsub_pause (NULL);
/* The spec includes 'cswh'. Earlier versions of Windows
* used to enable this by default, but testing suggests
@@ -192,6 +232,7 @@
* Note that IranNastaliq uses this feature extensively
* to fixup broken glyph sequences. Oh well...
* Test case: U+0643,U+0640,U+0631. */
+ //map->add_gsub_pause (NULL);
//map->add_global_bool_feature (HB_TAG('c','s','w','h'));
map->add_global_bool_feature (HB_TAG('m','s','e','t'));
}
@@ -208,8 +249,10 @@
* mask_array[NONE] == 0. */
hb_mask_t mask_array[ARABIC_NUM_FEATURES + 1];
- bool do_fallback;
arabic_fallback_plan_t *fallback_plan;
+
+ unsigned int do_fallback : 1;
+ unsigned int has_stch : 1;
};
void *
@@ -220,6 +263,7 @@
return NULL;
arabic_plan->do_fallback = plan->props.script == HB_SCRIPT_ARABIC;
+ arabic_plan->has_stch = !!plan->map.get_1_mask (HB_TAG ('s','t','c','h'));
for (unsigned int i = 0; i < ARABIC_NUM_FEATURES; i++) {
arabic_plan->mask_array[i] = plan->map.get_1_mask (arabic_features[i]);
arabic_plan->do_fallback = arabic_plan->do_fallback &&
@@ -320,8 +364,6 @@
hb_glyph_info_t *info = buffer->info;
for (unsigned int i = 0; i < count; i++)
info[i].mask |= arabic_plan->mask_array[info[i].arabic_shaping_action()];
-
- HB_BUFFER_DEALLOCATE_VAR (buffer, arabic_shaping_action);
}
static void
@@ -371,6 +413,197 @@
arabic_fallback_plan_shape (fallback_plan, font, buffer);
}
+/*
+ * Stretch feature: "stch".
+ * See example here:
+ * https://www.microsoft.com/typography/OpenTypeDev/syriac/intro.htm
+ * We implement this in a generic way, such that the Arabic subtending
+ * marks can use it as well.
+ */
+
+static void
+record_stch (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer)
+{
+ const arabic_shape_plan_t *arabic_plan = (const arabic_shape_plan_t *) plan->data;
+ if (!arabic_plan->has_stch)
+ return;
+
+ /* 'stch' feature was just applied. Look for anything that multiplied,
+ * and record it for stch treatment later. Note that rtlm, frac, etc
+ * are applied before stch, but we assume that they didn't result in
+ * anything multiplying into 5 pieces, so it's safe-ish... */
+
+ unsigned int count = buffer->len;
+ hb_glyph_info_t *info = buffer->info;
+ for (unsigned int i = 0; i < count; i++)
+ if (unlikely (_hb_glyph_info_multiplied (&info[i])))
+ {
+ unsigned int comp = _hb_glyph_info_get_lig_comp (&info[i]);
+ info[i].arabic_shaping_action() = comp % 2 ? STCH_REPEATING : STCH_FIXED;
+ buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH;
+ }
+}
+
+static void
+apply_stch (const hb_ot_shape_plan_t *plan,
+ hb_buffer_t *buffer,
+ hb_font_t *font)
+{
+ if (likely (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH)))
+ return;
+
+ /* The Arabic shaper currently always processes in RTL mode, so we should
+ * stretch / position the stretched pieces to the left / preceding glyphs. */
+
+ /* We do a two pass implementation:
+ * First pass calculates the exact number of extra glyphs we need,
+ * We then enlarge buffer to have that much room,
+ * Second pass applies the stretch, copying things to the end of buffer.
+ */
+
+ int sign = font->x_scale < 0 ? -1 : +1;
+ unsigned int extra_glyphs_needed = 0; // Set during MEASURE, used during CUT
+ typedef enum { MEASURE, CUT } step_t;
+
+ for (step_t step = MEASURE; step <= CUT; step = (step_t) (step + 1))
+ {
+ unsigned int count = buffer->len;
+ hb_glyph_info_t *info = buffer->info;
+ hb_glyph_position_t *pos = buffer->pos;
+ unsigned int new_len = count + extra_glyphs_needed; // write head during CUT
+ unsigned int j = new_len;
+ for (unsigned int i = count; i; i--)
+ {
+ if (!hb_in_range<unsigned> (info[i - 1].arabic_shaping_action(), STCH_FIXED, STCH_REPEATING))
+ {
+ if (step == CUT)
+ {
+ --j;
+ info[j] = info[i - 1];
+ pos[j] = pos[i - 1];
+ }
+ continue;
+ }
+
+ /* Yay, justification! */
+
+ hb_position_t w_total = 0; // Total to be filled
+ hb_position_t w_fixed = 0; // Sum of fixed tiles
+ hb_position_t w_repeating = 0; // Sum of repeating tiles
+ int n_fixed = 0;
+ int n_repeating = 0;
+
+ unsigned int end = i;
+ while (i &&
+ hb_in_range<unsigned> (info[i - 1].arabic_shaping_action(), STCH_FIXED, STCH_REPEATING))
+ {
+ i--;
+ hb_position_t width = font->get_glyph_h_advance (info[i].codepoint);
+ if (info[i].arabic_shaping_action() == STCH_FIXED)
+ {
+ w_fixed += width;
+ n_fixed++;
+ }
+ else
+ {
+ w_repeating += width;
+ n_repeating++;
+ }
+ }
+ unsigned int start = i;
+ unsigned int context = i;
+ while (context &&
+ !hb_in_range<unsigned> (info[context - 1].arabic_shaping_action(), STCH_FIXED, STCH_REPEATING) &&
+ (_hb_glyph_info_is_default_ignorable (&info[context - 1]) ||
+ HB_ARABIC_GENERAL_CATEGORY_IS_WORD (_hb_glyph_info_get_general_category (&info[context - 1]))))
+ {
+ context--;
+ w_total += pos[context].x_advance;
+ }
+ i++; // Don't touch i again.
+
+ DEBUG_MSG (ARABIC, NULL, "%s stretch at (%d,%d,%d)",
+ step == MEASURE ? "measuring" : "cutting", context, start, end);
+ DEBUG_MSG (ARABIC, NULL, "rest of word: count=%d width %d", start - context, w_total);
+ DEBUG_MSG (ARABIC, NULL, "fixed tiles: count=%d width=%d", n_fixed, w_fixed);
+ DEBUG_MSG (ARABIC, NULL, "repeating tiles: count=%d width=%d", n_repeating, w_repeating);
+
+ /* Number of additional times to repeat each repeating tile. */
+ int n_copies = 0;
+
+ hb_position_t w_remaining = w_total - w_fixed;
+ if (sign * w_remaining > sign * w_repeating && sign * w_repeating > 0)
+ n_copies = (sign * w_remaining) / (sign * w_repeating) - 1;
+
+ /* See if we can improve the fit by adding an extra repeat and squeezing them together a bit. */
+ hb_position_t extra_repeat_overlap = 0;
+ hb_position_t shortfall = sign * w_remaining - sign * w_repeating * (n_copies + 1);
+ if (shortfall > 0)
+ {
+ ++n_copies;
+ hb_position_t excess = (n_copies + 1) * sign * w_repeating - sign * w_remaining;
+ if (excess > 0)
+ extra_repeat_overlap = excess / (n_copies * n_repeating);
+ }
+
+ if (step == MEASURE)
+ {
+ extra_glyphs_needed += n_copies * n_repeating;
+ DEBUG_MSG (ARABIC, NULL, "will add extra %d copies of repeating tiles", n_copies);
+ }
+ else
+ {
+ hb_position_t x_offset = 0;
+ for (unsigned int k = end; k > start; k--)
+ {
+ hb_position_t width = font->get_glyph_h_advance (info[k - 1].codepoint);
+
+ unsigned int repeat = 1;
+ if (info[k - 1].arabic_shaping_action() == STCH_REPEATING)
+ repeat += n_copies;
+
+ DEBUG_MSG (ARABIC, NULL, "appending %d copies of glyph %d; j=%d",
+ repeat, info[k - 1].codepoint, j);
+ for (unsigned int n = 0; n < repeat; n++)
+ {
+ x_offset -= width;
+ if (n > 0)
+ x_offset += extra_repeat_overlap;
+ pos[k - 1].x_offset = x_offset;
+ /* Append copy. */
+ --j;
+ info[j] = info[k - 1];
+ pos[j] = pos[k - 1];
+ }
+ }
+ }
+ }
+
+ if (step == MEASURE)
+ {
+ if (unlikely (!buffer->ensure (count + extra_glyphs_needed)))
+ break;
+ }
+ else
+ {
+ assert (j == 0);
+ buffer->len = new_len;
+ }
+ }
+}
+
+
+static void
+postprocess_glyphs_arabic (const hb_ot_shape_plan_t *plan,
+ hb_buffer_t *buffer,
+ hb_font_t *font)
+{
+ apply_stch (plan, buffer, font);
+
+ HB_BUFFER_DEALLOCATE_VAR (buffer, arabic_shaping_action);
+}
const hb_ot_complex_shaper_t _hb_ot_complex_shaper_arabic =
{
@@ -379,7 +612,8 @@
NULL, /* override_features */
data_create_arabic,
data_destroy_arabic,
- NULL, /* preprocess_text_arabic */
+ NULL, /* preprocess_text */
+ postprocess_glyphs_arabic,
HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
NULL, /* decompose */
NULL, /* compose */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-default.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-default.cc Fri Aug 26 10:14:15 2016 -0700
@@ -35,10 +35,11 @@
NULL, /* data_create */
NULL, /* data_destroy */
NULL, /* preprocess_text */
+ NULL, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
NULL, /* decompose */
NULL, /* compose */
NULL, /* setup_masks */
- HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT,
+ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
true, /* fallback_position */
};
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hangul.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hangul.cc Fri Aug 26 10:14:15 2016 -0700
@@ -188,7 +188,7 @@
*/
unsigned int count = buffer->len;
- for (buffer->idx = 0; buffer->idx < count;)
+ for (buffer->idx = 0; buffer->idx < count && !buffer->in_error;)
{
hb_codepoint_t u = buffer->cur().codepoint;
@@ -411,13 +411,14 @@
"hangul",
collect_features_hangul,
override_features_hangul,
- data_create_hangul, /* data_create */
- data_destroy_hangul, /* data_destroy */
+ data_create_hangul,
+ data_destroy_hangul,
preprocess_text_hangul,
+ NULL, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_NONE,
NULL, /* decompose */
NULL, /* compose */
- setup_masks_hangul, /* setup_masks */
+ setup_masks_hangul,
HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
false, /* fallback_position */
};
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hebrew.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hebrew.cc Fri Aug 26 10:14:15 2016 -0700
@@ -68,7 +68,7 @@
0xFB4Au /* TAV */
};
- bool found = c->unicode->compose (a, b, ab);
+ bool found = (bool) c->unicode->compose (a, b, ab);
if (!found && !c->plan->has_mark)
{
@@ -163,6 +163,7 @@
NULL, /* data_create */
NULL, /* data_destroy */
NULL, /* preprocess_text */
+ NULL, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
NULL, /* decompose */
compose_hebrew,
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-machine.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-machine.hh Fri Aug 26 10:14:15 2016 -0700
@@ -56,52 +56,52 @@
5u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u,
5u, 7u, 7u, 7u, 8u, 8u, 1u, 16u, 8u, 13u, 4u, 8u, 6u, 6u, 16u, 16u,
4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u,
- 16u, 16u, 8u, 8u, 1u, 31u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u,
- 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u,
- 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u,
- 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u,
- 3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
- 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u,
- 5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u,
- 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u,
- 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u,
- 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
- 1u, 16u, 3u, 31u, 3u, 31u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u,
- 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u,
- 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u,
+ 16u, 16u, 8u, 8u, 1u, 18u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u,
+ 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u,
+ 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u,
5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u,
3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u,
- 5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u,
- 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u,
- 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u,
- 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
- 4u, 14u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u,
- 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u,
- 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u, 5u, 10u,
+ 5u, 14u, 3u, 14u, 1u, 16u, 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u,
+ 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u,
+ 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
+ 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
+ 3u, 17u, 3u, 17u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u,
+ 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u,
+ 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u,
9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u,
5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u,
4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
- 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u,
- 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u,
- 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
- 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
- 4u, 14u, 3u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u,
- 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u,
- 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u,
- 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u,
- 3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
+ 3u, 14u, 1u, 16u, 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u,
+ 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
+ 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
+ 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 1u, 16u,
+ 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u,
+ 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u,
+ 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u,
+ 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u,
+ 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
+ 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 1u, 16u,
+ 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
+ 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u,
+ 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u,
+ 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 3u, 17u, 4u, 14u,
+ 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u,
+ 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u,
+ 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u,
+ 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u,
+ 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
+ 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 1u, 16u,
+ 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
+ 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u,
+ 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u,
+ 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 1u, 17u, 3u, 17u,
+ 1u, 17u, 4u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u,
+ 5u, 10u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 3u, 17u, 3u, 17u, 1u, 16u,
3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u,
- 5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u,
- 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u,
- 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u,
- 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
- 1u, 16u, 3u, 31u, 1u, 31u, 3u, 31u, 1u, 31u, 4u, 14u, 5u, 10u, 9u, 10u,
- 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 1u, 16u, 3u, 31u, 3u, 31u,
- 4u, 31u, 3u, 31u, 3u, 31u, 1u, 16u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u,
- 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
- 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 1u, 16u, 3u, 10u, 5u, 10u,
- 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 0
+ 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u,
+ 3u, 13u, 1u, 16u, 3u, 10u, 5u, 10u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u,
+ 9u, 10u, 9u, 9u, 5u, 10u, 0
};
static const char _indic_syllable_machine_key_spans[] = {
@@ -127,52 +127,52 @@
3, 4, 3, 1, 4, 3, 1, 4,
3, 1, 1, 16, 6, 5, 1, 1,
5, 1, 1, 5, 1, 1, 5, 1,
- 1, 1, 31, 29, 29, 28, 16, 29,
- 29, 28, 16, 29, 29, 28, 16, 29,
- 29, 28, 16, 29, 29, 28, 10, 10,
- 6, 2, 1, 2, 2, 1, 6, 11,
- 8, 6, 8, 11, 12, 12, 11, 10,
- 12, 11, 10, 12, 11, 10, 12, 11,
- 10, 12, 16, 28, 11, 29, 29, 16,
- 16, 16, 16, 16, 29, 29, 16, 16,
- 16, 16, 16, 29, 29, 16, 16, 16,
- 16, 16, 29, 29, 16, 16, 16, 16,
- 16, 29, 29, 29, 29, 28, 16, 29,
- 29, 28, 16, 29, 29, 28, 16, 29,
- 29, 28, 16, 29, 29, 28, 10, 10,
+ 1, 1, 18, 15, 15, 14, 16, 15,
+ 15, 14, 16, 15, 15, 14, 16, 15,
+ 15, 14, 16, 15, 15, 14, 10, 10,
6, 2, 1, 2, 2, 1, 6, 11,
8, 6, 8, 11, 12, 12, 11, 10,
12, 11, 10, 12, 11, 10, 12, 11,
- 10, 12, 16, 28, 11, 29, 29, 16,
- 16, 16, 16, 16, 29, 29, 16, 16,
- 16, 16, 16, 29, 29, 16, 16, 16,
- 16, 16, 29, 29, 16, 16, 16, 16,
- 11, 16, 29, 29, 28, 16, 29, 29,
- 28, 16, 29, 29, 28, 16, 29, 29,
- 28, 16, 29, 29, 28, 10, 10, 6,
+ 10, 12, 16, 11, 15, 15, 16, 16,
+ 16, 16, 16, 15, 15, 16, 16, 16,
+ 16, 16, 15, 15, 16, 16, 16, 16,
+ 16, 15, 15, 16, 16, 16, 16, 16,
+ 15, 15, 15, 15, 14, 16, 15, 15,
+ 14, 16, 15, 15, 14, 16, 15, 15,
+ 14, 16, 15, 15, 14, 10, 10, 6,
2, 1, 2, 2, 1, 6, 11, 8,
6, 8, 11, 12, 12, 11, 10, 12,
11, 10, 12, 11, 10, 12, 11, 10,
- 12, 16, 28, 11, 29, 29, 16, 16,
- 16, 16, 16, 29, 29, 16, 16, 16,
- 16, 16, 29, 29, 16, 16, 16, 16,
- 16, 29, 29, 16, 16, 16, 16, 16,
- 11, 29, 11, 29, 29, 28, 16, 29,
- 29, 28, 16, 29, 29, 28, 16, 29,
- 29, 28, 16, 29, 29, 28, 10, 10,
- 6, 2, 1, 2, 2, 1, 6, 11,
- 8, 6, 8, 11, 12, 12, 11, 10,
+ 12, 16, 11, 15, 15, 16, 16, 16,
+ 16, 16, 15, 15, 16, 16, 16, 16,
+ 16, 15, 15, 16, 16, 16, 16, 16,
+ 15, 15, 16, 16, 16, 16, 11, 16,
+ 15, 15, 14, 16, 15, 15, 14, 16,
+ 15, 15, 14, 16, 15, 15, 14, 16,
+ 15, 15, 14, 10, 10, 6, 2, 1,
+ 2, 2, 1, 6, 11, 8, 6, 8,
+ 11, 12, 12, 11, 10, 12, 11, 10,
+ 12, 11, 10, 12, 11, 10, 12, 16,
+ 11, 15, 15, 16, 16, 16, 16, 16,
+ 15, 15, 16, 16, 16, 16, 16, 15,
+ 15, 16, 16, 16, 16, 16, 15, 15,
+ 16, 16, 16, 16, 16, 11, 15, 11,
+ 15, 15, 14, 16, 15, 15, 14, 16,
+ 15, 15, 14, 16, 15, 15, 14, 16,
+ 15, 15, 14, 10, 10, 6, 2, 1,
+ 2, 2, 1, 6, 11, 8, 6, 8,
+ 11, 12, 12, 11, 10, 12, 11, 10,
+ 12, 11, 10, 12, 11, 10, 12, 16,
+ 11, 15, 15, 16, 16, 16, 16, 16,
+ 15, 15, 16, 16, 16, 16, 16, 15,
+ 15, 16, 16, 16, 16, 16, 15, 15,
+ 16, 16, 16, 16, 16, 15, 17, 15,
+ 17, 11, 6, 2, 1, 2, 2, 1,
+ 6, 16, 15, 15, 14, 15, 15, 16,
12, 11, 10, 12, 11, 10, 12, 11,
- 10, 12, 16, 28, 11, 29, 29, 16,
- 16, 16, 16, 16, 29, 29, 16, 16,
- 16, 16, 16, 29, 29, 16, 16, 16,
- 16, 16, 29, 29, 16, 16, 16, 16,
- 16, 29, 31, 29, 31, 11, 6, 2,
- 1, 2, 2, 1, 6, 16, 29, 29,
- 28, 29, 29, 16, 12, 11, 10, 12,
- 11, 10, 12, 11, 10, 12, 11, 10,
- 11, 8, 6, 8, 11, 16, 8, 6,
- 6, 2, 1, 2, 2, 1, 6
+ 10, 12, 11, 10, 11, 8, 6, 8,
+ 11, 16, 8, 6, 6, 2, 1, 2,
+ 2, 1, 6
};
static const short _indic_syllable_machine_index_offsets[] = {
@@ -198,52 +198,52 @@
954, 958, 963, 967, 969, 974, 978, 980,
985, 989, 991, 993, 1010, 1017, 1023, 1025,
1027, 1033, 1035, 1037, 1043, 1045, 1047, 1053,
- 1055, 1057, 1059, 1091, 1121, 1151, 1180, 1197,
- 1227, 1257, 1286, 1303, 1333, 1363, 1392, 1409,
- 1439, 1469, 1498, 1515, 1545, 1575, 1604, 1615,
- 1626, 1633, 1636, 1638, 1641, 1644, 1646, 1653,
- 1665, 1674, 1681, 1690, 1702, 1715, 1728, 1740,
- 1751, 1764, 1776, 1787, 1800, 1812, 1823, 1836,
- 1848, 1859, 1872, 1889, 1918, 1930, 1960, 1990,
- 2007, 2024, 2041, 2058, 2075, 2105, 2135, 2152,
- 2169, 2186, 2203, 2220, 2250, 2280, 2297, 2314,
- 2331, 2348, 2365, 2395, 2425, 2442, 2459, 2476,
- 2493, 2510, 2540, 2570, 2600, 2630, 2659, 2676,
- 2706, 2736, 2765, 2782, 2812, 2842, 2871, 2888,
- 2918, 2948, 2977, 2994, 3024, 3054, 3083, 3094,
- 3105, 3112, 3115, 3117, 3120, 3123, 3125, 3132,
- 3144, 3153, 3160, 3169, 3181, 3194, 3207, 3219,
- 3230, 3243, 3255, 3266, 3279, 3291, 3302, 3315,
- 3327, 3338, 3351, 3368, 3397, 3409, 3439, 3469,
- 3486, 3503, 3520, 3537, 3554, 3584, 3614, 3631,
- 3648, 3665, 3682, 3699, 3729, 3759, 3776, 3793,
- 3810, 3827, 3844, 3874, 3904, 3921, 3938, 3955,
- 3972, 3984, 4001, 4031, 4061, 4090, 4107, 4137,
- 4167, 4196, 4213, 4243, 4273, 4302, 4319, 4349,
- 4379, 4408, 4425, 4455, 4485, 4514, 4525, 4536,
- 4543, 4546, 4548, 4551, 4554, 4556, 4563, 4575,
- 4584, 4591, 4600, 4612, 4625, 4638, 4650, 4661,
- 4674, 4686, 4697, 4710, 4722, 4733, 4746, 4758,
- 4769, 4782, 4799, 4828, 4840, 4870, 4900, 4917,
- 4934, 4951, 4968, 4985, 5015, 5045, 5062, 5079,
- 5096, 5113, 5130, 5160, 5190, 5207, 5224, 5241,
- 5258, 5275, 5305, 5335, 5352, 5369, 5386, 5403,
- 5420, 5432, 5462, 5474, 5504, 5534, 5563, 5580,
- 5610, 5640, 5669, 5686, 5716, 5746, 5775, 5792,
- 5822, 5852, 5881, 5898, 5928, 5958, 5987, 5998,
- 6009, 6016, 6019, 6021, 6024, 6027, 6029, 6036,
- 6048, 6057, 6064, 6073, 6085, 6098, 6111, 6123,
- 6134, 6147, 6159, 6170, 6183, 6195, 6206, 6219,
- 6231, 6242, 6255, 6272, 6301, 6313, 6343, 6373,
- 6390, 6407, 6424, 6441, 6458, 6488, 6518, 6535,
- 6552, 6569, 6586, 6603, 6633, 6663, 6680, 6697,
- 6714, 6731, 6748, 6778, 6808, 6825, 6842, 6859,
- 6876, 6893, 6923, 6955, 6985, 7017, 7029, 7036,
- 7039, 7041, 7044, 7047, 7049, 7056, 7073, 7103,
- 7133, 7162, 7192, 7222, 7239, 7252, 7264, 7275,
- 7288, 7300, 7311, 7324, 7336, 7347, 7360, 7372,
- 7383, 7395, 7404, 7411, 7420, 7432, 7449, 7458,
- 7465, 7472, 7475, 7477, 7480, 7483, 7485
+ 1055, 1057, 1059, 1078, 1094, 1110, 1125, 1142,
+ 1158, 1174, 1189, 1206, 1222, 1238, 1253, 1270,
+ 1286, 1302, 1317, 1334, 1350, 1366, 1381, 1392,
+ 1403, 1410, 1413, 1415, 1418, 1421, 1423, 1430,
+ 1442, 1451, 1458, 1467, 1479, 1492, 1505, 1517,
+ 1528, 1541, 1553, 1564, 1577, 1589, 1600, 1613,
+ 1625, 1636, 1649, 1666, 1678, 1694, 1710, 1727,
+ 1744, 1761, 1778, 1795, 1811, 1827, 1844, 1861,
+ 1878, 1895, 1912, 1928, 1944, 1961, 1978, 1995,
+ 2012, 2029, 2045, 2061, 2078, 2095, 2112, 2129,
+ 2146, 2162, 2178, 2194, 2210, 2225, 2242, 2258,
+ 2274, 2289, 2306, 2322, 2338, 2353, 2370, 2386,
+ 2402, 2417, 2434, 2450, 2466, 2481, 2492, 2503,
+ 2510, 2513, 2515, 2518, 2521, 2523, 2530, 2542,
+ 2551, 2558, 2567, 2579, 2592, 2605, 2617, 2628,
+ 2641, 2653, 2664, 2677, 2689, 2700, 2713, 2725,
+ 2736, 2749, 2766, 2778, 2794, 2810, 2827, 2844,
+ 2861, 2878, 2895, 2911, 2927, 2944, 2961, 2978,
+ 2995, 3012, 3028, 3044, 3061, 3078, 3095, 3112,
+ 3129, 3145, 3161, 3178, 3195, 3212, 3229, 3241,
+ 3258, 3274, 3290, 3305, 3322, 3338, 3354, 3369,
+ 3386, 3402, 3418, 3433, 3450, 3466, 3482, 3497,
+ 3514, 3530, 3546, 3561, 3572, 3583, 3590, 3593,
+ 3595, 3598, 3601, 3603, 3610, 3622, 3631, 3638,
+ 3647, 3659, 3672, 3685, 3697, 3708, 3721, 3733,
+ 3744, 3757, 3769, 3780, 3793, 3805, 3816, 3829,
+ 3846, 3858, 3874, 3890, 3907, 3924, 3941, 3958,
+ 3975, 3991, 4007, 4024, 4041, 4058, 4075, 4092,
+ 4108, 4124, 4141, 4158, 4175, 4192, 4209, 4225,
+ 4241, 4258, 4275, 4292, 4309, 4326, 4338, 4354,
+ 4366, 4382, 4398, 4413, 4430, 4446, 4462, 4477,
+ 4494, 4510, 4526, 4541, 4558, 4574, 4590, 4605,
+ 4622, 4638, 4654, 4669, 4680, 4691, 4698, 4701,
+ 4703, 4706, 4709, 4711, 4718, 4730, 4739, 4746,
+ 4755, 4767, 4780, 4793, 4805, 4816, 4829, 4841,
+ 4852, 4865, 4877, 4888, 4901, 4913, 4924, 4937,
+ 4954, 4966, 4982, 4998, 5015, 5032, 5049, 5066,
+ 5083, 5099, 5115, 5132, 5149, 5166, 5183, 5200,
+ 5216, 5232, 5249, 5266, 5283, 5300, 5317, 5333,
+ 5349, 5366, 5383, 5400, 5417, 5434, 5450, 5468,
+ 5484, 5502, 5514, 5521, 5524, 5526, 5529, 5532,
+ 5534, 5541, 5558, 5574, 5590, 5605, 5621, 5637,
+ 5654, 5667, 5679, 5690, 5703, 5715, 5726, 5739,
+ 5751, 5762, 5775, 5787, 5798, 5810, 5819, 5826,
+ 5835, 5847, 5864, 5873, 5880, 5887, 5890, 5892,
+ 5895, 5898, 5900
};
static const short _indic_syllable_machine_indicies[] = {
@@ -381,882 +381,684 @@
161, 161, 162, 157, 0, 183, 0, 184,
0, 186, 185, 188, 189, 190, 191, 192,
193, 84, 79, 194, 195, 196, 196, 156,
- 197, 198, 199, 200, 201, 187, 187, 187,
- 187, 187, 187, 187, 187, 187, 187, 187,
- 187, 202, 187, 204, 205, 206, 207, 6,
- 1, 208, 209, 203, 203, 38, 210, 203,
- 203, 211, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 212,
- 203, 213, 205, 214, 214, 6, 1, 208,
- 209, 203, 203, 203, 210, 203, 203, 211,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 212, 203, 205,
- 214, 214, 6, 1, 208, 209, 203, 203,
- 203, 210, 203, 203, 211, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 212, 203, 215, 203, 203, 203,
- 19, 216, 203, 1, 208, 209, 203, 203,
- 203, 217, 203, 215, 203, 218, 219, 220,
- 221, 6, 1, 208, 209, 203, 203, 36,
- 222, 203, 203, 211, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 212, 203, 223, 219, 224, 224, 6,
- 1, 208, 209, 203, 203, 203, 222, 203,
- 203, 211, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 212,
- 203, 219, 224, 224, 6, 1, 208, 209,
- 203, 203, 203, 222, 203, 203, 211, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 212, 203, 225, 203,
- 203, 203, 19, 226, 203, 1, 208, 209,
- 203, 203, 203, 217, 203, 225, 203, 227,
- 228, 229, 230, 6, 1, 208, 209, 203,
- 203, 34, 231, 203, 203, 211, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 212, 203, 232, 228, 233,
- 233, 6, 1, 208, 209, 203, 203, 203,
- 231, 203, 203, 211, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 212, 203, 228, 233, 233, 6, 1,
- 208, 209, 203, 203, 203, 231, 203, 203,
- 211, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 212, 203,
- 234, 203, 203, 203, 19, 235, 203, 1,
- 208, 209, 203, 203, 203, 217, 203, 234,
- 203, 236, 237, 238, 239, 6, 1, 208,
- 209, 203, 203, 32, 240, 203, 203, 211,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 212, 203, 241,
- 237, 242, 242, 6, 1, 208, 209, 203,
- 203, 203, 240, 203, 203, 211, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 212, 203, 237, 242, 242,
- 6, 1, 208, 209, 203, 203, 203, 240,
- 203, 203, 211, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 212, 203, 243, 203, 203, 203, 19, 244,
- 203, 1, 208, 209, 203, 203, 203, 217,
- 203, 243, 203, 245, 246, 247, 248, 6,
- 1, 208, 209, 203, 203, 30, 249, 203,
- 203, 211, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 212,
- 203, 250, 246, 251, 251, 6, 1, 208,
- 209, 203, 203, 203, 249, 203, 203, 211,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 212, 203, 246,
- 251, 251, 6, 1, 208, 209, 203, 203,
- 203, 249, 203, 203, 211, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 212, 203, 19, 252, 203, 1,
- 208, 209, 203, 203, 203, 217, 203, 253,
- 253, 203, 1, 208, 209, 203, 203, 203,
- 217, 203, 254, 203, 203, 255, 208, 209,
- 203, 208, 209, 203, 256, 203, 208, 257,
- 203, 208, 258, 203, 208, 203, 254, 203,
- 203, 203, 208, 209, 203, 259, 203, 260,
- 261, 203, 1, 208, 209, 203, 203, 4,
- 203, 3, 203, 253, 253, 203, 1, 208,
- 209, 203, 253, 253, 203, 1, 208, 209,
- 203, 259, 203, 253, 253, 203, 1, 208,
- 209, 203, 259, 203, 260, 253, 203, 1,
- 208, 209, 203, 203, 4, 203, 19, 203,
- 262, 262, 6, 1, 208, 209, 203, 203,
- 203, 217, 203, 263, 28, 264, 265, 9,
- 1, 208, 209, 203, 203, 203, 217, 203,
- 28, 264, 265, 9, 1, 208, 209, 203,
- 203, 203, 217, 203, 264, 264, 9, 1,
- 208, 209, 203, 203, 203, 217, 203, 266,
- 25, 267, 268, 12, 1, 208, 209, 203,
- 203, 203, 217, 203, 25, 267, 268, 12,
- 1, 208, 209, 203, 203, 203, 217, 203,
- 267, 267, 12, 1, 208, 209, 203, 203,
- 203, 217, 203, 269, 22, 270, 271, 15,
- 1, 208, 209, 203, 203, 203, 217, 203,
- 22, 270, 271, 15, 1, 208, 209, 203,
- 203, 203, 217, 203, 270, 270, 15, 1,
- 208, 209, 203, 203, 203, 217, 203, 272,
- 19, 253, 273, 203, 1, 208, 209, 203,
- 203, 203, 217, 203, 19, 253, 273, 203,
- 1, 208, 209, 203, 203, 203, 217, 203,
- 253, 274, 203, 1, 208, 209, 203, 203,
- 203, 217, 203, 19, 203, 253, 253, 203,
- 1, 208, 209, 203, 203, 203, 217, 203,
- 2, 3, 203, 203, 19, 252, 203, 1,
- 208, 209, 203, 203, 203, 217, 203, 2,
- 203, 246, 251, 251, 6, 1, 208, 209,
- 203, 203, 203, 249, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 212, 203, 246, 251,
- 251, 6, 1, 208, 209, 203, 203, 203,
- 249, 203, 245, 246, 251, 251, 6, 1,
- 208, 209, 203, 203, 203, 249, 203, 203,
- 211, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 212, 203,
- 245, 246, 247, 251, 6, 1, 208, 209,
- 203, 203, 30, 249, 203, 203, 211, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 212, 203, 243, 203,
- 275, 203, 262, 262, 6, 1, 208, 209,
- 203, 203, 203, 217, 203, 243, 203, 243,
- 203, 203, 203, 253, 253, 203, 1, 208,
- 209, 203, 203, 203, 217, 203, 243, 203,
- 243, 203, 203, 203, 253, 276, 203, 1,
- 208, 209, 203, 203, 203, 217, 203, 243,
- 203, 243, 203, 275, 203, 253, 253, 203,
- 1, 208, 209, 203, 203, 203, 217, 203,
- 243, 203, 243, 3, 203, 203, 19, 244,
- 203, 1, 208, 209, 203, 203, 203, 217,
- 203, 243, 203, 236, 237, 242, 242, 6,
- 1, 208, 209, 203, 203, 203, 240, 203,
- 203, 211, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 212,
- 203, 236, 237, 238, 242, 6, 1, 208,
- 209, 203, 203, 32, 240, 203, 203, 211,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 212, 203, 234,
- 203, 277, 203, 262, 262, 6, 1, 208,
- 209, 203, 203, 203, 217, 203, 234, 203,
- 234, 203, 203, 203, 253, 253, 203, 1,
- 208, 209, 203, 203, 203, 217, 203, 234,
- 203, 234, 203, 203, 203, 253, 278, 203,
- 1, 208, 209, 203, 203, 203, 217, 203,
- 234, 203, 234, 203, 277, 203, 253, 253,
- 203, 1, 208, 209, 203, 203, 203, 217,
- 203, 234, 203, 234, 3, 203, 203, 19,
- 235, 203, 1, 208, 209, 203, 203, 203,
- 217, 203, 234, 203, 227, 228, 233, 233,
- 6, 1, 208, 209, 203, 203, 203, 231,
- 203, 203, 211, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 212, 203, 227, 228, 229, 233, 6, 1,
- 208, 209, 203, 203, 34, 231, 203, 203,
- 211, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 212, 203,
- 225, 203, 279, 203, 262, 262, 6, 1,
- 208, 209, 203, 203, 203, 217, 203, 225,
- 203, 225, 203, 203, 203, 253, 253, 203,
- 1, 208, 209, 203, 203, 203, 217, 203,
- 225, 203, 225, 203, 203, 203, 253, 280,
- 203, 1, 208, 209, 203, 203, 203, 217,
- 203, 225, 203, 225, 203, 279, 203, 253,
- 253, 203, 1, 208, 209, 203, 203, 203,
- 217, 203, 225, 203, 225, 3, 203, 203,
- 19, 226, 203, 1, 208, 209, 203, 203,
- 203, 217, 203, 225, 203, 218, 219, 224,
- 224, 6, 1, 208, 209, 203, 203, 203,
- 222, 203, 203, 211, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 212, 203, 218, 219, 220, 224, 6,
- 1, 208, 209, 203, 203, 36, 222, 203,
- 203, 211, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 212,
- 203, 215, 203, 281, 203, 262, 262, 6,
- 1, 208, 209, 203, 203, 203, 217, 203,
- 215, 203, 215, 203, 203, 203, 253, 253,
- 203, 1, 208, 209, 203, 203, 203, 217,
- 203, 215, 203, 215, 203, 203, 203, 253,
- 282, 203, 1, 208, 209, 203, 203, 203,
- 217, 203, 215, 203, 215, 203, 281, 203,
- 253, 253, 203, 1, 208, 209, 203, 203,
- 203, 217, 203, 215, 203, 215, 3, 203,
- 203, 19, 216, 203, 1, 208, 209, 203,
- 203, 203, 217, 203, 215, 203, 204, 205,
- 214, 214, 6, 1, 208, 209, 203, 203,
- 203, 210, 203, 203, 211, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 212, 203, 204, 205, 206, 214,
- 6, 1, 208, 209, 203, 203, 38, 210,
- 203, 203, 211, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 212, 203, 284, 285, 286, 287, 45, 40,
- 288, 289, 283, 283, 77, 290, 283, 283,
- 291, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 292, 283,
- 293, 285, 294, 287, 45, 40, 288, 289,
- 283, 283, 283, 290, 283, 283, 291, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 292, 283, 285, 294,
- 287, 45, 40, 288, 289, 283, 283, 283,
- 290, 283, 283, 291, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 292, 283, 295, 283, 283, 283, 58,
- 296, 283, 40, 288, 289, 283, 283, 283,
- 297, 283, 295, 283, 298, 299, 300, 301,
- 45, 40, 288, 289, 283, 283, 75, 302,
- 283, 283, 291, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 292, 283, 303, 299, 304, 304, 45, 40,
- 288, 289, 283, 283, 283, 302, 283, 283,
- 291, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 292, 283,
- 299, 304, 304, 45, 40, 288, 289, 283,
- 283, 283, 302, 283, 283, 291, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 292, 283, 305, 283, 283,
- 283, 58, 306, 283, 40, 288, 289, 283,
- 283, 283, 297, 283, 305, 283, 307, 308,
- 309, 310, 45, 40, 288, 289, 283, 283,
- 73, 311, 283, 283, 291, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 292, 283, 312, 308, 313, 313,
- 45, 40, 288, 289, 283, 283, 283, 311,
- 283, 283, 291, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 292, 283, 308, 313, 313, 45, 40, 288,
- 289, 283, 283, 283, 311, 283, 283, 291,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 292, 283, 314,
- 283, 283, 283, 58, 315, 283, 40, 288,
- 289, 283, 283, 283, 297, 283, 314, 283,
- 316, 317, 318, 319, 45, 40, 288, 289,
- 283, 283, 71, 320, 283, 283, 291, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 292, 283, 321, 317,
- 322, 322, 45, 40, 288, 289, 283, 283,
- 283, 320, 283, 283, 291, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 292, 283, 317, 322, 322, 45,
- 40, 288, 289, 283, 283, 283, 320, 283,
- 283, 291, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 292,
- 283, 323, 283, 283, 283, 58, 324, 283,
- 40, 288, 289, 283, 283, 283, 297, 283,
- 323, 283, 325, 326, 327, 328, 45, 40,
- 288, 289, 283, 283, 69, 329, 283, 283,
- 291, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 292, 283,
- 330, 326, 331, 331, 45, 40, 288, 289,
- 283, 283, 283, 329, 283, 283, 291, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 292, 283, 326, 331,
- 331, 45, 40, 288, 289, 283, 283, 283,
- 329, 283, 283, 291, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 292, 283, 58, 332, 283, 40, 288,
- 289, 283, 283, 283, 297, 283, 333, 333,
- 283, 40, 288, 289, 283, 283, 283, 297,
- 283, 334, 283, 283, 335, 288, 289, 283,
- 288, 289, 283, 336, 283, 288, 337, 283,
- 288, 338, 283, 288, 283, 334, 283, 283,
- 283, 288, 289, 283, 339, 283, 340, 341,
- 283, 40, 288, 289, 283, 283, 43, 283,
- 42, 283, 333, 333, 283, 40, 288, 289,
- 283, 333, 333, 283, 40, 288, 289, 283,
- 339, 283, 333, 333, 283, 40, 288, 289,
- 283, 339, 283, 340, 333, 283, 40, 288,
- 289, 283, 283, 43, 283, 58, 283, 342,
- 342, 45, 40, 288, 289, 283, 283, 283,
- 297, 283, 343, 67, 344, 345, 48, 40,
- 288, 289, 283, 283, 283, 297, 283, 67,
- 344, 345, 48, 40, 288, 289, 283, 283,
- 283, 297, 283, 344, 344, 48, 40, 288,
- 289, 283, 283, 283, 297, 283, 346, 64,
- 347, 348, 51, 40, 288, 289, 283, 283,
- 283, 297, 283, 64, 347, 348, 51, 40,
- 288, 289, 283, 283, 283, 297, 283, 347,
- 347, 51, 40, 288, 289, 283, 283, 283,
- 297, 283, 349, 61, 350, 351, 54, 40,
- 288, 289, 283, 283, 283, 297, 283, 61,
- 350, 351, 54, 40, 288, 289, 283, 283,
- 283, 297, 283, 350, 350, 54, 40, 288,
- 289, 283, 283, 283, 297, 283, 352, 58,
- 333, 353, 283, 40, 288, 289, 283, 283,
- 283, 297, 283, 58, 333, 353, 283, 40,
- 288, 289, 283, 283, 283, 297, 283, 333,
- 354, 283, 40, 288, 289, 283, 283, 283,
- 297, 283, 58, 283, 333, 333, 283, 40,
- 288, 289, 283, 283, 283, 297, 283, 41,
- 42, 283, 283, 58, 332, 283, 40, 288,
- 289, 283, 283, 283, 297, 283, 41, 283,
- 326, 331, 331, 45, 40, 288, 289, 283,
- 283, 283, 329, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 292, 283, 326, 331, 331,
- 45, 40, 288, 289, 283, 283, 283, 329,
- 283, 325, 326, 331, 331, 45, 40, 288,
- 289, 283, 283, 283, 329, 283, 283, 291,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 292, 283, 325,
- 326, 327, 331, 45, 40, 288, 289, 283,
- 283, 69, 329, 283, 283, 291, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 292, 283, 323, 283, 355,
- 283, 342, 342, 45, 40, 288, 289, 283,
- 283, 283, 297, 283, 323, 283, 323, 283,
- 283, 283, 333, 333, 283, 40, 288, 289,
- 283, 283, 283, 297, 283, 323, 283, 323,
- 283, 283, 283, 333, 356, 283, 40, 288,
- 289, 283, 283, 283, 297, 283, 323, 283,
- 323, 283, 355, 283, 333, 333, 283, 40,
- 288, 289, 283, 283, 283, 297, 283, 323,
- 283, 323, 42, 283, 283, 58, 324, 283,
- 40, 288, 289, 283, 283, 283, 297, 283,
- 323, 283, 316, 317, 322, 322, 45, 40,
- 288, 289, 283, 283, 283, 320, 283, 283,
- 291, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 292, 283,
- 316, 317, 318, 322, 45, 40, 288, 289,
- 283, 283, 71, 320, 283, 283, 291, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 292, 283, 314, 283,
- 357, 283, 342, 342, 45, 40, 288, 289,
- 283, 283, 283, 297, 283, 314, 283, 314,
- 283, 283, 283, 333, 333, 283, 40, 288,
- 289, 283, 283, 283, 297, 283, 314, 283,
- 314, 283, 283, 283, 333, 358, 283, 40,
- 288, 289, 283, 283, 283, 297, 283, 314,
- 283, 314, 283, 357, 283, 333, 333, 283,
- 40, 288, 289, 283, 283, 283, 297, 283,
- 314, 283, 314, 42, 283, 283, 58, 315,
- 283, 40, 288, 289, 283, 283, 283, 297,
- 283, 314, 283, 307, 308, 313, 313, 45,
- 40, 288, 289, 283, 283, 283, 311, 283,
- 283, 291, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 292,
- 283, 307, 308, 309, 313, 45, 40, 288,
- 289, 283, 283, 73, 311, 283, 283, 291,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 292, 283, 305,
- 283, 359, 283, 342, 342, 45, 40, 288,
- 289, 283, 283, 283, 297, 283, 305, 283,
- 305, 283, 283, 283, 333, 333, 283, 40,
- 288, 289, 283, 283, 283, 297, 283, 305,
- 283, 305, 283, 283, 283, 333, 360, 283,
- 40, 288, 289, 283, 283, 283, 297, 283,
- 305, 283, 305, 283, 359, 283, 333, 333,
- 283, 40, 288, 289, 283, 283, 283, 297,
- 283, 305, 283, 305, 42, 283, 283, 58,
- 306, 283, 40, 288, 289, 283, 283, 283,
- 297, 283, 305, 283, 298, 299, 304, 304,
- 45, 40, 288, 289, 283, 283, 283, 302,
- 283, 283, 291, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 292, 283, 298, 299, 300, 304, 45, 40,
- 288, 289, 283, 283, 75, 302, 283, 283,
- 291, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 292, 283,
- 295, 283, 361, 283, 342, 342, 45, 40,
- 288, 289, 283, 283, 283, 297, 283, 295,
- 283, 295, 283, 283, 283, 333, 333, 283,
- 40, 288, 289, 283, 283, 283, 297, 283,
- 295, 283, 295, 283, 283, 283, 333, 362,
- 283, 40, 288, 289, 283, 283, 283, 297,
- 283, 295, 283, 295, 283, 361, 283, 333,
- 333, 283, 40, 288, 289, 283, 283, 283,
- 297, 283, 295, 283, 76, 44, 44, 45,
- 40, 283, 283, 283, 283, 283, 76, 283,
- 295, 42, 283, 283, 58, 296, 283, 40,
- 288, 289, 283, 283, 283, 297, 283, 295,
- 283, 284, 285, 294, 287, 45, 40, 288,
- 289, 283, 283, 283, 290, 283, 283, 291,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 292, 283, 364,
- 191, 365, 365, 84, 79, 194, 195, 363,
- 363, 363, 197, 363, 363, 200, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 202, 363, 191, 365, 365,
- 84, 79, 194, 195, 363, 363, 363, 197,
- 363, 363, 200, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 202, 363, 366, 363, 363, 363, 98, 367,
- 363, 79, 194, 195, 363, 363, 363, 368,
- 363, 366, 363, 369, 370, 371, 372, 84,
- 79, 194, 195, 363, 363, 115, 373, 363,
- 363, 200, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 202,
- 363, 374, 370, 375, 375, 84, 79, 194,
- 195, 363, 363, 363, 373, 363, 363, 200,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 202, 363, 370,
- 375, 375, 84, 79, 194, 195, 363, 363,
- 363, 373, 363, 363, 200, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 202, 363, 376, 363, 363, 363,
- 98, 377, 363, 79, 194, 195, 363, 363,
- 363, 368, 363, 376, 363, 378, 379, 380,
- 381, 84, 79, 194, 195, 363, 363, 113,
- 382, 363, 363, 200, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 202, 363, 383, 379, 384, 384, 84,
- 79, 194, 195, 363, 363, 363, 382, 363,
- 363, 200, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 202,
- 363, 379, 384, 384, 84, 79, 194, 195,
- 363, 363, 363, 382, 363, 363, 200, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 202, 363, 385, 363,
- 363, 363, 98, 386, 363, 79, 194, 195,
- 363, 363, 363, 368, 363, 385, 363, 387,
- 388, 389, 390, 84, 79, 194, 195, 363,
- 363, 111, 391, 363, 363, 200, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 202, 363, 392, 388, 393,
- 393, 84, 79, 194, 195, 363, 363, 363,
- 391, 363, 363, 200, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 202, 363, 388, 393, 393, 84, 79,
- 194, 195, 363, 363, 363, 391, 363, 363,
- 200, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 202, 363,
- 394, 363, 363, 363, 98, 395, 363, 79,
- 194, 195, 363, 363, 363, 368, 363, 394,
- 363, 396, 397, 398, 399, 84, 79, 194,
- 195, 363, 363, 109, 400, 363, 363, 200,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 202, 363, 401,
- 397, 402, 402, 84, 79, 194, 195, 363,
- 363, 363, 400, 363, 363, 200, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 202, 363, 397, 402, 402,
- 84, 79, 194, 195, 363, 363, 363, 400,
- 363, 363, 200, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 202, 363, 98, 403, 363, 79, 194, 195,
- 363, 363, 363, 368, 363, 404, 404, 363,
- 79, 194, 195, 363, 363, 363, 368, 363,
- 405, 363, 363, 406, 194, 195, 363, 194,
- 195, 363, 407, 363, 194, 408, 363, 194,
- 409, 363, 194, 363, 405, 363, 363, 363,
- 194, 195, 363, 410, 363, 411, 412, 363,
- 79, 194, 195, 363, 363, 82, 363, 81,
- 363, 404, 404, 363, 79, 194, 195, 363,
- 404, 404, 363, 79, 194, 195, 363, 410,
- 363, 404, 404, 363, 79, 194, 195, 363,
- 410, 363, 411, 404, 363, 79, 194, 195,
- 363, 363, 82, 363, 98, 363, 413, 413,
- 84, 79, 194, 195, 363, 363, 363, 368,
- 363, 414, 107, 415, 416, 88, 79, 194,
- 195, 363, 363, 363, 368, 363, 107, 415,
- 416, 88, 79, 194, 195, 363, 363, 363,
- 368, 363, 415, 415, 88, 79, 194, 195,
- 363, 363, 363, 368, 363, 417, 104, 418,
- 419, 91, 79, 194, 195, 363, 363, 363,
- 368, 363, 104, 418, 419, 91, 79, 194,
- 195, 363, 363, 363, 368, 363, 418, 418,
- 91, 79, 194, 195, 363, 363, 363, 368,
- 363, 420, 101, 421, 422, 94, 79, 194,
- 195, 363, 363, 363, 368, 363, 101, 421,
- 422, 94, 79, 194, 195, 363, 363, 363,
- 368, 363, 421, 421, 94, 79, 194, 195,
- 363, 363, 363, 368, 363, 423, 98, 404,
- 424, 363, 79, 194, 195, 363, 363, 363,
- 368, 363, 98, 404, 424, 363, 79, 194,
- 195, 363, 363, 363, 368, 363, 404, 425,
- 363, 79, 194, 195, 363, 363, 363, 368,
- 363, 98, 363, 404, 404, 363, 79, 194,
- 195, 363, 363, 363, 368, 363, 80, 81,
- 363, 363, 98, 403, 363, 79, 194, 195,
- 363, 363, 363, 368, 363, 80, 363, 397,
- 402, 402, 84, 79, 194, 195, 363, 363,
- 363, 400, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 202, 363, 397, 402, 402, 84,
- 79, 194, 195, 363, 363, 363, 400, 363,
- 396, 397, 402, 402, 84, 79, 194, 195,
- 363, 363, 363, 400, 363, 363, 200, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 202, 363, 396, 397,
- 398, 402, 84, 79, 194, 195, 363, 363,
- 109, 400, 363, 363, 200, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 202, 363, 394, 363, 426, 363,
- 413, 413, 84, 79, 194, 195, 363, 363,
- 363, 368, 363, 394, 363, 394, 363, 363,
- 363, 404, 404, 363, 79, 194, 195, 363,
- 363, 363, 368, 363, 394, 363, 394, 363,
- 363, 363, 404, 427, 363, 79, 194, 195,
- 363, 363, 363, 368, 363, 394, 363, 394,
- 363, 426, 363, 404, 404, 363, 79, 194,
- 195, 363, 363, 363, 368, 363, 394, 363,
- 394, 81, 363, 363, 98, 395, 363, 79,
- 194, 195, 363, 363, 363, 368, 363, 394,
- 363, 387, 388, 393, 393, 84, 79, 194,
- 195, 363, 363, 363, 391, 363, 363, 200,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 202, 363, 387,
- 388, 389, 393, 84, 79, 194, 195, 363,
- 363, 111, 391, 363, 363, 200, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 202, 363, 385, 363, 428,
- 363, 413, 413, 84, 79, 194, 195, 363,
- 363, 363, 368, 363, 385, 363, 385, 363,
- 363, 363, 404, 404, 363, 79, 194, 195,
- 363, 363, 363, 368, 363, 385, 363, 385,
- 363, 363, 363, 404, 429, 363, 79, 194,
- 195, 363, 363, 363, 368, 363, 385, 363,
- 385, 363, 428, 363, 404, 404, 363, 79,
- 194, 195, 363, 363, 363, 368, 363, 385,
- 363, 385, 81, 363, 363, 98, 386, 363,
- 79, 194, 195, 363, 363, 363, 368, 363,
- 385, 363, 378, 379, 384, 384, 84, 79,
- 194, 195, 363, 363, 363, 382, 363, 363,
- 200, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 202, 363,
- 378, 379, 380, 384, 84, 79, 194, 195,
- 363, 363, 113, 382, 363, 363, 200, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 202, 363, 376, 363,
- 430, 363, 413, 413, 84, 79, 194, 195,
- 363, 363, 363, 368, 363, 376, 363, 376,
- 363, 363, 363, 404, 404, 363, 79, 194,
- 195, 363, 363, 363, 368, 363, 376, 363,
- 376, 363, 363, 363, 404, 431, 363, 79,
- 194, 195, 363, 363, 363, 368, 363, 376,
- 363, 376, 363, 430, 363, 404, 404, 363,
- 79, 194, 195, 363, 363, 363, 368, 363,
- 376, 363, 376, 81, 363, 363, 98, 377,
- 363, 79, 194, 195, 363, 363, 363, 368,
- 363, 376, 363, 369, 370, 375, 375, 84,
- 79, 194, 195, 363, 363, 363, 373, 363,
- 363, 200, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 202,
- 363, 369, 370, 371, 375, 84, 79, 194,
- 195, 363, 363, 115, 373, 363, 363, 200,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 202, 363, 366,
- 363, 432, 363, 413, 413, 84, 79, 194,
- 195, 363, 363, 363, 368, 363, 366, 363,
- 366, 363, 363, 363, 404, 404, 363, 79,
- 194, 195, 363, 363, 363, 368, 363, 366,
- 363, 366, 363, 363, 363, 404, 433, 363,
- 79, 194, 195, 363, 363, 363, 368, 363,
- 366, 363, 366, 363, 432, 363, 404, 404,
- 363, 79, 194, 195, 363, 363, 363, 368,
- 363, 366, 363, 366, 81, 363, 363, 98,
- 367, 363, 79, 194, 195, 363, 363, 363,
- 368, 363, 366, 363, 116, 83, 83, 84,
- 79, 434, 434, 434, 434, 156, 116, 434,
- 190, 191, 365, 365, 84, 79, 194, 195,
- 363, 363, 363, 197, 363, 363, 200, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 202, 363, 116, 83,
- 83, 84, 79, 434, 434, 434, 434, 434,
- 116, 434, 436, 437, 438, 439, 123, 118,
- 440, 441, 435, 435, 155, 442, 435, 435,
- 443, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 444, 435,
- 445, 437, 439, 439, 123, 118, 440, 441,
- 435, 435, 435, 442, 435, 435, 443, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 444, 435, 437, 439,
- 439, 123, 118, 440, 441, 435, 435, 435,
- 442, 435, 435, 443, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 444, 435, 446, 435, 435, 435, 136,
- 447, 435, 118, 440, 441, 435, 435, 435,
- 448, 435, 446, 435, 449, 450, 451, 452,
- 123, 118, 440, 441, 435, 435, 153, 453,
- 435, 435, 443, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 444, 435, 454, 450, 455, 455, 123, 118,
- 440, 441, 435, 435, 435, 453, 435, 435,
- 443, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 444, 435,
- 450, 455, 455, 123, 118, 440, 441, 435,
- 435, 435, 453, 435, 435, 443, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 444, 435, 456, 435, 435,
- 435, 136, 457, 435, 118, 440, 441, 435,
- 435, 435, 448, 435, 456, 435, 458, 459,
- 460, 461, 123, 118, 440, 441, 435, 435,
- 151, 462, 435, 435, 443, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 444, 435, 463, 459, 464, 464,
- 123, 118, 440, 441, 435, 435, 435, 462,
- 435, 435, 443, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 444, 435, 459, 464, 464, 123, 118, 440,
- 441, 435, 435, 435, 462, 435, 435, 443,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 444, 435, 465,
- 435, 435, 435, 136, 466, 435, 118, 440,
- 441, 435, 435, 435, 448, 435, 465, 435,
- 467, 468, 469, 470, 123, 118, 440, 441,
- 435, 435, 149, 471, 435, 435, 443, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 444, 435, 472, 468,
- 473, 473, 123, 118, 440, 441, 435, 435,
- 435, 471, 435, 435, 443, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 444, 435, 468, 473, 473, 123,
- 118, 440, 441, 435, 435, 435, 471, 435,
- 435, 443, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 444,
- 435, 474, 435, 435, 435, 136, 475, 435,
- 118, 440, 441, 435, 435, 435, 448, 435,
- 474, 435, 476, 477, 478, 479, 123, 118,
- 440, 441, 435, 435, 147, 480, 435, 435,
- 443, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 444, 435,
- 481, 477, 482, 482, 123, 118, 440, 441,
- 435, 435, 435, 480, 435, 435, 443, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 444, 435, 477, 482,
- 482, 123, 118, 440, 441, 435, 435, 435,
- 480, 435, 435, 443, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 444, 435, 136, 483, 435, 118, 440,
- 441, 435, 435, 435, 448, 435, 484, 484,
- 435, 118, 440, 441, 435, 435, 435, 448,
- 435, 485, 435, 435, 486, 440, 441, 435,
- 440, 441, 435, 487, 435, 440, 488, 435,
- 440, 489, 435, 440, 435, 485, 435, 435,
- 435, 440, 441, 435, 490, 435, 491, 492,
- 435, 118, 440, 441, 435, 435, 121, 435,
- 120, 435, 484, 484, 435, 118, 440, 441,
- 435, 484, 484, 435, 118, 440, 441, 435,
- 490, 435, 484, 484, 435, 118, 440, 441,
- 435, 490, 435, 491, 484, 435, 118, 440,
- 441, 435, 435, 121, 435, 136, 435, 493,
- 493, 123, 118, 440, 441, 435, 435, 435,
- 448, 435, 494, 145, 495, 496, 126, 118,
- 440, 441, 435, 435, 435, 448, 435, 145,
- 495, 496, 126, 118, 440, 441, 435, 435,
- 435, 448, 435, 495, 495, 126, 118, 440,
- 441, 435, 435, 435, 448, 435, 497, 142,
- 498, 499, 129, 118, 440, 441, 435, 435,
- 435, 448, 435, 142, 498, 499, 129, 118,
- 440, 441, 435, 435, 435, 448, 435, 498,
- 498, 129, 118, 440, 441, 435, 435, 435,
- 448, 435, 500, 139, 501, 502, 132, 118,
- 440, 441, 435, 435, 435, 448, 435, 139,
- 501, 502, 132, 118, 440, 441, 435, 435,
- 435, 448, 435, 501, 501, 132, 118, 440,
- 441, 435, 435, 435, 448, 435, 503, 136,
- 484, 504, 435, 118, 440, 441, 435, 435,
- 435, 448, 435, 136, 484, 504, 435, 118,
- 440, 441, 435, 435, 435, 448, 435, 484,
- 505, 435, 118, 440, 441, 435, 435, 435,
- 448, 435, 136, 435, 484, 484, 435, 118,
- 440, 441, 435, 435, 435, 448, 435, 119,
- 120, 435, 435, 136, 483, 435, 118, 440,
- 441, 435, 435, 435, 448, 435, 119, 435,
- 477, 482, 482, 123, 118, 440, 441, 435,
- 435, 435, 480, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 444, 435, 477, 482, 482,
- 123, 118, 440, 441, 435, 435, 435, 480,
- 435, 476, 477, 482, 482, 123, 118, 440,
- 441, 435, 435, 435, 480, 435, 435, 443,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 444, 435, 476,
- 477, 478, 482, 123, 118, 440, 441, 435,
- 435, 147, 480, 435, 435, 443, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 444, 435, 474, 435, 506,
- 435, 493, 493, 123, 118, 440, 441, 435,
- 435, 435, 448, 435, 474, 435, 474, 435,
- 435, 435, 484, 484, 435, 118, 440, 441,
- 435, 435, 435, 448, 435, 474, 435, 474,
- 435, 435, 435, 484, 507, 435, 118, 440,
- 441, 435, 435, 435, 448, 435, 474, 435,
- 474, 435, 506, 435, 484, 484, 435, 118,
- 440, 441, 435, 435, 435, 448, 435, 474,
- 435, 474, 120, 435, 435, 136, 475, 435,
- 118, 440, 441, 435, 435, 435, 448, 435,
- 474, 435, 467, 468, 473, 473, 123, 118,
- 440, 441, 435, 435, 435, 471, 435, 435,
- 443, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 444, 435,
- 467, 468, 469, 473, 123, 118, 440, 441,
- 435, 435, 149, 471, 435, 435, 443, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 444, 435, 465, 435,
- 508, 435, 493, 493, 123, 118, 440, 441,
- 435, 435, 435, 448, 435, 465, 435, 465,
- 435, 435, 435, 484, 484, 435, 118, 440,
- 441, 435, 435, 435, 448, 435, 465, 435,
- 465, 435, 435, 435, 484, 509, 435, 118,
- 440, 441, 435, 435, 435, 448, 435, 465,
- 435, 465, 435, 508, 435, 484, 484, 435,
- 118, 440, 441, 435, 435, 435, 448, 435,
- 465, 435, 465, 120, 435, 435, 136, 466,
- 435, 118, 440, 441, 435, 435, 435, 448,
- 435, 465, 435, 458, 459, 464, 464, 123,
- 118, 440, 441, 435, 435, 435, 462, 435,
- 435, 443, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 444,
- 435, 458, 459, 460, 464, 123, 118, 440,
- 441, 435, 435, 151, 462, 435, 435, 443,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 444, 435, 456,
- 435, 510, 435, 493, 493, 123, 118, 440,
- 441, 435, 435, 435, 448, 435, 456, 435,
- 456, 435, 435, 435, 484, 484, 435, 118,
- 440, 441, 435, 435, 435, 448, 435, 456,
- 435, 456, 435, 435, 435, 484, 511, 435,
- 118, 440, 441, 435, 435, 435, 448, 435,
- 456, 435, 456, 435, 510, 435, 484, 484,
- 435, 118, 440, 441, 435, 435, 435, 448,
- 435, 456, 435, 456, 120, 435, 435, 136,
- 457, 435, 118, 440, 441, 435, 435, 435,
- 448, 435, 456, 435, 449, 450, 455, 455,
- 123, 118, 440, 441, 435, 435, 435, 453,
- 435, 435, 443, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 444, 435, 449, 450, 451, 455, 123, 118,
- 440, 441, 435, 435, 153, 453, 435, 435,
- 443, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 444, 435,
- 446, 435, 512, 435, 493, 493, 123, 118,
- 440, 441, 435, 435, 435, 448, 435, 446,
- 435, 446, 435, 435, 435, 484, 484, 435,
- 118, 440, 441, 435, 435, 435, 448, 435,
- 446, 435, 446, 435, 435, 435, 484, 513,
- 435, 118, 440, 441, 435, 435, 435, 448,
- 435, 446, 435, 446, 435, 512, 435, 484,
- 484, 435, 118, 440, 441, 435, 435, 435,
- 448, 435, 446, 435, 446, 120, 435, 435,
- 136, 447, 435, 118, 440, 441, 435, 435,
- 435, 448, 435, 446, 435, 436, 437, 439,
- 439, 123, 118, 440, 441, 435, 435, 435,
- 442, 435, 435, 443, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 444, 435, 188, 189, 190, 191, 514,
- 365, 84, 79, 194, 195, 196, 196, 156,
- 197, 363, 188, 200, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 202, 363, 204, 515, 206, 207, 6,
- 1, 208, 209, 203, 203, 38, 210, 203,
- 203, 211, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 212,
- 203, 215, 189, 190, 191, 516, 517, 84,
- 157, 518, 519, 203, 196, 156, 520, 203,
- 215, 200, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 202,
- 203, 116, 521, 521, 84, 157, 208, 209,
- 203, 203, 156, 522, 203, 523, 203, 203,
- 524, 518, 519, 203, 518, 519, 203, 256,
- 203, 518, 525, 203, 518, 526, 203, 518,
- 203, 523, 203, 203, 203, 518, 519, 203,
- 527, 3, 363, 363, 404, 433, 363, 79,
- 194, 195, 363, 363, 363, 368, 363, 527,
- 363, 528, 370, 529, 530, 84, 157, 518,
- 519, 203, 203, 158, 373, 203, 203, 200,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 202, 203, 531,
- 370, 532, 532, 84, 157, 518, 519, 203,
- 203, 203, 373, 203, 203, 200, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 202, 203, 370, 532, 532,
- 84, 157, 518, 519, 203, 203, 203, 373,
- 203, 203, 200, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 202, 203, 528, 370, 532, 532, 84, 157,
- 518, 519, 203, 203, 203, 373, 203, 203,
- 200, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 202, 203,
- 528, 370, 529, 532, 84, 157, 518, 519,
- 203, 203, 158, 373, 203, 203, 200, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 202, 203, 215, 203,
- 281, 116, 533, 533, 160, 157, 208, 209,
- 203, 203, 203, 522, 203, 215, 203, 534,
- 184, 535, 536, 162, 157, 518, 519, 203,
- 203, 203, 537, 203, 184, 535, 536, 162,
- 157, 518, 519, 203, 203, 203, 537, 203,
- 535, 535, 162, 157, 518, 519, 203, 203,
- 203, 537, 203, 538, 181, 539, 540, 165,
- 157, 518, 519, 203, 203, 203, 537, 203,
- 181, 539, 540, 165, 157, 518, 519, 203,
- 203, 203, 537, 203, 539, 539, 165, 157,
- 518, 519, 203, 203, 203, 537, 203, 541,
- 178, 542, 543, 168, 157, 518, 519, 203,
- 203, 203, 537, 203, 178, 542, 543, 168,
- 157, 518, 519, 203, 203, 203, 537, 203,
- 542, 542, 168, 157, 518, 519, 203, 203,
- 203, 537, 203, 544, 175, 545, 546, 203,
- 157, 518, 519, 203, 203, 203, 537, 203,
- 175, 545, 546, 203, 157, 518, 519, 203,
- 203, 203, 537, 203, 545, 545, 203, 157,
- 518, 519, 203, 203, 203, 537, 203, 547,
- 203, 548, 549, 203, 157, 518, 519, 203,
- 203, 172, 203, 171, 203, 545, 545, 203,
- 157, 518, 519, 203, 545, 545, 203, 157,
- 518, 519, 203, 547, 203, 545, 545, 203,
- 157, 518, 519, 203, 547, 203, 548, 545,
- 203, 157, 518, 519, 203, 203, 172, 203,
- 527, 171, 363, 363, 98, 367, 363, 79,
- 194, 195, 363, 363, 363, 368, 363, 527,
- 363, 551, 550, 552, 552, 550, 186, 553,
- 554, 550, 552, 552, 550, 186, 553, 554,
- 550, 555, 550, 550, 556, 553, 554, 550,
- 553, 554, 550, 557, 550, 553, 558, 550,
- 553, 559, 550, 553, 550, 555, 550, 550,
- 550, 553, 554, 550, 0
+ 197, 198, 199, 200, 201, 187, 203, 204,
+ 205, 206, 6, 1, 207, 208, 202, 202,
+ 38, 209, 202, 202, 210, 202, 211, 204,
+ 212, 212, 6, 1, 207, 208, 202, 202,
+ 202, 209, 202, 202, 210, 202, 204, 212,
+ 212, 6, 1, 207, 208, 202, 202, 202,
+ 209, 202, 202, 210, 202, 213, 202, 202,
+ 202, 19, 214, 202, 1, 207, 208, 202,
+ 202, 202, 215, 202, 213, 202, 216, 217,
+ 218, 219, 6, 1, 207, 208, 202, 202,
+ 36, 220, 202, 202, 210, 202, 221, 217,
+ 222, 222, 6, 1, 207, 208, 202, 202,
+ 202, 220, 202, 202, 210, 202, 217, 222,
+ 222, 6, 1, 207, 208, 202, 202, 202,
+ 220, 202, 202, 210, 202, 223, 202, 202,
+ 202, 19, 224, 202, 1, 207, 208, 202,
+ 202, 202, 215, 202, 223, 202, 225, 226,
+ 227, 228, 6, 1, 207, 208, 202, 202,
+ 34, 229, 202, 202, 210, 202, 230, 226,
+ 231, 231, 6, 1, 207, 208, 202, 202,
+ 202, 229, 202, 202, 210, 202, 226, 231,
+ 231, 6, 1, 207, 208, 202, 202, 202,
+ 229, 202, 202, 210, 202, 232, 202, 202,
+ 202, 19, 233, 202, 1, 207, 208, 202,
+ 202, 202, 215, 202, 232, 202, 234, 235,
+ 236, 237, 6, 1, 207, 208, 202, 202,
+ 32, 238, 202, 202, 210, 202, 239, 235,
+ 240, 240, 6, 1, 207, 208, 202, 202,
+ 202, 238, 202, 202, 210, 202, 235, 240,
+ 240, 6, 1, 207, 208, 202, 202, 202,
+ 238, 202, 202, 210, 202, 241, 202, 202,
+ 202, 19, 242, 202, 1, 207, 208, 202,
+ 202, 202, 215, 202, 241, 202, 243, 244,
+ 245, 246, 6, 1, 207, 208, 202, 202,
+ 30, 247, 202, 202, 210, 202, 248, 244,
+ 249, 249, 6, 1, 207, 208, 202, 202,
+ 202, 247, 202, 202, 210, 202, 244, 249,
+ 249, 6, 1, 207, 208, 202, 202, 202,
+ 247, 202, 202, 210, 202, 19, 250, 202,
+ 1, 207, 208, 202, 202, 202, 215, 202,
+ 251, 251, 202, 1, 207, 208, 202, 202,
+ 202, 215, 202, 252, 202, 202, 253, 207,
+ 208, 202, 207, 208, 202, 254, 202, 207,
+ 255, 202, 207, 256, 202, 207, 202, 252,
+ 202, 202, 202, 207, 208, 202, 257, 202,
+ 258, 259, 202, 1, 207, 208, 202, 202,
+ 4, 202, 3, 202, 251, 251, 202, 1,
+ 207, 208, 202, 251, 251, 202, 1, 207,
+ 208, 202, 257, 202, 251, 251, 202, 1,
+ 207, 208, 202, 257, 202, 258, 251, 202,
+ 1, 207, 208, 202, 202, 4, 202, 19,
+ 202, 260, 260, 6, 1, 207, 208, 202,
+ 202, 202, 215, 202, 261, 28, 262, 263,
+ 9, 1, 207, 208, 202, 202, 202, 215,
+ 202, 28, 262, 263, 9, 1, 207, 208,
+ 202, 202, 202, 215, 202, 262, 262, 9,
+ 1, 207, 208, 202, 202, 202, 215, 202,
+ 264, 25, 265, 266, 12, 1, 207, 208,
+ 202, 202, 202, 215, 202, 25, 265, 266,
+ 12, 1, 207, 208, 202, 202, 202, 215,
+ 202, 265, 265, 12, 1, 207, 208, 202,
+ 202, 202, 215, 202, 267, 22, 268, 269,
+ 15, 1, 207, 208, 202, 202, 202, 215,
+ 202, 22, 268, 269, 15, 1, 207, 208,
+ 202, 202, 202, 215, 202, 268, 268, 15,
+ 1, 207, 208, 202, 202, 202, 215, 202,
+ 270, 19, 251, 271, 202, 1, 207, 208,
+ 202, 202, 202, 215, 202, 19, 251, 271,
+ 202, 1, 207, 208, 202, 202, 202, 215,
+ 202, 251, 272, 202, 1, 207, 208, 202,
+ 202, 202, 215, 202, 19, 202, 251, 251,
+ 202, 1, 207, 208, 202, 202, 202, 215,
+ 202, 2, 3, 202, 202, 19, 250, 202,
+ 1, 207, 208, 202, 202, 202, 215, 202,
+ 2, 202, 244, 249, 249, 6, 1, 207,
+ 208, 202, 202, 202, 247, 202, 243, 244,
+ 249, 249, 6, 1, 207, 208, 202, 202,
+ 202, 247, 202, 202, 210, 202, 243, 244,
+ 245, 249, 6, 1, 207, 208, 202, 202,
+ 30, 247, 202, 202, 210, 202, 241, 202,
+ 273, 202, 260, 260, 6, 1, 207, 208,
+ 202, 202, 202, 215, 202, 241, 202, 241,
+ 202, 202, 202, 251, 251, 202, 1, 207,
+ 208, 202, 202, 202, 215, 202, 241, 202,
+ 241, 202, 202, 202, 251, 274, 202, 1,
+ 207, 208, 202, 202, 202, 215, 202, 241,
+ 202, 241, 202, 273, 202, 251, 251, 202,
+ 1, 207, 208, 202, 202, 202, 215, 202,
+ 241, 202, 241, 3, 202, 202, 19, 242,
+ 202, 1, 207, 208, 202, 202, 202, 215,
+ 202, 241, 202, 234, 235, 240, 240, 6,
+ 1, 207, 208, 202, 202, 202, 238, 202,
+ 202, 210, 202, 234, 235, 236, 240, 6,
+ 1, 207, 208, 202, 202, 32, 238, 202,
+ 202, 210, 202, 232, 202, 275, 202, 260,
+ 260, 6, 1, 207, 208, 202, 202, 202,
+ 215, 202, 232, 202, 232, 202, 202, 202,
+ 251, 251, 202, 1, 207, 208, 202, 202,
+ 202, 215, 202, 232, 202, 232, 202, 202,
+ 202, 251, 276, 202, 1, 207, 208, 202,
+ 202, 202, 215, 202, 232, 202, 232, 202,
+ 275, 202, 251, 251, 202, 1, 207, 208,
+ 202, 202, 202, 215, 202, 232, 202, 232,
+ 3, 202, 202, 19, 233, 202, 1, 207,
+ 208, 202, 202, 202, 215, 202, 232, 202,
+ 225, 226, 231, 231, 6, 1, 207, 208,
+ 202, 202, 202, 229, 202, 202, 210, 202,
+ 225, 226, 227, 231, 6, 1, 207, 208,
+ 202, 202, 34, 229, 202, 202, 210, 202,
+ 223, 202, 277, 202, 260, 260, 6, 1,
+ 207, 208, 202, 202, 202, 215, 202, 223,
+ 202, 223, 202, 202, 202, 251, 251, 202,
+ 1, 207, 208, 202, 202, 202, 215, 202,
+ 223, 202, 223, 202, 202, 202, 251, 278,
+ 202, 1, 207, 208, 202, 202, 202, 215,
+ 202, 223, 202, 223, 202, 277, 202, 251,
+ 251, 202, 1, 207, 208, 202, 202, 202,
+ 215, 202, 223, 202, 223, 3, 202, 202,
+ 19, 224, 202, 1, 207, 208, 202, 202,
+ 202, 215, 202, 223, 202, 216, 217, 222,
+ 222, 6, 1, 207, 208, 202, 202, 202,
+ 220, 202, 202, 210, 202, 216, 217, 218,
+ 222, 6, 1, 207, 208, 202, 202, 36,
+ 220, 202, 202, 210, 202, 213, 202, 279,
+ 202, 260, 260, 6, 1, 207, 208, 202,
+ 202, 202, 215, 202, 213, 202, 213, 202,
+ 202, 202, 251, 251, 202, 1, 207, 208,
+ 202, 202, 202, 215, 202, 213, 202, 213,
+ 202, 202, 202, 251, 280, 202, 1, 207,
+ 208, 202, 202, 202, 215, 202, 213, 202,
+ 213, 202, 279, 202, 251, 251, 202, 1,
+ 207, 208, 202, 202, 202, 215, 202, 213,
+ 202, 213, 3, 202, 202, 19, 214, 202,
+ 1, 207, 208, 202, 202, 202, 215, 202,
+ 213, 202, 203, 204, 212, 212, 6, 1,
+ 207, 208, 202, 202, 202, 209, 202, 202,
+ 210, 202, 203, 204, 205, 212, 6, 1,
+ 207, 208, 202, 202, 38, 209, 202, 202,
+ 210, 202, 282, 283, 284, 285, 45, 40,
+ 286, 287, 281, 281, 77, 288, 281, 281,
+ 289, 281, 290, 283, 291, 285, 45, 40,
+ 286, 287, 281, 281, 281, 288, 281, 281,
+ 289, 281, 283, 291, 285, 45, 40, 286,
+ 287, 281, 281, 281, 288, 281, 281, 289,
+ 281, 292, 281, 281, 281, 58, 293, 281,
+ 40, 286, 287, 281, 281, 281, 294, 281,
+ 292, 281, 295, 296, 297, 298, 45, 40,
+ 286, 287, 281, 281, 75, 299, 281, 281,
+ 289, 281, 300, 296, 301, 301, 45, 40,
+ 286, 287, 281, 281, 281, 299, 281, 281,
+ 289, 281, 296, 301, 301, 45, 40, 286,
+ 287, 281, 281, 281, 299, 281, 281, 289,
+ 281, 302, 281, 281, 281, 58, 303, 281,
+ 40, 286, 287, 281, 281, 281, 294, 281,
+ 302, 281, 304, 305, 306, 307, 45, 40,
+ 286, 287, 281, 281, 73, 308, 281, 281,
+ 289, 281, 309, 305, 310, 310, 45, 40,
+ 286, 287, 281, 281, 281, 308, 281, 281,
+ 289, 281, 305, 310, 310, 45, 40, 286,
+ 287, 281, 281, 281, 308, 281, 281, 289,
+ 281, 311, 281, 281, 281, 58, 312, 281,
+ 40, 286, 287, 281, 281, 281, 294, 281,
+ 311, 281, 313, 314, 315, 316, 45, 40,
+ 286, 287, 281, 281, 71, 317, 281, 281,
+ 289, 281, 318, 314, 319, 319, 45, 40,
+ 286, 287, 281, 281, 281, 317, 281, 281,
+ 289, 281, 314, 319, 319, 45, 40, 286,
+ 287, 281, 281, 281, 317, 281, 281, 289,
+ 281, 320, 281, 281, 281, 58, 321, 281,
+ 40, 286, 287, 281, 281, 281, 294, 281,
+ 320, 281, 322, 323, 324, 325, 45, 40,
+ 286, 287, 281, 281, 69, 326, 281, 281,
+ 289, 281, 327, 323, 328, 328, 45, 40,
+ 286, 287, 281, 281, 281, 326, 281, 281,
+ 289, 281, 323, 328, 328, 45, 40, 286,
+ 287, 281, 281, 281, 326, 281, 281, 289,
+ 281, 58, 329, 281, 40, 286, 287, 281,
+ 281, 281, 294, 281, 330, 330, 281, 40,
+ 286, 287, 281, 281, 281, 294, 281, 331,
+ 281, 281, 332, 286, 287, 281, 286, 287,
+ 281, 333, 281, 286, 334, 281, 286, 335,
+ 281, 286, 281, 331, 281, 281, 281, 286,
+ 287, 281, 336, 281, 337, 338, 281, 40,
+ 286, 287, 281, 281, 43, 281, 42, 281,
+ 330, 330, 281, 40, 286, 287, 281, 330,
+ 330, 281, 40, 286, 287, 281, 336, 281,
+ 330, 330, 281, 40, 286, 287, 281, 336,
+ 281, 337, 330, 281, 40, 286, 287, 281,
+ 281, 43, 281, 58, 281, 339, 339, 45,
+ 40, 286, 287, 281, 281, 281, 294, 281,
+ 340, 67, 341, 342, 48, 40, 286, 287,
+ 281, 281, 281, 294, 281, 67, 341, 342,
+ 48, 40, 286, 287, 281, 281, 281, 294,
+ 281, 341, 341, 48, 40, 286, 287, 281,
+ 281, 281, 294, 281, 343, 64, 344, 345,
+ 51, 40, 286, 287, 281, 281, 281, 294,
+ 281, 64, 344, 345, 51, 40, 286, 287,
+ 281, 281, 281, 294, 281, 344, 344, 51,
+ 40, 286, 287, 281, 281, 281, 294, 281,
+ 346, 61, 347, 348, 54, 40, 286, 287,
+ 281, 281, 281, 294, 281, 61, 347, 348,
+ 54, 40, 286, 287, 281, 281, 281, 294,
+ 281, 347, 347, 54, 40, 286, 287, 281,
+ 281, 281, 294, 281, 349, 58, 330, 350,
+ 281, 40, 286, 287, 281, 281, 281, 294,
+ 281, 58, 330, 350, 281, 40, 286, 287,
+ 281, 281, 281, 294, 281, 330, 351, 281,
+ 40, 286, 287, 281, 281, 281, 294, 281,
+ 58, 281, 330, 330, 281, 40, 286, 287,
+ 281, 281, 281, 294, 281, 41, 42, 281,
+ 281, 58, 329, 281, 40, 286, 287, 281,
+ 281, 281, 294, 281, 41, 281, 323, 328,
+ 328, 45, 40, 286, 287, 281, 281, 281,
+ 326, 281, 322, 323, 328, 328, 45, 40,
+ 286, 287, 281, 281, 281, 326, 281, 281,
+ 289, 281, 322, 323, 324, 328, 45, 40,
+ 286, 287, 281, 281, 69, 326, 281, 281,
+ 289, 281, 320, 281, 352, 281, 339, 339,
+ 45, 40, 286, 287, 281, 281, 281, 294,
+ 281, 320, 281, 320, 281, 281, 281, 330,
+ 330, 281, 40, 286, 287, 281, 281, 281,
+ 294, 281, 320, 281, 320, 281, 281, 281,
+ 330, 353, 281, 40, 286, 287, 281, 281,
+ 281, 294, 281, 320, 281, 320, 281, 352,
+ 281, 330, 330, 281, 40, 286, 287, 281,
+ 281, 281, 294, 281, 320, 281, 320, 42,
+ 281, 281, 58, 321, 281, 40, 286, 287,
+ 281, 281, 281, 294, 281, 320, 281, 313,
+ 314, 319, 319, 45, 40, 286, 287, 281,
+ 281, 281, 317, 281, 281, 289, 281, 313,
+ 314, 315, 319, 45, 40, 286, 287, 281,
+ 281, 71, 317, 281, 281, 289, 281, 311,
+ 281, 354, 281, 339, 339, 45, 40, 286,
+ 287, 281, 281, 281, 294, 281, 311, 281,
+ 311, 281, 281, 281, 330, 330, 281, 40,
+ 286, 287, 281, 281, 281, 294, 281, 311,
+ 281, 311, 281, 281, 281, 330, 355, 281,
+ 40, 286, 287, 281, 281, 281, 294, 281,
+ 311, 281, 311, 281, 354, 281, 330, 330,
+ 281, 40, 286, 287, 281, 281, 281, 294,
+ 281, 311, 281, 311, 42, 281, 281, 58,
+ 312, 281, 40, 286, 287, 281, 281, 281,
+ 294, 281, 311, 281, 304, 305, 310, 310,
+ 45, 40, 286, 287, 281, 281, 281, 308,
+ 281, 281, 289, 281, 304, 305, 306, 310,
+ 45, 40, 286, 287, 281, 281, 73, 308,
+ 281, 281, 289, 281, 302, 281, 356, 281,
+ 339, 339, 45, 40, 286, 287, 281, 281,
+ 281, 294, 281, 302, 281, 302, 281, 281,
+ 281, 330, 330, 281, 40, 286, 287, 281,
+ 281, 281, 294, 281, 302, 281, 302, 281,
+ 281, 281, 330, 357, 281, 40, 286, 287,
+ 281, 281, 281, 294, 281, 302, 281, 302,
+ 281, 356, 281, 330, 330, 281, 40, 286,
+ 287, 281, 281, 281, 294, 281, 302, 281,
+ 302, 42, 281, 281, 58, 303, 281, 40,
+ 286, 287, 281, 281, 281, 294, 281, 302,
+ 281, 295, 296, 301, 301, 45, 40, 286,
+ 287, 281, 281, 281, 299, 281, 281, 289,
+ 281, 295, 296, 297, 301, 45, 40, 286,
+ 287, 281, 281, 75, 299, 281, 281, 289,
+ 281, 292, 281, 358, 281, 339, 339, 45,
+ 40, 286, 287, 281, 281, 281, 294, 281,
+ 292, 281, 292, 281, 281, 281, 330, 330,
+ 281, 40, 286, 287, 281, 281, 281, 294,
+ 281, 292, 281, 292, 281, 281, 281, 330,
+ 359, 281, 40, 286, 287, 281, 281, 281,
+ 294, 281, 292, 281, 292, 281, 358, 281,
+ 330, 330, 281, 40, 286, 287, 281, 281,
+ 281, 294, 281, 292, 281, 76, 44, 44,
+ 45, 40, 281, 281, 281, 281, 281, 76,
+ 281, 292, 42, 281, 281, 58, 293, 281,
+ 40, 286, 287, 281, 281, 281, 294, 281,
+ 292, 281, 282, 283, 291, 285, 45, 40,
+ 286, 287, 281, 281, 281, 288, 281, 281,
+ 289, 281, 361, 191, 362, 362, 84, 79,
+ 194, 195, 360, 360, 360, 197, 360, 360,
+ 200, 360, 191, 362, 362, 84, 79, 194,
+ 195, 360, 360, 360, 197, 360, 360, 200,
+ 360, 363, 360, 360, 360, 98, 364, 360,
+ 79, 194, 195, 360, 360, 360, 365, 360,
+ 363, 360, 366, 367, 368, 369, 84, 79,
+ 194, 195, 360, 360, 115, 370, 360, 360,
+ 200, 360, 371, 367, 372, 372, 84, 79,
+ 194, 195, 360, 360, 360, 370, 360, 360,
+ 200, 360, 367, 372, 372, 84, 79, 194,
+ 195, 360, 360, 360, 370, 360, 360, 200,
+ 360, 373, 360, 360, 360, 98, 374, 360,
+ 79, 194, 195, 360, 360, 360, 365, 360,
+ 373, 360, 375, 376, 377, 378, 84, 79,
+ 194, 195, 360, 360, 113, 379, 360, 360,
+ 200, 360, 380, 376, 381, 381, 84, 79,
+ 194, 195, 360, 360, 360, 379, 360, 360,
+ 200, 360, 376, 381, 381, 84, 79, 194,
+ 195, 360, 360, 360, 379, 360, 360, 200,
+ 360, 382, 360, 360, 360, 98, 383, 360,
+ 79, 194, 195, 360, 360, 360, 365, 360,
+ 382, 360, 384, 385, 386, 387, 84, 79,
+ 194, 195, 360, 360, 111, 388, 360, 360,
+ 200, 360, 389, 385, 390, 390, 84, 79,
+ 194, 195, 360, 360, 360, 388, 360, 360,
+ 200, 360, 385, 390, 390, 84, 79, 194,
+ 195, 360, 360, 360, 388, 360, 360, 200,
+ 360, 391, 360, 360, 360, 98, 392, 360,
+ 79, 194, 195, 360, 360, 360, 365, 360,
+ 391, 360, 393, 394, 395, 396, 84, 79,
+ 194, 195, 360, 360, 109, 397, 360, 360,
+ 200, 360, 398, 394, 399, 399, 84, 79,
+ 194, 195, 360, 360, 360, 397, 360, 360,
+ 200, 360, 394, 399, 399, 84, 79, 194,
+ 195, 360, 360, 360, 397, 360, 360, 200,
+ 360, 98, 400, 360, 79, 194, 195, 360,
+ 360, 360, 365, 360, 401, 401, 360, 79,
+ 194, 195, 360, 360, 360, 365, 360, 402,
+ 360, 360, 403, 194, 195, 360, 194, 195,
+ 360, 404, 360, 194, 405, 360, 194, 406,
+ 360, 194, 360, 402, 360, 360, 360, 194,
+ 195, 360, 407, 360, 408, 409, 360, 79,
+ 194, 195, 360, 360, 82, 360, 81, 360,
+ 401, 401, 360, 79, 194, 195, 360, 401,
+ 401, 360, 79, 194, 195, 360, 407, 360,
+ 401, 401, 360, 79, 194, 195, 360, 407,
+ 360, 408, 401, 360, 79, 194, 195, 360,
+ 360, 82, 360, 98, 360, 410, 410, 84,
+ 79, 194, 195, 360, 360, 360, 365, 360,
+ 411, 107, 412, 413, 88, 79, 194, 195,
+ 360, 360, 360, 365, 360, 107, 412, 413,
+ 88, 79, 194, 195, 360, 360, 360, 365,
+ 360, 412, 412, 88, 79, 194, 195, 360,
+ 360, 360, 365, 360, 414, 104, 415, 416,
+ 91, 79, 194, 195, 360, 360, 360, 365,
+ 360, 104, 415, 416, 91, 79, 194, 195,
+ 360, 360, 360, 365, 360, 415, 415, 91,
+ 79, 194, 195, 360, 360, 360, 365, 360,
+ 417, 101, 418, 419, 94, 79, 194, 195,
+ 360, 360, 360, 365, 360, 101, 418, 419,
+ 94, 79, 194, 195, 360, 360, 360, 365,
+ 360, 418, 418, 94, 79, 194, 195, 360,
+ 360, 360, 365, 360, 420, 98, 401, 421,
+ 360, 79, 194, 195, 360, 360, 360, 365,
+ 360, 98, 401, 421, 360, 79, 194, 195,
+ 360, 360, 360, 365, 360, 401, 422, 360,
+ 79, 194, 195, 360, 360, 360, 365, 360,
+ 98, 360, 401, 401, 360, 79, 194, 195,
+ 360, 360, 360, 365, 360, 80, 81, 360,
+ 360, 98, 400, 360, 79, 194, 195, 360,
+ 360, 360, 365, 360, 80, 360, 394, 399,
+ 399, 84, 79, 194, 195, 360, 360, 360,
+ 397, 360, 393, 394, 399, 399, 84, 79,
+ 194, 195, 360, 360, 360, 397, 360, 360,
+ 200, 360, 393, 394, 395, 399, 84, 79,
+ 194, 195, 360, 360, 109, 397, 360, 360,
+ 200, 360, 391, 360, 423, 360, 410, 410,
+ 84, 79, 194, 195, 360, 360, 360, 365,
+ 360, 391, 360, 391, 360, 360, 360, 401,
+ 401, 360, 79, 194, 195, 360, 360, 360,
+ 365, 360, 391, 360, 391, 360, 360, 360,
+ 401, 424, 360, 79, 194, 195, 360, 360,
+ 360, 365, 360, 391, 360, 391, 360, 423,
+ 360, 401, 401, 360, 79, 194, 195, 360,
+ 360, 360, 365, 360, 391, 360, 391, 81,
+ 360, 360, 98, 392, 360, 79, 194, 195,
+ 360, 360, 360, 365, 360, 391, 360, 384,
+ 385, 390, 390, 84, 79, 194, 195, 360,
+ 360, 360, 388, 360, 360, 200, 360, 384,
+ 385, 386, 390, 84, 79, 194, 195, 360,
+ 360, 111, 388, 360, 360, 200, 360, 382,
+ 360, 425, 360, 410, 410, 84, 79, 194,
+ 195, 360, 360, 360, 365, 360, 382, 360,
+ 382, 360, 360, 360, 401, 401, 360, 79,
+ 194, 195, 360, 360, 360, 365, 360, 382,
+ 360, 382, 360, 360, 360, 401, 426, 360,
+ 79, 194, 195, 360, 360, 360, 365, 360,
+ 382, 360, 382, 360, 425, 360, 401, 401,
+ 360, 79, 194, 195, 360, 360, 360, 365,
+ 360, 382, 360, 382, 81, 360, 360, 98,
+ 383, 360, 79, 194, 195, 360, 360, 360,
+ 365, 360, 382, 360, 375, 376, 381, 381,
+ 84, 79, 194, 195, 360, 360, 360, 379,
+ 360, 360, 200, 360, 375, 376, 377, 381,
+ 84, 79, 194, 195, 360, 360, 113, 379,
+ 360, 360, 200, 360, 373, 360, 427, 360,
+ 410, 410, 84, 79, 194, 195, 360, 360,
+ 360, 365, 360, 373, 360, 373, 360, 360,
+ 360, 401, 401, 360, 79, 194, 195, 360,
+ 360, 360, 365, 360, 373, 360, 373, 360,
+ 360, 360, 401, 428, 360, 79, 194, 195,
+ 360, 360, 360, 365, 360, 373, 360, 373,
+ 360, 427, 360, 401, 401, 360, 79, 194,
+ 195, 360, 360, 360, 365, 360, 373, 360,
+ 373, 81, 360, 360, 98, 374, 360, 79,
+ 194, 195, 360, 360, 360, 365, 360, 373,
+ 360, 366, 367, 372, 372, 84, 79, 194,
+ 195, 360, 360, 360, 370, 360, 360, 200,
+ 360, 366, 367, 368, 372, 84, 79, 194,
+ 195, 360, 360, 115, 370, 360, 360, 200,
+ 360, 363, 360, 429, 360, 410, 410, 84,
+ 79, 194, 195, 360, 360, 360, 365, 360,
+ 363, 360, 363, 360, 360, 360, 401, 401,
+ 360, 79, 194, 195, 360, 360, 360, 365,
+ 360, 363, 360, 363, 360, 360, 360, 401,
+ 430, 360, 79, 194, 195, 360, 360, 360,
+ 365, 360, 363, 360, 363, 360, 429, 360,
+ 401, 401, 360, 79, 194, 195, 360, 360,
+ 360, 365, 360, 363, 360, 363, 81, 360,
+ 360, 98, 364, 360, 79, 194, 195, 360,
+ 360, 360, 365, 360, 363, 360, 116, 83,
+ 83, 84, 79, 431, 431, 431, 431, 156,
+ 116, 431, 190, 191, 362, 362, 84, 79,
+ 194, 195, 360, 360, 360, 197, 360, 360,
+ 200, 360, 116, 83, 83, 84, 79, 431,
+ 431, 431, 431, 431, 116, 431, 433, 434,
+ 435, 436, 123, 118, 437, 438, 432, 432,
+ 155, 439, 432, 432, 440, 432, 441, 434,
+ 436, 436, 123, 118, 437, 438, 432, 432,
+ 432, 439, 432, 432, 440, 432, 434, 436,
+ 436, 123, 118, 437, 438, 432, 432, 432,
+ 439, 432, 432, 440, 432, 442, 432, 432,
+ 432, 136, 443, 432, 118, 437, 438, 432,
+ 432, 432, 444, 432, 442, 432, 445, 446,
+ 447, 448, 123, 118, 437, 438, 432, 432,
+ 153, 449, 432, 432, 440, 432, 450, 446,
+ 451, 451, 123, 118, 437, 438, 432, 432,
+ 432, 449, 432, 432, 440, 432, 446, 451,
+ 451, 123, 118, 437, 438, 432, 432, 432,
+ 449, 432, 432, 440, 432, 452, 432, 432,
+ 432, 136, 453, 432, 118, 437, 438, 432,
+ 432, 432, 444, 432, 452, 432, 454, 455,
+ 456, 457, 123, 118, 437, 438, 432, 432,
+ 151, 458, 432, 432, 440, 432, 459, 455,
+ 460, 460, 123, 118, 437, 438, 432, 432,
+ 432, 458, 432, 432, 440, 432, 455, 460,
+ 460, 123, 118, 437, 438, 432, 432, 432,
+ 458, 432, 432, 440, 432, 461, 432, 432,
+ 432, 136, 462, 432, 118, 437, 438, 432,
+ 432, 432, 444, 432, 461, 432, 463, 464,
+ 465, 466, 123, 118, 437, 438, 432, 432,
+ 149, 467, 432, 432, 440, 432, 468, 464,
+ 469, 469, 123, 118, 437, 438, 432, 432,
+ 432, 467, 432, 432, 440, 432, 464, 469,
+ 469, 123, 118, 437, 438, 432, 432, 432,
+ 467, 432, 432, 440, 432, 470, 432, 432,
+ 432, 136, 471, 432, 118, 437, 438, 432,
+ 432, 432, 444, 432, 470, 432, 472, 473,
+ 474, 475, 123, 118, 437, 438, 432, 432,
+ 147, 476, 432, 432, 440, 432, 477, 473,
+ 478, 478, 123, 118, 437, 438, 432, 432,
+ 432, 476, 432, 432, 440, 432, 473, 478,
+ 478, 123, 118, 437, 438, 432, 432, 432,
+ 476, 432, 432, 440, 432, 136, 479, 432,
+ 118, 437, 438, 432, 432, 432, 444, 432,
+ 480, 480, 432, 118, 437, 438, 432, 432,
+ 432, 444, 432, 481, 432, 432, 482, 437,
+ 438, 432, 437, 438, 432, 483, 432, 437,
+ 484, 432, 437, 485, 432, 437, 432, 481,
+ 432, 432, 432, 437, 438, 432, 486, 432,
+ 487, 488, 432, 118, 437, 438, 432, 432,
+ 121, 432, 120, 432, 480, 480, 432, 118,
+ 437, 438, 432, 480, 480, 432, 118, 437,
+ 438, 432, 486, 432, 480, 480, 432, 118,
+ 437, 438, 432, 486, 432, 487, 480, 432,
+ 118, 437, 438, 432, 432, 121, 432, 136,
+ 432, 489, 489, 123, 118, 437, 438, 432,
+ 432, 432, 444, 432, 490, 145, 491, 492,
+ 126, 118, 437, 438, 432, 432, 432, 444,
+ 432, 145, 491, 492, 126, 118, 437, 438,
+ 432, 432, 432, 444, 432, 491, 491, 126,
+ 118, 437, 438, 432, 432, 432, 444, 432,
+ 493, 142, 494, 495, 129, 118, 437, 438,
+ 432, 432, 432, 444, 432, 142, 494, 495,
+ 129, 118, 437, 438, 432, 432, 432, 444,
+ 432, 494, 494, 129, 118, 437, 438, 432,
+ 432, 432, 444, 432, 496, 139, 497, 498,
+ 132, 118, 437, 438, 432, 432, 432, 444,
+ 432, 139, 497, 498, 132, 118, 437, 438,
+ 432, 432, 432, 444, 432, 497, 497, 132,
+ 118, 437, 438, 432, 432, 432, 444, 432,
+ 499, 136, 480, 500, 432, 118, 437, 438,
+ 432, 432, 432, 444, 432, 136, 480, 500,
+ 432, 118, 437, 438, 432, 432, 432, 444,
+ 432, 480, 501, 432, 118, 437, 438, 432,
+ 432, 432, 444, 432, 136, 432, 480, 480,
+ 432, 118, 437, 438, 432, 432, 432, 444,
+ 432, 119, 120, 432, 432, 136, 479, 432,
+ 118, 437, 438, 432, 432, 432, 444, 432,
+ 119, 432, 473, 478, 478, 123, 118, 437,
+ 438, 432, 432, 432, 476, 432, 472, 473,
+ 478, 478, 123, 118, 437, 438, 432, 432,
+ 432, 476, 432, 432, 440, 432, 472, 473,
+ 474, 478, 123, 118, 437, 438, 432, 432,
+ 147, 476, 432, 432, 440, 432, 470, 432,
+ 502, 432, 489, 489, 123, 118, 437, 438,
+ 432, 432, 432, 444, 432, 470, 432, 470,
+ 432, 432, 432, 480, 480, 432, 118, 437,
+ 438, 432, 432, 432, 444, 432, 470, 432,
+ 470, 432, 432, 432, 480, 503, 432, 118,
+ 437, 438, 432, 432, 432, 444, 432, 470,
+ 432, 470, 432, 502, 432, 480, 480, 432,
+ 118, 437, 438, 432, 432, 432, 444, 432,
+ 470, 432, 470, 120, 432, 432, 136, 471,
+ 432, 118, 437, 438, 432, 432, 432, 444,
+ 432, 470, 432, 463, 464, 469, 469, 123,
+ 118, 437, 438, 432, 432, 432, 467, 432,
+ 432, 440, 432, 463, 464, 465, 469, 123,
+ 118, 437, 438, 432, 432, 149, 467, 432,
+ 432, 440, 432, 461, 432, 504, 432, 489,
+ 489, 123, 118, 437, 438, 432, 432, 432,
+ 444, 432, 461, 432, 461, 432, 432, 432,
+ 480, 480, 432, 118, 437, 438, 432, 432,
+ 432, 444, 432, 461, 432, 461, 432, 432,
+ 432, 480, 505, 432, 118, 437, 438, 432,
+ 432, 432, 444, 432, 461, 432, 461, 432,
+ 504, 432, 480, 480, 432, 118, 437, 438,
+ 432, 432, 432, 444, 432, 461, 432, 461,
+ 120, 432, 432, 136, 462, 432, 118, 437,
+ 438, 432, 432, 432, 444, 432, 461, 432,
+ 454, 455, 460, 460, 123, 118, 437, 438,
+ 432, 432, 432, 458, 432, 432, 440, 432,
+ 454, 455, 456, 460, 123, 118, 437, 438,
+ 432, 432, 151, 458, 432, 432, 440, 432,
+ 452, 432, 506, 432, 489, 489, 123, 118,
+ 437, 438, 432, 432, 432, 444, 432, 452,
+ 432, 452, 432, 432, 432, 480, 480, 432,
+ 118, 437, 438, 432, 432, 432, 444, 432,
+ 452, 432, 452, 432, 432, 432, 480, 507,
+ 432, 118, 437, 438, 432, 432, 432, 444,
+ 432, 452, 432, 452, 432, 506, 432, 480,
+ 480, 432, 118, 437, 438, 432, 432, 432,
+ 444, 432, 452, 432, 452, 120, 432, 432,
+ 136, 453, 432, 118, 437, 438, 432, 432,
+ 432, 444, 432, 452, 432, 445, 446, 451,
+ 451, 123, 118, 437, 438, 432, 432, 432,
+ 449, 432, 432, 440, 432, 445, 446, 447,
+ 451, 123, 118, 437, 438, 432, 432, 153,
+ 449, 432, 432, 440, 432, 442, 432, 508,
+ 432, 489, 489, 123, 118, 437, 438, 432,
+ 432, 432, 444, 432, 442, 432, 442, 432,
+ 432, 432, 480, 480, 432, 118, 437, 438,
+ 432, 432, 432, 444, 432, 442, 432, 442,
+ 432, 432, 432, 480, 509, 432, 118, 437,
+ 438, 432, 432, 432, 444, 432, 442, 432,
+ 442, 432, 508, 432, 480, 480, 432, 118,
+ 437, 438, 432, 432, 432, 444, 432, 442,
+ 432, 442, 120, 432, 432, 136, 443, 432,
+ 118, 437, 438, 432, 432, 432, 444, 432,
+ 442, 432, 433, 434, 436, 436, 123, 118,
+ 437, 438, 432, 432, 432, 439, 432, 432,
+ 440, 432, 188, 189, 190, 191, 510, 362,
+ 84, 79, 194, 195, 196, 196, 156, 197,
+ 360, 188, 200, 360, 203, 511, 205, 206,
+ 6, 1, 207, 208, 202, 202, 38, 209,
+ 202, 202, 210, 202, 213, 189, 190, 191,
+ 512, 513, 84, 157, 514, 515, 202, 196,
+ 156, 516, 202, 213, 200, 202, 116, 517,
+ 517, 84, 157, 207, 208, 202, 202, 156,
+ 518, 202, 519, 202, 202, 520, 514, 515,
+ 202, 514, 515, 202, 254, 202, 514, 521,
+ 202, 514, 522, 202, 514, 202, 519, 202,
+ 202, 202, 514, 515, 202, 523, 3, 360,
+ 360, 401, 430, 360, 79, 194, 195, 360,
+ 360, 360, 365, 360, 523, 360, 524, 367,
+ 525, 526, 84, 157, 514, 515, 202, 202,
+ 158, 370, 202, 202, 200, 202, 527, 367,
+ 528, 528, 84, 157, 514, 515, 202, 202,
+ 202, 370, 202, 202, 200, 202, 367, 528,
+ 528, 84, 157, 514, 515, 202, 202, 202,
+ 370, 202, 202, 200, 202, 524, 367, 528,
+ 528, 84, 157, 514, 515, 202, 202, 202,
+ 370, 202, 202, 200, 202, 524, 367, 525,
+ 528, 84, 157, 514, 515, 202, 202, 158,
+ 370, 202, 202, 200, 202, 213, 202, 279,
+ 116, 529, 529, 160, 157, 207, 208, 202,
+ 202, 202, 518, 202, 213, 202, 530, 184,
+ 531, 532, 162, 157, 514, 515, 202, 202,
+ 202, 533, 202, 184, 531, 532, 162, 157,
+ 514, 515, 202, 202, 202, 533, 202, 531,
+ 531, 162, 157, 514, 515, 202, 202, 202,
+ 533, 202, 534, 181, 535, 536, 165, 157,
+ 514, 515, 202, 202, 202, 533, 202, 181,
+ 535, 536, 165, 157, 514, 515, 202, 202,
+ 202, 533, 202, 535, 535, 165, 157, 514,
+ 515, 202, 202, 202, 533, 202, 537, 178,
+ 538, 539, 168, 157, 514, 515, 202, 202,
+ 202, 533, 202, 178, 538, 539, 168, 157,
+ 514, 515, 202, 202, 202, 533, 202, 538,
+ 538, 168, 157, 514, 515, 202, 202, 202,
+ 533, 202, 540, 175, 541, 542, 202, 157,
+ 514, 515, 202, 202, 202, 533, 202, 175,
+ 541, 542, 202, 157, 514, 515, 202, 202,
+ 202, 533, 202, 541, 541, 202, 157, 514,
+ 515, 202, 202, 202, 533, 202, 543, 202,
+ 544, 545, 202, 157, 514, 515, 202, 202,
+ 172, 202, 171, 202, 541, 541, 202, 157,
+ 514, 515, 202, 541, 541, 202, 157, 514,
+ 515, 202, 543, 202, 541, 541, 202, 157,
+ 514, 515, 202, 543, 202, 544, 541, 202,
+ 157, 514, 515, 202, 202, 172, 202, 523,
+ 171, 360, 360, 98, 364, 360, 79, 194,
+ 195, 360, 360, 360, 365, 360, 523, 360,
+ 547, 546, 548, 548, 546, 186, 549, 550,
+ 546, 548, 548, 546, 186, 549, 550, 546,
+ 551, 546, 546, 552, 549, 550, 546, 549,
+ 550, 546, 553, 546, 549, 554, 546, 549,
+ 555, 546, 549, 546, 551, 546, 546, 546,
+ 549, 550, 546, 0
};
static const short _indic_syllable_machine_trans_targs[] = {
178, 200, 207, 209, 210, 4, 213, 5,
7, 216, 8, 10, 219, 11, 13, 222,
14, 16, 17, 199, 19, 20, 221, 22,
- 23, 218, 25, 26, 215, 224, 229, 233,
- 236, 240, 243, 247, 250, 254, 257, 178,
- 280, 287, 289, 290, 41, 293, 42, 44,
- 296, 45, 47, 299, 48, 50, 302, 51,
- 53, 54, 279, 56, 57, 301, 59, 60,
- 298, 62, 63, 295, 304, 309, 313, 316,
- 320, 323, 327, 330, 334, 338, 178, 359,
- 366, 368, 369, 78, 372, 178, 79, 81,
- 375, 82, 84, 378, 85, 87, 381, 88,
- 90, 91, 358, 93, 94, 380, 96, 97,
- 377, 99, 100, 374, 383, 388, 392, 395,
- 399, 402, 406, 409, 413, 178, 440, 447,
- 449, 450, 114, 453, 115, 117, 456, 118,
- 120, 459, 121, 123, 462, 124, 126, 127,
- 439, 129, 130, 461, 132, 133, 458, 135,
- 136, 455, 464, 469, 473, 476, 480, 483,
- 487, 490, 494, 497, 417, 502, 513, 152,
- 516, 154, 519, 155, 157, 522, 158, 160,
- 525, 161, 528, 530, 531, 166, 167, 527,
- 169, 170, 524, 172, 173, 521, 175, 176,
- 518, 178, 536, 178, 179, 259, 339, 341,
- 416, 418, 361, 362, 419, 415, 498, 499,
- 386, 534, 387, 178, 180, 182, 36, 258,
- 202, 203, 256, 227, 228, 181, 35, 183,
- 252, 1, 184, 186, 34, 251, 249, 185,
- 33, 187, 245, 188, 190, 32, 244, 242,
- 189, 31, 191, 238, 192, 194, 30, 237,
- 235, 193, 29, 195, 231, 196, 198, 28,
- 230, 226, 197, 27, 212, 0, 201, 206,
- 178, 204, 205, 208, 2, 211, 3, 214,
- 6, 24, 217, 9, 21, 220, 12, 18,
- 223, 15, 225, 232, 234, 239, 241, 246,
- 248, 253, 255, 178, 260, 262, 73, 336,
- 282, 283, 337, 307, 308, 261, 72, 263,
- 332, 38, 264, 266, 71, 331, 329, 265,
- 70, 267, 325, 268, 270, 69, 324, 322,
- 269, 68, 271, 318, 272, 274, 67, 317,
- 315, 273, 66, 275, 311, 276, 278, 65,
- 310, 306, 277, 64, 292, 37, 281, 286,
- 178, 284, 285, 288, 39, 291, 40, 294,
- 43, 61, 297, 46, 58, 300, 49, 55,
- 303, 52, 305, 312, 314, 319, 321, 326,
- 328, 333, 335, 178, 340, 109, 342, 411,
- 75, 343, 345, 108, 410, 408, 344, 107,
- 346, 404, 347, 349, 106, 403, 401, 348,
- 105, 350, 397, 351, 353, 104, 396, 394,
- 352, 103, 354, 390, 355, 357, 102, 389,
- 385, 356, 101, 371, 74, 360, 365, 178,
- 363, 364, 367, 76, 370, 77, 373, 80,
- 98, 376, 83, 95, 379, 86, 92, 382,
- 89, 384, 391, 393, 398, 400, 405, 407,
- 412, 414, 178, 178, 420, 422, 146, 145,
- 442, 443, 496, 467, 468, 421, 423, 492,
- 111, 424, 426, 144, 491, 489, 425, 143,
- 427, 485, 428, 430, 142, 484, 482, 429,
- 141, 431, 478, 432, 434, 140, 477, 475,
- 433, 139, 435, 471, 436, 438, 138, 470,
- 466, 437, 137, 452, 110, 441, 446, 178,
- 444, 445, 448, 112, 451, 113, 454, 116,
- 134, 457, 119, 131, 460, 122, 128, 463,
- 125, 465, 472, 474, 479, 481, 486, 488,
- 493, 495, 147, 500, 501, 515, 504, 505,
- 533, 148, 509, 503, 508, 506, 507, 510,
- 511, 150, 514, 512, 149, 151, 517, 153,
- 174, 163, 520, 156, 171, 523, 159, 168,
- 526, 162, 165, 529, 164, 532, 178, 535,
- 177, 538, 539, 537, 542, 178, 540, 541
+ 23, 218, 25, 26, 215, 224, 228, 232,
+ 235, 239, 242, 246, 249, 253, 256, 178,
+ 279, 286, 288, 289, 41, 292, 42, 44,
+ 295, 45, 47, 298, 48, 50, 301, 51,
+ 53, 54, 278, 56, 57, 300, 59, 60,
+ 297, 62, 63, 294, 303, 307, 311, 314,
+ 318, 321, 325, 328, 332, 336, 178, 357,
+ 364, 366, 367, 78, 370, 178, 79, 81,
+ 373, 82, 84, 376, 85, 87, 379, 88,
+ 90, 91, 356, 93, 94, 378, 96, 97,
+ 375, 99, 100, 372, 381, 385, 389, 392,
+ 396, 399, 403, 406, 410, 178, 437, 444,
+ 446, 447, 114, 450, 115, 117, 453, 118,
+ 120, 456, 121, 123, 459, 124, 126, 127,
+ 436, 129, 130, 458, 132, 133, 455, 135,
+ 136, 452, 461, 465, 469, 472, 476, 479,
+ 483, 486, 490, 493, 414, 498, 509, 152,
+ 512, 154, 515, 155, 157, 518, 158, 160,
+ 521, 161, 524, 526, 527, 166, 167, 523,
+ 169, 170, 520, 172, 173, 517, 175, 176,
+ 514, 178, 532, 178, 179, 258, 337, 339,
+ 413, 415, 359, 360, 416, 412, 494, 495,
+ 384, 530, 178, 180, 182, 36, 257, 202,
+ 203, 255, 227, 181, 35, 183, 251, 1,
+ 184, 186, 34, 250, 248, 185, 33, 187,
+ 244, 188, 190, 32, 243, 241, 189, 31,
+ 191, 237, 192, 194, 30, 236, 234, 193,
+ 29, 195, 230, 196, 198, 28, 229, 226,
+ 197, 27, 212, 0, 201, 206, 178, 204,
+ 205, 208, 2, 211, 3, 214, 6, 24,
+ 217, 9, 21, 220, 12, 18, 223, 15,
+ 225, 231, 233, 238, 240, 245, 247, 252,
+ 254, 178, 259, 261, 73, 334, 281, 282,
+ 335, 306, 260, 72, 262, 330, 38, 263,
+ 265, 71, 329, 327, 264, 70, 266, 323,
+ 267, 269, 69, 322, 320, 268, 68, 270,
+ 316, 271, 273, 67, 315, 313, 272, 66,
+ 274, 309, 275, 277, 65, 308, 305, 276,
+ 64, 291, 37, 280, 285, 178, 283, 284,
+ 287, 39, 290, 40, 293, 43, 61, 296,
+ 46, 58, 299, 49, 55, 302, 52, 304,
+ 310, 312, 317, 319, 324, 326, 331, 333,
+ 178, 338, 109, 340, 408, 75, 341, 343,
+ 108, 407, 405, 342, 107, 344, 401, 345,
+ 347, 106, 400, 398, 346, 105, 348, 394,
+ 349, 351, 104, 393, 391, 350, 103, 352,
+ 387, 353, 355, 102, 386, 383, 354, 101,
+ 369, 74, 358, 363, 178, 361, 362, 365,
+ 76, 368, 77, 371, 80, 98, 374, 83,
+ 95, 377, 86, 92, 380, 89, 382, 388,
+ 390, 395, 397, 402, 404, 409, 411, 178,
+ 178, 417, 419, 146, 145, 439, 440, 492,
+ 464, 418, 420, 488, 111, 421, 423, 144,
+ 487, 485, 422, 143, 424, 481, 425, 427,
+ 142, 480, 478, 426, 141, 428, 474, 429,
+ 431, 140, 473, 471, 430, 139, 432, 467,
+ 433, 435, 138, 466, 463, 434, 137, 449,
+ 110, 438, 443, 178, 441, 442, 445, 112,
+ 448, 113, 451, 116, 134, 454, 119, 131,
+ 457, 122, 128, 460, 125, 462, 468, 470,
+ 475, 477, 482, 484, 489, 491, 147, 496,
+ 497, 511, 500, 501, 529, 148, 505, 499,
+ 504, 502, 503, 506, 507, 150, 510, 508,
+ 149, 151, 513, 153, 174, 163, 516, 156,
+ 171, 519, 159, 168, 522, 162, 165, 525,
+ 164, 528, 178, 531, 177, 534, 535, 533,
+ 538, 178, 536, 537
};
static const char _indic_syllable_machine_trans_actions[] = {
@@ -1285,51 +1087,51 @@
0, 0, 2, 0, 0, 2, 0, 0,
2, 9, 0, 12, 2, 2, 6, 2,
13, 13, 0, 0, 2, 2, 6, 2,
- 6, 2, 6, 14, 2, 2, 0, 2,
- 0, 0, 2, 2, 2, 2, 0, 2,
- 2, 0, 2, 2, 0, 2, 2, 2,
- 0, 2, 2, 2, 2, 0, 2, 2,
- 2, 0, 2, 2, 2, 2, 0, 2,
- 2, 2, 0, 2, 2, 2, 2, 0,
- 2, 2, 2, 0, 2, 0, 0, 0,
- 15, 0, 0, 2, 0, 2, 0, 2,
- 0, 0, 2, 0, 0, 2, 0, 0,
- 2, 0, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 16, 2, 2, 0, 2,
- 0, 0, 2, 2, 2, 2, 0, 2,
- 2, 0, 2, 2, 0, 2, 2, 2,
- 0, 2, 2, 2, 2, 0, 2, 2,
- 2, 0, 2, 2, 2, 2, 0, 2,
- 2, 2, 0, 2, 2, 2, 2, 0,
- 2, 2, 2, 0, 2, 0, 0, 0,
- 17, 0, 0, 2, 0, 2, 0, 2,
- 0, 0, 2, 0, 0, 2, 0, 0,
- 2, 0, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 18, 6, 0, 6, 6,
- 0, 6, 2, 0, 6, 2, 6, 0,
- 6, 6, 6, 2, 0, 6, 2, 6,
- 0, 6, 6, 6, 2, 0, 6, 2,
- 6, 0, 6, 6, 6, 2, 0, 6,
- 2, 6, 0, 6, 0, 0, 0, 19,
- 0, 0, 2, 0, 2, 0, 2, 0,
- 0, 2, 0, 0, 2, 0, 0, 2,
- 0, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 20, 21, 2, 2, 0, 0,
- 0, 0, 2, 2, 2, 2, 2, 2,
- 0, 2, 2, 0, 2, 2, 2, 0,
+ 6, 2, 14, 2, 2, 0, 2, 0,
+ 0, 2, 2, 2, 0, 2, 2, 0,
+ 2, 2, 0, 2, 2, 2, 0, 2,
+ 2, 2, 2, 0, 2, 2, 2, 0,
2, 2, 2, 2, 0, 2, 2, 2,
0, 2, 2, 2, 2, 0, 2, 2,
- 2, 0, 2, 2, 2, 2, 0, 2,
- 2, 2, 0, 2, 0, 0, 0, 22,
- 0, 0, 2, 0, 2, 0, 2, 0,
+ 2, 0, 2, 0, 0, 0, 15, 0,
+ 0, 2, 0, 2, 0, 2, 0, 0,
+ 2, 0, 0, 2, 0, 0, 2, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 16, 2, 2, 0, 2, 0, 0,
+ 2, 2, 2, 0, 2, 2, 0, 2,
+ 2, 0, 2, 2, 2, 0, 2, 2,
+ 2, 2, 0, 2, 2, 2, 0, 2,
+ 2, 2, 2, 0, 2, 2, 2, 0,
+ 2, 2, 2, 2, 0, 2, 2, 2,
+ 0, 2, 0, 0, 0, 17, 0, 0,
+ 2, 0, 2, 0, 2, 0, 0, 2,
+ 0, 0, 2, 0, 0, 2, 0, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 18, 6, 0, 6, 6, 0, 6, 2,
+ 0, 6, 2, 6, 0, 6, 6, 6,
+ 2, 0, 6, 2, 6, 0, 6, 6,
+ 6, 2, 0, 6, 2, 6, 0, 6,
+ 6, 6, 2, 0, 6, 2, 6, 0,
+ 6, 0, 0, 0, 19, 0, 0, 2,
+ 0, 2, 0, 2, 0, 0, 2, 0,
+ 0, 2, 0, 0, 2, 0, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 20,
+ 21, 2, 2, 0, 0, 0, 0, 2,
+ 2, 2, 2, 2, 0, 2, 2, 0,
+ 2, 2, 2, 0, 2, 2, 2, 2,
+ 0, 2, 2, 2, 0, 2, 2, 2,
+ 2, 0, 2, 2, 2, 0, 2, 2,
+ 2, 2, 0, 2, 2, 2, 0, 2,
+ 0, 0, 0, 22, 0, 0, 2, 0,
+ 2, 0, 2, 0, 0, 2, 0, 0,
+ 2, 0, 0, 2, 0, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 0, 0,
+ 8, 2, 0, 0, 2, 0, 2, 0,
+ 0, 0, 0, 8, 8, 0, 8, 8,
+ 0, 0, 2, 0, 0, 0, 2, 0,
0, 2, 0, 0, 2, 0, 0, 2,
- 0, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 0, 0, 8, 2, 0, 0,
- 2, 0, 2, 0, 0, 0, 0, 8,
- 8, 0, 8, 8, 0, 0, 2, 0,
- 0, 0, 2, 0, 0, 2, 0, 0,
- 2, 0, 0, 2, 0, 2, 23, 2,
- 0, 0, 0, 0, 0, 24, 0, 0
+ 0, 2, 23, 2, 0, 0, 0, 0,
+ 0, 24, 0, 0
};
static const char _indic_syllable_machine_to_state_actions[] = {
@@ -1400,7 +1202,7 @@
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0
+ 0, 0, 0
};
static const char _indic_syllable_machine_from_state_actions[] = {
@@ -1471,7 +1273,7 @@
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0
+ 0, 0, 0
};
static const short _indic_syllable_machine_eof_trans[] = {
@@ -1497,52 +1299,52 @@
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
- 1, 186, 0, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 284, 284, 284, 284, 284,
- 284, 284, 284, 284, 284, 284, 284, 284,
- 284, 284, 284, 284, 284, 284, 284, 284,
- 284, 284, 284, 284, 284, 284, 284, 284,
- 284, 284, 284, 284, 284, 284, 284, 284,
- 284, 284, 284, 284, 284, 284, 284, 284,
- 284, 284, 284, 284, 284, 284, 284, 284,
- 284, 284, 284, 284, 284, 284, 284, 284,
- 284, 284, 284, 284, 284, 284, 284, 284,
- 284, 284, 284, 284, 284, 284, 284, 284,
- 284, 284, 284, 364, 364, 364, 364, 364,
- 364, 364, 364, 364, 364, 364, 364, 364,
- 364, 364, 364, 364, 364, 364, 364, 364,
- 364, 364, 364, 364, 364, 364, 364, 364,
- 364, 364, 364, 364, 364, 364, 364, 364,
- 364, 364, 364, 364, 364, 364, 364, 364,
- 364, 364, 364, 364, 364, 364, 364, 364,
- 364, 364, 364, 364, 364, 364, 364, 364,
- 364, 364, 364, 364, 364, 364, 364, 364,
- 364, 364, 364, 364, 364, 364, 364, 364,
- 435, 364, 435, 436, 436, 436, 436, 436,
- 436, 436, 436, 436, 436, 436, 436, 436,
- 436, 436, 436, 436, 436, 436, 436, 436,
- 436, 436, 436, 436, 436, 436, 436, 436,
- 436, 436, 436, 436, 436, 436, 436, 436,
- 436, 436, 436, 436, 436, 436, 436, 436,
- 436, 436, 436, 436, 436, 436, 436, 436,
- 436, 436, 436, 436, 436, 436, 436, 436,
- 436, 436, 436, 436, 436, 436, 436, 436,
- 436, 436, 436, 436, 436, 436, 436, 436,
- 436, 436, 364, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 364, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 364, 551, 551,
- 551, 551, 551, 551, 551, 551, 551
+ 1, 186, 0, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 203, 282, 282, 282, 282, 282, 282,
+ 282, 282, 282, 282, 282, 282, 282, 282,
+ 282, 282, 282, 282, 282, 282, 282, 282,
+ 282, 282, 282, 282, 282, 282, 282, 282,
+ 282, 282, 282, 282, 282, 282, 282, 282,
+ 282, 282, 282, 282, 282, 282, 282, 282,
+ 282, 282, 282, 282, 282, 282, 282, 282,
+ 282, 282, 282, 282, 282, 282, 282, 282,
+ 282, 282, 282, 282, 282, 282, 282, 282,
+ 282, 282, 282, 282, 282, 282, 282, 282,
+ 282, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 432, 361, 432,
+ 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 361, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 361, 203, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 361, 547, 547, 547, 547, 547, 547,
+ 547, 547, 547
};
static const int indic_syllable_machine_start = 178;
@@ -1556,7 +1358,7 @@
-#line 97 "hb-ot-shape-complex-indic-machine.rl"
+#line 96 "hb-ot-shape-complex-indic-machine.rl"
#define found_syllable(syllable_type) \
@@ -1576,7 +1378,7 @@
int cs;
hb_glyph_info_t *info = buffer->info;
-#line 1580 "hb-ot-shape-complex-indic-machine.hh"
+#line 1382 "hb-ot-shape-complex-indic-machine.hh"
{
cs = indic_syllable_machine_start;
ts = 0;
@@ -1584,7 +1386,7 @@
act = 0;
}
-#line 118 "hb-ot-shape-complex-indic-machine.rl"
+#line 117 "hb-ot-shape-complex-indic-machine.rl"
p = 0;
@@ -1593,7 +1395,7 @@
unsigned int last = 0;
unsigned int syllable_serial = 1;
-#line 1597 "hb-ot-shape-complex-indic-machine.hh"
+#line 1399 "hb-ot-shape-complex-indic-machine.hh"
{
int _slen;
int _trans;
@@ -1607,7 +1409,7 @@
#line 1 "NONE"
{ts = p;}
break;
-#line 1611 "hb-ot-shape-complex-indic-machine.hh"
+#line 1413 "hb-ot-shape-complex-indic-machine.hh"
}
_keys = _indic_syllable_machine_trans_keys + (cs<<1);
@@ -1630,71 +1432,71 @@
{te = p+1;}
break;
case 15:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
{te = p+1;{ found_syllable (consonant_syllable); }}
break;
case 17:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
{te = p+1;{ found_syllable (vowel_syllable); }}
break;
case 22:
-#line 90 "hb-ot-shape-complex-indic-machine.rl"
+#line 89 "hb-ot-shape-complex-indic-machine.rl"
{te = p+1;{ found_syllable (standalone_cluster); }}
break;
case 24:
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
+#line 90 "hb-ot-shape-complex-indic-machine.rl"
{te = p+1;{ found_syllable (symbol_cluster); }}
break;
case 19:
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+#line 91 "hb-ot-shape-complex-indic-machine.rl"
{te = p+1;{ found_syllable (broken_cluster); }}
break;
case 12:
-#line 93 "hb-ot-shape-complex-indic-machine.rl"
+#line 92 "hb-ot-shape-complex-indic-machine.rl"
{te = p+1;{ found_syllable (non_indic_cluster); }}
break;
case 14:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (consonant_syllable); }}
break;
case 16:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (vowel_syllable); }}
break;
case 21:
-#line 90 "hb-ot-shape-complex-indic-machine.rl"
+#line 89 "hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (standalone_cluster); }}
break;
case 23:
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
+#line 90 "hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (symbol_cluster); }}
break;
case 18:
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+#line 91 "hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (broken_cluster); }}
break;
case 20:
-#line 93 "hb-ot-shape-complex-indic-machine.rl"
+#line 92 "hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (non_indic_cluster); }}
break;
case 1:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
break;
case 3:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (vowel_syllable); }}
break;
case 7:
-#line 90 "hb-ot-shape-complex-indic-machine.rl"
+#line 89 "hb-ot-shape-complex-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (standalone_cluster); }}
break;
case 9:
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
+#line 90 "hb-ot-shape-complex-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (symbol_cluster); }}
break;
case 4:
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+#line 91 "hb-ot-shape-complex-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
break;
case 5:
@@ -1715,22 +1517,22 @@
case 8:
#line 1 "NONE"
{te = p+1;}
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
{act = 1;}
break;
case 6:
#line 1 "NONE"
{te = p+1;}
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+#line 91 "hb-ot-shape-complex-indic-machine.rl"
{act = 5;}
break;
case 13:
#line 1 "NONE"
{te = p+1;}
-#line 93 "hb-ot-shape-complex-indic-machine.rl"
+#line 92 "hb-ot-shape-complex-indic-machine.rl"
{act = 6;}
break;
-#line 1734 "hb-ot-shape-complex-indic-machine.hh"
+#line 1536 "hb-ot-shape-complex-indic-machine.hh"
}
_again:
@@ -1739,7 +1541,7 @@
#line 1 "NONE"
{ts = 0;}
break;
-#line 1743 "hb-ot-shape-complex-indic-machine.hh"
+#line 1545 "hb-ot-shape-complex-indic-machine.hh"
}
if ( ++p != pe )
@@ -1755,7 +1557,7 @@
}
-#line 127 "hb-ot-shape-complex-indic-machine.rl"
+#line 126 "hb-ot-shape-complex-indic-machine.rl"
}
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-private.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-private.hh Fri Aug 26 10:14:15 2016 -0700
@@ -60,11 +60,10 @@
OT_Repha = 15, /* Atomically-encoded logical or visual repha. */
OT_Ra = 16,
OT_CM = 17, /* Consonant-Medial. */
- OT_Symbol = 18, /* Avagraha, etc that take marks (SM,A,VD). */
- OT_CM2 = 31 /* Consonant-Medial, second slot. */
+ OT_Symbol = 18 /* Avagraha, etc that take marks (SM,A,VD). */
};
-#define MEDIAL_FLAGS (FLAG (OT_CM) | FLAG (OT_CM2))
+#define MEDIAL_FLAGS (FLAG (OT_CM))
/* Note:
*
@@ -109,27 +108,31 @@
INDIC_SYLLABIC_CATEGORY_AVAGRAHA = OT_Symbol,
INDIC_SYLLABIC_CATEGORY_BINDU = OT_SM,
- INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER = OT_PLACEHOLDER, /* TODO */
+ INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER = OT_PLACEHOLDER, /* Don't care. */
INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK = OT_A,
INDIC_SYLLABIC_CATEGORY_CONSONANT = OT_C,
INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD = OT_C,
INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL = OT_CM,
INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER = OT_C,
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER = OT_M, /* U+17CD only. */
INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL = OT_CM,
INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER = OT_PLACEHOLDER,
INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA = OT_Repha,
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED = OT_X, /* Don't care. */
INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED = OT_CM,
INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA = OT_N,
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER = OT_Repha, /* TODO */
INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK = OT_SM,
- INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER = OT_H, /* TODO */
+ INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER = OT_Coeng,
INDIC_SYLLABIC_CATEGORY_JOINER = OT_ZWJ,
INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER = OT_X,
INDIC_SYLLABIC_CATEGORY_NON_JOINER = OT_ZWNJ,
INDIC_SYLLABIC_CATEGORY_NUKTA = OT_N,
INDIC_SYLLABIC_CATEGORY_NUMBER = OT_PLACEHOLDER,
- INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER = OT_PLACEHOLDER, /* TODO */
- INDIC_SYLLABIC_CATEGORY_PURE_KILLER = OT_H, /* TODO */
+ INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER = OT_PLACEHOLDER, /* Don't care. */
+ INDIC_SYLLABIC_CATEGORY_PURE_KILLER = OT_M, /* Is like a vowel matra. */
INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER = OT_RS,
+ INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER = OT_M, /* Misc Khmer signs. */
INDIC_SYLLABIC_CATEGORY_TONE_LETTER = OT_X,
INDIC_SYLLABIC_CATEGORY_TONE_MARK = OT_N,
INDIC_SYLLABIC_CATEGORY_VIRAMA = OT_H,
@@ -162,17 +165,23 @@
};
#define INDIC_COMBINE_CATEGORIES(S,M) \
- (ASSERT_STATIC_EXPR_ZERO (M == INDIC_MATRA_CATEGORY_NOT_APPLICABLE || \
- ( \
- S == INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL || \
- S == INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK || \
- S == INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER || \
- S == INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA || \
- S == INDIC_SYLLABIC_CATEGORY_VIRAMA || \
- S == INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT || \
- false)) + \
- ASSERT_STATIC_EXPR_ZERO (S < 255 && M < 255) + \
- ((M << 8) | S))
+ ( \
+ ASSERT_STATIC_EXPR_ZERO (S < 255 && M < 255) + \
+ ( S | \
+ ( \
+ ( \
+ S == INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL || \
+ S == INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK || \
+ S == INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER || \
+ S == INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA || \
+ S == INDIC_SYLLABIC_CATEGORY_VIRAMA || \
+ S == INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT || \
+ false \
+ ? M : INDIC_MATRA_CATEGORY_NOT_APPLICABLE \
+ ) << 8 \
+ ) \
+ ) \
+ )
HB_INTERNAL INDIC_TABLE_ELEMENT_TYPE
hb_indic_get_categories (hb_codepoint_t u);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-table.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-table.cc Fri Aug 26 10:14:15 2016 -0700
@@ -2,67 +2,71 @@
/*
* The following table is generated by running:
*
- * ./gen-indic-table.py IndicSyllabicCategory.txt IndicMatraCategory.txt Blocks.txt
+ * ./gen-indic-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt Blocks.txt
*
* on files with these headers:
*
- * # IndicSyllabicCategory-7.0.0.txt
- * # Date: 2014-06-03, 07:00:00 GMT [KW, LI, AG, RP]
- * # IndicMatraCategory-7.0.0.txt
- * # Date: 2014-06-03, 07:00:00 GMT [KW, LI, AG, RP]
- * # Blocks-7.0.0.txt
- * # Date: 2014-04-03, 23:23:00 GMT [RP, KW]
+ * # IndicSyllabicCategory-9.0.0.txt
+ * # Date: 2016-05-21, 02:46:00 GMT [RP]
+ * # IndicPositionalCategory-9.0.0.txt
+ * # Date: 2016-02-25, 00:48:00 GMT [RP]
+ * # Blocks-9.0.0.txt
+ * # Date: 2016-02-05, 23:48:00 GMT [KW]
*/
#include "hb-ot-shape-complex-indic-private.hh"
-#define ISC_A INDIC_SYLLABIC_CATEGORY_AVAGRAHA /* 13 chars; Avagraha */
-#define ISC_Bi INDIC_SYLLABIC_CATEGORY_BINDU /* 59 chars; Bindu */
+#define ISC_A INDIC_SYLLABIC_CATEGORY_AVAGRAHA /* 15 chars; Avagraha */
+#define ISC_Bi INDIC_SYLLABIC_CATEGORY_BINDU /* 67 chars; Bindu */
#define ISC_BJN INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER /* 20 chars; Brahmi_Joining_Number */
-#define ISC_Ca INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK /* 30 chars; Cantillation_Mark */
-#define ISC_C INDIC_SYLLABIC_CATEGORY_CONSONANT /* 1744 chars; Consonant */
-#define ISC_CD INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD /* 7 chars; Consonant_Dead */
-#define ISC_CF INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL /* 61 chars; Consonant_Final */
+#define ISC_Ca INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK /* 53 chars; Cantillation_Mark */
+#define ISC_C INDIC_SYLLABIC_CATEGORY_CONSONANT /* 1907 chars; Consonant */
+#define ISC_CD INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD /* 10 chars; Consonant_Dead */
+#define ISC_CF INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL /* 62 chars; Consonant_Final */
#define ISC_CHL INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER /* 5 chars; Consonant_Head_Letter */
-#define ISC_CM INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL /* 19 chars; Consonant_Medial */
-#define ISC_CP INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER /* 11 chars; Consonant_Placeholder */
+#define ISC_CK INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER /* 2 chars; Consonant_Killer */
+#define ISC_CM INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL /* 22 chars; Consonant_Medial */
+#define ISC_CP INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER /* 16 chars; Consonant_Placeholder */
#define ISC_CPR INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA /* 1 chars; Consonant_Preceding_Repha */
-#define ISC_CS INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED /* 61 chars; Consonant_Subjoined */
+#define ISC_CPrf INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED /* 2 chars; Consonant_Prefixed */
+#define ISC_CS INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED /* 90 chars; Consonant_Subjoined */
#define ISC_CSR INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA /* 4 chars; Consonant_Succeeding_Repha */
+#define ISC_CWS INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER /* 4 chars; Consonant_With_Stacker */
#define ISC_GM INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK /* 2 chars; Gemination_Mark */
#define ISC_IS INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER /* 7 chars; Invisible_Stacker */
#define ISC_ZWJ INDIC_SYLLABIC_CATEGORY_JOINER /* 1 chars; Joiner */
#define ISC_ML INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER /* 1 chars; Modifying_Letter */
#define ISC_ZWNJ INDIC_SYLLABIC_CATEGORY_NON_JOINER /* 1 chars; Non_Joiner */
-#define ISC_N INDIC_SYLLABIC_CATEGORY_NUKTA /* 18 chars; Nukta */
-#define ISC_Nd INDIC_SYLLABIC_CATEGORY_NUMBER /* 408 chars; Number */
+#define ISC_N INDIC_SYLLABIC_CATEGORY_NUKTA /* 24 chars; Nukta */
+#define ISC_Nd INDIC_SYLLABIC_CATEGORY_NUMBER /* 459 chars; Number */
#define ISC_NJ INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER /* 1 chars; Number_Joiner */
#define ISC_x INDIC_SYLLABIC_CATEGORY_OTHER /* 1 chars; Other */
-#define ISC_PK INDIC_SYLLABIC_CATEGORY_PURE_KILLER /* 15 chars; Pure_Killer */
-#define ISC_RS INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER /* 3 chars; Register_Shifter */
+#define ISC_PK INDIC_SYLLABIC_CATEGORY_PURE_KILLER /* 16 chars; Pure_Killer */
+#define ISC_RS INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER /* 2 chars; Register_Shifter */
+#define ISC_SM INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER /* 22 chars; Syllable_Modifier */
#define ISC_TL INDIC_SYLLABIC_CATEGORY_TONE_LETTER /* 7 chars; Tone_Letter */
-#define ISC_TM INDIC_SYLLABIC_CATEGORY_TONE_MARK /* 62 chars; Tone_Mark */
-#define ISC_V INDIC_SYLLABIC_CATEGORY_VIRAMA /* 22 chars; Virama */
-#define ISC_Vs INDIC_SYLLABIC_CATEGORY_VISARGA /* 29 chars; Visarga */
+#define ISC_TM INDIC_SYLLABIC_CATEGORY_TONE_MARK /* 42 chars; Tone_Mark */
+#define ISC_V INDIC_SYLLABIC_CATEGORY_VIRAMA /* 24 chars; Virama */
+#define ISC_Vs INDIC_SYLLABIC_CATEGORY_VISARGA /* 31 chars; Visarga */
#define ISC_Vo INDIC_SYLLABIC_CATEGORY_VOWEL /* 30 chars; Vowel */
-#define ISC_M INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT /* 553 chars; Vowel_Dependent */
-#define ISC_VI INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT /* 395 chars; Vowel_Independent */
+#define ISC_M INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT /* 602 chars; Vowel_Dependent */
+#define ISC_VI INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT /* 431 chars; Vowel_Independent */
-#define IMC_B INDIC_MATRA_CATEGORY_BOTTOM /* 142 chars; Bottom */
+#define IMC_B INDIC_MATRA_CATEGORY_BOTTOM /* 300 chars; Bottom */
#define IMC_BR INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT /* 2 chars; Bottom_And_Right */
#define IMC_L INDIC_MATRA_CATEGORY_LEFT /* 57 chars; Left */
#define IMC_LR INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT /* 21 chars; Left_And_Right */
#define IMC_x INDIC_MATRA_CATEGORY_NOT_APPLICABLE /* 1 chars; Not_Applicable */
-#define IMC_O INDIC_MATRA_CATEGORY_OVERSTRUCK /* 2 chars; Overstruck */
-#define IMC_R INDIC_MATRA_CATEGORY_RIGHT /* 163 chars; Right */
-#define IMC_T INDIC_MATRA_CATEGORY_TOP /* 169 chars; Top */
+#define IMC_O INDIC_MATRA_CATEGORY_OVERSTRUCK /* 10 chars; Overstruck */
+#define IMC_R INDIC_MATRA_CATEGORY_RIGHT /* 258 chars; Right */
+#define IMC_T INDIC_MATRA_CATEGORY_TOP /* 342 chars; Top */
#define IMC_TB INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM /* 10 chars; Top_And_Bottom */
#define IMC_TBR INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT /* 1 chars; Top_And_Bottom_And_Right */
#define IMC_TL INDIC_MATRA_CATEGORY_TOP_AND_LEFT /* 6 chars; Top_And_Left */
#define IMC_TLR INDIC_MATRA_CATEGORY_TOP_AND_LEFT_AND_RIGHT /* 4 chars; Top_And_Left_And_Right */
#define IMC_TR INDIC_MATRA_CATEGORY_TOP_AND_RIGHT /* 13 chars; Top_And_Right */
-#define IMC_VOL INDIC_MATRA_CATEGORY_VISUAL_ORDER_LEFT /* 15 chars; Visual_Order_Left */
+#define IMC_VOL INDIC_MATRA_CATEGORY_VISUAL_ORDER_LEFT /* 19 chars; Visual_Order_Left */
#define _(S,M) INDIC_COMBINE_CATEGORIES (ISC_##S, IMC_##M)
@@ -79,29 +83,33 @@
/* 0030 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
/* 0038 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-#define indic_offset_0x00d0u 24
+#define indic_offset_0x00b0u 24
/* Latin-1 Supplement */
+ /* 00B0 */ _(x,x), _(x,x), _(SM,x), _(SM,x), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* 00B8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* 00C0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* 00C8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* 00D0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(CP,x),
-#define indic_offset_0x0900u 32
+#define indic_offset_0x0900u 64
/* Devanagari */
- /* 0900 */ _(Bi,x), _(Bi,x), _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0900 */ _(Bi,T), _(Bi,T), _(Bi,T), _(Vs,R), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
/* 0908 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
/* 0910 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
/* 0918 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0920 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0928 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0930 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 0938 */ _(C,x), _(C,x), _(M,T), _(M,R), _(N,x), _(A,x), _(M,R), _(M,L),
+ /* 0938 */ _(C,x), _(C,x), _(M,T), _(M,R), _(N,B), _(A,x), _(M,R), _(M,L),
/* 0940 */ _(M,R), _(M,B), _(M,B), _(M,B), _(M,B), _(M,T), _(M,T), _(M,T),
/* 0948 */ _(M,T), _(M,R), _(M,R), _(M,R), _(M,R), _(V,B), _(M,L), _(M,R),
- /* 0950 */ _(x,x), _(TM,x), _(TM,x), _(x,x), _(x,x), _(M,T), _(M,B), _(M,B),
+ /* 0950 */ _(x,x), _(Ca,T), _(Ca,B), _(x,T), _(x,T), _(M,T), _(M,B), _(M,B),
/* 0958 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0960 */ _(VI,x), _(VI,x), _(M,B), _(M,B), _(x,x), _(x,x), _(Nd,x), _(Nd,x),
/* 0968 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
@@ -110,14 +118,14 @@
/* Bengali */
- /* 0980 */ _(x,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0980 */ _(x,x), _(Bi,T), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
/* 0988 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(x,x), _(VI,x),
/* 0990 */ _(VI,x), _(x,x), _(x,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
/* 0998 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 09A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 09A8 */ _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 09B0 */ _(C,x), _(x,x), _(C,x), _(x,x), _(x,x), _(x,x), _(C,x), _(C,x),
- /* 09B8 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,x), _(A,x), _(M,R), _(M,L),
+ /* 09B8 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,B), _(A,x), _(M,R), _(M,L),
/* 09C0 */ _(M,R), _(M,B), _(M,B), _(M,B), _(M,B), _(x,x), _(x,x), _(M,L),
/* 09C8 */ _(M,L), _(x,x), _(x,x), _(M,LR), _(M,LR), _(V,B), _(CD,x), _(x,x),
/* 09D0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,R),
@@ -129,33 +137,33 @@
/* Gurmukhi */
- /* 0A00 */ _(x,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0A00 */ _(x,x), _(Bi,T), _(Bi,T), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
/* 0A08 */ _(VI,x), _(VI,x), _(VI,x), _(x,x), _(x,x), _(x,x), _(x,x), _(VI,x),
/* 0A10 */ _(VI,x), _(x,x), _(x,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
/* 0A18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0A20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0A28 */ _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0A30 */ _(C,x), _(x,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), _(x,x),
- /* 0A38 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,x), _(x,x), _(M,R), _(M,L),
+ /* 0A38 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,B), _(x,x), _(M,R), _(M,L),
/* 0A40 */ _(M,R), _(M,B), _(M,B), _(x,x), _(x,x), _(x,x), _(x,x), _(M,T),
/* 0A48 */ _(M,T), _(x,x), _(x,x), _(M,T), _(M,T), _(V,B), _(x,x), _(x,x),
/* 0A50 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* 0A58 */ _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(C,x), _(x,x),
/* 0A60 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(Nd,x), _(Nd,x),
/* 0A68 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 0A70 */ _(Bi,x), _(GM,T), _(CP,x), _(CP,x), _(x,x), _(CM,x), _(x,x), _(x,x),
+ /* 0A70 */ _(Bi,T), _(GM,T), _(CP,x), _(CP,x), _(x,x), _(CM,B), _(x,x), _(x,x),
/* 0A78 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* Gujarati */
- /* 0A80 */ _(x,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0A80 */ _(x,x), _(Bi,T), _(Bi,T), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
/* 0A88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(VI,x),
/* 0A90 */ _(VI,x), _(VI,x), _(x,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
/* 0A98 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0AA0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0AA8 */ _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0AB0 */ _(C,x), _(x,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), _(C,x),
- /* 0AB8 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,x), _(A,x), _(M,R), _(M,L),
+ /* 0AB8 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,B), _(A,x), _(M,R), _(M,L),
/* 0AC0 */ _(M,R), _(M,B), _(M,B), _(M,B), _(M,B), _(M,T), _(x,x), _(M,T),
/* 0AC8 */ _(M,T), _(M,TR), _(x,x), _(M,R), _(M,R), _(V,B), _(x,x), _(x,x),
/* 0AD0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
@@ -163,18 +171,18 @@
/* 0AE0 */ _(VI,x), _(VI,x), _(M,B), _(M,B), _(x,x), _(x,x), _(Nd,x), _(Nd,x),
/* 0AE8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
/* 0AF0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 0AF8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* 0AF8 */ _(x,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* Oriya */
- /* 0B00 */ _(x,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0B00 */ _(x,x), _(Bi,T), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
/* 0B08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(x,x), _(VI,x),
/* 0B10 */ _(VI,x), _(x,x), _(x,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
/* 0B18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0B20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0B28 */ _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0B30 */ _(C,x), _(x,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), _(C,x),
- /* 0B38 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,x), _(A,x), _(M,R), _(M,T),
+ /* 0B38 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,B), _(A,x), _(M,R), _(M,T),
/* 0B40 */ _(M,R), _(M,B), _(M,B), _(M,B), _(M,B), _(x,x), _(x,x), _(M,L),
/* 0B48 */ _(M,TL), _(x,x), _(x,x), _(M,LR),_(M,TLR), _(V,B), _(x,x), _(x,x),
/* 0B50 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,T), _(M,TR),
@@ -186,7 +194,7 @@
/* Tamil */
- /* 0B80 */ _(x,x), _(x,x), _(Bi,x), _(ML,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0B80 */ _(x,x), _(x,x), _(Bi,T), _(ML,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
/* 0B88 */ _(VI,x), _(VI,x), _(VI,x), _(x,x), _(x,x), _(x,x), _(VI,x), _(VI,x),
/* 0B90 */ _(VI,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(x,x), _(x,x),
/* 0B98 */ _(x,x), _(C,x), _(C,x), _(x,x), _(C,x), _(x,x), _(C,x), _(C,x),
@@ -194,7 +202,7 @@
/* 0BA8 */ _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(C,x), _(C,x),
/* 0BB0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0BB8 */ _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,R), _(M,R),
- /* 0BC0 */ _(M,T), _(M,B), _(M,B), _(x,x), _(x,x), _(x,x), _(M,L), _(M,L),
+ /* 0BC0 */ _(M,T), _(M,R), _(M,R), _(x,x), _(x,x), _(x,x), _(M,L), _(M,L),
/* 0BC8 */ _(M,L), _(x,x), _(M,LR), _(M,LR), _(M,LR), _(V,T), _(x,x), _(x,x),
/* 0BD0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,R),
/* 0BD8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
@@ -205,7 +213,7 @@
/* Telugu */
- /* 0C00 */ _(Bi,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0C00 */ _(Bi,T), _(Bi,R), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
/* 0C08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(VI,x), _(VI,x),
/* 0C10 */ _(VI,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
/* 0C18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
@@ -216,7 +224,7 @@
/* 0C40 */ _(M,T), _(M,R), _(M,R), _(M,R), _(M,R), _(x,x), _(M,T), _(M,T),
/* 0C48 */ _(M,TB), _(x,x), _(M,T), _(M,T), _(M,T), _(V,T), _(x,x), _(x,x),
/* 0C50 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,T), _(M,B), _(x,x),
- /* 0C58 */ _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* 0C58 */ _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* 0C60 */ _(VI,x), _(VI,x), _(M,B), _(M,B), _(x,x), _(x,x), _(Nd,x), _(Nd,x),
/* 0C68 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
/* 0C70 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
@@ -224,26 +232,26 @@
/* Kannada */
- /* 0C80 */ _(x,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0C80 */ _(x,x), _(Bi,T), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
/* 0C88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(VI,x), _(VI,x),
/* 0C90 */ _(VI,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
/* 0C98 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0CA0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0CA8 */ _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0CB0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), _(C,x),
- /* 0CB8 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,x), _(A,x), _(M,R), _(M,T),
+ /* 0CB8 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,B), _(A,x), _(M,R), _(M,T),
/* 0CC0 */ _(M,TR), _(M,R), _(M,R), _(M,R), _(M,R), _(x,x), _(M,T), _(M,TR),
/* 0CC8 */ _(M,TR), _(x,x), _(M,TR), _(M,TR), _(M,T), _(V,T), _(x,x), _(x,x),
/* 0CD0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,R), _(M,R), _(x,x),
/* 0CD8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(C,x), _(x,x),
/* 0CE0 */ _(VI,x), _(VI,x), _(M,B), _(M,B), _(x,x), _(x,x), _(Nd,x), _(Nd,x),
/* 0CE8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 0CF0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* 0CF0 */ _(x,x),_(CWS,x),_(CWS,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* 0CF8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* Malayalam */
- /* 0D00 */ _(x,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0D00 */ _(x,x), _(Bi,T), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
/* 0D08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(VI,x), _(VI,x),
/* 0D10 */ _(VI,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
/* 0D18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
@@ -253,8 +261,8 @@
/* 0D38 */ _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(A,x), _(M,R), _(M,R),
/* 0D40 */ _(M,R), _(M,R), _(M,R), _(M,B), _(M,B), _(x,x), _(M,L), _(M,L),
/* 0D48 */ _(M,L), _(x,x), _(M,LR), _(M,LR), _(M,LR), _(V,T),_(CPR,x), _(x,x),
- /* 0D50 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,R),
- /* 0D58 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* 0D50 */ _(x,x), _(x,x), _(x,x), _(x,x), _(CD,x), _(CD,x), _(CD,x), _(M,R),
+ /* 0D58 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(VI,x),
/* 0D60 */ _(VI,x), _(VI,x), _(M,B), _(M,B), _(x,x), _(x,x), _(Nd,x), _(Nd,x),
/* 0D68 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
/* 0D70 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
@@ -262,7 +270,7 @@
/* Sinhala */
- /* 0D80 */ _(x,x), _(x,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0D80 */ _(x,x), _(x,x), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
/* 0D88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
/* 0D90 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x),
/* 0D98 */ _(x,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
@@ -278,7 +286,7 @@
/* 0DE8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
/* 0DF0 */ _(x,x), _(x,x), _(M,R), _(M,R), _(x,x), _(x,x), _(x,x), _(x,x),
-#define indic_offset_0x1000u 1304
+#define indic_offset_0x1000u 1336
/* Myanmar */
@@ -289,51 +297,23 @@
/* 1018 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 1020 */ _(C,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
/* 1028 */ _(VI,x), _(VI,x), _(VI,x), _(M,R), _(M,R), _(M,T), _(M,T), _(M,B),
- /* 1030 */ _(M,B), _(M,L), _(M,T), _(M,T), _(M,T), _(M,T), _(Bi,x), _(TM,x),
- /* 1038 */ _(Vs,x), _(IS,x), _(PK,T), _(CM,x), _(CM,x), _(CM,x), _(CM,x), _(C,x),
+ /* 1030 */ _(M,B), _(M,L), _(M,T), _(M,T), _(M,T), _(M,T), _(Bi,T), _(TM,B),
+ /* 1038 */ _(Vs,R), _(IS,x), _(PK,T), _(CM,R), _(CM,x), _(CM,B), _(CM,B), _(C,x),
/* 1040 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
/* 1048 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(CP,x), _(x,x),
/* 1050 */ _(C,x), _(C,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(M,R), _(M,R),
- /* 1058 */ _(M,B), _(M,B), _(C,x), _(C,x), _(C,x), _(C,x), _(CM,x), _(CM,x),
- /* 1060 */ _(CM,x), _(C,x), _(M,R), _(TM,x), _(TM,x), _(C,x), _(C,x), _(M,R),
- /* 1068 */ _(M,R), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(C,x), _(C,x),
+ /* 1058 */ _(M,B), _(M,B), _(C,x), _(C,x), _(C,x), _(C,x), _(CM,B), _(CM,B),
+ /* 1060 */ _(CM,B), _(C,x), _(M,R), _(TM,R), _(TM,R), _(C,x), _(C,x), _(M,R),
+ /* 1068 */ _(M,R), _(TM,R), _(TM,R), _(TM,R), _(TM,R), _(TM,R), _(C,x), _(C,x),
/* 1070 */ _(C,x), _(M,T), _(M,T), _(M,T), _(M,T), _(C,x), _(C,x), _(C,x),
/* 1078 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1080 */ _(C,x), _(C,x), _(CM,x), _(M,R), _(M,L), _(M,T), _(M,T), _(TM,x),
- /* 1088 */ _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(C,x), _(TM,x),
+ /* 1080 */ _(C,x), _(C,x), _(CM,B), _(M,R), _(M,L), _(M,T), _(M,T), _(TM,R),
+ /* 1088 */ _(TM,R), _(TM,R), _(TM,R), _(TM,R), _(TM,R), _(TM,B), _(C,x), _(TM,R),
/* 1090 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 1098 */ _(Nd,x), _(Nd,x), _(TM,x), _(TM,x), _(M,R), _(M,T), _(x,x), _(x,x),
-
-#define indic_offset_0x1700u 1464
-
-
- /* Tagalog */
-
- /* 1700 */ _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1708 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x),
- /* 1710 */ _(C,x), _(C,x), _(M,T), _(M,B), _(PK,B), _(x,x), _(x,x), _(x,x),
- /* 1718 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Hanunoo */
+ /* 1098 */ _(Nd,x), _(Nd,x), _(TM,R), _(TM,R), _(M,R), _(M,T), _(x,x), _(x,x),
- /* 1720 */ _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1728 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1730 */ _(C,x), _(C,x), _(M,T), _(M,B), _(PK,B), _(x,x), _(x,x), _(x,x),
- /* 1738 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Buhid */
+#define indic_offset_0x1780u 1496
- /* 1740 */ _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1748 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1750 */ _(C,x), _(C,x), _(M,T), _(M,B), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1758 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Tagbanwa */
-
- /* 1760 */ _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1768 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x),
- /* 1770 */ _(C,x), _(x,x), _(M,T), _(M,B), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1778 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* Khmer */
@@ -345,515 +325,72 @@
/* 17A8 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
/* 17B0 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(x,x), _(M,R), _(M,T),
/* 17B8 */ _(M,T), _(M,T), _(M,T), _(M,B), _(M,B), _(M,B), _(M,TL),_(M,TLR),
- /* 17C0 */ _(M,LR), _(M,L), _(M,L), _(M,L), _(M,LR), _(M,LR), _(Bi,x), _(Vs,x),
- /* 17C8 */ _(M,R), _(RS,T), _(RS,T), _(RS,T),_(CSR,T), _(M,T), _(M,T), _(M,T),
- /* 17D0 */ _(M,T), _(PK,T), _(IS,x), _(M,T), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 17D8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(A,x), _(x,x), _(x,x), _(x,x),
+ /* 17C0 */ _(M,LR), _(M,L), _(M,L), _(M,L), _(M,LR), _(M,LR), _(Bi,T), _(Vs,R),
+ /* 17C8 */ _(M,R), _(RS,T), _(RS,T), _(SM,T),_(CSR,T), _(CK,T), _(SM,T), _(SM,T),
+ /* 17D0 */ _(SM,T), _(PK,T), _(IS,x), _(SM,T), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* 17D8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(A,x), _(SM,T), _(x,x), _(x,x),
/* 17E0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
/* 17E8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-#define indic_offset_0x1900u 1704
-
-
- /* Limbu */
-
- /* 1900 */ _(CP,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1908 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1910 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1918 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x),
- /* 1920 */ _(M,T), _(M,T), _(M,B), _(M,R), _(M,R), _(M,TR), _(M,TR), _(M,T),
- /* 1928 */ _(M,T), _(CS,x), _(CS,x), _(CS,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1930 */ _(CF,x), _(CF,x), _(Bi,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x),
- /* 1938 */ _(CF,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1940 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(Nd,x), _(Nd,x),
- /* 1948 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-
- /* Tai Le */
-
- /* 1950 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1958 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1960 */ _(C,x), _(C,x), _(C,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x),
- /* 1968 */ _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(x,x), _(x,x),
- /* 1970 */ _(TL,x), _(TL,x), _(TL,x), _(TL,x), _(TL,x), _(x,x), _(x,x), _(x,x),
- /* 1978 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* New Tai Lue */
-
- /* 1980 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1988 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1990 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1998 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 19A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 19A8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 19B0 */ _(M,R), _(M,R), _(M,R), _(M,R), _(M,R), _(M,L), _(M,L), _(M,L),
- /* 19B8 */ _(M,R), _(M,R), _(M,L), _(M,R), _(M,R), _(M,R), _(M,R), _(M,R),
- /* 19C0 */ _(M,R), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x),
- /* 19C8 */ _(TM,x), _(TM,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 19D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 19D8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 19E0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 19E8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 19F0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 19F8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Buginese */
-
- /* 1A00 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1A08 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1A10 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(M,T),
- /* 1A18 */ _(M,B), _(M,L), _(M,R), _(M,T), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Tai Tham */
-
- /* 1A20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1A28 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1A30 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1A38 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1A40 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1A48 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(VI,x), _(VI,x), _(VI,x),
- /* 1A50 */ _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(CM,L), _(CM,x), _(CF,x),
- /* 1A58 */ _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(x,x),
- /* 1A60 */ _(IS,x), _(M,R), _(M,T), _(M,R), _(M,R), _(M,T), _(M,T), _(M,T),
- /* 1A68 */ _(M,T), _(M,B), _(M,B), _(M,T), _(M,B), _(M,R), _(M,L), _(M,L),
- /* 1A70 */ _(M,L), _(M,L), _(M,L), _(M,T), _(M,T), _(TM,x), _(TM,x), _(TM,x),
- /* 1A78 */ _(TM,x), _(TM,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1A80 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 1A88 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1A90 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 1A98 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
-#define indic_offset_0x1b00u 2120
-
-
- /* Balinese */
-
- /* 1B00 */ _(Bi,x), _(Bi,x), _(Bi,x),_(CSR,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x),
- /* 1B08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 1B10 */ _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1B18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1B20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1B28 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1B30 */ _(C,x), _(C,x), _(C,x), _(C,x), _(N,x), _(M,R), _(M,T), _(M,T),
- /* 1B38 */ _(M,B), _(M,B), _(M,B), _(M,BR), _(M,TB),_(M,TBR), _(M,L), _(M,L),
- /* 1B40 */ _(M,LR), _(M,LR), _(M,T), _(M,TR), _(V,R), _(C,x), _(C,x), _(C,x),
- /* 1B48 */ _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1B50 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 1B58 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1B60 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1B68 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1B70 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1B78 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Sundanese */
-
- /* 1B80 */ _(Bi,x),_(CSR,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 1B88 */ _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1B90 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1B98 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1BA0 */ _(C,x), _(CS,x), _(CS,x), _(CS,x), _(M,T), _(M,B), _(M,L), _(M,R),
- /* 1BA8 */ _(M,T), _(M,T), _(PK,R), _(IS,x), _(CS,x), _(CS,x), _(C,x), _(C,x),
- /* 1BB0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 1BB8 */ _(Nd,x), _(Nd,x), _(A,x), _(C,x), _(C,x), _(C,x), _(CF,x), _(CF,x),
-
- /* Batak */
-
- /* 1BC0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1BC8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1BD0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1BD8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1BE0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(VI,x), _(VI,x), _(N,x), _(M,R),
- /* 1BE8 */ _(M,T), _(M,T), _(M,R), _(M,R), _(M,R), _(M,T), _(M,R), _(M,T),
- /* 1BF0 */ _(CF,x), _(CF,x), _(PK,R), _(PK,R), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1BF8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Lepcha */
-
- /* 1C00 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1C08 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1C10 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1C18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1C20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(CS,x), _(CS,x), _(M,R), _(M,L),
- /* 1C28 */ _(M,L), _(M,TL), _(M,R), _(M,R), _(M,B), _(CF,x), _(CF,x), _(CF,x),
- /* 1C30 */ _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(Bi,L), _(Bi,L), _(x,x), _(N,x),
- /* 1C38 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1C40 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 1C48 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(C,x), _(C,x), _(C,x),
-
-#define indic_offset_0x1cd0u 2456
+#define indic_offset_0x1cd0u 1608
/* Vedic Extensions */
- /* 1CD0 */ _(TM,x), _(TM,x), _(TM,x), _(x,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x),
- /* 1CD8 */ _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x),
- /* 1CE0 */ _(TM,x), _(TM,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1CE8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1CF0 */ _(x,x), _(x,x), _(Vs,x), _(Vs,x), _(TM,x), _(x,x), _(x,x), _(x,x),
+ /* 1CD0 */ _(Ca,T), _(Ca,T), _(Ca,T), _(x,x), _(Ca,O), _(Ca,B), _(Ca,B), _(Ca,B),
+ /* 1CD8 */ _(Ca,B), _(Ca,B), _(Ca,T), _(Ca,T), _(Ca,B), _(Ca,B), _(Ca,B), _(Ca,B),
+ /* 1CE0 */ _(Ca,T), _(Ca,R), _(x,O), _(x,O), _(x,O), _(x,O), _(x,O), _(x,O),
+ /* 1CE8 */ _(x,O), _(x,x), _(x,x), _(x,x), _(x,x), _(x,B), _(x,x), _(x,x),
+ /* 1CF0 */ _(x,x), _(x,x), _(Vs,x), _(Vs,x), _(Ca,T), _(x,x), _(x,x), _(x,x),
+ /* 1CF8 */ _(Ca,x), _(Ca,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-#define indic_offset_0x2008u 2496
+#define indic_offset_0x2008u 1656
/* General Punctuation */
/* 2008 */ _(x,x), _(x,x), _(x,x), _(x,x),_(ZWNJ,x),_(ZWJ,x), _(x,x), _(x,x),
- /* 2010 */ _(x,x), _(x,x), _(CP,x), _(CP,x), _(CP,x), _(x,x), _(x,x), _(x,x),
+ /* 2010 */ _(CP,x), _(CP,x), _(CP,x), _(CP,x), _(CP,x), _(x,x), _(x,x), _(x,x),
-#define indic_offset_0xa800u 2512
+#define indic_offset_0x2070u 1672
- /* Syloti Nagri */
-
- /* A800 */ _(VI,x), _(VI,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), _(PK,T), _(C,x),
- /* A808 */ _(C,x), _(C,x), _(C,x), _(Bi,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A810 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A818 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A820 */ _(C,x), _(C,x), _(C,x), _(M,R), _(M,R), _(M,B), _(M,T), _(M,R),
- /* A828 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A830 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A838 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Phags-pa */
+ /* Superscripts and Subscripts */
- /* A840 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A848 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A850 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A858 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(Vo,x), _(Vo,x),
- /* A860 */ _(Vo,x), _(Vo,x), _(C,x), _(C,x), _(C,x), _(C,x), _(Vo,x), _(CS,x),
- /* A868 */ _(CS,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A870 */ _(C,x), _(CS,x), _(C,x), _(Bi,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A878 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Saurashtra */
+ /* 2070 */ _(x,x), _(x,x), _(x,x), _(x,x), _(SM,x), _(x,x), _(x,x), _(x,x),
+ /* 2078 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* 2080 */ _(x,x), _(x,x), _(SM,x), _(SM,x), _(SM,x), _(x,x), _(x,x), _(x,x),
- /* A880 */ _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* A888 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* A890 */ _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A898 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A8A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A8A8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A8B0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(CF,x), _(M,R), _(M,R), _(M,R),
- /* A8B8 */ _(M,R), _(M,R), _(M,R), _(M,R), _(M,R), _(M,R), _(M,R), _(M,R),
- /* A8C0 */ _(M,R), _(M,R), _(M,R), _(M,R), _(V,B), _(x,x), _(x,x), _(x,x),
- /* A8C8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A8D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* A8D8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
+#define indic_offset_0xa8e0u 1696
+
/* Devanagari Extended */
- /* A8E0 */ _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x),
- /* A8E8 */ _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x),
- /* A8F0 */ _(Ca,x), _(Ca,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A8F8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Kayah Li */
-
- /* A900 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* A908 */ _(Nd,x), _(Nd,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A910 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A918 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A920 */ _(C,x), _(C,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x),
- /* A928 */ _(Vo,x), _(Vo,x), _(Vo,x), _(TM,x), _(TM,x), _(TM,x), _(x,x), _(x,x),
-
- /* Rejang */
+ /* A8E0 */ _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T),
+ /* A8E8 */ _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T),
+ /* A8F0 */ _(Ca,T), _(Ca,T), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A930 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A938 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A940 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(M,B),
- /* A948 */ _(M,B), _(M,B), _(M,T), _(M,B), _(M,B), _(M,B), _(M,B), _(CF,x),
- /* A950 */ _(CF,x), _(CF,x), _(CF,x), _(PK,R), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A958 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A960 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A968 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A970 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A978 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Javanese */
+#define indic_offset_0xa9e0u 1720
- /* A980 */ _(Bi,x), _(Bi,x),_(CSR,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* A988 */ _(VI,x), _(C,x), _(C,x), _(C,x), _(VI,x), _(VI,x), _(VI,x), _(C,x),
- /* A990 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A998 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A9A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A9A8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A9B0 */ _(C,x), _(C,x), _(C,x), _(N,x), _(M,R), _(M,R), _(M,T), _(M,T),
- /* A9B8 */ _(M,B), _(M,B), _(M,L), _(M,L), _(M,T), _(CS,x), _(CM,x), _(CM,x),
- /* A9C0 */ _(V,BR), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A9C8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A9D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* A9D8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* Myanmar Extended-B */
- /* A9E0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(C,x),
+ /* A9E0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(M,T), _(x,x), _(C,x),
/* A9E8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* A9F0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
/* A9F8 */ _(Nd,x), _(Nd,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x),
- /* Cham */
+#define indic_offset_0xaa60u 1752
- /* AA00 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x),
- /* AA08 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AA10 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AA18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AA20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AA28 */ _(C,x), _(M,T), _(M,T), _(M,T), _(M,T), _(M,B), _(M,T), _(M,L),
- /* AA30 */ _(M,L), _(M,T), _(M,B), _(CM,x), _(CM,L), _(CM,x), _(CM,x), _(x,x),
- /* AA38 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* AA40 */ _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x),
- /* AA48 */ _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(x,x), _(x,x),
- /* AA50 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* AA58 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* Myanmar Extended-A */
/* AA60 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* AA68 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AA70 */ _(x,x), _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* AA78 */ _(x,x), _(x,x), _(C,x), _(TM,x), _(TM,x), _(TM,x), _(C,x), _(C,x),
-
- /* Tai Viet */
-
- /* AA80 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AA88 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AA90 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AA98 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AAA0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AAA8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AAB0 */ _(M,T), _(M,R), _(M,T), _(M,T), _(M,B),_(M,VOL),_(M,VOL), _(M,T),
- /* AAB8 */ _(M,T),_(M,VOL), _(M,R),_(M,VOL),_(M,VOL), _(M,R), _(M,T), _(TM,x),
- /* AAC0 */ _(TL,x), _(TM,x), _(TL,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* AAC8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* AAD0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* AAD8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Meetei Mayek Extensions */
-
- /* AAE0 */ _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AAE8 */ _(C,x), _(C,x), _(C,x), _(M,L), _(M,B), _(M,T), _(M,L), _(M,R),
- /* AAF0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(Vs,x), _(IS,x), _(x,x),
-
-#define indic_offset_0xabc0u 3272
-
-
- /* Meetei Mayek */
-
- /* ABC0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* ABC8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(VI,x), _(VI,x),
- /* ABD0 */ _(C,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* ABD8 */ _(C,x), _(C,x), _(C,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x),
- /* ABE0 */ _(CF,x), _(CF,x), _(CF,x), _(M,R), _(M,R), _(M,T), _(M,R), _(M,R),
- /* ABE8 */ _(M,B), _(M,R), _(M,R), _(x,x), _(TM,x), _(PK,B), _(x,x), _(x,x),
- /* ABF0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* ABF8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
-#define indic_offset_0x10a00u 3336
-
-
- /* Kharoshthi */
-
- /* 10A00 */ _(C,x), _(M,O), _(M,B), _(M,B), _(x,x), _(M,T), _(M,O), _(x,x),
- /* 10A08 */ _(x,x), _(x,x), _(x,x), _(x,x), _(M,B), _(x,x), _(Bi,x), _(Vs,x),
- /* 10A10 */ _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), _(C,x),
- /* 10A18 */ _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 10A20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 10A28 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 10A30 */ _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 10A38 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(IS,x),
- /* 10A40 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-
-#define indic_offset_0x11000u 3408
-
-
- /* Brahmi */
-
- /* 11000 */ _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11008 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11010 */ _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11018 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11020 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11028 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11030 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11038 */ _(M,T), _(M,T), _(M,T), _(M,T), _(M,B), _(M,B), _(M,B), _(M,B),
- /* 11040 */ _(M,B), _(M,B), _(M,T), _(M,T), _(M,T), _(M,T), _(V,T), _(x,x),
- /* 11048 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11050 */ _(x,x), _(x,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),
- /* 11058 */_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),
- /* 11060 */_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x), _(Nd,x), _(Nd,x),
- /* 11068 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 11070 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11078 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(NJ,x),
-
- /* Kaithi */
-
- /* 11080 */ _(Bi,x), _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11088 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
- /* 11090 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11098 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 110A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 110A8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 110B0 */ _(M,R), _(M,L), _(M,R), _(M,B), _(M,B), _(M,T), _(M,T), _(M,R),
- /* 110B8 */ _(M,R), _(V,B), _(N,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
-#define indic_offset_0x11100u 3600
-
-
- /* Chakma */
-
- /* 11100 */ _(Bi,x), _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(C,x),
- /* 11108 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11110 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11118 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11120 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(M,T),
- /* 11128 */ _(M,T), _(M,T), _(M,B), _(M,B), _(M,L), _(M,T), _(M,TB), _(M,TB),
- /* 11130 */ _(M,T), _(M,B), _(M,B), _(IS,x), _(PK,T), _(x,x), _(Nd,x), _(Nd,x),
- /* 11138 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 11140 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11148 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Mahajani */
-
- /* 11150 */ _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(C,x), _(C,x), _(C,x),
- /* 11158 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11160 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11168 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11170 */ _(C,x), _(C,x), _(C,x), _(N,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11178 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Sharada */
+ /* AA70 */ _(x,x), _(C,x), _(C,x), _(C,x), _(CP,x), _(CP,x), _(CP,x), _(x,x),
+ /* AA78 */ _(x,x), _(x,x), _(C,x), _(TM,R), _(TM,T), _(TM,R), _(C,x), _(C,x),
- /* 11180 */ _(Bi,x), _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11188 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11190 */ _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11198 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 111A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 111A8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 111B0 */ _(C,x), _(C,x), _(C,x), _(M,R), _(M,L), _(M,R), _(M,B), _(M,B),
- /* 111B8 */ _(M,B), _(M,B), _(M,B), _(M,B), _(M,T), _(M,T), _(M,T), _(M,TR),
- /* 111C0 */ _(V,R), _(A,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 111C8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 111D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 111D8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Sinhala Archaic Numbers */
-
- /* 111E0 */ _(x,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 111E8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 111F0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x),
- /* 111F8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Khojki */
-
- /* 11200 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11208 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11210 */ _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11218 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11220 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11228 */ _(C,x), _(C,x), _(C,x), _(C,x), _(M,R), _(M,R), _(M,R), _(M,B),
- /* 11230 */ _(M,T), _(M,T), _(M,TR), _(M,TR), _(Bi,x), _(V,R), _(N,x), _(GM,T),
-
-#define indic_offset_0x112b0u 3912
-
-
- /* Khudawadi */
-
- /* 112B0 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 112B8 */ _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 112C0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 112C8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 112D0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 112D8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(Bi,x),
- /* 112E0 */ _(M,R), _(M,L), _(M,R), _(M,B), _(M,B), _(M,T), _(M,T), _(M,T),
- /* 112E8 */ _(M,T), _(N,x), _(PK,B), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 112F0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 112F8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Grantha */
-
- /* 11300 */ _(x,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11308 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(x,x), _(VI,x),
- /* 11310 */ _(VI,x), _(x,x), _(x,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
- /* 11318 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11320 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11328 */ _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11330 */ _(C,x), _(x,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), _(C,x),
- /* 11338 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,x), _(A,x), _(M,R), _(M,R),
- /* 11340 */ _(M,T), _(M,R), _(M,R), _(M,R), _(M,R), _(x,x), _(x,x), _(M,L),
- /* 11348 */ _(M,L), _(x,x), _(x,x), _(M,LR), _(M,LR), _(V,R), _(x,x), _(x,x),
- /* 11350 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,R),
- /* 11358 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11360 */ _(VI,x), _(VI,x), _(M,R), _(M,R), _(x,x), _(x,x), _(Ca,x), _(Ca,x),
- /* 11368 */ _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(x,x), _(x,x), _(x,x),
- /* 11370 */ _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(x,x), _(x,x), _(x,x),
-
-#define indic_offset_0x11480u 4112
-
-
- /* Tirhuta */
-
- /* 11480 */ _(x,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11488 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(C,x),
- /* 11490 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11498 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 114A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 114A8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 114B0 */ _(M,R), _(M,L), _(M,R), _(M,B), _(M,B), _(M,B), _(M,B), _(M,B),
- /* 114B8 */ _(M,B), _(M,L), _(M,T), _(M,TL), _(M,LR), _(M,R), _(M,LR), _(Bi,x),
- /* 114C0 */ _(Bi,x), _(Vs,x), _(V,B), _(N,x), _(A,x), _(x,x), _(x,x), _(x,x),
- /* 114C8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 114D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 114D8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
-#define indic_offset_0x11580u 4208
-
-
- /* Siddham */
-
- /* 11580 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11588 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x),
- /* 11590 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11598 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 115A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 115A8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(M,R),
- /* 115B0 */ _(M,L), _(M,R), _(M,B), _(M,B), _(M,B), _(M,B), _(x,x), _(x,x),
- /* 115B8 */ _(M,L), _(M,TL), _(M,LR),_(M,TLR), _(Bi,x), _(Bi,x), _(Vs,x), _(V,B),
- /* 115C0 */ _(N,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
-#define indic_offset_0x11600u 4280
-
-
- /* Modi */
-
- /* 11600 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11608 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x),
- /* 11610 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11618 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11620 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11628 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11630 */ _(M,R), _(M,R), _(M,R), _(M,B), _(M,B), _(M,B), _(M,B), _(M,B),
- /* 11638 */ _(M,B), _(M,T), _(M,T), _(M,R), _(M,R), _(Bi,x), _(Vs,x), _(V,B),
- /* 11640 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11648 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11650 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 11658 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11660 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11668 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11670 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11678 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Takri */
-
- /* 11680 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11688 */ _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11690 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11698 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 116A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 116A8 */ _(C,x), _(C,x), _(C,x), _(Bi,x), _(Vs,x), _(M,T), _(M,L), _(M,R),
- /* 116B0 */ _(M,B), _(M,B), _(M,T), _(M,T), _(M,T), _(M,T), _(V,T), _(N,x),
- /* 116B8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 116C0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 116C8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
-}; /* Table items: 4488; occupancy: 73% */
+}; /* Table items: 1784; occupancy: 69% */
INDIC_TABLE_ELEMENT_TYPE
hb_indic_get_categories (hb_codepoint_t u)
@@ -862,40 +399,27 @@
{
case 0x0u:
if (hb_in_range (u, 0x0028u, 0x003Fu)) return indic_table[u - 0x0028u + indic_offset_0x0028u];
- if (hb_in_range (u, 0x00D0u, 0x00D7u)) return indic_table[u - 0x00D0u + indic_offset_0x00d0u];
+ if (hb_in_range (u, 0x00B0u, 0x00D7u)) return indic_table[u - 0x00B0u + indic_offset_0x00b0u];
if (hb_in_range (u, 0x0900u, 0x0DF7u)) return indic_table[u - 0x0900u + indic_offset_0x0900u];
if (unlikely (u == 0x00A0u)) return _(CP,x);
break;
case 0x1u:
if (hb_in_range (u, 0x1000u, 0x109Fu)) return indic_table[u - 0x1000u + indic_offset_0x1000u];
- if (hb_in_range (u, 0x1700u, 0x17EFu)) return indic_table[u - 0x1700u + indic_offset_0x1700u];
- if (hb_in_range (u, 0x1900u, 0x1A9Fu)) return indic_table[u - 0x1900u + indic_offset_0x1900u];
- if (hb_in_range (u, 0x1B00u, 0x1C4Fu)) return indic_table[u - 0x1B00u + indic_offset_0x1b00u];
- if (hb_in_range (u, 0x1CD0u, 0x1CF7u)) return indic_table[u - 0x1CD0u + indic_offset_0x1cd0u];
+ if (hb_in_range (u, 0x1780u, 0x17EFu)) return indic_table[u - 0x1780u + indic_offset_0x1780u];
+ if (hb_in_range (u, 0x1CD0u, 0x1CFFu)) return indic_table[u - 0x1CD0u + indic_offset_0x1cd0u];
break;
case 0x2u:
if (hb_in_range (u, 0x2008u, 0x2017u)) return indic_table[u - 0x2008u + indic_offset_0x2008u];
+ if (hb_in_range (u, 0x2070u, 0x2087u)) return indic_table[u - 0x2070u + indic_offset_0x2070u];
if (unlikely (u == 0x25CCu)) return _(CP,x);
break;
case 0xAu:
- if (hb_in_range (u, 0xA800u, 0xAAF7u)) return indic_table[u - 0xA800u + indic_offset_0xa800u];
- if (hb_in_range (u, 0xABC0u, 0xABFFu)) return indic_table[u - 0xABC0u + indic_offset_0xabc0u];
- break;
-
- case 0x10u:
- if (hb_in_range (u, 0x10A00u, 0x10A47u)) return indic_table[u - 0x10A00u + indic_offset_0x10a00u];
- break;
-
- case 0x11u:
- if (hb_in_range (u, 0x11000u, 0x110BFu)) return indic_table[u - 0x11000u + indic_offset_0x11000u];
- if (hb_in_range (u, 0x11100u, 0x11237u)) return indic_table[u - 0x11100u + indic_offset_0x11100u];
- if (hb_in_range (u, 0x112B0u, 0x11377u)) return indic_table[u - 0x112B0u + indic_offset_0x112b0u];
- if (hb_in_range (u, 0x11480u, 0x114DFu)) return indic_table[u - 0x11480u + indic_offset_0x11480u];
- if (hb_in_range (u, 0x11580u, 0x115C7u)) return indic_table[u - 0x11580u + indic_offset_0x11580u];
- if (hb_in_range (u, 0x11600u, 0x116CFu)) return indic_table[u - 0x11600u + indic_offset_0x11600u];
+ if (hb_in_range (u, 0xA8E0u, 0xA8F7u)) return indic_table[u - 0xA8E0u + indic_offset_0xa8e0u];
+ if (hb_in_range (u, 0xA9E0u, 0xA9FFu)) return indic_table[u - 0xA9E0u + indic_offset_0xa9e0u];
+ if (hb_in_range (u, 0xAA60u, 0xAA7Fu)) return indic_table[u - 0xAA60u + indic_offset_0xaa60u];
break;
default:
@@ -914,11 +438,14 @@
#undef ISC_CD
#undef ISC_CF
#undef ISC_CHL
+#undef ISC_CK
#undef ISC_CM
#undef ISC_CP
#undef ISC_CPR
+#undef ISC_CPrf
#undef ISC_CS
#undef ISC_CSR
+#undef ISC_CWS
#undef ISC_GM
#undef ISC_IS
#undef ISC_ZWJ
@@ -930,6 +457,7 @@
#undef ISC_x
#undef ISC_PK
#undef ISC_RS
+#undef ISC_SM
#undef ISC_TL
#undef ISC_TM
#undef ISC_V
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic.cc Fri Aug 26 10:14:15 2016 -0700
@@ -176,24 +176,8 @@
* Re-assign category
*/
-
- /* The spec says U+0952 is OT_A. However, testing shows that Uniscribe
- * treats a whole bunch of characters similarly.
- * TESTS: For example, for U+0951:
- * U+092E,U+0947,U+0952
- * U+092E,U+0952,U+0947
- * U+092E,U+0947,U+0951
- * U+092E,U+0951,U+0947
- * U+092E,U+0951,U+0952
- * U+092E,U+0952,U+0951
- */
- if (unlikely (hb_in_ranges (u, 0x0951u, 0x0952u,
- 0x1CD0u, 0x1CD2u,
- 0x1CD4u, 0x1CE1u) ||
- u == 0x1CF4u))
- cat = OT_A;
/* The following act more like the Bindus. */
- else if (unlikely (hb_in_range (u, 0x0953u, 0x0954u)))
+ if (unlikely (hb_in_range (u, 0x0953u, 0x0954u)))
cat = OT_SM;
/* The following act like consonants. */
else if (unlikely (hb_in_ranges (u, 0x0A72u, 0x0A73u,
@@ -216,21 +200,10 @@
cat = OT_Symbol;
ASSERT_STATIC ((int) INDIC_SYLLABIC_CATEGORY_AVAGRAHA == OT_Symbol);
}
- else if (unlikely (hb_in_range (u, 0x17CDu, 0x17D1u) ||
- u == 0x17CBu || u == 0x17D3u || u == 0x17DDu)) /* Khmer Various signs */
- {
- /* These are like Top Matras. */
- cat = OT_M;
- pos = POS_ABOVE_C;
- }
else if (unlikely (u == 0x17C6u)) cat = OT_N; /* Khmer Bindu doesn't like to be repositioned. */
- else if (unlikely (u == 0x17D2u)) cat = OT_Coeng; /* Khmer coeng */
else if (unlikely (hb_in_range (u, 0x2010u, 0x2011u)))
cat = OT_PLACEHOLDER;
else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE;
- else if (unlikely (u == 0xA982u)) cat = OT_SM; /* Javanese repha. */
- else if (unlikely (u == 0xA9BEu)) cat = OT_CM2; /* Javanese medial ya. */
- else if (unlikely (u == 0xA9BDu)) { cat = OT_M; pos = POS_POST_C; } /* Javanese vocalic r. */
/*
@@ -296,11 +269,6 @@
BLWF_MODE_PRE_AND_POST, /* Below-forms feature applied to pre-base and post-base. */
BLWF_MODE_POST_ONLY /* Below-forms feature applied to post-base only. */
};
-enum pref_len_t {
- PREF_LEN_1 = 1,
- PREF_LEN_2 = 2,
- PREF_LEN_DONT_CARE = PREF_LEN_2
-};
struct indic_config_t
{
hb_script_t script;
@@ -310,26 +278,24 @@
reph_position_t reph_pos;
reph_mode_t reph_mode;
blwf_mode_t blwf_mode;
- pref_len_t pref_len;
};
static const indic_config_t indic_configs[] =
{
/* Default. Should be first. */
- {HB_SCRIPT_INVALID, false, 0,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_1},
- {HB_SCRIPT_DEVANAGARI,true, 0x094Du,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
- {HB_SCRIPT_BENGALI, true, 0x09CDu,BASE_POS_LAST, REPH_POS_AFTER_SUB, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
- {HB_SCRIPT_GURMUKHI, true, 0x0A4Du,BASE_POS_LAST, REPH_POS_BEFORE_SUB, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
- {HB_SCRIPT_GUJARATI, true, 0x0ACDu,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
- {HB_SCRIPT_ORIYA, true, 0x0B4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
- {HB_SCRIPT_TAMIL, true, 0x0BCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_2},
- {HB_SCRIPT_TELUGU, true, 0x0C4Du,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_EXPLICIT, BLWF_MODE_POST_ONLY, PREF_LEN_2},
- {HB_SCRIPT_KANNADA, true, 0x0CCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_POST_ONLY, PREF_LEN_2},
- {HB_SCRIPT_MALAYALAM, true, 0x0D4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_LOG_REPHA,BLWF_MODE_PRE_AND_POST, PREF_LEN_2},
+ {HB_SCRIPT_INVALID, false, 0,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+ {HB_SCRIPT_DEVANAGARI,true, 0x094Du,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+ {HB_SCRIPT_BENGALI, true, 0x09CDu,BASE_POS_LAST, REPH_POS_AFTER_SUB, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+ {HB_SCRIPT_GURMUKHI, true, 0x0A4Du,BASE_POS_LAST, REPH_POS_BEFORE_SUB, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+ {HB_SCRIPT_GUJARATI, true, 0x0ACDu,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+ {HB_SCRIPT_ORIYA, true, 0x0B4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+ {HB_SCRIPT_TAMIL, true, 0x0BCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+ {HB_SCRIPT_TELUGU, true, 0x0C4Du,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_EXPLICIT, BLWF_MODE_POST_ONLY},
+ {HB_SCRIPT_KANNADA, true, 0x0CCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_POST_ONLY},
+ {HB_SCRIPT_MALAYALAM, true, 0x0D4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_LOG_REPHA,BLWF_MODE_PRE_AND_POST},
{HB_SCRIPT_SINHALA, false,0x0DCAu,BASE_POS_LAST_SINHALA,
- REPH_POS_AFTER_MAIN, REPH_MODE_EXPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
- {HB_SCRIPT_KHMER, false,0x17D2u,BASE_POS_FIRST,REPH_POS_DONT_CARE, REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST, PREF_LEN_2},
- {HB_SCRIPT_JAVANESE, false,0xA9C0u,BASE_POS_FIRST,REPH_POS_DONT_CARE, REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST, PREF_LEN_1},
+ REPH_POS_AFTER_MAIN, REPH_MODE_EXPLICIT, BLWF_MODE_PRE_AND_POST},
+ {HB_SCRIPT_KHMER, false,0x17D2u,BASE_POS_FIRST,REPH_POS_DONT_CARE, REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST},
};
@@ -512,12 +478,12 @@
hb_codepoint_t glyph = virama_glyph;
if (unlikely (virama_glyph == (hb_codepoint_t) -1))
{
- if (!config->virama || !font->get_glyph (config->virama, 0, &glyph))
+ if (!config->virama || !font->get_nominal_glyph (config->virama, &glyph))
glyph = 0;
/* Technically speaking, the spec says we should apply 'locl' to virama too.
* Maybe one day... */
- /* Our get_glyph() function needs a font, so we can't get the virama glyph
+ /* Our get_nominal_glyph() function needs a font, so we can't get the virama glyph
* during shape planning... Instead, overwrite it here. It's safe. Don't worry! */
(const_cast<indic_shape_plan_t *> (this))->virama_glyph = glyph;
}
@@ -557,8 +523,15 @@
indic_plan->virama_glyph = (hb_codepoint_t) -1;
/* Use zero-context would_substitute() matching for new-spec of the main
- * Indic scripts, and scripts with one spec only, but not for old-specs. */
- bool zero_context = !indic_plan->is_old_spec;
+ * Indic scripts, and scripts with one spec only, but not for old-specs.
+ * The new-spec for all dual-spec scripts says zero-context matching happens.
+ *
+ * However, testing with Malayalam shows that old and new spec both allow
+ * context. Testing with Bengali new-spec however shows that it doesn't.
+ * So, the heuristic here is the way it is. It should *only* be changed,
+ * as we discover more cases of what Windows does. DON'T TOUCH OTHERWISE.
+ */
+ bool zero_context = !indic_plan->is_old_spec && plan->props.script != HB_SCRIPT_MALAYALAM;
indic_plan->rphf.init (&plan->map, HB_TAG('r','p','h','f'), zero_context);
indic_plan->pref.init (&plan->map, HB_TAG('p','r','e','f'), zero_context);
indic_plan->blwf.init (&plan->map, HB_TAG('b','l','w','f'), zero_context);
@@ -600,12 +573,8 @@
if (indic_plan->pstf.would_substitute (glyphs , 2, face) ||
indic_plan->pstf.would_substitute (glyphs+1, 2, face))
return POS_POST_C;
- unsigned int pref_len = indic_plan->config->pref_len;
- if ((pref_len == PREF_LEN_2 &&
- (indic_plan->pref.would_substitute (glyphs , 2, face) ||
- indic_plan->pref.would_substitute (glyphs+1, 2, face)))
- || (pref_len == PREF_LEN_1 &&
- indic_plan->pref.would_substitute (glyphs+1, 1, face)))
+ if (indic_plan->pref.would_substitute (glyphs , 2, face) ||
+ indic_plan->pref.would_substitute (glyphs+1, 2, face))
return POS_POST_C;
return POS_BASE_C;
}
@@ -754,10 +723,6 @@
switch (indic_plan->config->base_pos)
{
- default:
- assert (false);
- /* fallthrough */
-
case BASE_POS_LAST:
{
/* -> starting from the end of the syllable, move backwards */
@@ -1115,10 +1080,9 @@
}
}
- unsigned int pref_len = indic_plan->config->pref_len;
+ unsigned int pref_len = 2;
if (indic_plan->mask_array[PREF] && base + pref_len < end)
{
- assert (1 <= pref_len && pref_len <= 2);
/* Find a Halant,Ra sequence and mark it for pre-base reordering processing. */
for (unsigned int i = base + 1; i + pref_len - 1 < end; i++) {
hb_codepoint_t glyphs[2];
@@ -1231,7 +1195,7 @@
hb_codepoint_t dottedcircle_glyph;
- if (!font->get_glyph (0x25CCu, 0, &dottedcircle_glyph))
+ if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph))
return;
hb_glyph_info_t dottedcircle = {0};
@@ -1243,7 +1207,7 @@
buffer->idx = 0;
unsigned int last_syllable = 0;
- while (buffer->idx < buffer->len)
+ while (buffer->idx < buffer->len && !buffer->in_error)
{
unsigned int syllable = buffer->cur().syllable();
syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F);
@@ -1251,19 +1215,19 @@
{
last_syllable = syllable;
- hb_glyph_info_t info = dottedcircle;
- info.cluster = buffer->cur().cluster;
- info.mask = buffer->cur().mask;
- info.syllable() = buffer->cur().syllable();
+ hb_glyph_info_t ginfo = dottedcircle;
+ ginfo.cluster = buffer->cur().cluster;
+ ginfo.mask = buffer->cur().mask;
+ ginfo.syllable() = buffer->cur().syllable();
/* TODO Set glyph_props? */
/* Insert dottedcircle after possible Repha. */
- while (buffer->idx < buffer->len &&
+ while (buffer->idx < buffer->len && !buffer->in_error &&
last_syllable == buffer->cur().syllable() &&
buffer->cur().indic_category() == OT_Repha)
buffer->next_glyph ();
- buffer->output_info (info);
+ buffer->output_info (ginfo);
}
else
buffer->next_glyph ();
@@ -1328,7 +1292,7 @@
for (base = start; base < end; base++)
if (info[base].indic_position() >= POS_BASE_C)
{
- if (try_pref && base + 1 < end && indic_plan->config->pref_len == 2)
+ if (try_pref && base + 1 < end)
{
for (unsigned int i = base + 1; i < end; i++)
if ((info[i].mask & indic_plan->mask_array[PREF]) != 0)
@@ -1348,6 +1312,25 @@
break;
}
}
+ /* For Malayalam, skip over unformed below- (but NOT post-) forms. */
+ if (buffer->props.script == HB_SCRIPT_MALAYALAM)
+ {
+ for (unsigned int i = base + 1; i < end; i++)
+ {
+ while (i < end && is_joiner (info[i]))
+ i++;
+ if (i == end || !is_halant_or_coeng (info[i]))
+ break;
+ i++; /* Skip halant. */
+ while (i < end && is_joiner (info[i]))
+ i++;
+ if (i < end && is_consonant (info[i]) && info[i].indic_position() == POS_BELOW_C)
+ {
+ base = i;
+ info[base].indic_position() = POS_BASE_C;
+ }
+ }
+ }
if (start < base && info[base].indic_position() > POS_BASE_C)
base--;
@@ -1591,7 +1574,6 @@
if (try_pref && base + 1 < end) /* Otherwise there can't be any pre-base reordering Ra. */
{
- unsigned int pref_len = indic_plan->config->pref_len;
for (unsigned int i = base + 1; i < end; i++)
if ((info[i].mask & indic_plan->mask_array[PREF]) != 0)
{
@@ -1602,10 +1584,8 @@
/* Note: We just check that something got substituted. We don't check that
* the <pref> feature actually did it...
*
- * If pref len is longer than one, then only reorder if it ligated. If
- * pref len is one, only reorder if it didn't ligate with other things. */
- if (_hb_glyph_info_substituted (&info[i]) &&
- ((pref_len == 1) ^ _hb_glyph_info_ligated_and_didnt_multiply (&info[i])))
+ * Reorder pref only if it ligated. */
+ if (_hb_glyph_info_ligated_and_didnt_multiply (&info[i]))
{
/*
* 2. Try to find a target position the same way as for pre-base matra.
@@ -1631,8 +1611,8 @@
if (new_pos > start && info[new_pos - 1].indic_category() == OT_M)
{
unsigned int old_pos = i;
- for (unsigned int i = base + 1; i < old_pos; i++)
- if (info[i].indic_category() == OT_M)
+ for (unsigned int j = base + 1; j < old_pos; j++)
+ if (info[j].indic_category() == OT_M)
{
new_pos--;
break;
@@ -1796,7 +1776,7 @@
hb_codepoint_t glyph;
if (hb_options ().uniscribe_bug_compatible ||
- (c->font->get_glyph (ab, 0, &glyph) &&
+ (c->font->get_nominal_glyph (ab, &glyph) &&
indic_plan->pstf.would_substitute (&glyph, 1, c->font->face)))
{
/* Ok, safe to use Uniscribe-style decomposition. */
@@ -1806,7 +1786,7 @@
}
}
- return c->unicode->decompose (ab, a, b);
+ return (bool) c->unicode->decompose (ab, a, b);
}
static bool
@@ -1822,7 +1802,7 @@
/* Composition-exclusion exceptions that we want to recompose. */
if (a == 0x09AFu && b == 0x09BCu) { *ab = 0x09DFu; return true; }
- return c->unicode->compose (a, b, ab);
+ return (bool) c->unicode->compose (a, b, ab);
}
@@ -1834,6 +1814,7 @@
data_create_indic,
data_destroy_indic,
NULL, /* preprocess_text */
+ NULL, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
decompose_indic,
compose_indic,
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar-machine.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar-machine.hh Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
-#line 1 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 1 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
/*
* Copyright © 2011,2012 Google, Inc.
*
@@ -32,7 +32,7 @@
#include "hb-private.hh"
-#line 36 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 36 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
static const unsigned char _myanmar_syllable_machine_trans_keys[] = {
1u, 31u, 3u, 30u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u,
3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 16u, 3u, 29u, 3u, 29u, 3u, 29u,
@@ -261,11 +261,11 @@
static const int myanmar_syllable_machine_en_main = 0;
-#line 36 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 36 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
-#line 93 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 93 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
#define found_syllable(syllable_type) \
@@ -285,7 +285,7 @@
int cs;
hb_glyph_info_t *info = buffer->info;
-#line 289 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 289 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
{
cs = myanmar_syllable_machine_start;
ts = 0;
@@ -293,7 +293,7 @@
act = 0;
}
-#line 114 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 114 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
p = 0;
@@ -302,7 +302,7 @@
unsigned int last = 0;
unsigned int syllable_serial = 1;
-#line 306 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 306 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
{
int _slen;
int _trans;
@@ -316,7 +316,7 @@
#line 1 "NONE"
{ts = p;}
break;
-#line 320 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 320 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
}
_keys = _myanmar_syllable_machine_trans_keys + (cs<<1);
@@ -335,38 +335,38 @@
switch ( _myanmar_syllable_machine_trans_actions[_trans] ) {
case 7:
-#line 85 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 85 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
{te = p+1;{ found_syllable (consonant_syllable); }}
break;
case 5:
-#line 86 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 86 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
{te = p+1;{ found_syllable (non_myanmar_cluster); }}
break;
case 10:
-#line 87 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 87 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
{te = p+1;{ found_syllable (punctuation_cluster); }}
break;
case 4:
-#line 88 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 88 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
{te = p+1;{ found_syllable (broken_cluster); }}
break;
case 3:
-#line 89 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 89 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
{te = p+1;{ found_syllable (non_myanmar_cluster); }}
break;
case 6:
-#line 85 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 85 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
{te = p;p--;{ found_syllable (consonant_syllable); }}
break;
case 8:
-#line 88 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 88 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
{te = p;p--;{ found_syllable (broken_cluster); }}
break;
case 9:
-#line 89 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 89 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
{te = p;p--;{ found_syllable (non_myanmar_cluster); }}
break;
-#line 370 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 370 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
}
_again:
@@ -375,7 +375,7 @@
#line 1 "NONE"
{ts = 0;}
break;
-#line 379 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 379 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
}
if ( ++p != pe )
@@ -391,7 +391,7 @@
}
-#line 123 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 123 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
}
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar.cc Fri Aug 26 10:14:15 2016 -0700
@@ -199,6 +199,10 @@
cat = (indic_category_t) OT_A;
break;
+ case 0x1039u:
+ cat = (indic_category_t) OT_H;
+ break;
+
case 0x103Au:
cat = (indic_category_t) OT_As;
break;
@@ -245,6 +249,11 @@
case 0x104Au: case 0x104Bu:
cat = (indic_category_t) OT_P;
break;
+
+ case 0xAA74u: case 0xAA75u: case 0xAA76u:
+ /* https://github.com/roozbehp/unicode-data/issues/3 */
+ cat = (indic_category_t) OT_C;
+ break;
}
if (cat == OT_M)
@@ -435,7 +444,7 @@
hb_codepoint_t dottedcircle_glyph;
- if (!font->get_glyph (0x25CCu, 0, &dottedcircle_glyph))
+ if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph))
return;
hb_glyph_info_t dottedcircle = {0};
@@ -447,7 +456,7 @@
buffer->idx = 0;
unsigned int last_syllable = 0;
- while (buffer->idx < buffer->len)
+ while (buffer->idx < buffer->len && !buffer->in_error)
{
unsigned int syllable = buffer->cur().syllable();
syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F);
@@ -455,12 +464,12 @@
{
last_syllable = syllable;
- hb_glyph_info_t info = dottedcircle;
- info.cluster = buffer->cur().cluster;
- info.mask = buffer->cur().mask;
- info.syllable() = buffer->cur().syllable();
+ hb_glyph_info_t ginfo = dottedcircle;
+ ginfo.cluster = buffer->cur().cluster;
+ ginfo.mask = buffer->cur().mask;
+ ginfo.syllable() = buffer->cur().syllable();
- buffer->output_info (info);
+ buffer->output_info (ginfo);
}
else
buffer->next_glyph ();
@@ -507,6 +516,7 @@
NULL, /* data_create */
NULL, /* data_destroy */
NULL, /* preprocess_text */
+ NULL, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
NULL, /* decompose */
NULL, /* compose */
@@ -523,6 +533,7 @@
NULL, /* data_create */
NULL, /* data_destroy */
NULL, /* preprocess_text */
+ NULL, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
NULL, /* decompose */
NULL, /* compose */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-private.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-private.hh Fri Aug 26 10:14:15 2016 -0700
@@ -41,12 +41,8 @@
enum hb_ot_shape_zero_width_marks_type_t {
HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
-// HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_EARLY,
- HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE,
HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
- HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
-
- HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT = HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE
+ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE
};
@@ -110,6 +106,15 @@
hb_buffer_t *buffer,
hb_font_t *font);
+ /* postprocess_glyphs()
+ * Called during shape().
+ * Shapers can use to modify glyphs after shaping ends.
+ * May be NULL.
+ */
+ void (*postprocess_glyphs) (const hb_ot_shape_plan_t *plan,
+ hb_buffer_t *buffer,
+ hb_font_t *font);
+
hb_ot_shape_normalization_mode_t normalization_preference;
@@ -236,9 +241,6 @@
/* Unicode-3.0 additions */
case HB_SCRIPT_SINHALA:
- /* Unicode-5.2 additions */
- case HB_SCRIPT_JAVANESE:
-
/* If the designer designed the font for the 'DFLT' script,
* use the default shaper. Otherwise, use the specific shaper.
* Note that for some simple scripts, there may not be *any*
@@ -311,7 +313,7 @@
/* Unicode-5.2 additions */
case HB_SCRIPT_EGYPTIAN_HIEROGLYPHS:
- //case HB_SCRIPT_JAVANESE:
+ case HB_SCRIPT_JAVANESE:
case HB_SCRIPT_KAITHI:
case HB_SCRIPT_MEETEI_MAYEK:
case HB_SCRIPT_TAI_THAM:
@@ -340,6 +342,15 @@
case HB_SCRIPT_SIDDHAM:
case HB_SCRIPT_TIRHUTA:
+ /* Unicode-8.0 additions */
+ case HB_SCRIPT_AHOM:
+ //case HB_SCRIPT_MULTANI:
+
+ /* Unicode-9.0 additions */
+ case HB_SCRIPT_BHAIKSUKI:
+ case HB_SCRIPT_MARCHEN:
+ case HB_SCRIPT_NEWA:
+
/* If the designer designed the font for the 'DFLT' script,
* use the default shaper. Otherwise, use the specific shaper.
* Note that for some simple scripts, there may not be *any*
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-thai.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-thai.cc Fri Aug 26 10:14:15 2016 -0700
@@ -139,7 +139,6 @@
};
switch (action) {
- default: assert (false); /* Fallthrough */
case NOP: return u;
case SD: pua_mappings = SD_mappings; break;
case SDL: pua_mappings = SDL_mappings; break;
@@ -315,7 +314,7 @@
buffer->clear_output ();
unsigned int count = buffer->len;
- for (buffer->idx = 0; buffer->idx < count;)
+ for (buffer->idx = 0; buffer->idx < count && !buffer->in_error;)
{
hb_codepoint_t u = buffer->cur().codepoint;
if (likely (!IS_SARA_AM (u))) {
@@ -330,7 +329,7 @@
if (unlikely (buffer->in_error))
return;
- /* Make Nikhahit be recognized as a mark when zeroing widths. */
+ /* Make Nikhahit be recognized as a ccc=0 mark when zeroing widths. */
unsigned int end = buffer->out_len;
_hb_glyph_info_set_general_category (&buffer->out_info[end - 2], HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK);
@@ -372,10 +371,11 @@
NULL, /* data_create */
NULL, /* data_destroy */
preprocess_text_thai,
+ NULL, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
NULL, /* decompose */
NULL, /* compose */
NULL, /* setup_masks */
- HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT,
+ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
false,/* fallback_position */
};
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-tibetan.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-tibetan.cc Fri Aug 26 10:14:15 2016 -0700
@@ -52,10 +52,11 @@
NULL, /* data_create */
NULL, /* data_destroy */
NULL, /* preprocess_text */
+ NULL, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
NULL, /* decompose */
NULL, /* compose */
NULL, /* setup_masks */
- HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT,
+ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
true, /* fallback_position */
};
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-machine.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-machine.hh Fri Aug 26 10:14:15 2016 -0700
@@ -36,291 +36,222 @@
#line 38 "hb-ot-shape-complex-use-machine.hh"
static const unsigned char _use_syllable_machine_trans_keys[] = {
- 0u, 0u, 4u, 4u, 1u, 1u, 0u, 39u, 21u, 21u, 8u, 39u, 8u, 39u, 1u, 1u,
- 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u,
- 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u,
- 8u, 39u, 8u, 39u, 8u, 39u, 1u, 1u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u,
+ 1u, 1u, 0u, 39u, 21u, 21u, 8u, 39u, 8u, 39u, 1u, 1u, 8u, 39u, 8u, 39u,
+ 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u,
+ 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 13u, 21u,
+ 4u, 4u, 13u, 13u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u,
8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u,
- 8u, 39u, 12u, 21u, 12u, 13u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u,
- 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u,
- 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 1u, 39u, 8u, 39u, 21u, 42u, 41u, 42u,
+ 8u, 39u, 8u, 39u, 8u, 39u, 1u, 1u, 1u, 39u, 8u, 39u, 21u, 42u, 41u, 42u,
42u, 42u, 0
};
static const char _use_syllable_machine_key_spans[] = {
- 0, 1, 1, 40, 1, 32, 32, 1,
- 32, 32, 32, 19, 19, 19, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 1, 32, 32, 19, 19,
+ 1, 40, 1, 32, 32, 1, 32, 32,
+ 32, 19, 19, 19, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 9,
+ 1, 1, 32, 32, 32, 32, 19, 19,
19, 32, 32, 32, 32, 32, 32, 32,
- 32, 10, 2, 32, 32, 32, 32, 19,
- 19, 19, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 39, 32, 22, 2,
+ 32, 32, 32, 1, 39, 32, 22, 2,
1
};
static const short _use_syllable_machine_index_offsets[] = {
- 0, 0, 2, 4, 45, 47, 80, 113,
- 115, 148, 181, 214, 234, 254, 274, 307,
- 340, 373, 406, 439, 472, 505, 538, 571,
- 604, 637, 670, 703, 705, 738, 771, 791,
- 811, 831, 864, 897, 930, 963, 996, 1029,
- 1062, 1095, 1106, 1109, 1142, 1175, 1208, 1241,
- 1261, 1281, 1301, 1334, 1367, 1400, 1433, 1466,
- 1499, 1532, 1565, 1598, 1631, 1671, 1704, 1727,
- 1730
+ 0, 2, 43, 45, 78, 111, 113, 146,
+ 179, 212, 232, 252, 272, 305, 338, 371,
+ 404, 437, 470, 503, 536, 569, 602, 635,
+ 645, 647, 649, 682, 715, 748, 781, 801,
+ 821, 841, 874, 907, 940, 973, 1006, 1039,
+ 1072, 1105, 1138, 1171, 1173, 1213, 1246, 1269,
+ 1272
};
static const char _use_syllable_machine_indicies[] = {
- 1, 0, 3, 2, 4, 5, 6,
- 4, 1, 5, 8, 8, 7, 8, 8,
- 3, 9, 8, 8, 8, 4, 4, 10,
- 11, 8, 8, 12, 13, 14, 15, 16,
- 17, 18, 12, 19, 20, 21, 22, 23,
- 24, 8, 25, 26, 27, 8, 29, 28,
- 31, 30, 30, 32, 33, 30, 30, 30,
- 30, 30, 30, 30, 30, 34, 35, 36,
- 37, 38, 39, 40, 41, 35, 42, 34,
- 43, 44, 45, 46, 30, 47, 48, 49,
- 30, 31, 30, 30, 32, 33, 30, 30,
- 30, 30, 30, 30, 30, 30, 50, 35,
- 36, 37, 38, 39, 40, 41, 35, 42,
- 43, 43, 44, 45, 46, 30, 47, 48,
- 49, 30, 32, 51, 31, 30, 30, 32,
- 33, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 35, 36, 37, 38, 39, 40,
- 41, 35, 42, 43, 43, 44, 45, 46,
- 30, 47, 48, 49, 30, 31, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 35, 36, 37, 38, 39,
- 30, 30, 30, 30, 30, 30, 44, 45,
- 46, 30, 47, 48, 49, 30, 31, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 36, 37, 38,
- 39, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 47, 48, 49, 30, 31,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 37,
- 38, 39, 30, 31, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 38, 39, 30, 31,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 39, 30, 31, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 37, 38, 39, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 47, 48, 49, 30, 31, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 37, 38, 39, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 48, 49, 30, 31, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 37, 38, 39,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 49, 30, 31, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 36, 37, 38,
- 39, 30, 30, 30, 30, 30, 30, 44,
- 45, 46, 30, 47, 48, 49, 30, 31,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 36, 37,
- 38, 39, 30, 30, 30, 30, 30, 30,
- 30, 45, 46, 30, 47, 48, 49, 30,
- 31, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 36,
- 37, 38, 39, 30, 30, 30, 30, 30,
- 30, 30, 30, 46, 30, 47, 48, 49,
- 30, 31, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 35,
- 36, 37, 38, 39, 30, 41, 35, 30,
- 30, 30, 44, 45, 46, 30, 47, 48,
- 49, 30, 31, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 35, 36, 37, 38, 39, 30, 30, 35,
- 30, 30, 30, 44, 45, 46, 30, 47,
- 48, 49, 30, 31, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 35, 36, 37, 38, 39, 40, 41,
- 35, 30, 30, 30, 44, 45, 46, 30,
- 47, 48, 49, 30, 31, 30, 30, 32,
- 33, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 35, 36, 37, 38, 39, 40,
- 41, 35, 42, 30, 43, 44, 45, 46,
- 30, 47, 48, 49, 30, 31, 30, 30,
- 32, 33, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 35, 36, 37, 38, 39,
- 40, 41, 35, 42, 34, 43, 44, 45,
- 46, 30, 47, 48, 49, 30, 53, 52,
- 52, 54, 55, 52, 52, 52, 52, 52,
- 52, 52, 52, 56, 52, 57, 58, 59,
- 60, 61, 62, 57, 63, 56, 64, 52,
- 52, 52, 52, 65, 66, 67, 52, 53,
- 52, 52, 54, 55, 52, 52, 52, 52,
- 52, 52, 52, 52, 68, 52, 57, 58,
- 59, 60, 61, 62, 57, 63, 64, 64,
- 52, 52, 52, 52, 65, 66, 67, 52,
- 54, 51, 53, 52, 52, 54, 55, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 57, 58, 59, 60, 61, 62, 57,
- 63, 64, 64, 52, 52, 52, 52, 65,
- 66, 67, 52, 53, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 57, 58, 59, 60, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 65, 66, 67, 52, 53, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 58, 59, 60, 52,
- 53, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 59, 60, 52, 53, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 60, 52,
- 53, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 58, 59, 60, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 65, 66, 67,
- 52, 53, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 58, 59, 60, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 66,
- 67, 52, 53, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 58, 59, 60, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 67, 52, 53, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 57, 58, 59, 60, 52, 62,
- 57, 52, 52, 52, 52, 52, 52, 52,
- 65, 66, 67, 52, 53, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 57, 58, 59, 60, 52,
- 52, 57, 52, 52, 52, 52, 52, 52,
- 52, 65, 66, 67, 52, 53, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 57, 58, 59, 60,
- 61, 62, 57, 52, 52, 52, 52, 52,
- 52, 52, 65, 66, 67, 52, 53, 52,
- 52, 54, 55, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 57, 58, 59,
- 60, 61, 62, 57, 63, 52, 64, 52,
- 52, 52, 52, 65, 66, 67, 52, 53,
- 52, 52, 54, 55, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 57, 58,
- 59, 60, 61, 62, 57, 63, 56, 64,
- 52, 52, 52, 52, 65, 66, 67, 52,
- 70, 71, 69, 69, 69, 69, 69, 69,
- 69, 72, 69, 70, 71, 69, 7, 73,
- 73, 3, 9, 73, 73, 73, 73, 73,
- 73, 73, 73, 74, 12, 13, 14, 15,
- 16, 17, 18, 12, 19, 21, 21, 22,
- 23, 24, 73, 25, 26, 27, 73, 7,
- 73, 73, 3, 9, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 12, 13, 14,
- 15, 16, 17, 18, 12, 19, 21, 21,
- 22, 23, 24, 73, 25, 26, 27, 73,
- 7, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 12, 13,
- 14, 15, 16, 73, 73, 73, 73, 73,
- 73, 22, 23, 24, 73, 25, 26, 27,
- 73, 7, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 13, 14, 15, 16, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 25, 26,
- 27, 73, 7, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 14, 15, 16, 73, 7, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 15,
- 16, 73, 7, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 16, 73, 7, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 14, 15,
- 16, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 25, 26, 27, 73, 7,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 14,
- 15, 16, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 26, 27, 73,
- 7, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 14, 15, 16, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 27,
- 73, 7, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 13, 14, 15, 16, 73, 73, 73, 73,
- 73, 73, 22, 23, 24, 73, 25, 26,
- 27, 73, 7, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 73, 13, 14, 15, 16, 73, 73, 73,
- 73, 73, 73, 73, 23, 24, 73, 25,
- 26, 27, 73, 7, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 13, 14, 15, 16, 73, 73,
- 73, 73, 73, 73, 73, 73, 24, 73,
- 25, 26, 27, 73, 7, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 12, 13, 14, 15, 16, 73,
- 18, 12, 73, 73, 73, 22, 23, 24,
- 73, 25, 26, 27, 73, 7, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 12, 13, 14, 15, 16,
- 73, 73, 12, 73, 73, 73, 22, 23,
- 24, 73, 25, 26, 27, 73, 7, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 12, 13, 14, 15,
- 16, 17, 18, 12, 73, 73, 73, 22,
- 23, 24, 73, 25, 26, 27, 73, 7,
- 73, 73, 3, 9, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 12, 13, 14,
- 15, 16, 17, 18, 12, 19, 73, 21,
- 22, 23, 24, 73, 25, 26, 27, 73,
- 5, 6, 73, 73, 5, 73, 73, 7,
- 73, 73, 3, 9, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 12, 13, 14,
- 15, 16, 17, 18, 12, 19, 20, 21,
- 22, 23, 24, 73, 25, 26, 27, 73,
- 7, 73, 73, 3, 9, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 12, 13,
- 14, 15, 16, 17, 18, 12, 19, 20,
- 21, 22, 23, 24, 73, 25, 26, 27,
- 73, 76, 75, 75, 75, 75, 75, 75,
- 75, 75, 75, 75, 75, 75, 75, 75,
- 75, 75, 75, 75, 75, 76, 77, 75,
- 76, 77, 75, 77, 75, 0
+ 1, 0, 2, 3, 4, 2, 5, 3,
+ 4, 4, 6, 4, 4, 1, 7, 4,
+ 4, 4, 2, 2, 8, 9, 4, 4,
+ 10, 11, 12, 13, 14, 15, 16, 10,
+ 17, 18, 19, 20, 21, 22, 4, 23,
+ 24, 25, 4, 27, 26, 29, 28, 28,
+ 30, 31, 28, 28, 28, 28, 28, 28,
+ 28, 28, 32, 33, 34, 35, 36, 37,
+ 38, 39, 33, 40, 32, 41, 42, 43,
+ 44, 28, 45, 46, 47, 28, 29, 28,
+ 28, 30, 31, 28, 28, 28, 28, 28,
+ 28, 28, 28, 48, 33, 34, 35, 36,
+ 37, 38, 39, 33, 40, 41, 41, 42,
+ 43, 44, 28, 45, 46, 47, 28, 30,
+ 49, 29, 28, 28, 30, 31, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 33,
+ 34, 35, 36, 37, 38, 39, 33, 40,
+ 41, 41, 42, 43, 44, 28, 45, 46,
+ 47, 28, 29, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 33, 34, 35, 36, 37, 28, 28, 28,
+ 28, 28, 28, 42, 43, 44, 28, 45,
+ 46, 47, 28, 29, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 34, 35, 36, 37, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 45, 46, 47, 28, 29, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 35, 36, 37, 28,
+ 29, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 36, 37, 28, 29, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 37, 28,
+ 29, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 35, 36, 37, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 45, 46, 47,
+ 28, 29, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 35, 36, 37, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 46,
+ 47, 28, 29, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 35, 36, 37, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 47, 28, 29, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 34, 35, 36, 37, 28, 28,
+ 28, 28, 28, 28, 42, 43, 44, 28,
+ 45, 46, 47, 28, 29, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 34, 35, 36, 37, 28,
+ 28, 28, 28, 28, 28, 28, 43, 44,
+ 28, 45, 46, 47, 28, 29, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 34, 35, 36, 37,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 44, 28, 45, 46, 47, 28, 29, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 33, 34, 35, 36,
+ 37, 28, 39, 33, 28, 28, 28, 42,
+ 43, 44, 28, 45, 46, 47, 28, 29,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 33, 34, 35,
+ 36, 37, 28, 28, 33, 28, 28, 28,
+ 42, 43, 44, 28, 45, 46, 47, 28,
+ 29, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 33, 34,
+ 35, 36, 37, 38, 39, 33, 28, 28,
+ 28, 42, 43, 44, 28, 45, 46, 47,
+ 28, 29, 28, 28, 30, 31, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 33,
+ 34, 35, 36, 37, 38, 39, 33, 40,
+ 28, 41, 42, 43, 44, 28, 45, 46,
+ 47, 28, 29, 28, 28, 30, 31, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 33, 34, 35, 36, 37, 38, 39, 33,
+ 40, 32, 41, 42, 43, 44, 28, 45,
+ 46, 47, 28, 51, 50, 50, 50, 50,
+ 50, 50, 50, 52, 50, 5, 53, 51,
+ 50, 6, 54, 54, 1, 55, 54, 54,
+ 54, 54, 54, 54, 54, 54, 56, 10,
+ 11, 12, 13, 14, 15, 16, 10, 17,
+ 19, 19, 20, 21, 22, 54, 23, 24,
+ 25, 54, 6, 54, 54, 1, 55, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 10, 11, 12, 13, 14, 15, 16, 10,
+ 17, 19, 19, 20, 21, 22, 54, 23,
+ 24, 25, 54, 6, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 10, 11, 12, 13, 14, 54, 54,
+ 54, 54, 54, 54, 20, 21, 22, 54,
+ 23, 24, 25, 54, 6, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 11, 12, 13, 14, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 23, 24, 25, 54, 6, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 12, 13, 14,
+ 54, 6, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 13, 14, 54, 6, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 14,
+ 54, 6, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 12, 13, 14, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 23, 24,
+ 25, 54, 6, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 12, 13, 14, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 24, 25, 54, 6, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 12, 13, 14, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 25, 54, 6, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 11, 12, 13, 14, 54,
+ 54, 54, 54, 54, 54, 20, 21, 22,
+ 54, 23, 24, 25, 54, 6, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 11, 12, 13, 14,
+ 54, 54, 54, 54, 54, 54, 54, 21,
+ 22, 54, 23, 24, 25, 54, 6, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 11, 12, 13,
+ 14, 54, 54, 54, 54, 54, 54, 54,
+ 54, 22, 54, 23, 24, 25, 54, 6,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 10, 11, 12,
+ 13, 14, 54, 16, 10, 54, 54, 54,
+ 20, 21, 22, 54, 23, 24, 25, 54,
+ 6, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 10, 11,
+ 12, 13, 14, 54, 54, 10, 54, 54,
+ 54, 20, 21, 22, 54, 23, 24, 25,
+ 54, 6, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 10,
+ 11, 12, 13, 14, 15, 16, 10, 54,
+ 54, 54, 20, 21, 22, 54, 23, 24,
+ 25, 54, 6, 54, 54, 1, 55, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 10, 11, 12, 13, 14, 15, 16, 10,
+ 17, 54, 19, 20, 21, 22, 54, 23,
+ 24, 25, 54, 1, 57, 3, 54, 54,
+ 54, 3, 54, 54, 6, 54, 54, 1,
+ 55, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 10, 11, 12, 13, 14, 15,
+ 16, 10, 17, 18, 19, 20, 21, 22,
+ 54, 23, 24, 25, 54, 6, 54, 54,
+ 1, 55, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 10, 11, 12, 13, 14,
+ 15, 16, 10, 17, 18, 19, 20, 21,
+ 22, 54, 23, 24, 25, 54, 59, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 59, 60, 58, 59, 60, 58,
+ 60, 58, 0
};
static const char _use_syllable_machine_trans_targs[] = {
- 3, 41, 3, 43, 4, 5, 25, 3,
- 0, 2, 60, 62, 45, 46, 47, 48,
- 49, 56, 57, 58, 61, 59, 53, 54,
- 55, 50, 51, 52, 3, 3, 3, 3,
- 6, 7, 24, 9, 10, 11, 12, 13,
- 20, 21, 22, 23, 17, 18, 19, 14,
- 15, 16, 8, 3, 3, 3, 26, 27,
- 40, 29, 30, 31, 32, 36, 37, 38,
- 39, 33, 34, 35, 28, 3, 3, 1,
- 42, 3, 44, 3, 63, 64
+ 1, 26, 2, 3, 1, 23, 1, 43,
+ 44, 46, 28, 29, 30, 31, 32, 39,
+ 40, 41, 45, 42, 36, 37, 38, 33,
+ 34, 35, 1, 1, 1, 1, 4, 5,
+ 22, 7, 8, 9, 10, 11, 18, 19,
+ 20, 21, 15, 16, 17, 12, 13, 14,
+ 6, 1, 1, 24, 25, 1, 1, 0,
+ 27, 1, 1, 47, 48
};
static const char _use_syllable_machine_trans_actions[] = {
- 1, 2, 3, 4, 0, 0, 0, 7,
- 0, 0, 4, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 4, 4, 0, 0,
- 0, 0, 0, 0, 8, 9, 10, 11,
+ 1, 2, 0, 0, 5, 0, 6, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2, 2, 0, 0, 0, 0,
+ 0, 0, 7, 8, 9, 10, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 12, 13, 14, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 15, 16, 0,
- 2, 17, 4, 18, 0, 0
+ 0, 11, 12, 0, 0, 13, 14, 0,
+ 2, 15, 16, 0, 0
};
static const char _use_syllable_machine_to_state_actions[] = {
- 0, 0, 0, 5, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
@@ -330,9 +261,7 @@
};
static const char _use_syllable_machine_from_state_actions[] = {
- 0, 0, 0, 6, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 4, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
@@ -342,29 +271,27 @@
};
static const short _use_syllable_machine_eof_trans[] = {
- 0, 1, 3, 0, 29, 31, 31, 52,
- 31, 31, 31, 31, 31, 31, 31, 31,
- 31, 31, 31, 31, 31, 31, 31, 31,
- 31, 53, 53, 52, 53, 53, 53, 53,
- 53, 53, 53, 53, 53, 53, 53, 53,
- 53, 70, 70, 74, 74, 74, 74, 74,
- 74, 74, 74, 74, 74, 74, 74, 74,
- 74, 74, 74, 74, 74, 74, 76, 76,
- 76
+ 1, 0, 27, 29, 29, 50, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 51,
+ 54, 51, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 58, 55, 55, 59, 59,
+ 59
};
-static const int use_syllable_machine_start = 3;
-static const int use_syllable_machine_first_final = 3;
-static const int use_syllable_machine_error = 0;
+static const int use_syllable_machine_start = 1;
+static const int use_syllable_machine_first_final = 1;
+static const int use_syllable_machine_error = -1;
-static const int use_syllable_machine_en_main = 3;
+static const int use_syllable_machine_en_main = 1;
#line 38 "hb-ot-shape-complex-use-machine.rl"
-#line 145 "hb-ot-shape-complex-use-machine.rl"
+#line 138 "hb-ot-shape-complex-use-machine.rl"
#define found_syllable(syllable_type) \
@@ -384,7 +311,7 @@
int cs;
hb_glyph_info_t *info = buffer->info;
-#line 388 "hb-ot-shape-complex-use-machine.hh"
+#line 315 "hb-ot-shape-complex-use-machine.hh"
{
cs = use_syllable_machine_start;
ts = 0;
@@ -392,7 +319,7 @@
act = 0;
}
-#line 166 "hb-ot-shape-complex-use-machine.rl"
+#line 159 "hb-ot-shape-complex-use-machine.rl"
p = 0;
@@ -401,7 +328,7 @@
unsigned int last = 0;
unsigned int syllable_serial = 1;
-#line 405 "hb-ot-shape-complex-use-machine.hh"
+#line 332 "hb-ot-shape-complex-use-machine.hh"
{
int _slen;
int _trans;
@@ -409,15 +336,13 @@
const char *_inds;
if ( p == pe )
goto _test_eof;
- if ( cs == 0 )
- goto _out;
_resume:
switch ( _use_syllable_machine_from_state_actions[cs] ) {
- case 6:
+ case 4:
#line 1 "NONE"
{ts = p;}
break;
-#line 421 "hb-ot-shape-complex-use-machine.hh"
+#line 346 "hb-ot-shape-complex-use-machine.hh"
}
_keys = _use_syllable_machine_trans_keys + (cs<<1);
@@ -439,92 +364,70 @@
#line 1 "NONE"
{te = p+1;}
break;
- case 9:
+ case 8:
+#line 127 "hb-ot-shape-complex-use-machine.rl"
+ {te = p+1;{ found_syllable (independent_cluster); }}
+ break;
+ case 10:
+#line 129 "hb-ot-shape-complex-use-machine.rl"
+ {te = p+1;{ found_syllable (standard_cluster); }}
+ break;
+ case 6:
+#line 133 "hb-ot-shape-complex-use-machine.rl"
+ {te = p+1;{ found_syllable (broken_cluster); }}
+ break;
+ case 5:
#line 134 "hb-ot-shape-complex-use-machine.rl"
- {te = p+1;{ found_syllable (independent_cluster); }}
+ {te = p+1;{ found_syllable (non_cluster); }}
+ break;
+ case 7:
+#line 127 "hb-ot-shape-complex-use-machine.rl"
+ {te = p;p--;{ found_syllable (independent_cluster); }}
break;
case 11:
-#line 136 "hb-ot-shape-complex-use-machine.rl"
- {te = p+1;{ found_syllable (consonant_cluster); }}
- break;
- case 14:
-#line 137 "hb-ot-shape-complex-use-machine.rl"
- {te = p+1;{ found_syllable (vowel_cluster); }}
- break;
- case 16:
-#line 138 "hb-ot-shape-complex-use-machine.rl"
- {te = p+1;{ found_syllable (number_joiner_terminated_cluster); }}
- break;
- case 7:
-#line 141 "hb-ot-shape-complex-use-machine.rl"
- {te = p+1;{ found_syllable (broken_cluster); }}
- break;
- case 8:
-#line 134 "hb-ot-shape-complex-use-machine.rl"
- {te = p;p--;{ found_syllable (independent_cluster); }}
- break;
- case 12:
-#line 135 "hb-ot-shape-complex-use-machine.rl"
+#line 128 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (virama_terminated_cluster); }}
break;
- case 10:
-#line 136 "hb-ot-shape-complex-use-machine.rl"
- {te = p;p--;{ found_syllable (consonant_cluster); }}
+ case 9:
+#line 129 "hb-ot-shape-complex-use-machine.rl"
+ {te = p;p--;{ found_syllable (standard_cluster); }}
break;
case 13:
-#line 137 "hb-ot-shape-complex-use-machine.rl"
- {te = p;p--;{ found_syllable (vowel_cluster); }}
+#line 130 "hb-ot-shape-complex-use-machine.rl"
+ {te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }}
break;
- case 15:
-#line 139 "hb-ot-shape-complex-use-machine.rl"
+ case 12:
+#line 131 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (numeral_cluster); }}
break;
- case 18:
-#line 140 "hb-ot-shape-complex-use-machine.rl"
+ case 16:
+#line 132 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (symbol_cluster); }}
break;
- case 17:
-#line 141 "hb-ot-shape-complex-use-machine.rl"
+ case 14:
+#line 133 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (broken_cluster); }}
break;
+ case 15:
+#line 134 "hb-ot-shape-complex-use-machine.rl"
+ {te = p;p--;{ found_syllable (non_cluster); }}
+ break;
case 1:
-#line 139 "hb-ot-shape-complex-use-machine.rl"
- {{p = ((te))-1;}{ found_syllable (numeral_cluster); }}
- break;
- case 3:
-#line 1 "NONE"
- { switch( act ) {
- case 0:
- {{cs = 0; goto _again;}}
+#line 133 "hb-ot-shape-complex-use-machine.rl"
+ {{p = ((te))-1;}{ found_syllable (broken_cluster); }}
break;
- case 8:
- {{p = ((te))-1;} found_syllable (broken_cluster); }
- break;
- }
- }
- break;
- case 4:
-#line 1 "NONE"
- {te = p+1;}
-#line 141 "hb-ot-shape-complex-use-machine.rl"
- {act = 8;}
- break;
-#line 513 "hb-ot-shape-complex-use-machine.hh"
+#line 420 "hb-ot-shape-complex-use-machine.hh"
}
_again:
switch ( _use_syllable_machine_to_state_actions[cs] ) {
- case 5:
+ case 3:
#line 1 "NONE"
{ts = 0;}
-#line 1 "NONE"
- {act = 0;}
break;
-#line 524 "hb-ot-shape-complex-use-machine.hh"
+#line 429 "hb-ot-shape-complex-use-machine.hh"
}
- if ( cs == 0 )
- goto _out;
if ( ++p != pe )
goto _resume;
_test_eof: {}
@@ -536,10 +439,9 @@
}
}
- _out: {}
}
-#line 175 "hb-ot-shape-complex-use-machine.rl"
+#line 168 "hb-ot-shape-complex-use-machine.rl"
}
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-private.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-private.hh Fri Aug 26 10:14:15 2016 -0700
@@ -46,7 +46,6 @@
USE_O = 0, /* OTHER */
USE_B = 1, /* BASE */
- USE_IV = 2, /* BASE_VOWEL */
USE_IND = 3, /* BASE_IND */
USE_N = 4, /* BASE_NUM */
USE_GB = 5, /* BASE_OTHER */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-table.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-table.cc Fri Aug 26 10:14:15 2016 -0700
@@ -6,12 +6,12 @@
*
* on files with these headers:
*
- * # IndicSyllabicCategory-8.0.0.txt
- * # Date: 2015-05-12, 10:00:00 GMT [RP, KW, LI]
- * # IndicPositionalCategory-8.0.0.txt
- * # Date: 2015-05-12, 10:00:00 GMT [RP, KW, LI]
- * # Blocks-8.0.0.txt
- * # Date: 2014-11-10, 23:04:00 GMT [KW]
+ * # IndicSyllabicCategory-9.0.0.txt
+ * # Date: 2016-05-21, 02:46:00 GMT [RP]
+ * # IndicPositionalCategory-9.0.0.txt
+ * # Date: 2016-02-25, 00:48:00 GMT [RP]
+ * # Blocks-9.0.0.txt
+ * # Date: 2016-02-05, 23:48:00 GMT [KW]
* UnicodeData.txt does not have a header.
*/
@@ -24,7 +24,6 @@
#define H USE_H /* HALANT */
#define HN USE_HN /* HALANT_NUM */
#define IND USE_IND /* BASE_IND */
-#define IV USE_IV /* BASE_VOWEL */
#define N USE_N /* BASE_NUM */
#define O USE_O /* OTHER */
#define R USE_R /* REPHA */
@@ -80,30 +79,30 @@
/* Devanagari */
- /* 0900 */ VMAbv, VMAbv, VMAbv, VMPst, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV,
- /* 0910 */ IV, IV, IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0900 */ VMAbv, VMAbv, VMAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0910 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0920 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0930 */ B, B, B, B, B, B, B, B, B, B, VAbv, VPst, CMBlw, B, VPst, VPre,
/* 0940 */ VPst, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, VPst, VPst, VPst, VPst, H, VPre, VPst,
/* 0950 */ O, VMAbv, VMBlw, O, O, VAbv, VBlw, VBlw, B, B, B, B, B, B, B, B,
- /* 0960 */ IV, IV, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
- /* 0970 */ O, O, IV, IV, IV, IV, IV, IV, B, B, B, B, B, B, B, B,
+ /* 0960 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
+ /* 0970 */ O, O, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* Bengali */
- /* 0980 */ O, VMAbv, VMPst, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, O, O, IV,
- /* 0990 */ IV, O, O, IV, IV, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0980 */ O, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, O, B,
+ /* 0990 */ B, O, O, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 09A0 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
/* 09B0 */ B, O, B, O, O, O, B, B, B, B, O, O, CMBlw, B, VPst, VPre,
/* 09C0 */ VPst, VBlw, VBlw, VBlw, VBlw, O, O, VPre, VPre, O, O, VPre, VPre, H, IND, O,
/* 09D0 */ O, O, O, O, O, O, O, VPst, O, O, O, O, B, B, O, B,
- /* 09E0 */ IV, IV, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
+ /* 09E0 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
/* 09F0 */ B, B, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* Gurmukhi */
- /* 0A00 */ O, VMAbv, VMAbv, VMPst, O, IV, IV, IV, IV, IV, IV, O, O, O, O, IV,
- /* 0A10 */ IV, O, O, IV, IV, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0A00 */ O, VMAbv, VMAbv, VMPst, O, B, B, B, B, B, B, O, O, O, O, B,
+ /* 0A10 */ B, O, O, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0A20 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
/* 0A30 */ B, O, B, B, O, B, B, O, B, B, O, O, CMBlw, O, VPst, VPre,
/* 0A40 */ VPst, VBlw, VBlw, O, O, O, O, VAbv, VAbv, O, O, VAbv, VAbv, H, O, O,
@@ -113,30 +112,30 @@
/* Gujarati */
- /* 0A80 */ O, VMAbv, VMAbv, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, IV, O, IV,
- /* 0A90 */ IV, IV, O, IV, IV, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0A80 */ O, VMAbv, VMAbv, VMPst, O, B, B, B, B, B, B, B, B, B, O, B,
+ /* 0A90 */ B, B, O, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0AA0 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
/* 0AB0 */ B, O, B, B, O, B, B, B, B, B, O, O, CMBlw, B, VPst, VPre,
/* 0AC0 */ VPst, VBlw, VBlw, VBlw, VBlw, VAbv, O, VAbv, VAbv, VAbv, O, VPst, VPst, H, O, O,
/* 0AD0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
- /* 0AE0 */ IV, IV, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
+ /* 0AE0 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
/* 0AF0 */ O, O, O, O, O, O, O, O, O, B, O, O, O, O, O, O,
/* Oriya */
- /* 0B00 */ O, VMAbv, VMPst, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, O, O, IV,
- /* 0B10 */ IV, O, O, IV, IV, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0B00 */ O, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, O, B,
+ /* 0B10 */ B, O, O, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0B20 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
/* 0B30 */ B, O, B, B, O, B, B, B, B, B, O, O, CMBlw, B, VPst, VAbv,
/* 0B40 */ VPst, VBlw, VBlw, VBlw, VBlw, O, O, VPre, VPre, O, O, VPre, VPre, H, O, O,
/* 0B50 */ O, O, O, O, O, O, VAbv, VAbv, O, O, O, O, B, B, O, B,
- /* 0B60 */ IV, IV, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
+ /* 0B60 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
/* 0B70 */ O, B, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* Tamil */
- /* 0B80 */ O, O, VMAbv, IND, O, IV, IV, IV, IV, IV, IV, O, O, O, IV, IV,
- /* 0B90 */ IV, O, IV, IV, IV, B, O, O, O, B, B, O, B, O, B, B,
+ /* 0B80 */ O, O, VMAbv, IND, O, B, B, B, B, B, B, O, O, O, B, B,
+ /* 0B90 */ B, O, B, B, B, B, O, O, O, B, B, O, B, O, B, B,
/* 0BA0 */ O, O, O, B, B, O, O, O, B, B, B, O, O, O, B, B,
/* 0BB0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, VPst, VPst,
/* 0BC0 */ VAbv, VPst, VPst, O, O, O, VPre, VPre, VPre, O, VPre, VPre, VPre, H, O, O,
@@ -146,41 +145,41 @@
/* Telugu */
- /* 0C00 */ VMAbv, VMPst, VMPst, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, O, IV, IV,
- /* 0C10 */ IV, O, IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0C00 */ VMAbv, VMPst, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, B, B,
+ /* 0C10 */ B, O, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0C20 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
/* 0C30 */ B, B, B, B, B, B, B, B, B, B, O, O, O, B, VAbv, VAbv,
/* 0C40 */ VAbv, VPst, VPst, VPst, VPst, O, VAbv, VAbv, VAbv, O, VAbv, VAbv, VAbv, H, O, O,
/* 0C50 */ O, O, O, O, O, VAbv, VBlw, O, B, B, B, O, O, O, O, O,
- /* 0C60 */ IV, IV, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
+ /* 0C60 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
/* 0C70 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* Kannada */
- /* 0C80 */ O, VMAbv, VMPst, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, O, IV, IV,
- /* 0C90 */ IV, O, IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0C80 */ O, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, B, B,
+ /* 0C90 */ B, O, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0CA0 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
/* 0CB0 */ B, B, B, B, O, B, B, B, B, B, O, O, CMBlw, B, VPst, VAbv,
/* 0CC0 */ VAbv, VPst, VPst, VPst, VPst, O, VAbv, VAbv, VAbv, O, VAbv, VAbv, VAbv, H, O, O,
/* 0CD0 */ O, O, O, O, O, VPst, VPst, O, O, O, O, O, O, O, B, O,
- /* 0CE0 */ IV, IV, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
+ /* 0CE0 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
/* 0CF0 */ O, R, R, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* Malayalam */
- /* 0D00 */ O, VMAbv, VMPst, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, O, IV, IV,
- /* 0D10 */ IV, O, IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0D00 */ O, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, B, B,
+ /* 0D10 */ B, O, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0D20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0D30 */ B, B, B, B, B, B, B, B, B, B, B, O, O, B, VPst, VPst,
/* 0D40 */ VPst, VPst, VPst, VBlw, VBlw, O, VPre, VPre, VPre, O, VPre, VPre, VPre, H, R, O,
- /* 0D50 */ O, O, O, O, O, O, O, VPst, O, O, O, O, O, O, O, IV,
- /* 0D60 */ IV, IV, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
+ /* 0D50 */ O, O, O, O, IND, IND, IND, VPst, O, O, O, O, O, O, O, B,
+ /* 0D60 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
/* 0D70 */ O, O, O, O, O, O, O, O, O, O, IND, IND, IND, IND, IND, IND,
/* Sinhala */
- /* 0D80 */ O, O, VMPst, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV,
- /* 0D90 */ IV, IV, IV, IV, IV, IV, IV, O, O, O, B, B, B, B, B, B,
+ /* 0D80 */ O, O, VMPst, VMPst, O, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0D90 */ B, B, B, B, B, B, B, O, O, O, B, B, B, B, B, B,
/* 0DA0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0DB0 */ B, B, O, B, B, B, B, B, B, B, B, B, O, B, O, O,
/* 0DC0 */ B, B, B, B, B, B, B, O, O, O, H, O, O, O, O, VPst,
@@ -195,10 +194,10 @@
/* 1000 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1010 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
- /* 1020 */ B, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, VPst, VPst, VAbv, VAbv, VBlw,
+ /* 1020 */ B, B, B, B, B, B, B, B, B, B, B, VPst, VPst, VAbv, VAbv, VBlw,
/* 1030 */ VBlw, VPre, VAbv, VAbv, VAbv, VAbv, VMAbv, VMBlw, VMPst, H, VAbv, MPst, MPre, MBlw, MBlw, B,
/* 1040 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, GB, O,
- /* 1050 */ B, B, IV, IV, IV, IV, VPst, VPst, VBlw, VBlw, B, B, B, B, MBlw, MBlw,
+ /* 1050 */ B, B, B, B, B, B, VPst, VPst, VBlw, VBlw, B, B, B, B, MBlw, MBlw,
/* 1060 */ MBlw, B, VPst, VMPst, VMPst, B, B, VPst, VPst, VMPst, VMPst, VMPst, VMPst, VMPst, B, B,
/* 1070 */ B, VAbv, VAbv, VAbv, VAbv, B, B, B, B, B, B, B, B, B, B, B,
/* 1080 */ B, B, MBlw, VPst, VPre, VAbv, VAbv, VMPst, VMPst, VMPst, VMPst, VMPst, VMPst, VMBlw, B, VMPst,
@@ -209,30 +208,30 @@
/* Tagalog */
- /* 1700 */ IV, IV, IV, B, B, B, B, B, B, B, B, B, B, O, B, B,
+ /* 1700 */ B, B, B, B, B, B, B, B, B, B, B, B, B, O, B, B,
/* 1710 */ B, B, VAbv, VBlw, VBlw, O, O, O, O, O, O, O, O, O, O, O,
/* Hanunoo */
- /* 1720 */ IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 1720 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1730 */ B, B, VAbv, VBlw, VBlw, O, O, O, O, O, O, O, O, O, O, O,
/* Buhid */
- /* 1740 */ IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 1740 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1750 */ B, B, VAbv, VBlw, O, O, O, O, O, O, O, O, O, O, O, O,
/* Tagbanwa */
- /* 1760 */ IV, IV, IV, B, B, B, B, B, B, B, B, B, B, O, B, B,
+ /* 1760 */ B, B, B, B, B, B, B, B, B, B, B, B, B, O, B, B,
/* 1770 */ B, O, VAbv, VBlw, O, O, O, O, O, O, O, O, O, O, O, O,
/* Khmer */
/* 1780 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1790 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
- /* 17A0 */ B, B, B, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV,
- /* 17B0 */ IV, IV, IV, IV, O, O, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VPre, VPre,
+ /* 17A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 17B0 */ B, B, B, B, O, O, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VPre, VPre,
/* 17C0 */ VPre, VPre, VPre, VPre, VPre, VPre, VMAbv, VMPst, VPst, VMAbv, VMAbv, FM, FAbv, CMAbv, FM, FM,
/* 17D0 */ FM, VAbv, H, FM, O, O, O, O, O, O, O, O, B, VAbv, O, O,
/* 17E0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
@@ -274,8 +273,8 @@
/* 1A20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1A30 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
- /* 1A40 */ B, B, B, B, B, B, B, B, B, B, B, B, B, IV, IV, IV,
- /* 1A50 */ IV, IV, IV, B, B, MPre, MBlw, FPst, FAbv, FAbv, FAbv, FBlw, FBlw, FBlw, FBlw, O,
+ /* 1A40 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 1A50 */ B, B, B, B, B, MPre, MBlw, FPst, FAbv, FAbv, FAbv, FBlw, FBlw, FBlw, FBlw, O,
/* 1A60 */ H, VPst, VAbv, VPst, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VAbv, VBlw, VPst, VPre, VPre,
/* 1A70 */ VPre, VPre, VPre, VAbv, VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, FM, FM, FM, O, O, FM,
/* 1A80 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
@@ -286,8 +285,8 @@
/* Balinese */
- /* 1B00 */ VMAbv, VMAbv, VMAbv, FAbv, VMPst, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV,
- /* 1B10 */ IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 1B00 */ VMAbv, VMAbv, VMAbv, FAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B,
+ /* 1B10 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1B20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1B30 */ B, B, B, B, CMAbv, VPst, VAbv, VAbv, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VPre, VPre,
/* 1B40 */ VPre, VPre, VAbv, VAbv, H, B, B, B, B, B, B, B, O, O, O, O,
@@ -297,7 +296,7 @@
/* Sundanese */
- /* 1B80 */ VMAbv, FAbv, VMPst, IV, IV, IV, IV, IV, IV, IV, B, B, B, B, B, B,
+ /* 1B80 */ VMAbv, FAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1B90 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1BA0 */ B, SUB, SUB, SUB, VAbv, VBlw, VPre, VPst, VAbv, VAbv, VPst, H, SUB, SUB, B, B,
/* 1BB0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
@@ -306,7 +305,7 @@
/* 1BC0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1BD0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
- /* 1BE0 */ B, B, B, B, IV, IV, CMAbv, VPst, VAbv, VAbv, VPst, VPst, VPst, VAbv, VPst, VAbv,
+ /* 1BE0 */ B, B, B, B, B, B, CMAbv, VPst, VAbv, VAbv, VPst, VPst, VPst, VAbv, VPst, VAbv,
/* 1BF0 */ FAbv, FAbv, VPst, VPst, O, O, O, O, O, O, O, O, O, O, O, O,
/* Lepcha */
@@ -326,14 +325,20 @@
/* 1CE0 */ VMAbv, VMPst, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, O, O, O, O, VMBlw, O, O,
/* 1CF0 */ O, O, VMPst, VMPst, VMAbv, O, O, O, VMAbv, VMAbv, O, O, O, O, O, O,
-#define use_offset_0x2008u 2552
+#define use_offset_0x1df8u 2552
+
+
+ /* Combining Diacritical Marks Supplement */
+ O, O, O, FM, O, O, O, O,
+
+#define use_offset_0x2008u 2560
/* General Punctuation */
O, O, O, O, ZWNJ, ZWJ, O, O,
/* 2010 */ GB, GB, GB, GB, GB, O, O, O,
-#define use_offset_0x2060u 2568
+#define use_offset_0x2060u 2576
/* 2060 */ WJ, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
@@ -342,12 +347,12 @@
/* 2070 */ O, O, O, O, FM, O, O, O, O, O, O, O, O, O, O, O,
/* 2080 */ O, O, FM, FM, FM, O, O, O,
-#define use_offset_0xa800u 2608
+#define use_offset_0xa800u 2616
/* Syloti Nagri */
- /* A800 */ IV, IV, O, IV, IV, IV, VAbv, B, B, B, B, VMAbv, B, B, B, B,
+ /* A800 */ B, B, O, B, B, B, VAbv, B, B, B, B, VMAbv, B, B, B, B,
/* A810 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* A820 */ B, B, B, VPst, VPst, VBlw, VAbv, VPst, O, O, O, O, O, O, O, O,
/* A830 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
@@ -361,11 +366,11 @@
/* Saurashtra */
- /* A880 */ VMPst, VMPst, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV,
- /* A890 */ IV, IV, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* A880 */ VMPst, VMPst, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* A890 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* A8A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* A8B0 */ B, B, B, B, FPst, VPst, VPst, VPst, VPst, VPst, VPst, VPst, VPst, VPst, VPst, VPst,
- /* A8C0 */ VPst, VPst, VPst, VPst, H, O, O, O, O, O, O, O, O, O, O, O,
+ /* A8C0 */ VPst, VPst, VPst, VPst, H, VMAbv, O, O, O, O, O, O, O, O, O, O,
/* A8D0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
/* Devanagari Extended */
@@ -389,7 +394,7 @@
/* Javanese */
- /* A980 */ VMAbv, VMAbv, FAbv, VMPst, IV, IV, IV, IV, IV, B, B, B, IV, IV, IV, B,
+ /* A980 */ VMAbv, VMAbv, FAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B, B,
/* A990 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* A9A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* A9B0 */ B, B, B, CMAbv, VPst, VPst, VAbv, VAbv, VBlw, VBlw, VPre, VPre, VAbv, SUB, MPst, MPst,
@@ -403,7 +408,7 @@
/* Cham */
- /* AA00 */ IV, IV, IV, IV, IV, IV, B, B, B, B, B, B, B, B, B, B,
+ /* AA00 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* AA10 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* AA20 */ B, B, B, B, B, B, B, B, B, VAbv, VAbv, VAbv, VAbv, VBlw, VAbv, VPre,
/* AA30 */ VPre, VAbv, VBlw, MPst, MPre, MBlw, MBlw, O, O, O, O, O, O, O, O, O,
@@ -413,7 +418,7 @@
/* Myanmar Extended-A */
/* AA60 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
- /* AA70 */ O, B, B, B, O, O, O, O, O, O, B, VMPst, VMAbv, VMPst, B, B,
+ /* AA70 */ O, B, B, B, GB, GB, GB, O, O, O, B, VMPst, VMAbv, VMPst, B, B,
/* Tai Viet */
@@ -426,27 +431,27 @@
/* Meetei Mayek Extensions */
- /* AAE0 */ IV, IV, B, B, B, B, B, B, B, B, B, VPre, VBlw, VAbv, VPre, VPst,
+ /* AAE0 */ B, B, B, B, B, B, B, B, B, B, B, VPre, VBlw, VAbv, VPre, VPst,
/* AAF0 */ O, O, O, O, O, VMPst, H, O,
-#define use_offset_0xabc0u 3368
+#define use_offset_0xabc0u 3376
/* Meetei Mayek */
- /* ABC0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, IV, IV,
- /* ABD0 */ B, IV, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* ABC0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* ABD0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* ABE0 */ B, B, B, VPst, VPst, VAbv, VPst, VPst, VBlw, VPst, VPst, O, VMPst, VBlw, O, O,
/* ABF0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
-#define use_offset_0xfe00u 3432
+#define use_offset_0xfe00u 3440
/* Variation Selectors */
/* FE00 */ VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS,
-#define use_offset_0x10a00u 3448
+#define use_offset_0x10a00u 3456
/* Kharoshthi */
@@ -457,13 +462,13 @@
/* 10A30 */ B, B, B, B, O, O, O, O, CMAbv, CMBlw, CMBlw, O, O, O, O, H,
/* 10A40 */ B, B, B, B, B, B, B, B,
-#define use_offset_0x11000u 3520
+#define use_offset_0x11000u 3528
/* Brahmi */
- /* 11000 */ VMPst, VMAbv, VMPst, R, R, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV,
- /* 11010 */ IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11000 */ VMPst, VMAbv, VMPst, R, R, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11010 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11020 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11030 */ B, B, B, B, B, B, B, B, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VBlw,
/* 11040 */ VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, H, O, O, O, O, O, O, O, O, O,
@@ -473,17 +478,17 @@
/* Kaithi */
- /* 11080 */ VMAbv, VMAbv, VMPst, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, B, B, B,
+ /* 11080 */ VMAbv, VMAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11090 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 110A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 110B0 */ VPst, VPre, VPst, VBlw, VBlw, VAbv, VAbv, VPst, VPst, H, CMBlw, O, O, O, O, O,
-#define use_offset_0x11100u 3712
+#define use_offset_0x11100u 3720
/* Chakma */
- /* 11100 */ VMAbv, VMAbv, VMAbv, IV, IV, IV, IV, B, B, B, B, B, B, B, B, B,
+ /* 11100 */ VMAbv, VMAbv, VMAbv, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11110 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11120 */ B, B, B, B, B, B, B, VAbv, VAbv, VAbv, VBlw, VBlw, VPre, VAbv, VAbv, VAbv,
/* 11130 */ VAbv, VBlw, VBlw, H, VAbv, O, B, B, B, B, B, B, B, B, B, B,
@@ -497,8 +502,8 @@
/* Sharada */
- /* 11180 */ VMAbv, VMAbv, VMPst, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV,
- /* 11190 */ IV, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11180 */ VMAbv, VMAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11190 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 111A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 111B0 */ B, B, B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv,
/* 111C0 */ H, B, R, R, O, O, O, O, O, O, CMBlw, VAbv, VBlw, O, O, O,
@@ -511,23 +516,23 @@
/* Khojki */
- /* 11200 */ IV, IV, IV, IV, IV, IV, IV, IV, B, B, B, B, B, B, B, B,
+ /* 11200 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11210 */ B, B, O, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11220 */ B, B, B, B, B, B, B, B, B, B, B, B, VPst, VPst, VPst, VBlw,
- /* 11230 */ VAbv, VAbv, VAbv, VAbv, VMAbv, H, CMAbv, CMAbv,
+ /* 11230 */ VAbv, VAbv, VAbv, VAbv, VMAbv, H, CMAbv, CMAbv, O, O, O, O, O, O, VMAbv, O,
-#define use_offset_0x11280u 4024
+#define use_offset_0x11280u 4040
/* Multani */
- /* 11280 */ IV, IV, IV, IV, B, B, B, O, B, O, B, B, B, B, O, B,
+ /* 11280 */ B, B, B, B, B, B, B, O, B, O, B, B, B, B, O, B,
/* 11290 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, O, B,
/* 112A0 */ B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, O,
/* Khudawadi */
- /* 112B0 */ IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, B, B, B, B, B, B,
+ /* 112B0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 112C0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 112D0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, VMAbv,
/* 112E0 */ VPst, VPre, VPst, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, CMBlw, VBlw, O, O, O, O, O,
@@ -535,44 +540,55 @@
/* Grantha */
- /* 11300 */ VMAbv, VMAbv, VMPst, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, O, O, IV,
- /* 11310 */ IV, O, O, IV, IV, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11300 */ VMAbv, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, O, B,
+ /* 11310 */ B, O, O, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11320 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
/* 11330 */ B, O, B, B, O, B, B, B, B, B, O, O, CMBlw, B, VPst, VPst,
/* 11340 */ VAbv, VPst, VPst, VPst, VPst, O, O, VPre, VPre, O, O, VPre, VPre, H, O, O,
/* 11350 */ O, O, O, O, O, O, O, VPst, O, O, O, O, O, O, O, O,
- /* 11360 */ IV, IV, VPst, VPst, O, O, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, O, O, O,
+ /* 11360 */ B, B, VPst, VPst, O, O, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, O, O, O,
/* 11370 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, O, O, O,
-#define use_offset_0x11480u 4272
+#define use_offset_0x11400u 4288
+
+
+ /* Newa */
+ /* 11400 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11410 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11420 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11430 */ B, B, B, B, B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv,
+ /* 11440 */ VPst, VPst, H, VMAbv, VMAbv, VMPst, CMBlw, B, O, O, O, O, O, O, O, O,
+ /* 11450 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
+ /* 11460 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+ /* 11470 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* Tirhuta */
- /* 11480 */ O, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, B,
+ /* 11480 */ O, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11490 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 114A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 114B0 */ VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VPre, VAbv, VPre, VPre, VPst, VPre, VMAbv,
/* 114C0 */ VMAbv, VMPst, H, CMBlw, B, O, O, O, O, O, O, O, O, O, O, O,
/* 114D0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
-#define use_offset_0x11580u 4368
+#define use_offset_0x11580u 4512
/* Siddham */
- /* 11580 */ IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, B, B,
+ /* 11580 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11590 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 115A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, VPst,
/* 115B0 */ VPre, VPst, VBlw, VBlw, VBlw, VBlw, O, O, VPre, VPre, VPre, VPre, VMAbv, VMAbv, VMPst, H,
/* 115C0 */ CMBlw, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
- /* 115D0 */ O, O, O, O, O, O, O, O, IV, IV, IV, IV, VBlw, VBlw, O, O,
+ /* 115D0 */ O, O, O, O, O, O, O, O, B, B, B, B, VBlw, VBlw, O, O,
/* 115E0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* 115F0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* Modi */
- /* 11600 */ IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, B, B,
+ /* 11600 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11610 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11620 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11630 */ VPst, VPst, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VPst, VPst, VMAbv, VMPst, H,
@@ -583,7 +599,7 @@
/* Takri */
- /* 11680 */ IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, B, B, B, B, B, B,
+ /* 11680 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11690 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 116A0 */ B, B, B, B, B, B, B, B, B, B, B, VMAbv, VMPst, VAbv, VPre, VPst,
/* 116B0 */ VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, H, CMBlw, O, O, O, O, O, O, O, O,
@@ -599,7 +615,28 @@
/* 11720 */ VPst, VPst, VAbv, VAbv, VBlw, VBlw, VPre, VAbv, VBlw, VAbv, VAbv, VAbv, O, O, O, O,
/* 11730 */ B, B, B, B, B, B, B, B, B, B, B, B, O, O, O, O,
-}; /* Table items: 4816; occupancy: 72% */
+#define use_offset_0x11c00u 4960
+
+
+ /* Bhaiksuki */
+
+ /* 11C00 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
+ /* 11C10 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11C20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, VPst,
+ /* 11C30 */ VAbv, VAbv, VBlw, VBlw, VBlw, VBlw, VBlw, O, VAbv, VAbv, VAbv, VAbv, VMAbv, VMAbv, VMPst, H,
+ /* 11C40 */ B, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+ /* 11C50 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11C60 */ B, B, B, B, B, B, B, B, B, B, B, B, B, O, O, O,
+
+ /* Marchen */
+
+ /* 11C70 */ O, O, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11C80 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11C90 */ O, O, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB,
+ /* 11CA0 */ SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, O, SUB, SUB, SUB, SUB, SUB, SUB, SUB,
+ /* 11CB0 */ VBlw, VPre, VBlw, VAbv, VPst, VMAbv, VMAbv, O,
+
+}; /* Table items: 5144; occupancy: 72% */
USE_TABLE_ELEMENT_TYPE
hb_use_get_categories (hb_codepoint_t u)
@@ -619,6 +656,7 @@
if (hb_in_range (u, 0x1900u, 0x1A9Fu)) return use_table[u - 0x1900u + use_offset_0x1900u];
if (hb_in_range (u, 0x1B00u, 0x1C4Fu)) return use_table[u - 0x1B00u + use_offset_0x1b00u];
if (hb_in_range (u, 0x1CD0u, 0x1CFFu)) return use_table[u - 0x1CD0u + use_offset_0x1cd0u];
+ if (hb_in_range (u, 0x1DF8u, 0x1DFFu)) return use_table[u - 0x1DF8u + use_offset_0x1df8u];
break;
case 0x2u:
@@ -642,10 +680,11 @@
case 0x11u:
if (hb_in_range (u, 0x11000u, 0x110BFu)) return use_table[u - 0x11000u + use_offset_0x11000u];
- if (hb_in_range (u, 0x11100u, 0x11237u)) return use_table[u - 0x11100u + use_offset_0x11100u];
+ if (hb_in_range (u, 0x11100u, 0x1123Fu)) return use_table[u - 0x11100u + use_offset_0x11100u];
if (hb_in_range (u, 0x11280u, 0x11377u)) return use_table[u - 0x11280u + use_offset_0x11280u];
- if (hb_in_range (u, 0x11480u, 0x114DFu)) return use_table[u - 0x11480u + use_offset_0x11480u];
+ if (hb_in_range (u, 0x11400u, 0x114DFu)) return use_table[u - 0x11400u + use_offset_0x11400u];
if (hb_in_range (u, 0x11580u, 0x1173Fu)) return use_table[u - 0x11580u + use_offset_0x11580u];
+ if (hb_in_range (u, 0x11C00u, 0x11CB7u)) return use_table[u - 0x11C00u + use_offset_0x11c00u];
if (unlikely (u == 0x1107Fu)) return HN;
break;
@@ -662,7 +701,6 @@
#undef H
#undef HN
#undef IND
-#undef IV
#undef N
#undef O
#undef R
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use.cc Fri Aug 26 10:14:15 2016 -0700
@@ -184,6 +184,9 @@
case HB_SCRIPT_MANICHAEAN:
case HB_SCRIPT_PSALTER_PAHLAVI:
+ /* Unicode-9.0 additions */
+ case HB_SCRIPT_ADLAM:
+
return true;
default:
@@ -227,12 +230,12 @@
enum syllable_type_t {
independent_cluster,
virama_terminated_cluster,
- consonant_cluster,
- vowel_cluster,
+ standard_cluster,
number_joiner_terminated_cluster,
numeral_cluster,
symbol_cluster,
broken_cluster,
+ non_cluster,
};
#include "hb-ot-shape-complex-use-machine.hh"
@@ -285,6 +288,9 @@
setup_topographical_masks (const hb_ot_shape_plan_t *plan,
hb_buffer_t *buffer)
{
+ const use_shape_plan_t *use_plan = (const use_shape_plan_t *) plan->data;
+ if (use_plan->arabic_plan)
+ return;
ASSERT_STATIC (INIT < 4 && ISOL < 4 && MEDI < 4 && FINA < 4);
hb_mask_t masks[4], all_masks = 0;
@@ -309,13 +315,13 @@
{
case independent_cluster:
case symbol_cluster:
+ case non_cluster:
/* These don't join. Nothing to do. */
last_form = _NONE;
break;
case virama_terminated_cluster:
- case consonant_cluster:
- case vowel_cluster:
+ case standard_cluster:
case number_joiner_terminated_cluster:
case numeral_cluster:
case broken_cluster:
@@ -360,7 +366,7 @@
hb_glyph_info_t *info = buffer->info;
unsigned int count = buffer->len;
for (unsigned int i = 0; i < count; i++)
- _hb_glyph_info_clear_substituted_and_ligated_and_multiplied (&info[i]);
+ _hb_glyph_info_clear_substituted (&info[i]);
}
static void
@@ -405,6 +411,12 @@
}
}
+static inline bool
+is_halant (const hb_glyph_info_t &info)
+{
+ return info.use_category() == USE_H && !_hb_glyph_info_ligated (&info);
+}
+
static void
reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end)
{
@@ -412,28 +424,26 @@
/* Only a few syllable types need reordering. */
if (unlikely (!(FLAG_SAFE (syllable_type) &
(FLAG (virama_terminated_cluster) |
- FLAG (consonant_cluster) |
- FLAG (vowel_cluster) |
+ FLAG (standard_cluster) |
FLAG (broken_cluster) |
0))))
return;
hb_glyph_info_t *info = buffer->info;
-#define HALANT_FLAGS FLAG(USE_H)
-#define BASE_FLAGS (FLAG (USE_B) | FLAG (USE_GB) | FLAG (USE_IV))
+#define BASE_FLAGS (FLAG (USE_B) | FLAG (USE_GB))
/* Move things forward. */
if (info[start].use_category() == USE_R && end - start > 1)
{
/* Got a repha. Reorder it to after first base, before first halant. */
for (unsigned int i = start + 1; i < end; i++)
- if (FLAG_UNSAFE (info[i].use_category()) & (HALANT_FLAGS | BASE_FLAGS))
+ if ((FLAG_UNSAFE (info[i].use_category()) & (BASE_FLAGS)) || is_halant (info[i]))
{
/* If we hit a halant, move before it; otherwise it's a base: move to it's
* place, and shift things in between backward. */
- if (info[i].use_category() == USE_H)
+ if (is_halant (info[i]))
i--;
buffer->merge_clusters (start, i + 1);
@@ -450,11 +460,11 @@
for (unsigned int i = start; i < end; i++)
{
uint32_t flag = FLAG_UNSAFE (info[i].use_category());
- if (flag & (HALANT_FLAGS | BASE_FLAGS))
+ if ((flag & (BASE_FLAGS)) || is_halant (info[i]))
{
- /* If we hit a halant, move before it; otherwise it's a base: move to it's
+ /* If we hit a halant, move after it; otherwise it's a base: move to it's
* place, and shift things in between backward. */
- if (info[i].use_category() == USE_H)
+ if (is_halant (info[i]))
j = i + 1;
else
j = i;
@@ -490,22 +500,16 @@
if (likely (!has_broken_syllables))
return;
-
- hb_codepoint_t dottedcircle_glyph;
- if (!font->get_glyph (0x25CCu, 0, &dottedcircle_glyph))
- return;
-
hb_glyph_info_t dottedcircle = {0};
- if (!font->get_glyph (0x25CCu, 0, &dottedcircle.codepoint))
+ if (!font->get_nominal_glyph (0x25CCu, &dottedcircle.codepoint))
return;
dottedcircle.use_category() = hb_use_get_categories (0x25CC);
buffer->clear_output ();
buffer->idx = 0;
-
unsigned int last_syllable = 0;
- while (buffer->idx < buffer->len)
+ while (buffer->idx < buffer->len && !buffer->in_error)
{
unsigned int syllable = buffer->cur().syllable();
syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F);
@@ -513,19 +517,19 @@
{
last_syllable = syllable;
- hb_glyph_info_t info = dottedcircle;
- info.cluster = buffer->cur().cluster;
- info.mask = buffer->cur().mask;
- info.syllable() = buffer->cur().syllable();
+ hb_glyph_info_t ginfo = dottedcircle;
+ ginfo.cluster = buffer->cur().cluster;
+ ginfo.mask = buffer->cur().mask;
+ ginfo.syllable() = buffer->cur().syllable();
/* TODO Set glyph_props? */
/* Insert dottedcircle after possible Repha. */
- while (buffer->idx < buffer->len &&
+ while (buffer->idx < buffer->len && !buffer->in_error &&
last_syllable == buffer->cur().syllable() &&
buffer->cur().use_category() == USE_R)
buffer->next_glyph ();
- buffer->output_info (info);
+ buffer->output_info (ginfo);
}
else
buffer->next_glyph ();
@@ -564,7 +568,7 @@
if (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (c->unicode->general_category (a)))
return false;
- return c->unicode->compose (a, b, ab);
+ return (bool)c->unicode->compose (a, b, ab);
}
@@ -576,10 +580,11 @@
data_create_use,
data_destroy_use,
NULL, /* preprocess_text */
+ NULL, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
NULL, /* decompose */
compose_use,
setup_masks_use,
- HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
+ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
false, /* fallback_position */
};
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback-private.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback-private.hh Fri Aug 26 10:14:15 2016 -0700
@@ -45,5 +45,9 @@
hb_font_t *font,
hb_buffer_t *buffer);
+HB_INTERNAL void _hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer);
+
#endif /* HB_OT_SHAPE_FALLBACK_PRIVATE_HH */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback.cc Fri Aug 26 10:14:15 2016 -0700
@@ -224,7 +224,7 @@
pos.x_offset += base_extents.x_bearing + base_extents.width - mark_extents.width / 2 - mark_extents.x_bearing;
break;
}
- /* Fall through */
+ HB_FALLTHROUGH;
default:
case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW:
@@ -259,6 +259,7 @@
case HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT:
/* Add gap, fall-through. */
base_extents.height -= y_gap;
+ HB_FALLTHROUGH;
case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT:
case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW:
@@ -279,6 +280,7 @@
/* Add gap, fall-through. */
base_extents.y_bearing += y_gap;
base_extents.height -= y_gap;
+ HB_FALLTHROUGH;
case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE:
case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT:
@@ -482,3 +484,70 @@
idx = skippy_iter.idx;
}
}
+
+
+/* Adjusts width of various spaces. */
+void
+_hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer)
+{
+ if (!HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
+ return;
+
+ hb_glyph_info_t *info = buffer->info;
+ hb_glyph_position_t *pos = buffer->pos;
+ unsigned int count = buffer->len;
+ for (unsigned int i = 0; i < count; i++)
+ if (_hb_glyph_info_is_unicode_space (&info[i]) && !_hb_glyph_info_ligated (&info[i]))
+ {
+ hb_unicode_funcs_t::space_t space_type = _hb_glyph_info_get_unicode_space_fallback_type (&info[i]);
+ hb_codepoint_t glyph;
+ typedef hb_unicode_funcs_t t;
+ switch (space_type)
+ {
+ case t::NOT_SPACE: /* Shouldn't happen. */
+ case t::SPACE:
+ break;
+
+ case t::SPACE_EM:
+ case t::SPACE_EM_2:
+ case t::SPACE_EM_3:
+ case t::SPACE_EM_4:
+ case t::SPACE_EM_5:
+ case t::SPACE_EM_6:
+ case t::SPACE_EM_16:
+ pos[i].x_advance = (font->x_scale + ((int) space_type)/2) / (int) space_type;
+ break;
+
+ case t::SPACE_4_EM_18:
+ pos[i].x_advance = font->x_scale * 4 / 18;
+ break;
+
+ case t::SPACE_FIGURE:
+ for (char u = '0'; u <= '9'; u++)
+ if (font->get_nominal_glyph (u, &glyph))
+ {
+ pos[i].x_advance = font->get_glyph_h_advance (glyph);
+ break;
+ }
+ break;
+
+ case t::SPACE_PUNCTUATION:
+ if (font->get_nominal_glyph ('.', &glyph))
+ pos[i].x_advance = font->get_glyph_h_advance (glyph);
+ else if (font->get_nominal_glyph (',', &glyph))
+ pos[i].x_advance = font->get_glyph_h_advance (glyph);
+ break;
+
+ case t::SPACE_NARROW:
+ /* Half-space?
+ * Unicode doc http://www.unicode.org/charts/PDF/U2000.pdf says ~1/4 or 1/5 of EM.
+ * However, in my testing, many fonts have their regular space being about that
+ * size. To me, a percentage of the space width makes more sense. Half is as
+ * good as any. */
+ pos[i].x_advance /= 2;
+ break;
+ }
+ }
+}
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-normalize.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-normalize.cc Fri Aug 26 10:14:15 2016 -0700
@@ -62,24 +62,12 @@
* with previous base, use that. This needs the itemizer to have this
* knowledge too. We need to provide assistance to the itemizer.
*
- * - When a font does not support a character but supports its decomposition,
- * well, use the decomposition (preferring the canonical decomposition, but
- * falling back to the compatibility decomposition if necessary). The
- * compatibility decomposition is really nice to have, for characters like
- * ellipsis, or various-sized space characters.
+ * - When a font does not support a character but supports its canonical
+ * decomposition, well, use the decomposition.
*
* - The complex shapers can customize the compose and decompose functions to
* offload some of their requirements to the normalizer. For example, the
* Indic shaper may want to disallow recomposing of two matras.
- *
- * - We try compatibility decomposition if decomposing through canonical
- * decomposition alone failed to find a sequence that the font supports.
- * We don't try compatibility decomposition recursively during the canonical
- * decomposition phase. This has minimal impact. There are only a handful
- * of Greek letter that have canonical decompositions that include characters
- * with compatibility decomposition. Those can be found using this command:
- *
- * egrep "`echo -n ';('; grep ';<' UnicodeData.txt | cut -d';' -f1 | tr '\n' '|'; echo ') '`" UnicodeData.txt
*/
static bool
@@ -88,7 +76,7 @@
hb_codepoint_t *a,
hb_codepoint_t *b)
{
- return c->unicode->decompose (ab, a, b);
+ return (bool) c->unicode->decompose (ab, a, b);
}
static bool
@@ -97,21 +85,21 @@
hb_codepoint_t b,
hb_codepoint_t *ab)
{
- return c->unicode->compose (a, b, ab);
+ return (bool) c->unicode->compose (a, b, ab);
}
static inline void
set_glyph (hb_glyph_info_t &info, hb_font_t *font)
{
- font->get_glyph (info.codepoint, 0, &info.glyph_index());
+ font->get_nominal_glyph (info.codepoint, &info.glyph_index());
}
static inline void
output_char (hb_buffer_t *buffer, hb_codepoint_t unichar, hb_codepoint_t glyph)
{
buffer->cur().glyph_index() = glyph;
- buffer->output_glyph (unichar);
- _hb_glyph_info_set_unicode_props (&buffer->prev(), buffer->unicode);
+ buffer->output_glyph (unichar); /* This is very confusing indeed. */
+ _hb_glyph_info_set_unicode_props (&buffer->prev(), buffer);
}
static inline void
@@ -136,10 +124,10 @@
hb_font_t * const font = c->font;
if (!c->decompose (c, ab, &a, &b) ||
- (b && !font->get_glyph (b, 0, &b_glyph)))
+ (b && !font->get_nominal_glyph (b, &b_glyph)))
return 0;
- bool has_a = font->get_glyph (a, 0, &a_glyph);
+ bool has_a = (bool) font->get_nominal_glyph (a, &a_glyph);
if (shortest && has_a) {
/* Output a and b */
output_char (buffer, a, a_glyph);
@@ -171,28 +159,6 @@
return 0;
}
-/* Returns 0 if didn't decompose, number of resulting characters otherwise. */
-static inline unsigned int
-decompose_compatibility (const hb_ot_shape_normalize_context_t *c, hb_codepoint_t u)
-{
- unsigned int len, i;
- hb_codepoint_t decomposed[HB_UNICODE_MAX_DECOMPOSITION_LEN];
- hb_codepoint_t glyphs[HB_UNICODE_MAX_DECOMPOSITION_LEN];
-
- len = c->buffer->unicode->decompose_compatibility (u, decomposed);
- if (!len)
- return 0;
-
- for (i = 0; i < len; i++)
- if (!c->font->get_glyph (decomposed[i], 0, &glyphs[i]))
- return 0;
-
- for (i = 0; i < len; i++)
- output_char (c->buffer, decomposed[i], glyphs[i]);
-
- return len;
-}
-
static inline void
decompose_current_character (const hb_ot_shape_normalize_context_t *c, bool shortest)
{
@@ -200,17 +166,50 @@
hb_codepoint_t u = buffer->cur().codepoint;
hb_codepoint_t glyph;
- /* Kind of a cute waterfall here... */
- if (shortest && c->font->get_glyph (u, 0, &glyph))
+ if (shortest && c->font->get_nominal_glyph (u, &glyph))
+ {
next_char (buffer, glyph);
- else if (decompose (c, shortest, u))
+ return;
+ }
+
+ if (decompose (c, shortest, u))
+ {
skip_char (buffer);
- else if (!shortest && c->font->get_glyph (u, 0, &glyph))
+ return;
+ }
+
+ if (!shortest && c->font->get_nominal_glyph (u, &glyph))
+ {
next_char (buffer, glyph);
- else if (decompose_compatibility (c, u))
- skip_char (buffer);
- else
- next_char (buffer, glyph); /* glyph is initialized in earlier branches. */
+ return;
+ }
+
+ if (_hb_glyph_info_is_unicode_space (&buffer->cur()))
+ {
+ hb_codepoint_t space_glyph;
+ hb_unicode_funcs_t::space_t space_type = buffer->unicode->space_fallback_type (u);
+ if (space_type != hb_unicode_funcs_t::NOT_SPACE && c->font->get_nominal_glyph (0x0020u, &space_glyph))
+ {
+ _hb_glyph_info_set_unicode_space_fallback_type (&buffer->cur(), space_type);
+ next_char (buffer, space_glyph);
+ buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK;
+ return;
+ }
+ }
+
+ if (u == 0x2011u)
+ {
+ /* U+2011 is the only sensible character that is a no-break version of another character
+ * and not a space. The space ones are handled already. Handle this lone one. */
+ hb_codepoint_t other_glyph;
+ if (c->font->get_nominal_glyph (0x2010u, &other_glyph))
+ {
+ next_char (buffer, other_glyph);
+ return;
+ }
+ }
+
+ next_char (buffer, glyph); /* glyph is initialized in earlier branches. */
}
static inline void
@@ -219,10 +218,10 @@
/* TODO Currently if there's a variation-selector we give-up, it's just too hard. */
hb_buffer_t * const buffer = c->buffer;
hb_font_t * const font = c->font;
- for (; buffer->idx < end - 1;) {
+ for (; buffer->idx < end - 1 && !buffer->in_error;) {
if (unlikely (buffer->unicode->is_variation_selector (buffer->cur(+1).codepoint))) {
/* The next two lines are some ugly lines... But work. */
- if (font->get_glyph (buffer->cur().codepoint, buffer->cur(+1).codepoint, &buffer->cur().glyph_index()))
+ if (font->get_variation_glyph (buffer->cur().codepoint, buffer->cur(+1).codepoint, &buffer->cur().glyph_index()))
{
buffer->replace_glyphs (2, 1, &buffer->cur().codepoint);
}
@@ -255,13 +254,13 @@
decompose_multi_char_cluster (const hb_ot_shape_normalize_context_t *c, unsigned int end, bool short_circuit)
{
hb_buffer_t * const buffer = c->buffer;
- for (unsigned int i = buffer->idx; i < end; i++)
+ for (unsigned int i = buffer->idx; i < end && !buffer->in_error; i++)
if (unlikely (buffer->unicode->is_variation_selector (buffer->info[i].codepoint))) {
handle_variation_selector_cluster (c, end, short_circuit);
return;
}
- while (buffer->idx < end)
+ while (buffer->idx < end && !buffer->in_error)
decompose_current_character (c, short_circuit);
}
@@ -321,7 +320,7 @@
buffer->clear_output ();
count = buffer->len;
- for (buffer->idx = 0; buffer->idx < count;)
+ for (buffer->idx = 0; buffer->idx < count && !buffer->in_error;)
{
unsigned int end;
for (end = buffer->idx + 1; end < count; end++)
@@ -371,7 +370,7 @@
count = buffer->len;
unsigned int starter = 0;
buffer->next_glyph ();
- while (buffer->idx < count)
+ while (buffer->idx < count && !buffer->in_error)
{
hb_codepoint_t composed, glyph;
if (/* We don't try to compose a non-mark character with it's preceding starter.
@@ -389,7 +388,7 @@
buffer->cur().codepoint,
&composed) &&
/* And the font has glyph for the composite. */
- font->get_glyph (composed, 0, &glyph))
+ font->get_nominal_glyph (composed, &glyph))
{
/* Composes. */
buffer->next_glyph (); /* Copy to out-buffer. */
@@ -400,7 +399,7 @@
/* Modify starter and carry on. */
buffer->out_info[starter].codepoint = composed;
buffer->out_info[starter].glyph_index() = glyph;
- _hb_glyph_info_set_unicode_props (&buffer->out_info[starter], buffer->unicode);
+ _hb_glyph_info_set_unicode_props (&buffer->out_info[starter], buffer);
continue;
}
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.cc Fri Aug 26 10:14:15 2016 -0700
@@ -145,7 +145,7 @@
struct hb_ot_shaper_font_data_t {};
hb_ot_shaper_font_data_t *
-_hb_ot_shaper_font_data_create (hb_font_t *font)
+_hb_ot_shaper_font_data_create (hb_font_t *font HB_UNUSED)
{
return (hb_ot_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
}
@@ -228,7 +228,7 @@
unsigned int count = buffer->len;
hb_glyph_info_t *info = buffer->info;
for (unsigned int i = 0; i < count; i++)
- _hb_glyph_info_set_unicode_props (&info[i], buffer->unicode);
+ _hb_glyph_info_set_unicode_props (&info[i], buffer);
}
static void
@@ -245,7 +245,7 @@
hb_glyph_info_t dottedcircle = {0};
dottedcircle.codepoint = 0x25CCu;
- _hb_glyph_info_set_unicode_props (&dottedcircle, buffer->unicode);
+ _hb_glyph_info_set_unicode_props (&dottedcircle, buffer);
buffer->clear_output ();
@@ -254,7 +254,7 @@
info.cluster = buffer->cur().cluster;
info.mask = buffer->cur().mask;
buffer->output_info (info);
- while (buffer->idx < buffer->len)
+ while (buffer->idx < buffer->len && !buffer->in_error)
buffer->next_glyph ();
buffer->swap_buffers ();
@@ -263,16 +263,18 @@
static void
hb_form_clusters (hb_buffer_t *buffer)
{
- if (buffer->cluster_level != HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
+ if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII) ||
+ buffer->cluster_level != HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
return;
- /* Loop duplicated in hb_ensure_native_direction(). */
+ /* Loop duplicated in hb_ensure_native_direction(), and in _hb-coretext.cc */
unsigned int base = 0;
unsigned int count = buffer->len;
hb_glyph_info_t *info = buffer->info;
for (unsigned int i = 1; i < count; i++)
{
- if (likely (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i]))))
+ if (likely (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i])) &&
+ !_hb_glyph_info_is_joiner (&info[i])))
{
buffer->merge_clusters (base, i);
base = i;
@@ -346,7 +348,8 @@
static inline void
hb_ot_shape_setup_masks_fraction (hb_ot_shape_context_t *c)
{
- if (!c->plan->has_frac)
+ if (!(c->buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII) ||
+ !c->plan->has_frac)
return;
hb_buffer_t *buffer = c->buffer;
@@ -416,7 +419,8 @@
{
hb_buffer_t *buffer = c->buffer;
- if (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES)
+ if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES) ||
+ (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES))
return;
unsigned int count = buffer->len;
@@ -433,7 +437,8 @@
{
hb_buffer_t *buffer = c->buffer;
- if (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES)
+ if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES) ||
+ (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES))
return;
unsigned int count = buffer->len;
@@ -451,7 +456,7 @@
return;
hb_codepoint_t space;
- if (c->font->get_glyph (' ', 0, &space))
+ if (c->font->get_nominal_glyph (' ', &space))
{
/* Replace default-ignorables with a zero-advance space glyph. */
for (/*continue*/; i < count; i++)
@@ -519,39 +524,10 @@
}
static inline void
-hb_synthesize_glyph_classes (hb_ot_shape_context_t *c)
-{
- unsigned int count = c->buffer->len;
- hb_glyph_info_t *info = c->buffer->info;
- for (unsigned int i = 0; i < count; i++)
- {
- hb_ot_layout_glyph_class_mask_t klass;
-
- /* Never mark default-ignorables as marks.
- * They won't get in the way of lookups anyway,
- * but having them as mark will cause them to be skipped
- * over if the lookup-flag says so, but at least for the
- * Mongolian variation selectors, looks like Uniscribe
- * marks them as non-mark. Some Mongolian fonts without
- * GDEF rely on this. Another notable character that
- * this applies to is COMBINING GRAPHEME JOINER. */
- klass = (_hb_glyph_info_get_general_category (&info[i]) !=
- HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK ||
- _hb_glyph_info_is_default_ignorable (&info[i])) ?
- HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH :
- HB_OT_LAYOUT_GLYPH_PROPS_MARK;
- _hb_glyph_info_set_glyph_props (&info[i], klass);
- }
-}
-
-static inline void
hb_ot_substitute_default (hb_ot_shape_context_t *c)
{
hb_buffer_t *buffer = c->buffer;
- if (c->plan->shaper->preprocess_text)
- c->plan->shaper->preprocess_text (c->plan, buffer, c->font);
-
hb_ot_shape_initialize_masks (c);
hb_ot_mirror_chars (c);
@@ -576,16 +552,10 @@
{
hb_buffer_t *buffer = c->buffer;
- _hb_buffer_allocate_gsubgpos_vars (buffer);
hb_ot_layout_substitute_start (c->font, buffer);
- if (!hb_ot_layout_has_glyph_classes (c->face))
- hb_synthesize_glyph_classes (c);
-
c->plan->substitute (c->font, buffer);
- hb_ot_layout_substitute_finish (c->font, buffer);
-
return;
}
@@ -593,6 +563,9 @@
hb_ot_substitute (hb_ot_shape_context_t *c)
{
hb_ot_substitute_default (c);
+
+ _hb_buffer_allocate_gsubgpos_vars (c->buffer);
+
hb_ot_substitute_complex (c);
}
@@ -613,20 +586,6 @@
}
static inline void
-zero_mark_widths_by_unicode (hb_buffer_t *buffer, bool adjust_offsets)
-{
- unsigned int count = buffer->len;
- hb_glyph_info_t *info = buffer->info;
- for (unsigned int i = 0; i < count; i++)
- if (_hb_glyph_info_get_general_category (&info[i]) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)
- {
- if (adjust_offsets)
- adjust_mark_offsets (&buffer->pos[i]);
- zero_mark_width (&buffer->pos[i]);
- }
-}
-
-static inline void
zero_mark_widths_by_gdef (hb_buffer_t *buffer, bool adjust_offsets)
{
unsigned int count = buffer->len;
@@ -647,26 +606,41 @@
unsigned int count = c->buffer->len;
hb_glyph_info_t *info = c->buffer->info;
hb_glyph_position_t *pos = c->buffer->pos;
- for (unsigned int i = 0; i < count; i++)
+
+ if (HB_DIRECTION_IS_HORIZONTAL (direction))
{
- c->font->get_glyph_advance_for_direction (info[i].codepoint,
- direction,
- &pos[i].x_advance,
- &pos[i].y_advance);
- c->font->subtract_glyph_origin_for_direction (info[i].codepoint,
- direction,
- &pos[i].x_offset,
- &pos[i].y_offset);
-
+ for (unsigned int i = 0; i < count; i++)
+ pos[i].x_advance = c->font->get_glyph_h_advance (info[i].codepoint);
+ /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
+ if (c->font->has_glyph_h_origin_func ())
+ for (unsigned int i = 0; i < count; i++)
+ c->font->subtract_glyph_h_origin (info[i].codepoint,
+ &pos[i].x_offset,
+ &pos[i].y_offset);
}
+ else
+ {
+ for (unsigned int i = 0; i < count; i++)
+ {
+ pos[i].y_advance = c->font->get_glyph_v_advance (info[i].codepoint);
+ c->font->subtract_glyph_v_origin (info[i].codepoint,
+ &pos[i].x_offset,
+ &pos[i].y_offset);
+ }
+ }
+ if (c->buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK)
+ _hb_ot_shape_fallback_spaces (c->plan, c->font, c->buffer);
}
static inline bool
hb_ot_position_complex (hb_ot_shape_context_t *c)
{
+ hb_ot_layout_position_start (c->font, c->buffer);
+
bool ret = false;
unsigned int count = c->buffer->len;
- bool has_positioning = hb_ot_layout_has_positioning (c->face);
+ bool has_positioning = (bool) hb_ot_layout_has_positioning (c->face);
+
/* If the font has no GPOS, AND, no fallback positioning will
* happen, AND, direction is forward, then when zeroing mark
* widths, we shift the mark with it, such that the mark
@@ -685,15 +659,8 @@
zero_mark_widths_by_gdef (c->buffer, adjust_offsets_when_zeroing);
break;
- /* Not currently used for any shaper:
- case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_EARLY:
- zero_mark_widths_by_unicode (c->buffer, adjust_offsets_when_zeroing);
- break;
- */
-
default:
case HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE:
- case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE:
case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE:
break;
}
@@ -703,60 +670,56 @@
hb_glyph_info_t *info = c->buffer->info;
hb_glyph_position_t *pos = c->buffer->pos;
- /* Change glyph origin to what GPOS expects, apply GPOS, change it back. */
+ /* Change glyph origin to what GPOS expects (horizontal), apply GPOS, change it back. */
- for (unsigned int i = 0; i < count; i++) {
- c->font->add_glyph_origin_for_direction (info[i].codepoint,
- HB_DIRECTION_LTR,
- &pos[i].x_offset,
- &pos[i].y_offset);
- }
+ /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
+ if (c->font->has_glyph_h_origin_func ())
+ for (unsigned int i = 0; i < count; i++)
+ c->font->add_glyph_h_origin (info[i].codepoint,
+ &pos[i].x_offset,
+ &pos[i].y_offset);
c->plan->position (c->font, c->buffer);
- for (unsigned int i = 0; i < count; i++) {
- c->font->subtract_glyph_origin_for_direction (info[i].codepoint,
- HB_DIRECTION_LTR,
- &pos[i].x_offset,
- &pos[i].y_offset);
- }
+ /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
+ if (c->font->has_glyph_h_origin_func ())
+ for (unsigned int i = 0; i < count; i++)
+ c->font->subtract_glyph_h_origin (info[i].codepoint,
+ &pos[i].x_offset,
+ &pos[i].y_offset);
ret = true;
}
switch (c->plan->shaper->zero_width_marks)
{
- case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE:
- zero_mark_widths_by_unicode (c->buffer, adjust_offsets_when_zeroing);
- break;
-
case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE:
zero_mark_widths_by_gdef (c->buffer, adjust_offsets_when_zeroing);
break;
default:
case HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE:
- //case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_EARLY:
case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY:
break;
}
+ /* Finishing off GPOS has to follow a certain order. */
+ hb_ot_layout_position_finish_advances (c->font, c->buffer);
+ hb_ot_zero_width_default_ignorables (c);
+ hb_ot_layout_position_finish_offsets (c->font, c->buffer);
+
return ret;
}
static inline void
hb_ot_position (hb_ot_shape_context_t *c)
{
- hb_ot_layout_position_start (c->font, c->buffer);
+ c->buffer->clear_positions ();
hb_ot_position_default (c);
hb_bool_t fallback = !hb_ot_position_complex (c);
- hb_ot_zero_width_default_ignorables (c);
-
- hb_ot_layout_position_finish (c->font, c->buffer);
-
if (fallback && c->plan->shaper->fallback_position)
_hb_ot_shape_fallback_position (c->plan, c->font, c->buffer);
@@ -778,6 +741,12 @@
hb_ot_shape_internal (hb_ot_shape_context_t *c)
{
c->buffer->deallocate_var_all ();
+ c->buffer->scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
+ if (likely (!_hb_unsigned_int_mul_overflows (c->buffer->len, HB_BUFFER_MAX_EXPANSION_FACTOR)))
+ {
+ c->buffer->max_len = MAX (c->buffer->len * HB_BUFFER_MAX_EXPANSION_FACTOR,
+ (unsigned) HB_BUFFER_MAX_LEN_MIN);
+ }
/* Save the original direction, we use it later. */
c->target_direction = c->buffer->props.direction;
@@ -792,15 +761,22 @@
hb_ensure_native_direction (c->buffer);
+ if (c->plan->shaper->preprocess_text)
+ c->plan->shaper->preprocess_text (c->plan, c->buffer, c->font);
+
hb_ot_substitute (c);
hb_ot_position (c);
hb_ot_hide_default_ignorables (c);
+ if (c->plan->shaper->postprocess_glyphs)
+ c->plan->shaper->postprocess_glyphs (c->plan, c->buffer, c->font);
+
_hb_buffer_deallocate_unicode_vars (c->buffer);
c->buffer->props.direction = c->target_direction;
+ c->buffer->max_len = HB_BUFFER_MAX_LEN_DEFAULT;
c->buffer->deallocate_var_all ();
}
@@ -820,6 +796,8 @@
/**
+ * hb_ot_shape_plan_collect_lookups:
+ *
* Since: 0.9.7
**/
void
@@ -841,18 +819,20 @@
hb_set_t *glyphs)
{
hb_codepoint_t glyph;
- if (font->get_glyph (u, 0, &glyph))
+ if (font->get_nominal_glyph (u, &glyph))
glyphs->add (glyph);
if (mirror)
{
hb_codepoint_t m = unicode->mirroring (u);
- if (m != u && font->get_glyph (m, 0, &glyph))
+ if (m != u && font->get_nominal_glyph (m, &glyph))
glyphs->add (glyph);
}
}
/**
+ * hb_ot_shape_glyphs_closure:
+ *
* Since: 0.9.2
**/
void
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.h Fri Aug 26 10:14:15 2016 -0700
@@ -36,14 +36,14 @@
HB_BEGIN_DECLS
/* TODO port to shape-plan / set. */
-void
+HB_EXTERN void
hb_ot_shape_glyphs_closure (hb_font_t *font,
hb_buffer_t *buffer,
const hb_feature_t *features,
unsigned int num_features,
hb_set_t *glyphs);
-void
+HB_EXTERN void
hb_ot_shape_plan_collect_lookups (hb_shape_plan_t *shape_plan,
hb_tag_t table_tag,
hb_set_t *lookup_indexes /* OUT */);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.cc Fri Aug 26 10:14:15 2016 -0700
@@ -186,14 +186,18 @@
{"aa", HB_TAG('A','F','R',' ')}, /* Afar */
{"ab", HB_TAG('A','B','K',' ')}, /* Abkhazian */
{"abq", HB_TAG('A','B','A',' ')}, /* Abaza */
+ {"acf", HB_TAG('F','A','N',' ')}, /* French Antillean */
{"ach", HB_TAG('A','C','H',' ')}, /* Acoli */
+ {"acr", HB_TAG('A','C','R',' ')}, /* Achi */
{"ada", HB_TAG('D','N','G',' ')}, /* Dangme */
{"ady", HB_TAG('A','D','Y',' ')}, /* Adyghe */
{"af", HB_TAG('A','F','K',' ')}, /* Afrikaans */
+ {"ahg", HB_TAG('A','G','W',' ')}, /* Agaw */
{"aii", HB_TAG('S','W','A',' ')}, /* Swadaya Aramaic */
{"aio", HB_TAG('A','I','O',' ')}, /* Aiton */
{"aiw", HB_TAG('A','R','I',' ')}, /* Aari */
{"ak", HB_TAG('T','W','I',' ')}, /* Akan [macrolanguage] */
+ {"aka", HB_TAG('A','K','A',' ')}, /* Akan */
{"alt", HB_TAG('A','L','T',' ')}, /* [Southern] Altai */
{"am", HB_TAG('A','M','H',' ')}, /* Amharic */
{"amf", HB_TAG('H','B','N',' ')}, /* Hammer-Banna */
@@ -206,6 +210,7 @@
{"as", HB_TAG('A','S','M',' ')}, /* Assamese */
{"ast", HB_TAG('A','S','T',' ')}, /* Asturian/Asturleonese/Bable/Leonese */
{"ath", HB_TAG('A','T','H',' ')}, /* Athapaskan [family] */
+ {"atj", HB_TAG('R','C','R',' ')}, /* R-Cree */
{"atv", HB_TAG('A','L','T',' ')}, /* [Northern] Altai */
{"av", HB_TAG('A','V','R',' ')}, /* Avaric */
{"awa", HB_TAG('A','W','A',' ')}, /* Awadhi */
@@ -214,6 +219,7 @@
{"azb", HB_TAG('A','Z','B',' ')}, /* South Azerbaijani */
{"azj", HB_TAG('A','Z','E',' ')}, /* North Azerbaijani */
{"ba", HB_TAG('B','S','H',' ')}, /* Bashkir */
+ {"bad", HB_TAG('B','A','D','0')}, /* Banda */
{"bai", HB_TAG('B','M','L',' ')}, /* Bamileke [family] */
{"bal", HB_TAG('B','L','I',' ')}, /* Baluchi [macrolangauge] */
{"ban", HB_TAG('B','A','N',' ')}, /* Balinese */
@@ -222,11 +228,13 @@
{"bci", HB_TAG('B','A','U',' ')}, /* Baoulé */
{"bcl", HB_TAG('B','I','K',' ')}, /* Central Bikol */
{"bcq", HB_TAG('B','C','H',' ')}, /* Bench */
+ {"bdy", HB_TAG('B','D','Y',' ')}, /* Bandjalang */
{"be", HB_TAG('B','E','L',' ')}, /* Belarusian */
{"bem", HB_TAG('B','E','M',' ')}, /* Bemba (Zambia) */
{"ber", HB_TAG('B','E','R',' ')}, /* Berber [family] */
{"bfq", HB_TAG('B','A','D',' ')}, /* Badaga */
{"bft", HB_TAG('B','L','T',' ')}, /* Balti */
+ {"bfu", HB_TAG('L','A','H',' ')}, /* Lahuli */
{"bfy", HB_TAG('B','A','G',' ')}, /* Baghelkhandi */
{"bg", HB_TAG('B','G','R',' ')}, /* Bulgarian */
{"bgc", HB_TAG('B','G','C',' ')}, /* Haryanvi */
@@ -260,11 +268,13 @@
{"bxr", HB_TAG('R','B','U',' ')}, /* Russian Buriat */
{"byn", HB_TAG('B','I','L',' ')}, /* Bilen */
{"ca", HB_TAG('C','A','T',' ')}, /* Catalan */
+ {"cak", HB_TAG('C','A','K',' ')}, /* Kaqchikel */
{"cbk", HB_TAG('C','B','K',' ')}, /* Chavacano */
{"ce", HB_TAG('C','H','E',' ')}, /* Chechen */
{"ceb", HB_TAG('C','E','B',' ')}, /* Cebuano */
{"cgg", HB_TAG('C','G','G',' ')}, /* Chiga */
{"ch", HB_TAG('C','H','A',' ')}, /* Chamorro */
+ {"chk", HB_TAG('C','H','K','0')}, /* Chuukese */
{"cho", HB_TAG('C','H','O',' ')}, /* Choctaw */
{"chp", HB_TAG('C','H','P',' ')}, /* Chipewyan */
{"chr", HB_TAG('C','H','R',' ')}, /* Cherokee */
@@ -272,9 +282,12 @@
{"ckb", HB_TAG('K','U','R',' ')}, /* Central Kurdish (Sorani) */
{"ckt", HB_TAG('C','H','K',' ')}, /* Chukchi */
{"cop", HB_TAG('C','O','P',' ')}, /* Coptic */
+ {"cpp", HB_TAG('C','P','P',' ')}, /* Creoles */
{"cr", HB_TAG('C','R','E',' ')}, /* Cree */
+ {"cre", HB_TAG('Y','C','R',' ')}, /* Y-Cree */
{"crh", HB_TAG('C','R','T',' ')}, /* Crimean Tatar */
{"crj", HB_TAG('E','C','R',' ')}, /* [Southern] East Cree */
+ {"crk", HB_TAG('W','C','R',' ')}, /* West-Cree */
{"crl", HB_TAG('E','C','R',' ')}, /* [Northern] East Cree */
{"crm", HB_TAG('M','C','R',' ')}, /* Moose Cree */
{"crx", HB_TAG('C','R','R',' ')}, /* Carrier */
@@ -283,21 +296,27 @@
{"ctg", HB_TAG('C','T','G',' ')}, /* Chittagonian */
{"cts", HB_TAG('B','I','K',' ')}, /* Northern Catanduanes Bikol */
{"cu", HB_TAG('C','S','L',' ')}, /* Church Slavic */
+ {"cuk", HB_TAG('C','U','K',' ')}, /* San Blas Kuna */
{"cv", HB_TAG('C','H','U',' ')}, /* Chuvash */
{"cwd", HB_TAG('D','C','R',' ')}, /* Woods Cree */
{"cy", HB_TAG('W','E','L',' ')}, /* Welsh */
{"da", HB_TAG('D','A','N',' ')}, /* Danish */
{"dap", HB_TAG('N','I','S',' ')}, /* Nisi (India) */
{"dar", HB_TAG('D','A','R',' ')}, /* Dargwa */
+ {"dax", HB_TAG('D','A','X',' ')}, /* Dayi */
{"de", HB_TAG('D','E','U',' ')}, /* German */
{"dgo", HB_TAG('D','G','O',' ')}, /* Dogri */
{"dhd", HB_TAG('M','A','W',' ')}, /* Dhundari */
+ {"dhg", HB_TAG('D','H','G',' ')}, /* Dhangu */
{"din", HB_TAG('D','N','K',' ')}, /* Dinka [macrolanguage] */
{"diq", HB_TAG('D','I','Q',' ')}, /* Dimli */
{"dje", HB_TAG('D','J','R',' ')}, /* Zarma */
+ {"djr", HB_TAG('D','J','R','0')}, /* Djambarrpuyngu */
{"dng", HB_TAG('D','U','N',' ')}, /* Dungan */
+ {"dnj", HB_TAG('D','N','J',' ')}, /* Dan */
{"doi", HB_TAG('D','G','R',' ')}, /* Dogri [macrolanguage] */
{"dsb", HB_TAG('L','S','B',' ')}, /* Lower Sorbian */
+ {"duj", HB_TAG('D','U','J',' ')}, /* Dhuwal */
{"dv", HB_TAG('D','I','V',' ')}, /* Dhivehi/Divehi/Maldivian */
{"dyu", HB_TAG('J','U','L',' ')}, /* Jula */
{"dz", HB_TAG('D','Z','N',' ')}, /* Dzongkha */
@@ -307,23 +326,30 @@
{"el", HB_TAG('E','L','L',' ')}, /* Modern Greek (1453-) */
{"emk", HB_TAG('M','N','K',' ')}, /* Eastern Maninkakan */
{"en", HB_TAG('E','N','G',' ')}, /* English */
+ {"enf", HB_TAG('F','N','E',' ')}, /* Forest Nenets */
+ {"enh", HB_TAG('T','N','E',' ')}, /* Tundra Nenets */
{"eo", HB_TAG('N','T','O',' ')}, /* Esperanto */
{"eot", HB_TAG('B','T','I',' ')}, /* Beti (Côte d'Ivoire) */
{"es", HB_TAG('E','S','P',' ')}, /* Spanish */
+ {"esu", HB_TAG('E','S','U',' ')}, /* Central Yupik */
{"et", HB_TAG('E','T','I',' ')}, /* Estonian [macrolanguage] */
{"eu", HB_TAG('E','U','Q',' ')}, /* Basque */
{"eve", HB_TAG('E','V','N',' ')}, /* Even */
{"evn", HB_TAG('E','V','K',' ')}, /* Evenki */
{"fa", HB_TAG('F','A','R',' ')}, /* Persian [macrolanguage] */
+ {"fan", HB_TAG('F','A','N','0')}, /* Fang */
+ {"fat", HB_TAG('F','A','T',' ')}, /* Fanti */
{"ff", HB_TAG('F','U','L',' ')}, /* Fulah [macrolanguage] */
{"fi", HB_TAG('F','I','N',' ')}, /* Finnish */
{"fil", HB_TAG('P','I','L',' ')}, /* Filipino */
{"fj", HB_TAG('F','J','I',' ')}, /* Fijian */
+ {"flm", HB_TAG('H','A','L',' ')}, /* Halam */
{"fo", HB_TAG('F','O','S',' ')}, /* Faroese */
{"fon", HB_TAG('F','O','N',' ')}, /* Fon */
{"fr", HB_TAG('F','R','A',' ')}, /* French */
{"frc", HB_TAG('F','R','C',' ')}, /* Cajun French */
{"frp", HB_TAG('F','R','P',' ')}, /* Arpitan/Francoprovençal */
+ {"fuf", HB_TAG('F','T','A',' ')}, /* Futa */
{"fur", HB_TAG('F','R','L',' ')}, /* Friulian */
{"fuv", HB_TAG('F','U','V',' ')}, /* Nigerian Fulfulde */
{"fy", HB_TAG('F','R','I',' ')}, /* Western Frisian */
@@ -334,17 +360,24 @@
{"gd", HB_TAG('G','A','E',' ')}, /* Scottish Gaelic */
{"gez", HB_TAG('G','E','Z',' ')}, /* Ge'ez */
{"ggo", HB_TAG('G','O','N',' ')}, /* Southern Gondi */
+ {"gih", HB_TAG('G','I','H',' ')}, /* Githabul */
+ {"gil", HB_TAG('G','I','L','0')}, /* Kiribati (Gilbertese) */
+ {"gkp", HB_TAG('G','K','P',' ')}, /* Kpelle (Guinea) */
{"gl", HB_TAG('G','A','L',' ')}, /* Galician */
{"gld", HB_TAG('N','A','N',' ')}, /* Nanai */
+ {"gle", HB_TAG('I','R','T',' ')}, /* Irish Traditional */
{"glk", HB_TAG('G','L','K',' ')}, /* Gilaki */
{"gn", HB_TAG('G','U','A',' ')}, /* Guarani [macrolanguage] */
+ {"gnn", HB_TAG('G','N','N',' ')}, /* Gumatj */
{"gno", HB_TAG('G','O','N',' ')}, /* Northern Gondi */
{"gog", HB_TAG('G','O','G',' ')}, /* Gogo */
{"gon", HB_TAG('G','O','N',' ')}, /* Gondi [macrolanguage] */
{"grt", HB_TAG('G','R','O',' ')}, /* Garo */
{"gru", HB_TAG('S','O','G',' ')}, /* Sodo Gurage */
+ {"gsw", HB_TAG('A','L','S',' ')}, /* Alsatian */
{"gu", HB_TAG('G','U','J',' ')}, /* Gujarati */
{"guc", HB_TAG('G','U','C',' ')}, /* Wayuu */
+ {"guf", HB_TAG('G','U','F',' ')}, /* Gupapuyngu */
{"guk", HB_TAG('G','M','Z',' ')}, /* Gumuz */
/*{"guk", HB_TAG('G','U','K',' ')},*/ /* Gumuz (in SIL fonts) */
{"guz", HB_TAG('G','U','Z',' ')}, /* Ekegusii/Gusii */
@@ -355,9 +388,9 @@
{"hay", HB_TAG('H','A','Y',' ')}, /* Haya */
{"haz", HB_TAG('H','A','Z',' ')}, /* Hazaragi */
{"he", HB_TAG('I','W','R',' ')}, /* Hebrew */
- {"hz", HB_TAG('H','E','R',' ')}, /* Herero */
{"hi", HB_TAG('H','I','N',' ')}, /* Hindi */
{"hil", HB_TAG('H','I','L',' ')}, /* Hiligaynon */
+ {"hmn", HB_TAG('H','M','N',' ')}, /* Hmong */
{"hnd", HB_TAG('H','N','D',' ')}, /* [Southern] Hindko */
{"hne", HB_TAG('C','H','H',' ')}, /* Chattisgarhi */
{"hno", HB_TAG('H','N','D',' ')}, /* [Northern] Hindko */
@@ -371,11 +404,13 @@
{"hy", HB_TAG('H','Y','E',' ')}, /* Armenian */
{"hz", HB_TAG('H','E','R',' ')}, /* Herero */
{"ia", HB_TAG('I','N','A',' ')}, /* Interlingua (International Auxiliary Language Association) */
+ {"iba", HB_TAG('I','B','A',' ')}, /* Iban */
{"ibb", HB_TAG('I','B','B',' ')}, /* Ibibio */
{"id", HB_TAG('I','N','D',' ')}, /* Indonesian */
{"ie", HB_TAG('I','L','E',' ')}, /* Interlingue/Occidental */
{"ig", HB_TAG('I','B','O',' ')}, /* Igbo */
{"igb", HB_TAG('E','B','I',' ')}, /* Ebira */
+ {"ii", HB_TAG('Y','I','M',' ')}, /* Yi Modern */
{"ijc", HB_TAG('I','J','O',' ')}, /* Izon */
{"ijo", HB_TAG('I','J','O',' ')}, /* Ijo [family] */
{"ik", HB_TAG('I','P','K',' ')}, /* Inupiaq [macrolanguage] */
@@ -391,15 +426,20 @@
{"jv", HB_TAG('J','A','V',' ')}, /* Javanese */
{"ka", HB_TAG('K','A','T',' ')}, /* Georgian */
{"kaa", HB_TAG('K','R','K',' ')}, /* Karakalpak */
- {"kab", HB_TAG('K','A','B',' ')}, /* Kabyle */
+ {"kab", HB_TAG('K','A','B','0')}, /* Kabyle */
{"kam", HB_TAG('K','M','B',' ')}, /* Kamba (Kenya) */
{"kar", HB_TAG('K','R','N',' ')}, /* Karen [family] */
+ {"kat", HB_TAG('K','G','E',' ')}, /* Khutsuri Georgian */
{"kbd", HB_TAG('K','A','B',' ')}, /* Kabardian */
{"kde", HB_TAG('K','D','E',' ')}, /* Makonde */
{"kdr", HB_TAG('K','R','M',' ')}, /* Karaim */
{"kdt", HB_TAG('K','U','Y',' ')}, /* Kuy */
+ {"kea", HB_TAG('K','E','A',' ')}, /* Kabuverdianu (Crioulo) */
+ {"kek", HB_TAG('K','E','K',' ')}, /* Kekchi */
{"kex", HB_TAG('K','K','N',' ')}, /* Kokni */
+ {"kfa", HB_TAG('K','O','D',' ')}, /* Kodagu */
{"kfr", HB_TAG('K','A','C',' ')}, /* Kachchi */
+ {"kfx", HB_TAG('K','U','L',' ')}, /* Kulvi */
{"kfy", HB_TAG('K','M','N',' ')}, /* Kumaoni */
{"kg", HB_TAG('K','O','N',' ')}, /* Kongo [macrolanguage] */
{"kha", HB_TAG('K','S','I',' ')}, /* Khasi */
@@ -408,7 +448,9 @@
/*{"kht", HB_TAG('K','H','T',' ')},*/ /* Khamti (OpenType spec and SIL fonts) */
{"khw", HB_TAG('K','H','W',' ')}, /* Khowar */
{"ki", HB_TAG('K','I','K',' ')}, /* Gikuyu/Kikuyu */
+ {"kiu", HB_TAG('K','I','U',' ')}, /* Kirmanjki */
{"kj", HB_TAG('K','U','A',' ')}, /* Kuanyama/Kwanyama */
+ {"kjd", HB_TAG('K','J','D',' ')}, /* Southern Kiwai */
{"kjh", HB_TAG('K','H','A',' ')}, /* Khakass */
{"kjp", HB_TAG('K','J','P',' ')}, /* Pwo Eastern Karen */
{"kk", HB_TAG('K','A','Z',' ')}, /* Kazakh */
@@ -422,6 +464,8 @@
{"ko", HB_TAG('K','O','R',' ')}, /* Korean */
{"koi", HB_TAG('K','O','P',' ')}, /* Komi-Permyak */
{"kok", HB_TAG('K','O','K',' ')}, /* Konkani [macrolanguage] */
+ {"kon", HB_TAG('K','O','N','0')}, /* Kongo */
+ {"kos", HB_TAG('K','O','S',' ')}, /* Kosraean */
{"kpe", HB_TAG('K','P','L',' ')}, /* Kpelle [macrolanguage] */
{"kpv", HB_TAG('K','O','Z',' ')}, /* Komi-Zyrian */
{"kpy", HB_TAG('K','Y','K',' ')}, /* Koryak */
@@ -431,9 +475,11 @@
{"krl", HB_TAG('K','R','L',' ')}, /* Karelian */
{"kru", HB_TAG('K','U','U',' ')}, /* Kurukh */
{"ks", HB_TAG('K','S','H',' ')}, /* Kashmiri */
- {"ksh", HB_TAG('K','S','H',' ')}, /* Kölsch */
+ {"ksh", HB_TAG('K','S','H','0')}, /* Ripuarian, Kölsch */
/*{"ksw", HB_TAG('K','R','N',' ')},*/ /* S'gaw Karen (Microsoft fonts?) */
{"ksw", HB_TAG('K','S','W',' ')}, /* S'gaw Karen (OpenType spec and SIL fonts) */
+ {"ktb", HB_TAG('K','E','B',' ')}, /* Kebena */
+ {"ktu", HB_TAG('K','O','N',' ')}, /* Kikongo */
{"ku", HB_TAG('K','U','R',' ')}, /* Kurdish [macrolanguage] */
{"kum", HB_TAG('K','U','M',' ')}, /* Kumyk */
{"kv", HB_TAG('K','O','M',' ')}, /* Komi [macrolanguage] */
@@ -461,6 +507,7 @@
{"lmo", HB_TAG('L','M','O',' ')}, /* Lombard */
{"ln", HB_TAG('L','I','N',' ')}, /* Lingala */
{"lo", HB_TAG('L','A','O',' ')}, /* Lao */
+ {"lom", HB_TAG('L','O','M',' ')}, /* Loma */
{"lrc", HB_TAG('L','R','C',' ')}, /* Northern Luri */
{"lt", HB_TAG('L','T','H',' ')}, /* Lithuanian */
{"lu", HB_TAG('L','U','B',' ')}, /* Luba-Katanga */
@@ -475,6 +522,8 @@
{"mag", HB_TAG('M','A','G',' ')}, /* Magahi */
{"mai", HB_TAG('M','T','H',' ')}, /* Maithili */
{"mak", HB_TAG('M','K','R',' ')}, /* Makasar */
+ {"mal", HB_TAG('M','A','L',' ')}, /* Malayalam */
+ {"mam", HB_TAG('M','A','M',' ')}, /* Mam */
{"man", HB_TAG('M','N','K',' ')}, /* Manding/Mandingo [macrolanguage] */
{"mdc", HB_TAG('M','L','E',' ')}, /* Male (Papua New Guinea) */
{"mdf", HB_TAG('M','O','K',' ')}, /* Moksha */
@@ -517,6 +566,7 @@
{"mww", HB_TAG('M','W','W',' ')}, /* Hmong Daw */
{"my", HB_TAG('B','R','M',' ')}, /* Burmese */
{"mym", HB_TAG('M','E','N',' ')}, /* Me'en */
+ {"myn", HB_TAG('M','Y','N',' ')}, /* Mayan */
{"myq", HB_TAG('M','N','K',' ')}, /* Forest Maninka (retired code) */
{"myv", HB_TAG('E','R','Z',' ')}, /* Erzya */
{"mzn", HB_TAG('M','Z','N',' ')}, /* Mazanderani */
@@ -534,6 +584,7 @@
{"ng", HB_TAG('N','D','G',' ')}, /* Ndonga */
{"nga", HB_TAG('N','G','A',' ')}, /* Ngabaka */
{"ngl", HB_TAG('L','M','W',' ')}, /* Lomwe */
+ {"ngo", HB_TAG('S','X','T',' ')}, /* Sutu */
{"niu", HB_TAG('N','I','U',' ')}, /* Niuean */
{"niv", HB_TAG('G','I','L',' ')}, /* Gilyak */
{"nl", HB_TAG('N','L','D',' ')}, /* Dutch */
@@ -554,13 +605,15 @@
{"oc", HB_TAG('O','C','I',' ')}, /* Occitan (post 1500) */
{"oj", HB_TAG('O','J','B',' ')}, /* Ojibwa [macrolanguage] */
{"ojs", HB_TAG('O','C','R',' ')}, /* Oji-Cree */
+ {"okm", HB_TAG('K','O','H',' ')}, /* Korean Old Hangul */
{"om", HB_TAG('O','R','O',' ')}, /* Oromo [macrolanguage] */
{"or", HB_TAG('O','R','I',' ')}, /* Oriya */
{"os", HB_TAG('O','S','S',' ')}, /* Ossetian */
{"pa", HB_TAG('P','A','N',' ')}, /* Panjabi */
{"pag", HB_TAG('P','A','G',' ')}, /* Pangasinan */
{"pam", HB_TAG('P','A','M',' ')}, /* Kapampangan/Pampanga */
- {"pap", HB_TAG('P','A','P',' ')}, /* Papiamento */
+ {"pap", HB_TAG('P','A','P','0')}, /* Papiamento */
+ {"pau", HB_TAG('P','A','U',' ')}, /* Palauan */
{"pcc", HB_TAG('P','C','C',' ')}, /* Bouyei */
{"pcd", HB_TAG('P','C','D',' ')}, /* Picard */
{"pce", HB_TAG('P','L','G',' ')}, /* [Ruching] Palaung */
@@ -574,24 +627,34 @@
{"plp", HB_TAG('P','A','P',' ')}, /* Palpa */
{"pms", HB_TAG('P','M','S',' ')}, /* Piemontese */
{"pnb", HB_TAG('P','N','B',' ')}, /* Western Panjabi */
+ {"poh", HB_TAG('P','O','H',' ')}, /* Pocomchi */
+ {"pon", HB_TAG('P','O','N',' ')}, /* Pohnpeian */
{"prs", HB_TAG('D','R','I',' ')}, /* Afghan Persian/Dari */
{"ps", HB_TAG('P','A','S',' ')}, /* Pashto/Pushto [macrolanguage] */
{"pt", HB_TAG('P','T','G',' ')}, /* Portuguese */
{"pwo", HB_TAG('P','W','O',' ')}, /* Pwo Western Karen */
{"qu", HB_TAG('Q','U','Z',' ')}, /* Quechua [macrolanguage] */
{"quc", HB_TAG('Q','U','C',' ')}, /* K'iche'/Quiché */
+ {"quh", HB_TAG('Q','U','H',' ')}, /* Quechua (Bolivia) */
{"quz", HB_TAG('Q','U','Z',' ')}, /* Cusco Quechua */
+ {"qvi", HB_TAG('Q','V','I',' ')}, /* Quechua (Ecuador) */
+ {"qwh", HB_TAG('Q','W','H',' ')}, /* Quechua (Peru) */
{"raj", HB_TAG('R','A','J',' ')}, /* Rajasthani [macrolanguage] */
+ {"rar", HB_TAG('R','A','R',' ')}, /* Rarotongan */
{"rbb", HB_TAG('P','L','G',' ')}, /* Rumai Palaung */
{"rej", HB_TAG('R','E','J',' ')}, /* Rejang */
{"ria", HB_TAG('R','I','A',' ')}, /* Riang (India) */
+ {"rif", HB_TAG('R','I','F',' ')}, /* Tarifit */
{"ril", HB_TAG('R','I','A',' ')}, /* Riang (Myanmar) */
+ {"rit", HB_TAG('R','I','T',' ')}, /* Ritarungo */
{"rki", HB_TAG('A','R','K',' ')}, /* Rakhine */
+ {"rkw", HB_TAG('R','K','W',' ')}, /* Arakwal */
{"rm", HB_TAG('R','M','S',' ')}, /* Romansh */
{"rmy", HB_TAG('R','M','Y',' ')}, /* Vlax Romani */
{"rn", HB_TAG('R','U','N',' ')}, /* Rundi */
{"ro", HB_TAG('R','O','M',' ')}, /* Romanian */
{"rom", HB_TAG('R','O','Y',' ')}, /* Romany [macrolanguage] */
+ {"rtm", HB_TAG('R','T','M',' ')}, /* Rotuman */
{"ru", HB_TAG('R','U','S',' ')}, /* Russian */
{"rue", HB_TAG('R','S','Y',' ')}, /* Rusyn */
{"rup", HB_TAG('R','U','P',' ')}, /* Aromanian/Arumanian/Macedo-Romanian */
@@ -599,10 +662,11 @@
{"rwr", HB_TAG('M','A','W',' ')}, /* Marwari (India) */
{"sa", HB_TAG('S','A','N',' ')}, /* Sanskrit */
{"sah", HB_TAG('Y','A','K',' ')}, /* Yakut */
+ {"sam", HB_TAG('P','A','A',' ')}, /* Palestinian Aramaic */
{"sas", HB_TAG('S','A','S',' ')}, /* Sasak */
{"sat", HB_TAG('S','A','T',' ')}, /* Santali */
+ {"sc", HB_TAG('S','R','D',' ')}, /* Sardinian [macrolanguage] */
{"sck", HB_TAG('S','A','D',' ')}, /* Sadri */
- {"sc", HB_TAG('S','R','D',' ')}, /* Sardinian [macrolanguage] */
{"scn", HB_TAG('S','C','N',' ')}, /* Sicilian */
{"sco", HB_TAG('S','C','O',' ')}, /* Scots */
{"scs", HB_TAG('S','L','A',' ')}, /* [North] Slavey */
@@ -615,6 +679,7 @@
{"sgs", HB_TAG('S','G','S',' ')}, /* Samogitian */
{"sgw", HB_TAG('C','H','G',' ')}, /* Sebat Bet Gurage */
/*{"sgw", HB_TAG('S','G','W',' ')},*/ /* Sebat Bet Gurage (in SIL fonts) */
+ {"shi", HB_TAG('S','H','I',' ')}, /* Tachelhit */
{"shn", HB_TAG('S','H','N',' ')}, /* Shan */
{"si", HB_TAG('S','N','H',' ')}, /* Sinhala */
{"sid", HB_TAG('S','I','D',' ')}, /* Sidamo */
@@ -627,7 +692,7 @@
{"smj", HB_TAG('L','S','M',' ')}, /* Lule Sami */
{"smn", HB_TAG('I','S','M',' ')}, /* Inari Sami */
{"sms", HB_TAG('S','K','S',' ')}, /* Skolt Sami */
- {"sn", HB_TAG('S','N','A',' ')}, /* Shona */
+ {"sn", HB_TAG('S','N','A','0')}, /* Shona */
{"snk", HB_TAG('S','N','K',' ')}, /* Soninke */
{"so", HB_TAG('S','M','L',' ')}, /* Somali */
{"sop", HB_TAG('S','O','P',' ')}, /* Songe */
@@ -665,20 +730,24 @@
{"tiv", HB_TAG('T','I','V',' ')}, /* Tiv */
{"tk", HB_TAG('T','K','M',' ')}, /* Turkmen */
{"tl", HB_TAG('T','G','L',' ')}, /* Tagalog */
- {"tmh", HB_TAG('t','m','h',' ')}, /* Tamashek [macrolanguage] */
+ {"tmh", HB_TAG('T','M','H',' ')}, /* Tamashek */
{"tn", HB_TAG('T','N','A',' ')}, /* Tswana */
{"to", HB_TAG('T','G','N',' ')}, /* Tonga (Tonga Islands) */
+ {"tod", HB_TAG('T','O','D','0')}, /* Toma */
+ {"toi", HB_TAG('T','N','G',' ')}, /* Tonga */
{"tpi", HB_TAG('T','P','I',' ')}, /* Tok Pisin */
{"tr", HB_TAG('T','R','K',' ')}, /* Turkish */
{"tru", HB_TAG('T','U','A',' ')}, /* Turoyo Aramaic */
{"ts", HB_TAG('T','S','G',' ')}, /* Tsonga */
{"tt", HB_TAG('T','A','T',' ')}, /* Tatar */
{"tum", HB_TAG('T','U','M',' ')}, /* Tumbuka */
+ {"tvl", HB_TAG('T','V','L',' ')}, /* Tuvalu */
{"tw", HB_TAG('T','W','I',' ')}, /* Twi */
{"ty", HB_TAG('T','H','T',' ')}, /* Tahitian */
{"tyv", HB_TAG('T','U','V',' ')}, /* Tuvin */
{"tyz", HB_TAG('T','Y','Z',' ')}, /* TÃ y */
{"tzm", HB_TAG('T','Z','M',' ')}, /* Central Atlas Tamazight */
+ {"tzo", HB_TAG('T','Z','O',' ')}, /* Tzotzil */
{"udm", HB_TAG('U','D','M',' ')}, /* Udmurt */
{"ug", HB_TAG('U','Y','G',' ')}, /* Uighur */
{"uk", HB_TAG('U','K','R',' ')}, /* Ukrainian */
@@ -690,8 +759,8 @@
{"uzs", HB_TAG('U','Z','B',' ')}, /* Southern Uzbek */
{"ve", HB_TAG('V','E','N',' ')}, /* Venda */
{"vec", HB_TAG('V','E','C',' ')}, /* Venetian */
+ {"vi", HB_TAG('V','I','T',' ')}, /* Vietnamese */
{"vls", HB_TAG('F','L','E',' ')}, /* Vlaams */
- {"vi", HB_TAG('V','I','T',' ')}, /* Vietnamese */
{"vmw", HB_TAG('M','A','K',' ')}, /* Makhuwa */
{"vo", HB_TAG('V','O','L',' ')}, /* Volapük */
{"vro", HB_TAG('V','R','O',' ')}, /* Võro */
@@ -700,72 +769,60 @@
{"wbm", HB_TAG('W','A',' ',' ')}, /* Wa */
{"wbr", HB_TAG('W','A','G',' ')}, /* Wagdi */
{"wle", HB_TAG('S','I','G',' ')}, /* Wolane */
+ {"wo", HB_TAG('W','L','F',' ')}, /* Wolof */
{"wry", HB_TAG('M','A','W',' ')}, /* Merwari */
{"wtm", HB_TAG('W','T','M',' ')}, /* Mewati */
- {"wo", HB_TAG('W','L','F',' ')}, /* Wolof */
{"xal", HB_TAG('K','L','M',' ')}, /* Kalmyk */
+ {"xan", HB_TAG('S','E','K',' ')}, /* Sekota */
{"xh", HB_TAG('X','H','S',' ')}, /* Xhosa */
+ {"xjb", HB_TAG('X','J','B',' ')}, /* Minjangbal */
{"xog", HB_TAG('X','O','G',' ')}, /* Soga */
{"xom", HB_TAG('K','M','O',' ')}, /* Komo (Sudan) */
+ {"xpe", HB_TAG('X','P','E',' ')}, /* Kpelle (Liberia) */
{"xsl", HB_TAG('S','S','L',' ')}, /* South Slavey */
{"xst", HB_TAG('S','I','G',' ')}, /* Silt'e (retired code) */
{"xwo", HB_TAG('T','O','D',' ')}, /* Written Oirat (Todo) */
{"yao", HB_TAG('Y','A','O',' ')}, /* Yao */
+ {"yap", HB_TAG('Y','A','P',' ')}, /* Yapese */
{"yi", HB_TAG('J','I','I',' ')}, /* Yiddish [macrolanguage] */
{"yo", HB_TAG('Y','B','A',' ')}, /* Yoruba */
{"yso", HB_TAG('N','I','S',' ')}, /* Nisi (China) */
{"za", HB_TAG('Z','H','A',' ')}, /* Chuang/Zhuang [macrolanguage] */
{"zea", HB_TAG('Z','E','A',' ')}, /* Zeeuws */
+ {"zgh", HB_TAG('Z','G','H',' ')}, /* Standard Morrocan Tamazigh */
{"zne", HB_TAG('Z','N','D',' ')}, /* Zande */
{"zu", HB_TAG('Z','U','L',' ')}, /* Zulu */
- {"zum", HB_TAG('L','R','C',' ')} /* Kumzari */
+ {"zum", HB_TAG('L','R','C',' ')}, /* Kumzari */
+ {"zza", HB_TAG('Z','Z','A',' ')}, /* Zazaki */
/* The corresponding languages IDs for the following IDs are unclear,
* overlap, or are architecturally weird. Needs more research. */
-/*{"ahg/awn/xan?", HB_TAG('A','G','W',' ')},*/ /* Agaw */
-/*{"gsw?/gsw-FR?", HB_TAG('A','L','S',' ')},*/ /* Alsatian */
+/*{"chp", HB_TAG('S','A','Y',' ')},*/ /* Sayisi */
+/*{"cwd", HB_TAG('T','C','R',' ')},*/ /* TH-Cree */
+/*{"emk", HB_TAG('E','M','K',' ')},*/ /* Eastern Maninkakan */
/*{"krc", HB_TAG('B','A','L',' ')},*/ /* Balkar */
/*{"??", HB_TAG('B','C','R',' ')},*/ /* Bible Cree */
/*{"zh?", HB_TAG('C','H','N',' ')},*/ /* Chinese (seen in Microsoft fonts) */
-/*{"acf/gcf?", HB_TAG('F','A','N',' ')},*/ /* French Antillean */
-/*{"enf?/yrk?", HB_TAG('F','N','E',' ')},*/ /* Forest Nenets */
-/*{"fuf?", HB_TAG('F','T','A',' ')},*/ /* Futa */
/*{"ar-Syrc?", HB_TAG('G','A','R',' ')},*/ /* Garshuni */
-/*{"cfm/rnl?", HB_TAG('H','A','L',' ')},*/ /* Halam */
-/*{"ga-Latg?/Latg?", HB_TAG('I','R','T',' ')},*/ /* Irish Traditional */
+/*{"hy?", HB_TAG('H','Y','E','0')},*/ /* Armenian East (ISO 639-3 hye according to Microsoft, but that’s equivalent to ISO 639-1 hy) */
+/*{"ga-Latg?/" HB_TAG('I','R','T',' ')},*/ /* Irish Traditional */
/*{"krc", HB_TAG('K','A','R',' ')},*/ /* Karachay */
-/*{"alw?/ktb?", HB_TAG('K','E','B',' ')},*/ /* Kebena */
-/*{"Geok", HB_TAG('K','G','E',' ')},*/ /* Khutsuri Georgian */
+/*{"ka-Geok?", HB_TAG('K','G','E',' ')},*/ /* Khutsuri Georgian */
/*{"kca", HB_TAG('K','H','K',' ')},*/ /* Khanty-Kazim */
/*{"kca", HB_TAG('K','H','S',' ')},*/ /* Khanty-Shurishkar */
/*{"kca", HB_TAG('K','H','V',' ')},*/ /* Khanty-Vakhi */
-/*{"guz?/kqs?/kss?", HB_TAG('K','I','S',' ')},*/ /* Kisii */
-/*{"kfa/kfi?/kpb?/xua?/xuj?", HB_TAG('K','O','D',' ')},*/ /* Kodagu */
-/*{"okm?/oko?", HB_TAG('K','O','H',' ')},*/ /* Korean Old Hangul */
-/*{"kon?/ktu?/...", HB_TAG('K','O','N',' ')},*/ /* Kikongo */
-/*{"kfx?", HB_TAG('K','U','L',' ')},*/ /* Kulvi */
-/*{"??", HB_TAG('L','A','H',' ')},*/ /* Lahuli */
-/*{"??", HB_TAG('L','C','R',' ')},*/ /* L-Cree */
+/*{"kqs, kss", HB_TAG('K','I','S',' ')},*/ /* Kisii */
+/*{"lua", HB_TAG('L','U','A',' ')},*/ /* Luba-Lulua */
+/*{"mlq", HB_TAG('M','L','N',' ')},*/ /* Malinke */
+/*{"nso", HB_TAG('N','S','O',' ')},*/ /* Sotho, Northern */
/*{"??", HB_TAG('M','A','L',' ')},*/ /* Malayalam Traditional */
-/*{"mnk?/mlq?/...", HB_TAG('M','L','N',' ')},*/ /* Malinke */
-/*{"??", HB_TAG('N','C','R',' ')},*/ /* N-Cree */
-/*{"??", HB_TAG('N','H','C',' ')},*/ /* Norway House Cree */
-/*{"jpa?/sam?", HB_TAG('P','A','A',' ')},*/ /* Palestinian Aramaic */
-/*{"polyton", HB_TAG('P','G','R',' ')},*/ /* Polytonic Greek */
-/*{"??", HB_TAG('Q','I','N',' ')},*/ /* Asho Chin */
-/*{"??", HB_TAG('R','C','R',' ')},*/ /* R-Cree */
-/*{"chp?", HB_TAG('S','A','Y',' ')},*/ /* Sayisi */
-/*{"xan?", HB_TAG('S','E','K',' ')},*/ /* Sekota */
-/*{"ngo?", HB_TAG('S','X','T',' ')},*/ /* Sutu */
-/*{"??", HB_TAG('T','C','R',' ')},*/ /* TH-Cree */
-/*{"tnz?/tog?/toi?", HB_TAG('T','N','G',' ')},*/ /* Tonga */
-/*{"enh?/yrk?", HB_TAG('T','N','E',' ')},*/ /* Tundra Nenets */
-/*{"??", HB_TAG('W','C','R',' ')},*/ /* West-Cree */
-/*{"cre?", HB_TAG('Y','C','R',' ')},*/ /* Y-Cree */
+/*{"csw", HB_TAG('N','C','R',' ')},*/ /* N-Cree */
+/*{"csw", HB_TAG('N','H','C',' ')},*/ /* Norway House Cree */
+/*{"el-polyton", HB_TAG('P','G','R',' ')},*/ /* Polytonic Greek */
+/*{"bgr, cnh, cnw, czt, sez, tcp, csy, ctd, flm, pck, tcz, zom, cmr, dao, hlt, cka, cnk, mrh, mwg, cbl, cnb, csh", HB_TAG('Q','I','N',' ')},*/ /* Chin */
/*{"??", HB_TAG('Y','I','C',' ')},*/ /* Yi Classic */
-/*{"ii?/Yiii?", HB_TAG('Y','I','M',' ')},*/ /* Yi Modern */
-/*{"??", HB_TAG('Z','H','P',' ')},*/ /* Chinese Phonetic */
+/*{"zh-Latn-pinyin", HB_TAG('Z','H','P',' ')},*/ /* Chinese Phonetic */
};
typedef struct {
@@ -928,4 +985,27 @@
}
}
+#ifdef MAIN
+static inline void
+test_langs_sorted (void)
+{
+ for (unsigned int i = 1; i < ARRAY_LENGTH (ot_languages); i++)
+ {
+ int c = lang_compare_first_component (ot_languages[i-1].language, ot_languages[i].language);
+ if (c >= 0)
+ {
+ fprintf (stderr, "ot_languages not sorted at index %d: %s %d %s\n",
+ i, ot_languages[i-1].language, c, ot_languages[i].language);
+ abort();
+ }
+ }
+}
+int
+main (void)
+{
+ test_langs_sorted ();
+ return 0;
+}
+
+#endif
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.h Fri Aug 26 10:14:15 2016 -0700
@@ -39,18 +39,18 @@
#define HB_OT_TAG_DEFAULT_SCRIPT HB_TAG ('D', 'F', 'L', 'T')
#define HB_OT_TAG_DEFAULT_LANGUAGE HB_TAG ('d', 'f', 'l', 't')
-void
+HB_EXTERN void
hb_ot_tags_from_script (hb_script_t script,
hb_tag_t *script_tag_1,
hb_tag_t *script_tag_2);
-hb_script_t
+HB_EXTERN hb_script_t
hb_ot_tag_to_script (hb_tag_t tag);
-hb_tag_t
+HB_EXTERN hb_tag_t
hb_ot_tag_from_language (hb_language_t language);
-hb_language_t
+HB_EXTERN hb_language_t
hb_ot_tag_to_language (hb_tag_t tag);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-private.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-private.hh Fri Aug 26 10:14:15 2016 -0700
@@ -83,7 +83,7 @@
#define unlikely(expr) (expr)
#endif
-#ifndef __GNUC__
+#if !defined(__GNUC__) && !defined(__clang__)
#undef __attribute__
#define __attribute__(x)
#endif
@@ -119,6 +119,36 @@
#define HB_FUNC __func__
#endif
+/*
+ * Borrowed from https://bugzilla.mozilla.org/show_bug.cgi?id=1215411
+ * HB_FALLTHROUGH is an annotation to suppress compiler warnings about switch
+ * cases that fall through without a break or return statement. HB_FALLTHROUGH
+ * is only needed on cases that have code:
+ *
+ * switch (foo) {
+ * case 1: // These cases have no code. No fallthrough annotations are needed.
+ * case 2:
+ * case 3:
+ * foo = 4; // This case has code, so a fallthrough annotation is needed:
+ * HB_FALLTHROUGH;
+ * default:
+ * return foo;
+ * }
+ */
+#if defined(__clang__) && __cplusplus >= 201103L
+ /* clang's fallthrough annotations are only available starting in C++11. */
+# define HB_FALLTHROUGH [[clang::fallthrough]]
+#elif defined(_MSC_VER)
+ /*
+ * MSVC's __fallthrough annotations are checked by /analyze (Code Analysis):
+ * https://msdn.microsoft.com/en-us/library/ms235402%28VS.80%29.aspx
+ */
+# include <sal.h>
+# define HB_FALLTHROUGH __fallthrough
+#else
+# define HB_FALLTHROUGH /* FALLTHROUGH */
+#endif
+
#if defined(_WIN32) || defined(__CYGWIN__)
/* We need Windows Vista for both Uniscribe backend and for
* MemoryBarrier. We don't support compiling on Windows XP,
@@ -139,6 +169,7 @@
# if defined(_WIN32_WCE)
/* Some things not defined on Windows CE. */
# define strdup _strdup
+# define vsnprintf _vsnprintf
# define getenv(Name) NULL
# if _WIN32_WCE < 0x800
# define setlocale(Category, Locale) "C"
@@ -149,6 +180,9 @@
# endif
# if defined(_MSC_VER) && _MSC_VER < 1900
# define snprintf _snprintf
+# elif defined(_MSC_VER) && _MSC_VER >= 1900
+# /* Covers VC++ Error for strdup being a deprecated POSIX name and to instead use _strdup instead */
+# define strdup _strdup
# endif
#endif
@@ -210,9 +244,9 @@
#define _ASSERT_STATIC0(_line, _cond) _ASSERT_STATIC1 (_line, (_cond))
#define ASSERT_STATIC(_cond) _ASSERT_STATIC0 (__LINE__, (_cond))
-/* Note: C++ allows sizeof() of variable-lengh arrays. So, if _cond is not
- * constant, it still compiles (ouch!), but at least we'll get a -Wvla warning. */
-#define ASSERT_STATIC_EXPR_ZERO(_cond) (0 * sizeof (char[(_cond) ? 1 : -1]))
+template <unsigned int cond> class hb_assert_constant_t {};
+
+#define ASSERT_STATIC_EXPR_ZERO(_cond) (0 * (unsigned int) sizeof (hb_assert_constant_t<_cond>))
#define _PASTE1(a,b) a##b
#define PASTE(a,b) _PASTE1(a,b)
@@ -578,6 +612,15 @@
/* Debug */
+/* HB_NDEBUG disables some sanity checks that are very safe to disable and
+ * should be disabled in production systems. If NDEBUG is defined, enable
+ * HB_NDEBUG; but if it's desirable that normal assert()s (which are very
+ * light-weight) to be enabled, then HB_DEBUG can be defined to disable
+ * the costlier checks. */
+#ifdef NDEBUG
+#define HB_NDEBUG
+#endif
+
#ifndef HB_DEBUG
#define HB_DEBUG 0
#endif
@@ -861,6 +904,29 @@
}
+/* Enable bitwise ops on enums marked as flags_t */
+/* To my surprise, looks like the function resolver is happy to silently cast
+ * one enum to another... So this doesn't provide the type-checking that I
+ * originally had in mind... :(.
+ *
+ * For MSVC warnings, see: https://github.com/behdad/harfbuzz/pull/163
+ */
+#ifdef _MSC_VER
+# pragma warning(disable:4200)
+# pragma warning(disable:4800)
+#endif
+#define HB_MARK_AS_FLAG_T(T) \
+ extern "C++" { \
+ static inline T operator | (T l, T r) { return T ((unsigned) l | (unsigned) r); } \
+ static inline T operator & (T l, T r) { return T ((unsigned) l & (unsigned) r); } \
+ static inline T operator ^ (T l, T r) { return T ((unsigned) l ^ (unsigned) r); } \
+ static inline T operator ~ (T r) { return T (~(unsigned int) r); } \
+ static inline T& operator |= (T &l, T r) { l = l | r; return l; } \
+ static inline T& operator &= (T& l, T r) { l = l & r; return l; } \
+ static inline T& operator ^= (T& l, T r) { l = l ^ r; return l; } \
+ }
+
+
/* Useful for set-operations on small enums.
* For example, for testing "x ∈ {x1, x2, x3}" use:
* (FLAG_SAFE(x) & (FLAG(x1) | FLAG(x2) | FLAG(x3)))
@@ -949,5 +1015,7 @@
return _hb_options.opts;
}
+/* Size signifying variable-sized array */
+#define VAR 1
#endif /* HB_PRIVATE_HH */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-set.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-set.h Fri Aug 26 10:14:15 2016 -0700
@@ -44,109 +44,109 @@
typedef struct hb_set_t hb_set_t;
-hb_set_t *
+HB_EXTERN hb_set_t *
hb_set_create (void);
-hb_set_t *
+HB_EXTERN hb_set_t *
hb_set_get_empty (void);
-hb_set_t *
+HB_EXTERN hb_set_t *
hb_set_reference (hb_set_t *set);
-void
+HB_EXTERN void
hb_set_destroy (hb_set_t *set);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_set_set_user_data (hb_set_t *set,
hb_user_data_key_t *key,
void * data,
hb_destroy_func_t destroy,
hb_bool_t replace);
-void *
+HB_EXTERN void *
hb_set_get_user_data (hb_set_t *set,
hb_user_data_key_t *key);
/* Returns false if allocation has failed before */
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_set_allocation_successful (const hb_set_t *set);
-void
+HB_EXTERN void
hb_set_clear (hb_set_t *set);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_set_is_empty (const hb_set_t *set);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_set_has (const hb_set_t *set,
hb_codepoint_t codepoint);
/* Right now limited to 16-bit integers. Eventually will do full codepoint range, sans -1
* which we will use as a sentinel. */
-void
+HB_EXTERN void
hb_set_add (hb_set_t *set,
hb_codepoint_t codepoint);
-void
+HB_EXTERN void
hb_set_add_range (hb_set_t *set,
hb_codepoint_t first,
hb_codepoint_t last);
-void
+HB_EXTERN void
hb_set_del (hb_set_t *set,
hb_codepoint_t codepoint);
-void
+HB_EXTERN void
hb_set_del_range (hb_set_t *set,
hb_codepoint_t first,
hb_codepoint_t last);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_set_is_equal (const hb_set_t *set,
const hb_set_t *other);
-void
+HB_EXTERN void
hb_set_set (hb_set_t *set,
const hb_set_t *other);
-void
+HB_EXTERN void
hb_set_union (hb_set_t *set,
const hb_set_t *other);
-void
+HB_EXTERN void
hb_set_intersect (hb_set_t *set,
const hb_set_t *other);
-void
+HB_EXTERN void
hb_set_subtract (hb_set_t *set,
const hb_set_t *other);
-void
+HB_EXTERN void
hb_set_symmetric_difference (hb_set_t *set,
const hb_set_t *other);
-void
+HB_EXTERN void
hb_set_invert (hb_set_t *set);
-unsigned int
+HB_EXTERN unsigned int
hb_set_get_population (const hb_set_t *set);
/* Returns -1 if set empty. */
-hb_codepoint_t
+HB_EXTERN hb_codepoint_t
hb_set_get_min (const hb_set_t *set);
/* Returns -1 if set empty. */
-hb_codepoint_t
+HB_EXTERN hb_codepoint_t
hb_set_get_max (const hb_set_t *set);
/* Pass -1 in to get started. */
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_set_next (const hb_set_t *set,
hb_codepoint_t *codepoint);
/* Pass -1 for first and last to get started. */
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_set_next_range (const hb_set_t *set,
hb_codepoint_t *first,
hb_codepoint_t *last);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape-plan.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape-plan.h Fri Aug 26 10:14:15 2016 -0700
@@ -38,49 +38,49 @@
typedef struct hb_shape_plan_t hb_shape_plan_t;
-hb_shape_plan_t *
+HB_EXTERN hb_shape_plan_t *
hb_shape_plan_create (hb_face_t *face,
const hb_segment_properties_t *props,
const hb_feature_t *user_features,
unsigned int num_user_features,
const char * const *shaper_list);
-hb_shape_plan_t *
+HB_EXTERN hb_shape_plan_t *
hb_shape_plan_create_cached (hb_face_t *face,
const hb_segment_properties_t *props,
const hb_feature_t *user_features,
unsigned int num_user_features,
const char * const *shaper_list);
-hb_shape_plan_t *
+HB_EXTERN hb_shape_plan_t *
hb_shape_plan_get_empty (void);
-hb_shape_plan_t *
+HB_EXTERN hb_shape_plan_t *
hb_shape_plan_reference (hb_shape_plan_t *shape_plan);
-void
+HB_EXTERN void
hb_shape_plan_destroy (hb_shape_plan_t *shape_plan);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_shape_plan_set_user_data (hb_shape_plan_t *shape_plan,
hb_user_data_key_t *key,
void * data,
hb_destroy_func_t destroy,
hb_bool_t replace);
-void *
+HB_EXTERN void *
hb_shape_plan_get_user_data (hb_shape_plan_t *shape_plan,
hb_user_data_key_t *key);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_shape_plan_execute (hb_shape_plan_t *shape_plan,
hb_font_t *font,
hb_buffer_t *buffer,
const hb_feature_t *features,
unsigned int num_features);
-const char *
+HB_EXTERN const char *
hb_shape_plan_get_shaper (hb_shape_plan_t *shape_plan);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.cc Fri Aug 26 10:14:15 2016 -0700
@@ -210,13 +210,15 @@
/**
* hb_feature_from_string:
* @str: (array length=len) (element-type uint8_t): a string to parse
- * @len: length of @str, or -1 if string is nul-terminated
+ * @len: length of @str, or -1 if string is %NULL terminated
* @feature: (out): the #hb_feature_t to initialize with the parsed values
*
- * Parses a string into a #hb_feature_t. If @len is -1 then @str is
- * %NULL-terminated.
+ * Parses a string into a #hb_feature_t.
*
- * Return value: %TRUE if @str is successfully parsed, %FALSE otherwise
+ * TODO: document the syntax here.
+ *
+ * Return value:
+ * %true if @str is successfully parsed, %false otherwise.
*
* Since: 0.9.5
**/
@@ -392,8 +394,6 @@
* positioned glyphs. If @features is not %NULL, it will be used to control the
* features applied during shaping.
*
- * Return value: %FALSE if all shapers failed, %TRUE otherwise
- *
* Since: 0.9.2
**/
void
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.h Fri Aug 26 10:14:15 2016 -0700
@@ -47,29 +47,29 @@
unsigned int end;
} hb_feature_t;
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_feature_from_string (const char *str, int len,
hb_feature_t *feature);
-void
+HB_EXTERN void
hb_feature_to_string (hb_feature_t *feature,
char *buf, unsigned int size);
-void
+HB_EXTERN void
hb_shape (hb_font_t *font,
hb_buffer_t *buffer,
const hb_feature_t *features,
unsigned int num_features);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_shape_full (hb_font_t *font,
hb_buffer_t *buffer,
const hb_feature_t *features,
unsigned int num_features,
const char * const *shaper_list);
-const char **
+HB_EXTERN const char **
hb_shape_list_shapers (void);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shaper-list.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shaper-list.hh Fri Aug 26 10:14:15 2016 -0700
@@ -46,6 +46,9 @@
#ifdef HAVE_UNISCRIBE
HB_SHAPER_IMPLEMENT (uniscribe)
#endif
+#ifdef HAVE_DIRECTWRITE
+HB_SHAPER_IMPLEMENT (directwrite)
+#endif
#ifdef HAVE_CORETEXT
HB_SHAPER_IMPLEMENT (coretext)
#endif
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn.cc Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn.cc Fri Aug 26 10:14:15 2016 -0700
@@ -154,6 +154,12 @@
HB_SCRIPT_MULTANI,
HB_SCRIPT_OLD_HUNGARIAN,
HB_SCRIPT_SIGNWRITING,
+ HB_SCRIPT_ADLAM,
+ HB_SCRIPT_BHAIKSUKI,
+ HB_SCRIPT_MARCHEN,
+ HB_SCRIPT_NEWA,
+ HB_SCRIPT_OSAGE,
+ HB_SCRIPT_TANGUT,
};
static hb_unicode_combining_class_t
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.c Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.c Fri Aug 26 10:14:15 2016 -0700
@@ -16,6 +16,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <stdint.h>
#include "ucdn.h"
typedef struct {
@@ -24,8 +25,8 @@
unsigned char bidi_class;
unsigned char mirrored;
unsigned char east_asian_width;
- unsigned char normalization_check;
unsigned char script;
+ unsigned char linebreak_class;
} UCDRecord;
typedef struct {
@@ -33,6 +34,11 @@
} MirrorPair;
typedef struct {
+ unsigned short from, to;
+ unsigned char type;
+} BracketPair;
+
+typedef struct {
unsigned int start;
short count, index;
} Reindex;
@@ -108,6 +114,24 @@
return mpa->from - mpb->from;
}
+static int compare_bp(const void *a, const void *b)
+{
+ BracketPair *bpa = (BracketPair *)a;
+ BracketPair *bpb = (BracketPair *)b;
+ return bpa->from - bpb->from;
+}
+
+static BracketPair *search_bp(uint32_t code)
+{
+ BracketPair bp = {0,0,2};
+ BracketPair *res;
+
+ bp.from = code;
+ res = bsearch(&bp, bracket_pairs, BIDI_BRACKET_LEN, sizeof(BracketPair),
+ compare_bp);
+ return res;
+}
+
static int hangul_pair_decompose(uint32_t code, uint32_t *a, uint32_t *b)
{
int si = code - SBASE;
@@ -199,6 +223,42 @@
return get_ucd_record(code)->script;
}
+int ucdn_get_linebreak_class(uint32_t code)
+{
+ return get_ucd_record(code)->linebreak_class;
+}
+
+int ucdn_get_resolved_linebreak_class(uint32_t code)
+{
+ const UCDRecord *record = get_ucd_record(code);
+
+ switch (record->linebreak_class)
+ {
+ case UCDN_LINEBREAK_CLASS_AI:
+ case UCDN_LINEBREAK_CLASS_SG:
+ case UCDN_LINEBREAK_CLASS_XX:
+ return UCDN_LINEBREAK_CLASS_AL;
+
+ case UCDN_LINEBREAK_CLASS_SA:
+ if (record->category == UCDN_GENERAL_CATEGORY_MC ||
+ record->category == UCDN_GENERAL_CATEGORY_MN)
+ return UCDN_LINEBREAK_CLASS_CM;
+ return UCDN_LINEBREAK_CLASS_AL;
+
+ case UCDN_LINEBREAK_CLASS_CJ:
+ return UCDN_LINEBREAK_CLASS_NS;
+
+ case UCDN_LINEBREAK_CLASS_CB:
+ return UCDN_LINEBREAK_CLASS_B2;
+
+ case UCDN_LINEBREAK_CLASS_NL:
+ return UCDN_LINEBREAK_CLASS_BK;
+
+ default:
+ return record->linebreak_class;
+ }
+}
+
uint32_t ucdn_mirror(uint32_t code)
{
MirrorPair mp = {0};
@@ -217,6 +277,24 @@
return res->to;
}
+uint32_t ucdn_paired_bracket(uint32_t code)
+{
+ BracketPair *res = search_bp(code);
+ if (res == NULL)
+ return code;
+ else
+ return res->to;
+}
+
+int ucdn_paired_bracket_type(uint32_t code)
+{
+ BracketPair *res = search_bp(code);
+ if (res == NULL)
+ return UCDN_BIDI_PAIRED_BRACKET_TYPE_NONE;
+ else
+ return res->type;
+}
+
int ucdn_decompose(uint32_t code, uint32_t *a, uint32_t *b)
{
const unsigned short *rec;
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.h Fri Aug 26 10:14:15 2016 -0700
@@ -17,6 +17,8 @@
#ifndef UCDN_H
#define UCDN_H
+
+
#if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__)
# define HB_BEGIN_VISIBILITY _Pragma ("GCC visibility push(hidden)")
# define HB_END_VISIBILITY _Pragma ("GCC visibility pop")
@@ -58,6 +60,7 @@
#endif
+
#define UCDN_EAST_ASIAN_F 0
#define UCDN_EAST_ASIAN_H 1
#define UCDN_EAST_ASIAN_W 2
@@ -197,6 +200,53 @@
#define UCDN_SCRIPT_MULTANI 129
#define UCDN_SCRIPT_OLD_HUNGARIAN 130
#define UCDN_SCRIPT_SIGNWRITING 131
+#define UCDN_SCRIPT_ADLAM 132
+#define UCDN_SCRIPT_BHAIKSUKI 133
+#define UCDN_SCRIPT_MARCHEN 134
+#define UCDN_SCRIPT_NEWA 135
+#define UCDN_SCRIPT_OSAGE 136
+#define UCDN_SCRIPT_TANGUT 137
+
+#define UCDN_LINEBREAK_CLASS_OP 0
+#define UCDN_LINEBREAK_CLASS_CL 1
+#define UCDN_LINEBREAK_CLASS_CP 2
+#define UCDN_LINEBREAK_CLASS_QU 3
+#define UCDN_LINEBREAK_CLASS_GL 4
+#define UCDN_LINEBREAK_CLASS_NS 5
+#define UCDN_LINEBREAK_CLASS_EX 6
+#define UCDN_LINEBREAK_CLASS_SY 7
+#define UCDN_LINEBREAK_CLASS_IS 8
+#define UCDN_LINEBREAK_CLASS_PR 9
+#define UCDN_LINEBREAK_CLASS_PO 10
+#define UCDN_LINEBREAK_CLASS_NU 11
+#define UCDN_LINEBREAK_CLASS_AL 12
+#define UCDN_LINEBREAK_CLASS_HL 13
+#define UCDN_LINEBREAK_CLASS_ID 14
+#define UCDN_LINEBREAK_CLASS_IN 15
+#define UCDN_LINEBREAK_CLASS_HY 16
+#define UCDN_LINEBREAK_CLASS_BA 17
+#define UCDN_LINEBREAK_CLASS_BB 18
+#define UCDN_LINEBREAK_CLASS_B2 19
+#define UCDN_LINEBREAK_CLASS_ZW 20
+#define UCDN_LINEBREAK_CLASS_CM 21
+#define UCDN_LINEBREAK_CLASS_WJ 22
+#define UCDN_LINEBREAK_CLASS_H2 23
+#define UCDN_LINEBREAK_CLASS_H3 24
+#define UCDN_LINEBREAK_CLASS_JL 25
+#define UCDN_LINEBREAK_CLASS_JV 26
+#define UCDN_LINEBREAK_CLASS_JT 27
+#define UCDN_LINEBREAK_CLASS_RI 28
+#define UCDN_LINEBREAK_CLASS_AI 29
+#define UCDN_LINEBREAK_CLASS_BK 30
+#define UCDN_LINEBREAK_CLASS_CB 31
+#define UCDN_LINEBREAK_CLASS_CJ 32
+#define UCDN_LINEBREAK_CLASS_CR 33
+#define UCDN_LINEBREAK_CLASS_LF 34
+#define UCDN_LINEBREAK_CLASS_NL 35
+#define UCDN_LINEBREAK_CLASS_SA 36
+#define UCDN_LINEBREAK_CLASS_SG 37
+#define UCDN_LINEBREAK_CLASS_SP 38
+#define UCDN_LINEBREAK_CLASS_XX 39
#define UCDN_GENERAL_CATEGORY_CC 0
#define UCDN_GENERAL_CATEGORY_CF 1
@@ -253,6 +303,10 @@
#define UCDN_BIDI_CLASS_FSI 21
#define UCDN_BIDI_CLASS_PDI 22
+#define UCDN_BIDI_PAIRED_BRACKET_TYPE_OPEN 0
+#define UCDN_BIDI_PAIRED_BRACKET_TYPE_CLOSE 1
+#define UCDN_BIDI_PAIRED_BRACKET_TYPE_NONE 2
+
/**
* Return version of the Unicode database.
*
@@ -302,6 +356,27 @@
int ucdn_get_script(uint32_t code);
/**
+ * Get unresolved linebreak class of a codepoint. This does not take
+ * rule LB1 of UAX#14 into account. See ucdn_get_resolved_linebreak_class()
+ * for resolved linebreak classes.
+ *
+ * @param code Unicode codepoint
+ * @return value according to UCDN_LINEBREAK_* and as defined in UAX#14.
+ */
+int ucdn_get_linebreak_class(uint32_t code);
+
+/**
+ * Get resolved linebreak class of a codepoint. This resolves characters
+ * in the AI, SG, XX, SA and CJ classes according to rule LB1 of UAX#14.
+ * In addition the CB class is resolved as the equivalent B2 class and
+ * the NL class is resolved as the equivalent BK class.
+ *
+ * @param code Unicode codepoint
+ * @return value according to UCDN_LINEBREAK_* and as defined in UAX#14.
+ */
+int ucdn_get_resolved_linebreak_class(uint32_t code);
+
+/**
* Check if codepoint can be mirrored.
*
* @param code Unicode codepoint
@@ -319,6 +394,25 @@
uint32_t ucdn_mirror(uint32_t code);
/**
+ * Get paired bracket for a codepoint.
+ *
+ * @param code Unicode codepoint
+ * @return paired bracket codepoint or the original codepoint if no
+ * paired bracket character exists
+ */
+uint32_t ucdn_paired_bracket(uint32_t code);
+
+/**
+ * Get paired bracket type for a codepoint.
+ *
+ * @param code Unicode codepoint
+ * @return value according to UCDN_BIDI_PAIRED_BRACKET_TYPE_* and as defined
+ * in UAX#9.
+ *
+ */
+int ucdn_paired_bracket_type(uint32_t code);
+
+/**
* Pairwise canonical decomposition of a codepoint. This includes
* Hangul Jamo decomposition (see chapter 3.12 of the Unicode core
* specification).
@@ -359,6 +453,8 @@
*/
int ucdn_compose(uint32_t *code, uint32_t a, uint32_t b);
-HB_END_HEADER
+#ifdef __cplusplus
+}
+#endif
#endif
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/unicodedata_db.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/unicodedata_db.h Fri Aug 26 10:14:15 2016 -0700
@@ -1,821 +1,999 @@
/* this file was generated by makeunicodedata.py 3.2 */
-#define UNIDATA_VERSION "8.0.0"
+#define UNIDATA_VERSION "9.0.0"
/* a list of unique database records */
static const UCDRecord ucd_records[] = {
- {2, 0, 18, 0, 5, 0, 102},
- {0, 0, 14, 0, 5, 0, 0},
- {0, 0, 16, 0, 5, 0, 0},
- {0, 0, 15, 0, 5, 0, 0},
- {0, 0, 17, 0, 5, 0, 0},
- {29, 0, 17, 0, 3, 0, 0},
- {21, 0, 18, 0, 3, 0, 0},
- {21, 0, 10, 0, 3, 0, 0},
- {23, 0, 10, 0, 3, 0, 0},
+ {2, 0, 18, 0, 5, 102, 41},
+ {0, 0, 14, 0, 5, 0, 21},
+ {0, 0, 16, 0, 5, 0, 17},
+ {0, 0, 15, 0, 5, 0, 35},
+ {0, 0, 16, 0, 5, 0, 30},
+ {0, 0, 17, 0, 5, 0, 30},
+ {0, 0, 15, 0, 5, 0, 33},
+ {0, 0, 15, 0, 5, 0, 21},
+ {0, 0, 16, 0, 5, 0, 21},
+ {29, 0, 17, 0, 3, 0, 40},
+ {21, 0, 18, 0, 3, 0, 6},
+ {21, 0, 18, 0, 3, 0, 3},
+ {21, 0, 10, 0, 3, 0, 12},
+ {23, 0, 10, 0, 3, 0, 9},
+ {21, 0, 10, 0, 3, 0, 10},
+ {21, 0, 18, 0, 3, 0, 12},
{22, 0, 18, 1, 3, 0, 0},
- {18, 0, 18, 1, 3, 0, 0},
- {25, 0, 9, 0, 3, 0, 0},
- {21, 0, 12, 0, 3, 0, 0},
- {17, 0, 9, 0, 3, 0, 0},
- {13, 0, 8, 0, 3, 0, 0},
- {25, 0, 18, 1, 3, 0, 0},
- {25, 0, 18, 0, 3, 0, 0},
- {9, 0, 0, 0, 3, 0, 1},
- {24, 0, 18, 0, 3, 0, 0},
- {16, 0, 18, 0, 3, 0, 0},
- {5, 0, 0, 0, 3, 0, 1},
- {29, 0, 12, 0, 5, 0, 0},
+ {18, 0, 18, 1, 3, 0, 2},
+ {25, 0, 9, 0, 3, 0, 9},
+ {21, 0, 12, 0, 3, 0, 8},
+ {17, 0, 9, 0, 3, 0, 16},
+ {21, 0, 12, 0, 3, 0, 7},
+ {13, 0, 8, 0, 3, 0, 11},
+ {21, 0, 18, 0, 3, 0, 8},
+ {25, 0, 18, 1, 3, 0, 12},
+ {25, 0, 18, 0, 3, 0, 12},
+ {9, 0, 0, 0, 3, 1, 12},
+ {21, 0, 18, 0, 3, 0, 9},
+ {24, 0, 18, 0, 3, 0, 12},
+ {16, 0, 18, 0, 3, 0, 12},
+ {5, 0, 0, 0, 3, 1, 12},
+ {25, 0, 18, 0, 3, 0, 17},
+ {18, 0, 18, 1, 3, 0, 1},
+ {0, 0, 15, 0, 5, 0, 36},
+ {29, 0, 12, 0, 5, 0, 4},
{21, 0, 18, 0, 4, 0, 0},
- {23, 0, 10, 0, 4, 0, 0},
- {26, 0, 18, 0, 3, 0, 0},
- {24, 0, 18, 0, 4, 0, 0},
- {26, 0, 18, 0, 5, 0, 0},
- {7, 0, 0, 0, 4, 0, 1},
- {20, 0, 18, 1, 5, 0, 0},
- {1, 0, 14, 0, 4, 0, 0},
- {26, 0, 18, 0, 4, 0, 0},
- {26, 0, 10, 0, 4, 0, 0},
- {25, 0, 10, 0, 4, 0, 0},
- {15, 0, 8, 0, 4, 0, 0},
- {5, 0, 0, 0, 5, 0, 0},
- {19, 0, 18, 1, 5, 0, 0},
- {15, 0, 18, 0, 4, 0, 0},
- {9, 0, 0, 0, 5, 0, 1},
- {9, 0, 0, 0, 4, 0, 1},
- {25, 0, 18, 0, 4, 0, 0},
- {5, 0, 0, 0, 4, 0, 1},
- {5, 0, 0, 0, 5, 0, 1},
- {7, 0, 0, 0, 5, 0, 1},
- {8, 0, 0, 0, 5, 0, 1},
- {6, 0, 0, 0, 5, 0, 1},
- {6, 0, 18, 0, 5, 0, 0},
- {6, 0, 0, 0, 5, 0, 0},
- {24, 0, 18, 0, 5, 0, 0},
- {6, 0, 18, 0, 4, 0, 0},
- {6, 0, 0, 0, 4, 0, 0},
- {24, 0, 18, 0, 5, 0, 34},
- {12, 230, 13, 0, 4, 0, 40},
- {12, 232, 13, 0, 4, 0, 40},
- {12, 220, 13, 0, 4, 0, 40},
- {12, 216, 13, 0, 4, 0, 40},
- {12, 202, 13, 0, 4, 0, 40},
- {12, 1, 13, 0, 4, 0, 40},
- {12, 240, 13, 0, 4, 0, 40},
- {12, 0, 13, 0, 4, 0, 40},
- {12, 233, 13, 0, 4, 0, 40},
- {12, 234, 13, 0, 4, 0, 40},
- {9, 0, 0, 0, 5, 0, 2},
- {5, 0, 0, 0, 5, 0, 2},
- {24, 0, 18, 0, 5, 0, 2},
- {2, 0, 18, 0, 5, 0, 102},
- {6, 0, 0, 0, 5, 0, 2},
- {21, 0, 18, 0, 5, 0, 0},
- {9, 0, 0, 0, 4, 0, 2},
- {5, 0, 0, 0, 4, 0, 2},
- {9, 0, 0, 0, 5, 0, 54},
- {5, 0, 0, 0, 5, 0, 54},
- {25, 0, 18, 0, 5, 0, 2},
- {9, 0, 0, 0, 5, 0, 3},
- {9, 0, 0, 0, 4, 0, 3},
- {5, 0, 0, 0, 4, 0, 3},
- {5, 0, 0, 0, 5, 0, 3},
- {26, 0, 0, 0, 5, 0, 3},
- {12, 230, 13, 0, 5, 0, 3},
- {12, 230, 13, 0, 5, 0, 40},
- {11, 0, 13, 0, 5, 0, 3},
- {9, 0, 0, 0, 5, 0, 4},
- {6, 0, 0, 0, 5, 0, 4},
- {21, 0, 0, 0, 5, 0, 4},
- {5, 0, 0, 0, 5, 0, 4},
- {21, 0, 0, 0, 5, 0, 0},
- {17, 0, 18, 0, 5, 0, 4},
- {26, 0, 18, 0, 5, 0, 4},
- {23, 0, 10, 0, 5, 0, 4},
- {12, 220, 13, 0, 5, 0, 5},
- {12, 230, 13, 0, 5, 0, 5},
- {12, 222, 13, 0, 5, 0, 5},
- {12, 228, 13, 0, 5, 0, 5},
- {12, 10, 13, 0, 5, 0, 5},
- {12, 11, 13, 0, 5, 0, 5},
- {12, 12, 13, 0, 5, 0, 5},
- {12, 13, 13, 0, 5, 0, 5},
- {12, 14, 13, 0, 5, 0, 5},
- {12, 15, 13, 0, 5, 0, 5},
- {12, 16, 13, 0, 5, 0, 5},
- {12, 17, 13, 0, 5, 0, 5},
- {12, 18, 13, 0, 5, 0, 5},
- {12, 19, 13, 0, 5, 0, 5},
- {12, 20, 13, 0, 5, 0, 5},
- {12, 21, 13, 0, 5, 0, 5},
- {12, 22, 13, 0, 5, 0, 5},
- {17, 0, 3, 0, 5, 0, 5},
- {12, 23, 13, 0, 5, 0, 5},
- {21, 0, 3, 0, 5, 0, 5},
- {12, 24, 13, 0, 5, 0, 5},
- {12, 25, 13, 0, 5, 0, 5},
- {7, 0, 3, 0, 5, 0, 5},
- {1, 0, 11, 0, 5, 0, 6},
- {1, 0, 11, 0, 5, 0, 0},
- {25, 0, 18, 0, 5, 0, 6},
- {25, 0, 4, 0, 5, 0, 6},
- {21, 0, 10, 0, 5, 0, 6},
- {23, 0, 4, 0, 5, 0, 6},
- {21, 0, 12, 0, 5, 0, 0},
+ {23, 0, 10, 0, 3, 0, 10},
+ {23, 0, 10, 0, 4, 0, 9},
+ {26, 0, 18, 0, 3, 0, 12},
+ {21, 0, 18, 0, 4, 0, 29},
+ {24, 0, 18, 0, 4, 0, 29},
+ {26, 0, 18, 0, 5, 0, 12},
+ {7, 0, 0, 0, 4, 1, 29},
+ {20, 0, 18, 1, 5, 0, 3},
+ {1, 0, 14, 0, 4, 0, 17},
+ {26, 0, 18, 0, 4, 0, 12},
+ {26, 0, 10, 0, 4, 0, 10},
+ {25, 0, 10, 0, 4, 0, 9},
+ {15, 0, 8, 0, 4, 0, 29},
+ {24, 0, 18, 0, 4, 0, 18},
+ {5, 0, 0, 0, 5, 0, 12},
+ {19, 0, 18, 1, 5, 0, 3},
+ {15, 0, 18, 0, 4, 0, 29},
+ {9, 0, 0, 0, 5, 1, 12},
+ {9, 0, 0, 0, 4, 1, 12},
+ {25, 0, 18, 0, 4, 0, 29},
+ {5, 0, 0, 0, 4, 1, 12},
+ {5, 0, 0, 0, 5, 1, 12},
+ {7, 0, 0, 0, 5, 1, 12},
+ {8, 0, 0, 0, 5, 1, 12},
+ {6, 0, 0, 0, 5, 1, 12},
+ {6, 0, 18, 0, 5, 0, 12},
+ {6, 0, 0, 0, 5, 0, 12},
+ {24, 0, 18, 0, 5, 0, 12},
+ {24, 0, 18, 0, 4, 0, 12},
+ {6, 0, 18, 0, 4, 0, 29},
+ {6, 0, 18, 0, 5, 0, 18},
+ {6, 0, 0, 0, 4, 0, 29},
+ {24, 0, 18, 0, 5, 34, 12},
+ {12, 230, 13, 0, 4, 40, 21},
+ {12, 232, 13, 0, 4, 40, 21},
+ {12, 220, 13, 0, 4, 40, 21},
+ {12, 216, 13, 0, 4, 40, 21},
+ {12, 202, 13, 0, 4, 40, 21},
+ {12, 1, 13, 0, 4, 40, 21},
+ {12, 240, 13, 0, 4, 40, 21},
+ {12, 0, 13, 0, 4, 40, 4},
+ {12, 233, 13, 0, 4, 40, 4},
+ {12, 234, 13, 0, 4, 40, 4},
+ {9, 0, 0, 0, 5, 2, 12},
+ {5, 0, 0, 0, 5, 2, 12},
+ {24, 0, 18, 0, 5, 2, 12},
+ {2, 0, 18, 0, 5, 102, 41},
+ {6, 0, 0, 0, 5, 2, 12},
+ {21, 0, 18, 0, 5, 0, 8},
+ {21, 0, 18, 0, 5, 0, 12},
+ {9, 0, 0, 0, 4, 2, 12},
+ {5, 0, 0, 0, 4, 2, 12},
+ {9, 0, 0, 0, 5, 54, 12},
+ {5, 0, 0, 0, 5, 54, 12},
+ {25, 0, 18, 0, 5, 2, 12},
+ {9, 0, 0, 0, 5, 3, 12},
+ {9, 0, 0, 0, 4, 3, 12},
+ {5, 0, 0, 0, 4, 3, 12},
+ {5, 0, 0, 0, 5, 3, 12},
+ {26, 0, 0, 0, 5, 3, 12},
+ {12, 230, 13, 0, 5, 3, 21},
+ {12, 230, 13, 0, 5, 40, 21},
+ {11, 0, 13, 0, 5, 3, 21},
+ {9, 0, 0, 0, 5, 4, 12},
+ {6, 0, 0, 0, 5, 4, 12},
+ {21, 0, 0, 0, 5, 4, 12},
+ {5, 0, 0, 0, 5, 4, 12},
+ {21, 0, 0, 0, 5, 0, 8},
+ {17, 0, 18, 0, 5, 4, 17},
+ {26, 0, 18, 0, 5, 4, 12},
+ {23, 0, 10, 0, 5, 4, 9},
+ {12, 220, 13, 0, 5, 5, 21},
+ {12, 230, 13, 0, 5, 5, 21},
+ {12, 222, 13, 0, 5, 5, 21},
+ {12, 228, 13, 0, 5, 5, 21},
+ {12, 10, 13, 0, 5, 5, 21},
+ {12, 11, 13, 0, 5, 5, 21},
+ {12, 12, 13, 0, 5, 5, 21},
+ {12, 13, 13, 0, 5, 5, 21},
+ {12, 14, 13, 0, 5, 5, 21},
+ {12, 15, 13, 0, 5, 5, 21},
+ {12, 16, 13, 0, 5, 5, 21},
+ {12, 17, 13, 0, 5, 5, 21},
+ {12, 18, 13, 0, 5, 5, 21},
+ {12, 19, 13, 0, 5, 5, 21},
+ {12, 20, 13, 0, 5, 5, 21},
+ {12, 21, 13, 0, 5, 5, 21},
+ {12, 22, 13, 0, 5, 5, 21},
+ {17, 0, 3, 0, 5, 5, 17},
+ {12, 23, 13, 0, 5, 5, 21},
+ {21, 0, 3, 0, 5, 5, 12},
+ {12, 24, 13, 0, 5, 5, 21},
+ {12, 25, 13, 0, 5, 5, 21},
+ {21, 0, 3, 0, 5, 5, 6},
+ {7, 0, 3, 0, 5, 5, 13},
+ {1, 0, 11, 0, 5, 6, 12},
+ {1, 0, 11, 0, 5, 0, 12},
+ {25, 0, 18, 0, 5, 6, 12},
+ {25, 0, 4, 0, 5, 6, 12},
+ {21, 0, 10, 0, 5, 6, 10},
+ {23, 0, 4, 0, 5, 6, 10},
+ {21, 0, 12, 0, 5, 0, 8},
+ {21, 0, 4, 0, 5, 6, 8},
+ {26, 0, 18, 0, 5, 6, 12},
+ {12, 230, 13, 0, 5, 6, 21},
+ {12, 30, 13, 0, 5, 6, 21},
+ {12, 31, 13, 0, 5, 6, 21},
+ {12, 32, 13, 0, 5, 6, 21},
{21, 0, 4, 0, 5, 0, 6},
- {26, 0, 18, 0, 5, 0, 6},
- {12, 230, 13, 0, 5, 0, 6},
- {12, 30, 13, 0, 5, 0, 6},
- {12, 31, 13, 0, 5, 0, 6},
- {12, 32, 13, 0, 5, 0, 6},
- {21, 0, 4, 0, 5, 0, 0},
- {1, 0, 4, 0, 5, 0, 0},
- {7, 0, 4, 0, 5, 0, 6},
- {6, 0, 4, 0, 5, 0, 0},
- {12, 27, 13, 0, 5, 0, 40},
- {12, 28, 13, 0, 5, 0, 40},
- {12, 29, 13, 0, 5, 0, 40},
- {12, 30, 13, 0, 5, 0, 40},
- {12, 31, 13, 0, 5, 0, 40},
- {12, 32, 13, 0, 5, 0, 40},
- {12, 33, 13, 0, 5, 0, 40},
- {12, 34, 13, 0, 5, 0, 40},
- {12, 220, 13, 0, 5, 0, 40},
- {12, 220, 13, 0, 5, 0, 6},
- {13, 0, 11, 0, 5, 0, 6},
- {21, 0, 11, 0, 5, 0, 6},
- {12, 35, 13, 0, 5, 0, 40},
- {6, 0, 4, 0, 5, 0, 6},
- {13, 0, 8, 0, 5, 0, 6},
- {26, 0, 4, 0, 5, 0, 6},
- {21, 0, 4, 0, 5, 0, 7},
- {1, 0, 4, 0, 5, 0, 7},
- {7, 0, 4, 0, 5, 0, 7},
- {12, 36, 13, 0, 5, 0, 7},
- {12, 230, 13, 0, 5, 0, 7},
- {12, 220, 13, 0, 5, 0, 7},
- {7, 0, 4, 0, 5, 0, 8},
- {12, 0, 13, 0, 5, 0, 8},
- {13, 0, 3, 0, 5, 0, 65},
- {7, 0, 3, 0, 5, 0, 65},
- {12, 230, 13, 0, 5, 0, 65},
- {12, 220, 13, 0, 5, 0, 65},
- {6, 0, 3, 0, 5, 0, 65},
- {26, 0, 18, 0, 5, 0, 65},
- {21, 0, 18, 0, 5, 0, 65},
- {7, 0, 3, 0, 5, 0, 81},
- {12, 230, 13, 0, 5, 0, 81},
- {6, 0, 3, 0, 5, 0, 81},
- {21, 0, 3, 0, 5, 0, 81},
- {7, 0, 3, 0, 5, 0, 94},
- {12, 220, 13, 0, 5, 0, 94},
- {21, 0, 3, 0, 5, 0, 94},
- {12, 27, 13, 0, 5, 0, 6},
- {12, 28, 13, 0, 5, 0, 6},
- {12, 29, 13, 0, 5, 0, 6},
- {12, 0, 13, 0, 5, 0, 9},
- {10, 0, 0, 0, 5, 0, 9},
- {7, 0, 0, 0, 5, 0, 9},
- {12, 7, 13, 0, 5, 0, 9},
- {12, 9, 13, 0, 5, 0, 9},
- {12, 230, 13, 0, 5, 0, 9},
- {13, 0, 0, 0, 5, 0, 9},
- {21, 0, 0, 0, 5, 0, 9},
- {6, 0, 0, 0, 5, 0, 9},
- {7, 0, 0, 0, 5, 0, 10},
- {12, 0, 13, 0, 5, 0, 10},
- {10, 0, 0, 0, 5, 0, 10},
- {12, 7, 13, 0, 5, 0, 10},
- {12, 9, 13, 0, 5, 0, 10},
- {13, 0, 0, 0, 5, 0, 10},
- {23, 0, 10, 0, 5, 0, 10},
- {15, 0, 0, 0, 5, 0, 10},
- {26, 0, 0, 0, 5, 0, 10},
- {12, 0, 13, 0, 5, 0, 11},
- {10, 0, 0, 0, 5, 0, 11},
- {7, 0, 0, 0, 5, 0, 11},
- {12, 7, 13, 0, 5, 0, 11},
- {12, 9, 13, 0, 5, 0, 11},
- {13, 0, 0, 0, 5, 0, 11},
- {12, 0, 13, 0, 5, 0, 12},
- {10, 0, 0, 0, 5, 0, 12},
- {7, 0, 0, 0, 5, 0, 12},
- {12, 7, 13, 0, 5, 0, 12},
- {12, 9, 13, 0, 5, 0, 12},
- {13, 0, 0, 0, 5, 0, 12},
+ {1, 0, 4, 0, 5, 0, 21},
+ {21, 0, 4, 0, 5, 6, 6},
+ {7, 0, 4, 0, 5, 6, 12},
+ {6, 0, 4, 0, 5, 0, 12},
+ {12, 27, 13, 0, 5, 40, 21},
+ {12, 28, 13, 0, 5, 40, 21},
+ {12, 29, 13, 0, 5, 40, 21},
+ {12, 30, 13, 0, 5, 40, 21},
+ {12, 31, 13, 0, 5, 40, 21},
+ {12, 32, 13, 0, 5, 40, 21},
+ {12, 33, 13, 0, 5, 40, 21},
+ {12, 34, 13, 0, 5, 40, 21},
+ {12, 220, 13, 0, 5, 40, 21},
+ {12, 220, 13, 0, 5, 6, 21},
+ {13, 0, 11, 0, 5, 6, 11},
+ {21, 0, 11, 0, 5, 6, 11},
+ {21, 0, 4, 0, 5, 6, 12},
+ {12, 35, 13, 0, 5, 40, 21},
+ {6, 0, 4, 0, 5, 6, 12},
+ {13, 0, 8, 0, 5, 6, 11},
+ {26, 0, 4, 0, 5, 6, 12},
+ {21, 0, 4, 0, 5, 7, 12},
+ {1, 0, 4, 0, 5, 7, 12},
+ {7, 0, 4, 0, 5, 7, 12},
+ {12, 36, 13, 0, 5, 7, 21},
+ {12, 230, 13, 0, 5, 7, 21},
+ {12, 220, 13, 0, 5, 7, 21},
+ {7, 0, 4, 0, 5, 8, 12},
+ {12, 0, 13, 0, 5, 8, 21},
+ {13, 0, 3, 0, 5, 65, 11},
+ {7, 0, 3, 0, 5, 65, 12},
+ {12, 230, 13, 0, 5, 65, 21},
+ {12, 220, 13, 0, 5, 65, 21},
+ {6, 0, 3, 0, 5, 65, 12},
+ {26, 0, 18, 0, 5, 65, 12},
+ {21, 0, 18, 0, 5, 65, 12},
+ {21, 0, 18, 0, 5, 65, 8},
+ {21, 0, 18, 0, 5, 65, 6},
+ {7, 0, 3, 0, 5, 81, 12},
+ {12, 230, 13, 0, 5, 81, 21},
+ {6, 0, 3, 0, 5, 81, 12},
+ {21, 0, 3, 0, 5, 81, 12},
+ {7, 0, 3, 0, 5, 94, 12},
+ {12, 220, 13, 0, 5, 94, 21},
+ {21, 0, 3, 0, 5, 94, 12},
+ {12, 27, 13, 0, 5, 6, 21},
+ {12, 28, 13, 0, 5, 6, 21},
+ {12, 29, 13, 0, 5, 6, 21},
+ {12, 0, 13, 0, 5, 9, 21},
+ {10, 0, 0, 0, 5, 9, 21},
+ {7, 0, 0, 0, 5, 9, 12},
+ {12, 7, 13, 0, 5, 9, 21},
+ {12, 9, 13, 0, 5, 9, 21},
+ {12, 230, 13, 0, 5, 9, 21},
+ {21, 0, 0, 0, 5, 0, 17},
+ {13, 0, 0, 0, 5, 9, 11},
+ {21, 0, 0, 0, 5, 9, 12},
+ {6, 0, 0, 0, 5, 9, 12},
+ {7, 0, 0, 0, 5, 10, 12},
+ {12, 0, 13, 0, 5, 10, 21},
+ {10, 0, 0, 0, 5, 10, 21},
+ {12, 7, 13, 0, 5, 10, 21},
+ {12, 9, 13, 0, 5, 10, 21},
+ {13, 0, 0, 0, 5, 10, 11},
+ {23, 0, 10, 0, 5, 10, 10},
+ {15, 0, 0, 0, 5, 10, 12},
+ {15, 0, 0, 0, 5, 10, 10},
+ {26, 0, 0, 0, 5, 10, 12},
+ {23, 0, 10, 0, 5, 10, 9},
+ {12, 0, 13, 0, 5, 11, 21},
+ {10, 0, 0, 0, 5, 11, 21},
+ {7, 0, 0, 0, 5, 11, 12},
+ {12, 7, 13, 0, 5, 11, 21},
+ {12, 9, 13, 0, 5, 11, 21},
+ {13, 0, 0, 0, 5, 11, 11},
+ {12, 0, 13, 0, 5, 12, 21},
+ {10, 0, 0, 0, 5, 12, 21},
+ {7, 0, 0, 0, 5, 12, 12},
+ {12, 7, 13, 0, 5, 12, 21},
+ {12, 9, 13, 0, 5, 12, 21},
+ {13, 0, 0, 0, 5, 12, 11},
+ {21, 0, 0, 0, 5, 12, 12},
+ {23, 0, 10, 0, 5, 12, 9},
+ {12, 0, 13, 0, 5, 13, 21},
+ {10, 0, 0, 0, 5, 13, 21},
+ {7, 0, 0, 0, 5, 13, 12},
+ {12, 7, 13, 0, 5, 13, 21},
+ {12, 9, 13, 0, 5, 13, 21},
+ {13, 0, 0, 0, 5, 13, 11},
+ {26, 0, 0, 0, 5, 13, 12},
+ {15, 0, 0, 0, 5, 13, 12},
+ {12, 0, 13, 0, 5, 14, 21},
+ {7, 0, 0, 0, 5, 14, 12},
+ {10, 0, 0, 0, 5, 14, 21},
+ {12, 9, 13, 0, 5, 14, 21},
+ {13, 0, 0, 0, 5, 14, 11},
+ {15, 0, 0, 0, 5, 14, 12},
+ {26, 0, 18, 0, 5, 14, 12},
+ {23, 0, 10, 0, 5, 14, 9},
+ {12, 0, 13, 0, 5, 15, 21},
+ {10, 0, 0, 0, 5, 15, 21},
+ {7, 0, 0, 0, 5, 15, 12},
+ {12, 9, 13, 0, 5, 15, 21},
+ {12, 84, 13, 0, 5, 15, 21},
+ {12, 91, 13, 0, 5, 15, 21},
+ {13, 0, 0, 0, 5, 15, 11},
+ {15, 0, 18, 0, 5, 15, 12},
+ {26, 0, 0, 0, 5, 15, 12},
+ {7, 0, 0, 0, 5, 16, 12},
+ {12, 0, 13, 0, 5, 16, 21},
+ {10, 0, 0, 0, 5, 16, 21},
+ {12, 7, 13, 0, 5, 16, 21},
+ {12, 0, 0, 0, 5, 16, 21},
+ {12, 9, 13, 0, 5, 16, 21},
+ {13, 0, 0, 0, 5, 16, 11},
+ {12, 0, 13, 0, 5, 17, 21},
+ {10, 0, 0, 0, 5, 17, 21},
+ {7, 0, 0, 0, 5, 17, 12},
+ {12, 9, 13, 0, 5, 17, 21},
+ {26, 0, 0, 0, 5, 17, 12},
+ {15, 0, 0, 0, 5, 17, 12},
+ {13, 0, 0, 0, 5, 17, 11},
+ {26, 0, 0, 0, 5, 17, 10},
+ {10, 0, 0, 0, 5, 18, 21},
+ {7, 0, 0, 0, 5, 18, 12},
+ {12, 9, 13, 0, 5, 18, 21},
+ {12, 0, 13, 0, 5, 18, 21},
+ {13, 0, 0, 0, 5, 18, 11},
+ {21, 0, 0, 0, 5, 18, 12},
+ {7, 0, 0, 0, 5, 19, 38},
+ {12, 0, 13, 0, 5, 19, 38},
+ {12, 103, 13, 0, 5, 19, 38},
+ {12, 9, 13, 0, 5, 19, 38},
+ {23, 0, 10, 0, 5, 0, 9},
+ {6, 0, 0, 0, 5, 19, 38},
+ {12, 107, 13, 0, 5, 19, 38},
+ {21, 0, 0, 0, 5, 19, 12},
+ {13, 0, 0, 0, 5, 19, 11},
+ {21, 0, 0, 0, 5, 19, 17},
+ {7, 0, 0, 0, 5, 20, 38},
+ {12, 0, 13, 0, 5, 20, 38},
+ {12, 118, 13, 0, 5, 20, 38},
+ {6, 0, 0, 0, 5, 20, 38},
+ {12, 122, 13, 0, 5, 20, 38},
+ {13, 0, 0, 0, 5, 20, 11},
+ {7, 0, 0, 0, 5, 21, 12},
+ {26, 0, 0, 0, 5, 21, 18},
+ {21, 0, 0, 0, 5, 21, 18},
+ {21, 0, 0, 0, 5, 21, 12},
+ {21, 0, 0, 0, 5, 21, 4},
+ {21, 0, 0, 0, 5, 21, 17},
+ {21, 0, 0, 0, 5, 21, 6},
+ {26, 0, 0, 0, 5, 21, 12},
+ {12, 220, 13, 0, 5, 21, 21},
+ {13, 0, 0, 0, 5, 21, 11},
+ {15, 0, 0, 0, 5, 21, 12},
+ {26, 0, 0, 0, 5, 21, 17},
+ {12, 216, 13, 0, 5, 21, 21},
+ {22, 0, 18, 1, 5, 21, 0},
+ {18, 0, 18, 1, 5, 21, 1},
+ {10, 0, 0, 0, 5, 21, 21},
+ {12, 129, 13, 0, 5, 21, 21},
+ {12, 130, 13, 0, 5, 21, 21},
+ {12, 0, 13, 0, 5, 21, 21},
+ {12, 132, 13, 0, 5, 21, 21},
+ {10, 0, 0, 0, 5, 21, 17},
+ {12, 230, 13, 0, 5, 21, 21},
+ {12, 9, 13, 0, 5, 21, 21},
+ {26, 0, 0, 0, 5, 0, 12},
+ {7, 0, 0, 0, 5, 22, 38},
+ {10, 0, 0, 0, 5, 22, 38},
+ {12, 0, 13, 0, 5, 22, 38},
+ {12, 7, 13, 0, 5, 22, 38},
+ {12, 9, 13, 0, 5, 22, 38},
+ {13, 0, 0, 0, 5, 22, 11},
+ {21, 0, 0, 0, 5, 22, 17},
+ {21, 0, 0, 0, 5, 22, 12},
+ {12, 220, 13, 0, 5, 22, 38},
+ {26, 0, 0, 0, 5, 22, 38},
+ {9, 0, 0, 0, 5, 23, 12},
+ {7, 0, 0, 0, 5, 23, 12},
{21, 0, 0, 0, 5, 0, 12},
- {23, 0, 10, 0, 5, 0, 12},
- {12, 0, 13, 0, 5, 0, 13},
- {10, 0, 0, 0, 5, 0, 13},
- {7, 0, 0, 0, 5, 0, 13},
- {12, 7, 13, 0, 5, 0, 13},
- {12, 9, 13, 0, 5, 0, 13},
- {13, 0, 0, 0, 5, 0, 13},
- {26, 0, 0, 0, 5, 0, 13},
- {15, 0, 0, 0, 5, 0, 13},
- {12, 0, 13, 0, 5, 0, 14},
- {7, 0, 0, 0, 5, 0, 14},
- {10, 0, 0, 0, 5, 0, 14},
- {12, 9, 13, 0, 5, 0, 14},
- {13, 0, 0, 0, 5, 0, 14},
- {15, 0, 0, 0, 5, 0, 14},
- {26, 0, 18, 0, 5, 0, 14},
- {23, 0, 10, 0, 5, 0, 14},
- {12, 0, 13, 0, 5, 0, 15},
- {10, 0, 0, 0, 5, 0, 15},
- {7, 0, 0, 0, 5, 0, 15},
- {12, 9, 13, 0, 5, 0, 15},
- {12, 84, 13, 0, 5, 0, 15},
- {12, 91, 13, 0, 5, 0, 15},
- {13, 0, 0, 0, 5, 0, 15},
- {15, 0, 18, 0, 5, 0, 15},
- {26, 0, 0, 0, 5, 0, 15},
- {12, 0, 13, 0, 5, 0, 16},
- {10, 0, 0, 0, 5, 0, 16},
- {7, 0, 0, 0, 5, 0, 16},
- {12, 7, 13, 0, 5, 0, 16},
- {12, 0, 0, 0, 5, 0, 16},
- {12, 9, 13, 0, 5, 0, 16},
- {13, 0, 0, 0, 5, 0, 16},
- {12, 0, 13, 0, 5, 0, 17},
- {10, 0, 0, 0, 5, 0, 17},
- {7, 0, 0, 0, 5, 0, 17},
- {12, 9, 13, 0, 5, 0, 17},
- {13, 0, 0, 0, 5, 0, 17},
- {15, 0, 0, 0, 5, 0, 17},
- {26, 0, 0, 0, 5, 0, 17},
- {10, 0, 0, 0, 5, 0, 18},
- {7, 0, 0, 0, 5, 0, 18},
- {12, 9, 13, 0, 5, 0, 18},
- {12, 0, 13, 0, 5, 0, 18},
- {13, 0, 0, 0, 5, 0, 18},
- {21, 0, 0, 0, 5, 0, 18},
- {7, 0, 0, 0, 5, 0, 19},
- {12, 0, 13, 0, 5, 0, 19},
- {12, 103, 13, 0, 5, 0, 19},
- {12, 9, 13, 0, 5, 0, 19},
- {23, 0, 10, 0, 5, 0, 0},
- {6, 0, 0, 0, 5, 0, 19},
- {12, 107, 13, 0, 5, 0, 19},
- {21, 0, 0, 0, 5, 0, 19},
- {13, 0, 0, 0, 5, 0, 19},
- {7, 0, 0, 0, 5, 0, 20},
- {12, 0, 13, 0, 5, 0, 20},
- {12, 118, 13, 0, 5, 0, 20},
- {6, 0, 0, 0, 5, 0, 20},
- {12, 122, 13, 0, 5, 0, 20},
- {13, 0, 0, 0, 5, 0, 20},
- {7, 0, 0, 0, 5, 0, 21},
- {26, 0, 0, 0, 5, 0, 21},
- {21, 0, 0, 0, 5, 0, 21},
- {12, 220, 13, 0, 5, 0, 21},
- {13, 0, 0, 0, 5, 0, 21},
- {15, 0, 0, 0, 5, 0, 21},
- {12, 216, 13, 0, 5, 0, 21},
- {22, 0, 18, 1, 5, 0, 21},
- {18, 0, 18, 1, 5, 0, 21},
+ {6, 0, 0, 0, 5, 23, 12},
+ {7, 0, 0, 0, 2, 24, 25},
+ {7, 0, 0, 0, 5, 24, 26},
+ {7, 0, 0, 0, 5, 24, 27},
+ {7, 0, 0, 0, 5, 25, 12},
+ {12, 230, 13, 0, 5, 25, 21},
+ {21, 0, 0, 0, 5, 25, 12},
+ {21, 0, 0, 0, 5, 25, 17},
+ {15, 0, 0, 0, 5, 25, 12},
+ {26, 0, 18, 0, 5, 25, 12},
+ {9, 0, 0, 0, 5, 26, 12},
+ {5, 0, 0, 0, 5, 26, 12},
+ {17, 0, 18, 0, 5, 27, 17},
+ {7, 0, 0, 0, 5, 27, 12},
+ {21, 0, 0, 0, 5, 27, 12},
+ {29, 0, 17, 0, 5, 28, 17},
+ {7, 0, 0, 0, 5, 28, 12},
+ {22, 0, 18, 1, 5, 28, 0},
+ {18, 0, 18, 1, 5, 28, 1},
+ {7, 0, 0, 0, 5, 29, 12},
+ {14, 0, 0, 0, 5, 29, 12},
+ {7, 0, 0, 0, 5, 41, 12},
+ {12, 0, 13, 0, 5, 41, 21},
+ {12, 9, 13, 0, 5, 41, 21},
+ {7, 0, 0, 0, 5, 42, 12},
+ {12, 0, 13, 0, 5, 42, 21},
+ {12, 9, 13, 0, 5, 42, 21},
+ {7, 0, 0, 0, 5, 43, 12},
+ {12, 0, 13, 0, 5, 43, 21},
+ {7, 0, 0, 0, 5, 44, 12},
+ {12, 0, 13, 0, 5, 44, 21},
+ {7, 0, 0, 0, 5, 30, 38},
+ {12, 0, 13, 0, 5, 30, 38},
+ {10, 0, 0, 0, 5, 30, 38},
+ {12, 9, 13, 0, 5, 30, 38},
+ {21, 0, 0, 0, 5, 30, 17},
+ {21, 0, 0, 0, 5, 30, 5},
+ {6, 0, 0, 0, 5, 30, 38},
+ {21, 0, 0, 0, 5, 30, 12},
+ {23, 0, 10, 0, 5, 30, 9},
+ {12, 230, 13, 0, 5, 30, 38},
+ {13, 0, 0, 0, 5, 30, 11},
+ {15, 0, 18, 0, 5, 30, 12},
+ {21, 0, 18, 0, 5, 31, 12},
+ {21, 0, 18, 0, 5, 0, 6},
+ {21, 0, 18, 0, 5, 31, 17},
+ {21, 0, 18, 0, 5, 0, 17},
+ {17, 0, 18, 0, 5, 31, 18},
+ {21, 0, 18, 0, 5, 31, 6},
+ {12, 0, 13, 0, 5, 31, 21},
+ {1, 0, 14, 0, 5, 31, 4},
+ {13, 0, 0, 0, 5, 31, 11},
+ {7, 0, 0, 0, 5, 31, 12},
+ {6, 0, 0, 0, 5, 31, 12},
+ {12, 228, 13, 0, 5, 31, 21},
+ {7, 0, 0, 0, 5, 45, 12},
+ {12, 0, 13, 0, 5, 45, 21},
+ {10, 0, 0, 0, 5, 45, 21},
+ {12, 222, 13, 0, 5, 45, 21},
+ {12, 230, 13, 0, 5, 45, 21},
+ {12, 220, 13, 0, 5, 45, 21},
+ {26, 0, 18, 0, 5, 45, 12},
+ {21, 0, 18, 0, 5, 45, 6},
+ {13, 0, 0, 0, 5, 45, 11},
+ {7, 0, 0, 0, 5, 46, 38},
+ {7, 0, 0, 0, 5, 55, 38},
+ {13, 0, 0, 0, 5, 55, 11},
+ {15, 0, 0, 0, 5, 55, 38},
+ {26, 0, 18, 0, 5, 55, 38},
+ {26, 0, 18, 0, 5, 30, 12},
+ {7, 0, 0, 0, 5, 53, 12},
+ {12, 230, 13, 0, 5, 53, 21},
+ {12, 220, 13, 0, 5, 53, 21},
+ {10, 0, 0, 0, 5, 53, 21},
+ {12, 0, 13, 0, 5, 53, 21},
+ {21, 0, 0, 0, 5, 53, 12},
+ {7, 0, 0, 0, 5, 77, 38},
+ {10, 0, 0, 0, 5, 77, 38},
+ {12, 0, 13, 0, 5, 77, 38},
+ {12, 9, 13, 0, 5, 77, 38},
+ {12, 230, 13, 0, 5, 77, 38},
+ {12, 220, 13, 0, 5, 77, 21},
+ {13, 0, 0, 0, 5, 77, 11},
+ {21, 0, 0, 0, 5, 77, 38},
+ {6, 0, 0, 0, 5, 77, 38},
+ {11, 0, 13, 0, 5, 40, 21},
+ {12, 0, 13, 0, 5, 61, 21},
+ {10, 0, 0, 0, 5, 61, 21},
+ {7, 0, 0, 0, 5, 61, 12},
+ {12, 7, 13, 0, 5, 61, 21},
+ {10, 9, 0, 0, 5, 61, 21},
+ {13, 0, 0, 0, 5, 61, 11},
+ {21, 0, 0, 0, 5, 61, 17},
+ {21, 0, 0, 0, 5, 61, 12},
+ {26, 0, 0, 0, 5, 61, 12},
+ {12, 230, 13, 0, 5, 61, 21},
+ {12, 220, 13, 0, 5, 61, 21},
+ {12, 0, 13, 0, 5, 66, 21},
+ {10, 0, 0, 0, 5, 66, 21},
+ {7, 0, 0, 0, 5, 66, 12},
+ {10, 9, 0, 0, 5, 66, 21},
+ {12, 9, 13, 0, 5, 66, 21},
+ {13, 0, 0, 0, 5, 66, 11},
+ {7, 0, 0, 0, 5, 92, 12},
+ {12, 7, 13, 0, 5, 92, 21},
+ {10, 0, 0, 0, 5, 92, 21},
+ {12, 0, 13, 0, 5, 92, 21},
+ {10, 9, 0, 0, 5, 92, 21},
+ {21, 0, 0, 0, 5, 92, 12},
+ {7, 0, 0, 0, 5, 67, 12},
+ {10, 0, 0, 0, 5, 67, 21},
+ {12, 0, 13, 0, 5, 67, 21},
+ {12, 7, 13, 0, 5, 67, 21},
+ {21, 0, 0, 0, 5, 67, 17},
+ {13, 0, 0, 0, 5, 67, 11},
+ {13, 0, 0, 0, 5, 68, 11},
+ {7, 0, 0, 0, 5, 68, 12},
+ {6, 0, 0, 0, 5, 68, 12},
+ {21, 0, 0, 0, 5, 68, 17},
+ {21, 0, 0, 0, 5, 66, 12},
+ {12, 1, 13, 0, 5, 40, 21},
{10, 0, 0, 0, 5, 0, 21},
- {12, 129, 13, 0, 5, 0, 21},
- {12, 130, 13, 0, 5, 0, 21},
- {12, 0, 13, 0, 5, 0, 21},
- {12, 132, 13, 0, 5, 0, 21},
- {12, 230, 13, 0, 5, 0, 21},
- {12, 9, 13, 0, 5, 0, 21},
- {26, 0, 0, 0, 5, 0, 0},
- {7, 0, 0, 0, 5, 0, 22},
- {10, 0, 0, 0, 5, 0, 22},
- {12, 0, 13, 0, 5, 0, 22},
- {12, 7, 13, 0, 5, 0, 22},
- {12, 9, 13, 0, 5, 0, 22},
- {13, 0, 0, 0, 5, 0, 22},
- {21, 0, 0, 0, 5, 0, 22},
- {12, 220, 13, 0, 5, 0, 22},
- {26, 0, 0, 0, 5, 0, 22},
- {9, 0, 0, 0, 5, 0, 23},
- {7, 0, 0, 0, 5, 0, 23},
- {6, 0, 0, 0, 5, 0, 23},
- {7, 0, 0, 0, 2, 0, 24},
- {7, 0, 0, 0, 5, 0, 24},
- {7, 0, 0, 0, 5, 0, 25},
- {12, 230, 13, 0, 5, 0, 25},
- {21, 0, 0, 0, 5, 0, 25},
- {15, 0, 0, 0, 5, 0, 25},
- {26, 0, 18, 0, 5, 0, 25},
- {9, 0, 0, 0, 5, 0, 26},
- {5, 0, 0, 0, 5, 0, 26},
- {17, 0, 18, 0, 5, 0, 27},
- {7, 0, 0, 0, 5, 0, 27},
- {21, 0, 0, 0, 5, 0, 27},
- {29, 0, 17, 0, 5, 0, 28},
- {7, 0, 0, 0, 5, 0, 28},
- {22, 0, 18, 1, 5, 0, 28},
- {18, 0, 18, 1, 5, 0, 28},
- {7, 0, 0, 0, 5, 0, 29},
- {14, 0, 0, 0, 5, 0, 29},
- {7, 0, 0, 0, 5, 0, 41},
- {12, 0, 13, 0, 5, 0, 41},
- {12, 9, 13, 0, 5, 0, 41},
- {7, 0, 0, 0, 5, 0, 42},
- {12, 0, 13, 0, 5, 0, 42},
- {12, 9, 13, 0, 5, 0, 42},
- {7, 0, 0, 0, 5, 0, 43},
- {12, 0, 13, 0, 5, 0, 43},
- {7, 0, 0, 0, 5, 0, 44},
- {12, 0, 13, 0, 5, 0, 44},
- {7, 0, 0, 0, 5, 0, 30},
- {12, 0, 13, 0, 5, 0, 30},
- {10, 0, 0, 0, 5, 0, 30},
- {12, 9, 13, 0, 5, 0, 30},
- {21, 0, 0, 0, 5, 0, 30},
- {6, 0, 0, 0, 5, 0, 30},
- {23, 0, 10, 0, 5, 0, 30},
- {12, 230, 13, 0, 5, 0, 30},
- {13, 0, 0, 0, 5, 0, 30},
- {15, 0, 18, 0, 5, 0, 30},
- {21, 0, 18, 0, 5, 0, 31},
- {17, 0, 18, 0, 5, 0, 31},
- {12, 0, 13, 0, 5, 0, 31},
- {1, 0, 14, 0, 5, 0, 31},
- {13, 0, 0, 0, 5, 0, 31},
- {7, 0, 0, 0, 5, 0, 31},
- {6, 0, 0, 0, 5, 0, 31},
- {12, 228, 13, 0, 5, 0, 31},
- {7, 0, 0, 0, 5, 0, 45},
- {12, 0, 13, 0, 5, 0, 45},
- {10, 0, 0, 0, 5, 0, 45},
- {12, 222, 13, 0, 5, 0, 45},
- {12, 230, 13, 0, 5, 0, 45},
- {12, 220, 13, 0, 5, 0, 45},
- {26, 0, 18, 0, 5, 0, 45},
- {21, 0, 18, 0, 5, 0, 45},
- {13, 0, 0, 0, 5, 0, 45},
- {7, 0, 0, 0, 5, 0, 46},
- {7, 0, 0, 0, 5, 0, 55},
- {13, 0, 0, 0, 5, 0, 55},
- {15, 0, 0, 0, 5, 0, 55},
- {26, 0, 18, 0, 5, 0, 55},
- {26, 0, 18, 0, 5, 0, 30},
- {7, 0, 0, 0, 5, 0, 53},
- {12, 230, 13, 0, 5, 0, 53},
- {12, 220, 13, 0, 5, 0, 53},
- {10, 0, 0, 0, 5, 0, 53},
- {12, 0, 13, 0, 5, 0, 53},
- {21, 0, 0, 0, 5, 0, 53},
- {7, 0, 0, 0, 5, 0, 77},
- {10, 0, 0, 0, 5, 0, 77},
- {12, 0, 13, 0, 5, 0, 77},
- {12, 9, 13, 0, 5, 0, 77},
- {12, 230, 13, 0, 5, 0, 77},
- {12, 220, 13, 0, 5, 0, 77},
- {13, 0, 0, 0, 5, 0, 77},
- {21, 0, 0, 0, 5, 0, 77},
- {6, 0, 0, 0, 5, 0, 77},
- {11, 0, 13, 0, 5, 0, 40},
- {12, 0, 13, 0, 5, 0, 61},
- {10, 0, 0, 0, 5, 0, 61},
- {7, 0, 0, 0, 5, 0, 61},
- {12, 7, 13, 0, 5, 0, 61},
- {10, 9, 0, 0, 5, 0, 61},
- {13, 0, 0, 0, 5, 0, 61},
- {21, 0, 0, 0, 5, 0, 61},
- {26, 0, 0, 0, 5, 0, 61},
- {12, 230, 13, 0, 5, 0, 61},
- {12, 220, 13, 0, 5, 0, 61},
- {12, 0, 13, 0, 5, 0, 66},
- {10, 0, 0, 0, 5, 0, 66},
- {7, 0, 0, 0, 5, 0, 66},
- {10, 9, 0, 0, 5, 0, 66},
- {12, 9, 13, 0, 5, 0, 66},
- {13, 0, 0, 0, 5, 0, 66},
- {7, 0, 0, 0, 5, 0, 92},
- {12, 7, 13, 0, 5, 0, 92},
- {10, 0, 0, 0, 5, 0, 92},
- {12, 0, 13, 0, 5, 0, 92},
- {10, 9, 0, 0, 5, 0, 92},
- {21, 0, 0, 0, 5, 0, 92},
- {7, 0, 0, 0, 5, 0, 67},
- {10, 0, 0, 0, 5, 0, 67},
- {12, 0, 13, 0, 5, 0, 67},
- {12, 7, 13, 0, 5, 0, 67},
- {21, 0, 0, 0, 5, 0, 67},
- {13, 0, 0, 0, 5, 0, 67},
- {13, 0, 0, 0, 5, 0, 68},
- {7, 0, 0, 0, 5, 0, 68},
- {6, 0, 0, 0, 5, 0, 68},
- {21, 0, 0, 0, 5, 0, 68},
- {21, 0, 0, 0, 5, 0, 66},
- {12, 1, 13, 0, 5, 0, 40},
- {10, 0, 0, 0, 5, 0, 0},
- {7, 0, 0, 0, 5, 0, 0},
- {6, 0, 0, 0, 5, 0, 3},
- {12, 234, 13, 0, 5, 0, 40},
- {12, 214, 13, 0, 5, 0, 40},
- {12, 202, 13, 0, 5, 0, 40},
- {12, 233, 13, 0, 5, 0, 40},
- {8, 0, 0, 0, 5, 0, 2},
- {29, 0, 17, 0, 5, 0, 0},
- {1, 0, 14, 0, 5, 0, 0},
- {1, 0, 14, 0, 5, 0, 40},
- {1, 0, 0, 0, 5, 0, 0},
- {1, 0, 3, 0, 5, 0, 0},
- {17, 0, 18, 0, 4, 0, 0},
- {17, 0, 18, 0, 5, 0, 0},
- {20, 0, 18, 0, 4, 0, 0},
- {19, 0, 18, 0, 4, 0, 0},
+ {7, 0, 0, 0, 5, 0, 12},
+ {6, 0, 0, 0, 5, 3, 12},
+ {12, 234, 13, 0, 5, 40, 21},
+ {12, 214, 13, 0, 5, 40, 21},
+ {12, 202, 13, 0, 5, 40, 21},
+ {12, 233, 13, 0, 5, 40, 21},
+ {8, 0, 0, 0, 5, 2, 12},
+ {24, 0, 18, 0, 5, 2, 18},
+ {29, 0, 17, 0, 5, 0, 17},
+ {29, 0, 17, 0, 5, 0, 4},
+ {1, 0, 14, 0, 5, 0, 20},
+ {1, 0, 14, 0, 5, 40, 21},
+ {1, 0, 14, 0, 5, 40, 41},
+ {1, 0, 0, 0, 5, 0, 21},
+ {1, 0, 3, 0, 5, 0, 21},
+ {17, 0, 18, 0, 4, 0, 17},
+ {17, 0, 18, 0, 5, 0, 4},
+ {17, 0, 18, 0, 5, 0, 17},
+ {17, 0, 18, 0, 4, 0, 19},
+ {17, 0, 18, 0, 4, 0, 29},
+ {20, 0, 18, 0, 4, 0, 3},
+ {19, 0, 18, 0, 4, 0, 3},
{22, 0, 18, 0, 5, 0, 0},
- {20, 0, 18, 0, 5, 0, 0},
- {27, 0, 17, 0, 5, 0, 0},
- {28, 0, 15, 0, 5, 0, 0},
- {1, 0, 1, 0, 5, 0, 0},
- {1, 0, 5, 0, 5, 0, 0},
- {1, 0, 7, 0, 5, 0, 0},
- {1, 0, 2, 0, 5, 0, 0},
- {1, 0, 6, 0, 5, 0, 0},
- {21, 0, 10, 0, 4, 0, 0},
- {21, 0, 10, 0, 5, 0, 0},
- {16, 0, 18, 0, 5, 0, 0},
- {25, 0, 12, 0, 5, 0, 0},
+ {20, 0, 18, 0, 5, 0, 3},
+ {21, 0, 18, 0, 4, 0, 12},
+ {21, 0, 18, 0, 4, 0, 15},
+ {21, 0, 18, 0, 4, 0, 17},
+ {27, 0, 17, 0, 5, 0, 30},
+ {28, 0, 15, 0, 5, 0, 30},
+ {1, 0, 1, 0, 5, 0, 21},
+ {1, 0, 5, 0, 5, 0, 21},
+ {1, 0, 7, 0, 5, 0, 21},
+ {1, 0, 2, 0, 5, 0, 21},
+ {1, 0, 6, 0, 5, 0, 21},
+ {21, 0, 10, 0, 4, 0, 10},
+ {21, 0, 10, 0, 5, 0, 10},
+ {21, 0, 18, 0, 4, 0, 10},
+ {21, 0, 18, 0, 5, 0, 10},
+ {21, 0, 18, 0, 5, 0, 5},
+ {16, 0, 18, 0, 5, 0, 12},
+ {25, 0, 12, 0, 5, 0, 8},
{22, 0, 18, 1, 5, 0, 0},
- {18, 0, 18, 1, 5, 0, 0},
- {25, 0, 18, 0, 5, 0, 0},
- {1, 0, 19, 0, 5, 0, 0},
- {1, 0, 20, 0, 5, 0, 0},
- {1, 0, 21, 0, 5, 0, 0},
- {1, 0, 22, 0, 5, 0, 0},
- {15, 0, 8, 0, 5, 0, 0},
- {25, 0, 9, 0, 5, 0, 0},
- {6, 0, 0, 0, 4, 0, 1},
- {23, 0, 10, 0, 1, 0, 0},
- {9, 0, 0, 0, 5, 0, 0},
- {5, 0, 0, 0, 4, 0, 0},
- {26, 0, 10, 0, 5, 0, 0},
- {25, 0, 18, 1, 5, 0, 0},
- {15, 0, 18, 0, 5, 0, 0},
- {14, 0, 0, 0, 4, 0, 1},
- {14, 0, 0, 0, 5, 0, 1},
- {25, 0, 18, 1, 4, 0, 0},
- {25, 0, 10, 0, 5, 0, 0},
+ {18, 0, 18, 1, 5, 0, 1},
+ {25, 0, 18, 0, 5, 0, 12},
+ {1, 0, 14, 0, 5, 0, 22},
+ {1, 0, 14, 0, 5, 0, 12},
+ {1, 0, 19, 0, 5, 0, 21},
+ {1, 0, 20, 0, 5, 0, 21},
+ {1, 0, 21, 0, 5, 0, 21},
+ {1, 0, 22, 0, 5, 0, 21},
+ {1, 0, 14, 0, 5, 0, 21},
+ {15, 0, 8, 0, 5, 0, 12},
+ {25, 0, 9, 0, 5, 0, 12},
+ {6, 0, 0, 0, 4, 1, 29},
+ {23, 0, 10, 0, 5, 0, 10},
+ {23, 0, 10, 0, 1, 0, 9},
+ {2, 0, 18, 0, 5, 102, 9},
+ {9, 0, 0, 0, 5, 0, 12},
+ {26, 0, 18, 0, 4, 0, 10},
+ {26, 0, 18, 0, 4, 0, 29},
+ {5, 0, 0, 0, 4, 0, 29},
+ {26, 0, 18, 0, 4, 0, 9},
+ {9, 0, 0, 0, 4, 1, 29},
+ {26, 0, 10, 0, 5, 0, 12},
+ {25, 0, 18, 1, 5, 0, 12},
+ {15, 0, 18, 0, 5, 0, 12},
+ {15, 0, 18, 0, 4, 0, 12},
+ {15, 0, 18, 0, 5, 0, 29},
+ {14, 0, 0, 0, 4, 1, 29},
+ {14, 0, 0, 0, 5, 1, 12},
+ {25, 0, 18, 1, 4, 0, 29},
+ {25, 0, 9, 0, 5, 0, 9},
+ {25, 0, 10, 0, 5, 0, 9},
+ {25, 0, 18, 0, 5, 0, 15},
+ {26, 0, 18, 0, 2, 0, 14},
{22, 0, 18, 1, 2, 0, 0},
- {18, 0, 18, 1, 2, 0, 0},
- {26, 0, 0, 0, 4, 0, 0},
- {26, 0, 0, 0, 5, 0, 52},
- {9, 0, 0, 0, 5, 0, 56},
- {5, 0, 0, 0, 5, 0, 56},
- {26, 0, 18, 0, 5, 0, 54},
- {12, 230, 13, 0, 5, 0, 54},
- {21, 0, 18, 0, 5, 0, 54},
- {15, 0, 18, 0, 5, 0, 54},
- {5, 0, 0, 0, 5, 0, 23},
- {7, 0, 0, 0, 5, 0, 57},
- {6, 0, 0, 0, 5, 0, 57},
- {21, 0, 0, 0, 5, 0, 57},
- {12, 9, 13, 0, 5, 0, 57},
- {26, 0, 18, 0, 2, 0, 35},
- {26, 0, 18, 0, 2, 0, 0},
- {29, 0, 17, 0, 0, 0, 0},
- {21, 0, 18, 0, 2, 0, 0},
- {6, 0, 0, 0, 2, 0, 35},
- {7, 0, 0, 0, 2, 0, 0},
- {14, 0, 0, 0, 2, 0, 35},
- {17, 0, 18, 0, 2, 0, 0},
- {22, 0, 18, 0, 2, 0, 0},
- {18, 0, 18, 0, 2, 0, 0},
- {12, 218, 13, 0, 2, 0, 40},
- {12, 228, 13, 0, 2, 0, 40},
- {12, 232, 13, 0, 2, 0, 40},
- {12, 222, 13, 0, 2, 0, 40},
- {10, 224, 0, 0, 2, 0, 24},
- {6, 0, 0, 0, 2, 0, 0},
- {7, 0, 0, 0, 2, 0, 32},
- {12, 8, 13, 0, 2, 0, 40},
- {24, 0, 18, 0, 2, 0, 0},
- {6, 0, 0, 0, 2, 0, 32},
- {7, 0, 0, 0, 2, 0, 33},
- {6, 0, 0, 0, 2, 0, 33},
- {7, 0, 0, 0, 2, 0, 34},
- {26, 0, 0, 0, 2, 0, 0},
- {15, 0, 0, 0, 2, 0, 0},
- {26, 0, 0, 0, 2, 0, 24},
- {26, 0, 18, 0, 2, 0, 24},
- {15, 0, 0, 0, 4, 0, 0},
- {15, 0, 18, 0, 2, 0, 0},
- {26, 0, 0, 0, 2, 0, 33},
- {7, 0, 0, 0, 2, 0, 35},
- {2, 0, 18, 0, 2, 0, 102},
- {7, 0, 0, 0, 2, 0, 36},
- {6, 0, 0, 0, 2, 0, 36},
- {26, 0, 18, 0, 2, 0, 36},
- {7, 0, 0, 0, 5, 0, 82},
- {6, 0, 0, 0, 5, 0, 82},
- {21, 0, 0, 0, 5, 0, 82},
- {7, 0, 0, 0, 5, 0, 69},
- {6, 0, 0, 0, 5, 0, 69},
- {21, 0, 18, 0, 5, 0, 69},
- {13, 0, 0, 0, 5, 0, 69},
- {7, 0, 0, 0, 5, 0, 3},
+ {18, 0, 18, 1, 2, 0, 1},
+ {26, 0, 18, 0, 2, 0, 12},
+ {26, 0, 18, 0, 5, 0, 14},
+ {26, 0, 0, 0, 4, 0, 29},
+ {26, 0, 18, 0, 5, 0, 29},
+ {25, 0, 18, 0, 2, 0, 12},
+ {26, 0, 18, 0, 4, 0, 14},
+ {26, 0, 18, 0, 5, 0, 41},
+ {26, 0, 18, 0, 4, 0, 41},
+ {26, 0, 18, 0, 2, 0, 41},
+ {26, 0, 18, 0, 2, 0, 29},
+ {26, 0, 18, 0, 5, 0, 3},
+ {26, 0, 18, 0, 5, 0, 6},
+ {26, 0, 0, 0, 5, 52, 12},
+ {9, 0, 0, 0, 5, 56, 12},
+ {5, 0, 0, 0, 5, 56, 12},
+ {26, 0, 18, 0, 5, 54, 12},
+ {12, 230, 13, 0, 5, 54, 21},
+ {21, 0, 18, 0, 5, 54, 6},
+ {21, 0, 18, 0, 5, 54, 17},
+ {15, 0, 18, 0, 5, 54, 12},
+ {5, 0, 0, 0, 5, 23, 12},
+ {7, 0, 0, 0, 5, 57, 12},
+ {6, 0, 0, 0, 5, 57, 12},
+ {21, 0, 0, 0, 5, 57, 17},
+ {12, 9, 13, 0, 5, 57, 21},
{21, 0, 18, 0, 5, 0, 3},
- {6, 0, 18, 0, 5, 0, 3},
- {7, 0, 0, 0, 5, 0, 83},
- {14, 0, 0, 0, 5, 0, 83},
- {12, 230, 13, 0, 5, 0, 83},
- {21, 0, 0, 0, 5, 0, 83},
- {24, 0, 0, 0, 5, 0, 0},
- {7, 0, 0, 0, 5, 0, 58},
- {12, 0, 13, 0, 5, 0, 58},
- {12, 9, 13, 0, 5, 0, 58},
- {10, 0, 0, 0, 5, 0, 58},
- {26, 0, 18, 0, 5, 0, 58},
- {15, 0, 0, 0, 5, 0, 0},
- {7, 0, 0, 0, 5, 0, 64},
- {21, 0, 18, 0, 5, 0, 64},
- {10, 0, 0, 0, 5, 0, 70},
- {7, 0, 0, 0, 5, 0, 70},
- {12, 9, 13, 0, 5, 0, 70},
- {21, 0, 0, 0, 5, 0, 70},
- {13, 0, 0, 0, 5, 0, 70},
- {13, 0, 0, 0, 5, 0, 71},
- {7, 0, 0, 0, 5, 0, 71},
- {12, 0, 13, 0, 5, 0, 71},
- {12, 220, 13, 0, 5, 0, 71},
- {21, 0, 0, 0, 5, 0, 71},
- {7, 0, 0, 0, 5, 0, 72},
- {12, 0, 13, 0, 5, 0, 72},
- {10, 0, 0, 0, 5, 0, 72},
- {10, 9, 0, 0, 5, 0, 72},
- {21, 0, 0, 0, 5, 0, 72},
- {12, 0, 13, 0, 5, 0, 84},
- {10, 0, 0, 0, 5, 0, 84},
- {7, 0, 0, 0, 5, 0, 84},
- {12, 7, 13, 0, 5, 0, 84},
- {10, 9, 0, 0, 5, 0, 84},
- {21, 0, 0, 0, 5, 0, 84},
- {13, 0, 0, 0, 5, 0, 84},
- {6, 0, 0, 0, 5, 0, 22},
- {7, 0, 0, 0, 5, 0, 76},
- {12, 0, 13, 0, 5, 0, 76},
- {10, 0, 0, 0, 5, 0, 76},
- {13, 0, 0, 0, 5, 0, 76},
- {21, 0, 0, 0, 5, 0, 76},
- {7, 0, 0, 0, 5, 0, 78},
- {12, 230, 13, 0, 5, 0, 78},
- {12, 220, 13, 0, 5, 0, 78},
- {6, 0, 0, 0, 5, 0, 78},
- {21, 0, 0, 0, 5, 0, 78},
- {7, 0, 0, 0, 5, 0, 85},
- {10, 0, 0, 0, 5, 0, 85},
- {12, 0, 13, 0, 5, 0, 85},
- {21, 0, 0, 0, 5, 0, 85},
- {6, 0, 0, 0, 5, 0, 85},
- {12, 9, 13, 0, 5, 0, 85},
- {13, 0, 0, 0, 5, 0, 85},
- {4, 0, 0, 0, 5, 0, 102},
- {3, 0, 0, 0, 4, 0, 102},
- {12, 26, 13, 0, 5, 0, 5},
- {25, 0, 9, 0, 5, 0, 5},
- {24, 0, 4, 0, 5, 0, 6},
- {18, 0, 18, 0, 5, 0, 0},
- {16, 0, 18, 0, 2, 0, 0},
- {21, 0, 12, 0, 2, 0, 0},
- {21, 0, 10, 0, 2, 0, 0},
- {25, 0, 9, 0, 2, 0, 0},
- {17, 0, 9, 0, 2, 0, 0},
- {25, 0, 18, 1, 2, 0, 0},
- {25, 0, 18, 0, 2, 0, 0},
- {23, 0, 10, 0, 2, 0, 0},
- {21, 0, 18, 0, 0, 0, 0},
- {21, 0, 10, 0, 0, 0, 0},
- {23, 0, 10, 0, 0, 0, 0},
+ {21, 0, 18, 0, 5, 0, 0},
+ {17, 0, 18, 0, 5, 0, 12},
+ {17, 0, 18, 0, 5, 0, 19},
+ {26, 0, 18, 0, 2, 35, 14},
+ {29, 0, 17, 0, 0, 0, 17},
+ {21, 0, 18, 0, 2, 0, 1},
+ {21, 0, 18, 0, 2, 0, 14},
+ {6, 0, 0, 0, 2, 35, 5},
+ {7, 0, 0, 0, 2, 0, 14},
+ {14, 0, 0, 0, 2, 35, 14},
+ {17, 0, 18, 0, 2, 0, 5},
+ {22, 0, 18, 0, 2, 0, 0},
+ {18, 0, 18, 0, 2, 0, 1},
+ {12, 218, 13, 0, 2, 40, 21},
+ {12, 228, 13, 0, 2, 40, 21},
+ {12, 232, 13, 0, 2, 40, 21},
+ {12, 222, 13, 0, 2, 40, 21},
+ {10, 224, 0, 0, 2, 24, 21},
+ {17, 0, 18, 0, 2, 0, 14},
+ {6, 0, 0, 0, 2, 0, 14},
+ {6, 0, 0, 0, 2, 0, 21},
+ {7, 0, 0, 0, 2, 0, 5},
+ {7, 0, 0, 0, 2, 32, 32},
+ {7, 0, 0, 0, 2, 32, 14},
+ {12, 8, 13, 0, 2, 40, 21},
+ {24, 0, 18, 0, 2, 0, 5},
+ {6, 0, 0, 0, 2, 32, 5},
+ {7, 0, 0, 0, 2, 33, 32},
+ {7, 0, 0, 0, 2, 33, 14},
+ {21, 0, 18, 0, 2, 0, 5},
+ {6, 0, 0, 0, 2, 0, 32},
+ {6, 0, 0, 0, 2, 33, 5},
+ {7, 0, 0, 0, 2, 34, 14},
+ {7, 0, 0, 0, 2, 24, 14},
+ {26, 0, 0, 0, 2, 0, 14},
+ {15, 0, 0, 0, 2, 0, 14},
+ {26, 0, 0, 0, 2, 24, 14},
+ {26, 0, 18, 0, 2, 24, 14},
+ {15, 0, 0, 0, 4, 0, 29},
+ {15, 0, 18, 0, 2, 0, 14},
+ {26, 0, 0, 0, 2, 33, 14},
+ {7, 0, 0, 0, 2, 35, 14},
+ {2, 0, 18, 0, 2, 102, 14},
+ {7, 0, 0, 0, 2, 36, 14},
+ {6, 0, 0, 0, 2, 36, 5},
+ {26, 0, 18, 0, 2, 36, 14},
+ {7, 0, 0, 0, 5, 82, 12},
+ {6, 0, 0, 0, 5, 82, 12},
+ {21, 0, 0, 0, 5, 82, 17},
+ {7, 0, 0, 0, 5, 69, 12},
+ {6, 0, 0, 0, 5, 69, 12},
+ {21, 0, 18, 0, 5, 69, 17},
+ {21, 0, 18, 0, 5, 69, 6},
+ {13, 0, 0, 0, 5, 69, 11},
+ {7, 0, 0, 0, 5, 3, 12},
+ {21, 0, 18, 0, 5, 3, 12},
+ {6, 0, 18, 0, 5, 3, 12},
+ {7, 0, 0, 0, 5, 83, 12},
+ {14, 0, 0, 0, 5, 83, 12},
+ {12, 230, 13, 0, 5, 83, 21},
+ {21, 0, 0, 0, 5, 83, 12},
+ {21, 0, 0, 0, 5, 83, 17},
+ {24, 0, 0, 0, 5, 0, 12},
+ {7, 0, 0, 0, 5, 58, 12},
+ {12, 0, 13, 0, 5, 58, 21},
+ {12, 9, 13, 0, 5, 58, 21},
+ {10, 0, 0, 0, 5, 58, 21},
+ {26, 0, 18, 0, 5, 58, 12},
+ {15, 0, 0, 0, 5, 0, 12},
+ {7, 0, 0, 0, 5, 64, 12},
+ {21, 0, 18, 0, 5, 64, 18},
+ {21, 0, 18, 0, 5, 64, 6},
+ {10, 0, 0, 0, 5, 70, 21},
+ {7, 0, 0, 0, 5, 70, 12},
+ {12, 9, 13, 0, 5, 70, 21},
+ {12, 0, 13, 0, 5, 70, 21},
+ {21, 0, 0, 0, 5, 70, 17},
+ {13, 0, 0, 0, 5, 70, 11},
+ {21, 0, 0, 0, 5, 9, 18},
+ {13, 0, 0, 0, 5, 71, 11},
+ {7, 0, 0, 0, 5, 71, 12},
+ {12, 0, 13, 0, 5, 71, 21},
+ {12, 220, 13, 0, 5, 71, 21},
+ {21, 0, 0, 0, 5, 71, 17},
+ {7, 0, 0, 0, 5, 72, 12},
+ {12, 0, 13, 0, 5, 72, 21},
+ {10, 0, 0, 0, 5, 72, 21},
+ {10, 9, 0, 0, 5, 72, 21},
+ {21, 0, 0, 0, 5, 72, 12},
+ {12, 0, 13, 0, 5, 84, 21},
+ {10, 0, 0, 0, 5, 84, 21},
+ {7, 0, 0, 0, 5, 84, 12},
+ {12, 7, 13, 0, 5, 84, 21},
+ {10, 9, 0, 0, 5, 84, 21},
+ {21, 0, 0, 0, 5, 84, 12},
+ {21, 0, 0, 0, 5, 84, 17},
+ {13, 0, 0, 0, 5, 84, 11},
+ {6, 0, 0, 0, 5, 22, 38},
+ {7, 0, 0, 0, 5, 76, 12},
+ {12, 0, 13, 0, 5, 76, 21},
+ {10, 0, 0, 0, 5, 76, 21},
+ {13, 0, 0, 0, 5, 76, 11},
+ {21, 0, 0, 0, 5, 76, 12},
+ {21, 0, 0, 0, 5, 76, 17},
+ {7, 0, 0, 0, 5, 78, 38},
+ {12, 230, 13, 0, 5, 78, 38},
+ {12, 220, 13, 0, 5, 78, 38},
+ {6, 0, 0, 0, 5, 78, 38},
+ {21, 0, 0, 0, 5, 78, 38},
+ {7, 0, 0, 0, 5, 85, 12},
+ {10, 0, 0, 0, 5, 85, 21},
+ {12, 0, 13, 0, 5, 85, 21},
+ {21, 0, 0, 0, 5, 85, 17},
+ {6, 0, 0, 0, 5, 85, 12},
+ {12, 9, 13, 0, 5, 85, 21},
+ {13, 0, 0, 0, 5, 85, 11},
+ {7, 0, 0, 0, 2, 24, 23},
+ {7, 0, 0, 0, 2, 24, 24},
+ {4, 0, 0, 0, 5, 102, 39},
+ {3, 0, 0, 0, 4, 102, 41},
+ {12, 26, 13, 0, 5, 5, 21},
+ {25, 0, 9, 0, 5, 5, 12},
+ {24, 0, 4, 0, 5, 6, 12},
+ {18, 0, 18, 0, 5, 0, 1},
+ {12, 0, 13, 0, 4, 40, 21},
+ {21, 0, 18, 0, 2, 0, 8},
+ {21, 0, 18, 0, 2, 0, 6},
+ {21, 0, 18, 0, 2, 0, 15},
+ {16, 0, 18, 0, 2, 0, 14},
+ {21, 0, 12, 0, 2, 0, 1},
+ {21, 0, 12, 0, 2, 0, 5},
+ {21, 0, 10, 0, 2, 0, 14},
+ {25, 0, 9, 0, 2, 0, 14},
+ {17, 0, 9, 0, 2, 0, 14},
+ {25, 0, 18, 1, 2, 0, 14},
+ {25, 0, 18, 0, 2, 0, 14},
+ {23, 0, 10, 0, 2, 0, 9},
+ {21, 0, 10, 0, 2, 0, 10},
+ {21, 0, 18, 0, 0, 0, 6},
+ {21, 0, 18, 0, 0, 0, 14},
+ {21, 0, 10, 0, 0, 0, 14},
+ {23, 0, 10, 0, 0, 0, 9},
+ {21, 0, 10, 0, 0, 0, 10},
{22, 0, 18, 1, 0, 0, 0},
- {18, 0, 18, 1, 0, 0, 0},
- {25, 0, 9, 0, 0, 0, 0},
- {21, 0, 12, 0, 0, 0, 0},
- {17, 0, 9, 0, 0, 0, 0},
- {13, 0, 8, 0, 0, 0, 0},
- {25, 0, 18, 1, 0, 0, 0},
- {25, 0, 18, 0, 0, 0, 0},
- {9, 0, 0, 0, 0, 0, 1},
- {24, 0, 18, 0, 0, 0, 0},
- {16, 0, 18, 0, 0, 0, 0},
- {5, 0, 0, 0, 0, 0, 1},
- {21, 0, 18, 0, 1, 0, 0},
+ {18, 0, 18, 1, 0, 0, 1},
+ {25, 0, 9, 0, 0, 0, 14},
+ {21, 0, 12, 0, 0, 0, 1},
+ {17, 0, 9, 0, 0, 0, 14},
+ {21, 0, 12, 0, 0, 0, 14},
+ {13, 0, 8, 0, 0, 0, 14},
+ {21, 0, 12, 0, 0, 0, 5},
+ {21, 0, 18, 0, 0, 0, 5},
+ {25, 0, 18, 1, 0, 0, 14},
+ {25, 0, 18, 0, 0, 0, 14},
+ {9, 0, 0, 0, 0, 1, 14},
+ {24, 0, 18, 0, 0, 0, 14},
+ {16, 0, 18, 0, 0, 0, 14},
+ {5, 0, 0, 0, 0, 1, 14},
+ {21, 0, 18, 0, 1, 0, 1},
{22, 0, 18, 1, 1, 0, 0},
- {18, 0, 18, 1, 1, 0, 0},
- {7, 0, 0, 0, 1, 0, 33},
- {6, 0, 0, 0, 1, 0, 0},
- {7, 0, 0, 0, 1, 0, 24},
- {26, 0, 18, 0, 0, 0, 0},
- {26, 0, 18, 0, 1, 0, 0},
- {25, 0, 18, 0, 1, 0, 0},
- {1, 0, 18, 0, 5, 0, 0},
- {7, 0, 0, 0, 5, 0, 47},
- {14, 0, 18, 0, 5, 0, 2},
- {15, 0, 18, 0, 5, 0, 2},
- {26, 0, 18, 0, 5, 0, 2},
- {7, 0, 0, 0, 5, 0, 73},
- {7, 0, 0, 0, 5, 0, 74},
- {7, 0, 0, 0, 5, 0, 37},
- {15, 0, 0, 0, 5, 0, 37},
- {7, 0, 0, 0, 5, 0, 38},
- {14, 0, 0, 0, 5, 0, 38},
- {7, 0, 0, 0, 5, 0, 118},
- {12, 230, 13, 0, 5, 0, 118},
- {7, 0, 0, 0, 5, 0, 48},
- {21, 0, 0, 0, 5, 0, 48},
- {7, 0, 0, 0, 5, 0, 59},
- {21, 0, 0, 0, 5, 0, 59},
- {14, 0, 0, 0, 5, 0, 59},
- {9, 0, 0, 0, 5, 0, 39},
- {5, 0, 0, 0, 5, 0, 39},
- {7, 0, 0, 0, 5, 0, 49},
- {7, 0, 0, 0, 5, 0, 50},
- {13, 0, 0, 0, 5, 0, 50},
- {7, 0, 0, 0, 5, 0, 106},
- {7, 0, 0, 0, 5, 0, 104},
- {21, 0, 0, 0, 5, 0, 104},
- {7, 0, 0, 0, 5, 0, 110},
- {7, 0, 3, 0, 5, 0, 51},
- {7, 0, 3, 0, 5, 0, 86},
- {21, 0, 3, 0, 5, 0, 86},
- {15, 0, 3, 0, 5, 0, 86},
- {7, 0, 3, 0, 5, 0, 120},
- {26, 0, 3, 0, 5, 0, 120},
- {15, 0, 3, 0, 5, 0, 120},
- {7, 0, 3, 0, 5, 0, 116},
- {15, 0, 3, 0, 5, 0, 116},
- {7, 0, 3, 0, 5, 0, 128},
- {15, 0, 3, 0, 5, 0, 128},
- {7, 0, 3, 0, 5, 0, 63},
- {15, 0, 3, 0, 5, 0, 63},
- {21, 0, 18, 0, 5, 0, 63},
- {7, 0, 3, 0, 5, 0, 75},
- {21, 0, 3, 0, 5, 0, 75},
- {7, 0, 3, 0, 5, 0, 97},
- {7, 0, 3, 0, 5, 0, 96},
- {15, 0, 3, 0, 5, 0, 96},
- {7, 0, 3, 0, 5, 0, 60},
- {12, 0, 13, 0, 5, 0, 60},
- {12, 220, 13, 0, 5, 0, 60},
- {12, 230, 13, 0, 5, 0, 60},
- {12, 1, 13, 0, 5, 0, 60},
- {12, 9, 13, 0, 5, 0, 60},
- {15, 0, 3, 0, 5, 0, 60},
- {21, 0, 3, 0, 5, 0, 60},
- {7, 0, 3, 0, 5, 0, 87},
- {15, 0, 3, 0, 5, 0, 87},
- {21, 0, 3, 0, 5, 0, 87},
- {7, 0, 3, 0, 5, 0, 117},
- {15, 0, 3, 0, 5, 0, 117},
- {7, 0, 3, 0, 5, 0, 112},
- {26, 0, 3, 0, 5, 0, 112},
- {12, 230, 13, 0, 5, 0, 112},
- {12, 220, 13, 0, 5, 0, 112},
- {15, 0, 3, 0, 5, 0, 112},
- {21, 0, 3, 0, 5, 0, 112},
- {7, 0, 3, 0, 5, 0, 79},
- {21, 0, 18, 0, 5, 0, 79},
- {7, 0, 3, 0, 5, 0, 88},
- {15, 0, 3, 0, 5, 0, 88},
- {7, 0, 3, 0, 5, 0, 89},
- {15, 0, 3, 0, 5, 0, 89},
- {7, 0, 3, 0, 5, 0, 122},
- {21, 0, 3, 0, 5, 0, 122},
- {15, 0, 3, 0, 5, 0, 122},
- {7, 0, 3, 0, 5, 0, 90},
- {9, 0, 3, 0, 5, 0, 130},
- {5, 0, 3, 0, 5, 0, 130},
- {15, 0, 3, 0, 5, 0, 130},
- {15, 0, 11, 0, 5, 0, 6},
- {10, 0, 0, 0, 5, 0, 93},
- {12, 0, 13, 0, 5, 0, 93},
- {7, 0, 0, 0, 5, 0, 93},
- {12, 9, 13, 0, 5, 0, 93},
- {21, 0, 0, 0, 5, 0, 93},
- {15, 0, 18, 0, 5, 0, 93},
- {13, 0, 0, 0, 5, 0, 93},
- {12, 0, 13, 0, 5, 0, 91},
- {10, 0, 0, 0, 5, 0, 91},
- {7, 0, 0, 0, 5, 0, 91},
- {12, 9, 13, 0, 5, 0, 91},
- {12, 7, 13, 0, 5, 0, 91},
- {21, 0, 0, 0, 5, 0, 91},
- {1, 0, 0, 0, 5, 0, 91},
- {7, 0, 0, 0, 5, 0, 100},
- {13, 0, 0, 0, 5, 0, 100},
- {12, 230, 13, 0, 5, 0, 95},
- {7, 0, 0, 0, 5, 0, 95},
- {12, 0, 13, 0, 5, 0, 95},
- {10, 0, 0, 0, 5, 0, 95},
- {12, 9, 13, 0, 5, 0, 95},
- {13, 0, 0, 0, 5, 0, 95},
- {21, 0, 0, 0, 5, 0, 95},
- {7, 0, 0, 0, 5, 0, 111},
- {12, 7, 13, 0, 5, 0, 111},
- {21, 0, 0, 0, 5, 0, 111},
- {12, 0, 13, 0, 5, 0, 99},
- {10, 0, 0, 0, 5, 0, 99},
- {7, 0, 0, 0, 5, 0, 99},
- {10, 9, 0, 0, 5, 0, 99},
- {21, 0, 0, 0, 5, 0, 99},
- {12, 7, 13, 0, 5, 0, 99},
- {13, 0, 0, 0, 5, 0, 99},
- {15, 0, 0, 0, 5, 0, 18},
- {7, 0, 0, 0, 5, 0, 108},
- {10, 0, 0, 0, 5, 0, 108},
- {12, 0, 13, 0, 5, 0, 108},
- {10, 9, 0, 0, 5, 0, 108},
- {12, 7, 13, 0, 5, 0, 108},
- {21, 0, 0, 0, 5, 0, 108},
- {7, 0, 0, 0, 5, 0, 129},
- {21, 0, 0, 0, 5, 0, 129},
- {7, 0, 0, 0, 5, 0, 109},
- {12, 0, 13, 0, 5, 0, 109},
- {10, 0, 0, 0, 5, 0, 109},
- {12, 7, 13, 0, 5, 0, 109},
- {12, 9, 13, 0, 5, 0, 109},
- {13, 0, 0, 0, 5, 0, 109},
- {12, 0, 13, 0, 5, 0, 107},
- {10, 0, 0, 0, 5, 0, 107},
- {7, 0, 0, 0, 5, 0, 107},
- {12, 7, 13, 0, 5, 0, 107},
- {10, 9, 0, 0, 5, 0, 107},
- {12, 230, 13, 0, 5, 0, 107},
- {7, 0, 0, 0, 5, 0, 124},
- {10, 0, 0, 0, 5, 0, 124},
- {12, 0, 13, 0, 5, 0, 124},
- {12, 9, 13, 0, 5, 0, 124},
- {12, 7, 13, 0, 5, 0, 124},
- {21, 0, 0, 0, 5, 0, 124},
- {13, 0, 0, 0, 5, 0, 124},
- {7, 0, 0, 0, 5, 0, 123},
- {10, 0, 0, 0, 5, 0, 123},
- {12, 0, 13, 0, 5, 0, 123},
- {12, 9, 13, 0, 5, 0, 123},
- {12, 7, 13, 0, 5, 0, 123},
- {21, 0, 0, 0, 5, 0, 123},
- {7, 0, 0, 0, 5, 0, 114},
- {10, 0, 0, 0, 5, 0, 114},
- {12, 0, 13, 0, 5, 0, 114},
- {12, 9, 13, 0, 5, 0, 114},
- {21, 0, 0, 0, 5, 0, 114},
- {13, 0, 0, 0, 5, 0, 114},
- {7, 0, 0, 0, 5, 0, 101},
- {12, 0, 13, 0, 5, 0, 101},
- {10, 0, 0, 0, 5, 0, 101},
- {10, 9, 0, 0, 5, 0, 101},
- {12, 7, 13, 0, 5, 0, 101},
- {13, 0, 0, 0, 5, 0, 101},
- {7, 0, 0, 0, 5, 0, 126},
- {12, 0, 13, 0, 5, 0, 126},
- {10, 0, 0, 0, 5, 0, 126},
- {12, 9, 13, 0, 5, 0, 126},
- {13, 0, 0, 0, 5, 0, 126},
- {15, 0, 0, 0, 5, 0, 126},
- {21, 0, 0, 0, 5, 0, 126},
- {26, 0, 0, 0, 5, 0, 126},
- {9, 0, 0, 0, 5, 0, 125},
- {5, 0, 0, 0, 5, 0, 125},
- {13, 0, 0, 0, 5, 0, 125},
- {15, 0, 0, 0, 5, 0, 125},
- {7, 0, 0, 0, 5, 0, 125},
- {7, 0, 0, 0, 5, 0, 121},
- {7, 0, 0, 0, 5, 0, 62},
- {14, 0, 0, 0, 5, 0, 62},
- {21, 0, 0, 0, 5, 0, 62},
- {7, 0, 0, 0, 5, 0, 80},
- {7, 0, 0, 0, 5, 0, 127},
- {7, 0, 0, 0, 5, 0, 115},
- {13, 0, 0, 0, 5, 0, 115},
- {21, 0, 0, 0, 5, 0, 115},
- {7, 0, 0, 0, 5, 0, 103},
- {12, 1, 13, 0, 5, 0, 103},
- {21, 0, 0, 0, 5, 0, 103},
- {7, 0, 0, 0, 5, 0, 119},
- {12, 230, 13, 0, 5, 0, 119},
- {21, 0, 0, 0, 5, 0, 119},
- {26, 0, 0, 0, 5, 0, 119},
- {6, 0, 0, 0, 5, 0, 119},
- {13, 0, 0, 0, 5, 0, 119},
- {15, 0, 0, 0, 5, 0, 119},
- {7, 0, 0, 0, 5, 0, 98},
- {10, 0, 0, 0, 5, 0, 98},
- {12, 0, 13, 0, 5, 0, 98},
- {6, 0, 0, 0, 5, 0, 98},
- {7, 0, 0, 0, 5, 0, 105},
- {26, 0, 0, 0, 5, 0, 105},
- {12, 0, 13, 0, 5, 0, 105},
- {12, 1, 13, 0, 5, 0, 105},
- {21, 0, 0, 0, 5, 0, 105},
- {10, 216, 0, 0, 5, 0, 0},
- {10, 226, 0, 0, 5, 0, 0},
- {12, 230, 13, 0, 5, 0, 2},
- {25, 0, 0, 0, 5, 0, 0},
- {13, 0, 8, 0, 5, 0, 0},
- {26, 0, 0, 0, 5, 0, 131},
- {12, 0, 13, 0, 5, 0, 131},
- {21, 0, 0, 0, 5, 0, 131},
- {7, 0, 3, 0, 5, 0, 113},
- {15, 0, 3, 0, 5, 0, 113},
- {12, 220, 13, 0, 5, 0, 113},
- {26, 0, 0, 0, 2, 0, 32},
+ {18, 0, 18, 1, 1, 0, 1},
+ {21, 0, 18, 0, 1, 0, 5},
+ {7, 0, 0, 0, 1, 33, 14},
+ {7, 0, 0, 0, 1, 33, 32},
+ {6, 0, 0, 0, 1, 0, 32},
+ {6, 0, 0, 0, 1, 0, 5},
+ {7, 0, 0, 0, 1, 24, 14},
+ {23, 0, 10, 0, 0, 0, 10},
+ {26, 0, 18, 0, 0, 0, 14},
+ {26, 0, 18, 0, 1, 0, 12},
+ {25, 0, 18, 0, 1, 0, 12},
+ {1, 0, 18, 0, 5, 0, 21},
+ {26, 0, 18, 0, 5, 0, 31},
+ {7, 0, 0, 0, 5, 47, 12},
+ {14, 0, 18, 0, 5, 2, 12},
+ {15, 0, 18, 0, 5, 2, 12},
+ {26, 0, 18, 0, 5, 2, 12},
+ {26, 0, 0, 0, 5, 2, 12},
+ {7, 0, 0, 0, 5, 73, 12},
+ {7, 0, 0, 0, 5, 74, 12},
+ {7, 0, 0, 0, 5, 37, 12},
+ {15, 0, 0, 0, 5, 37, 12},
+ {7, 0, 0, 0, 5, 38, 12},
+ {14, 0, 0, 0, 5, 38, 12},
+ {7, 0, 0, 0, 5, 118, 12},
+ {12, 230, 13, 0, 5, 118, 21},
+ {7, 0, 0, 0, 5, 48, 12},
+ {21, 0, 0, 0, 5, 48, 17},
+ {7, 0, 0, 0, 5, 59, 12},
+ {21, 0, 0, 0, 5, 59, 17},
+ {14, 0, 0, 0, 5, 59, 12},
+ {9, 0, 0, 0, 5, 39, 12},
+ {5, 0, 0, 0, 5, 39, 12},
+ {7, 0, 0, 0, 5, 49, 12},
+ {7, 0, 0, 0, 5, 50, 12},
+ {13, 0, 0, 0, 5, 50, 11},
+ {9, 0, 0, 0, 5, 136, 12},
+ {5, 0, 0, 0, 5, 136, 12},
+ {7, 0, 0, 0, 5, 106, 12},
+ {7, 0, 0, 0, 5, 104, 12},
+ {21, 0, 0, 0, 5, 104, 12},
+ {7, 0, 0, 0, 5, 110, 12},
+ {7, 0, 3, 0, 5, 51, 12},
+ {7, 0, 3, 0, 5, 86, 12},
+ {21, 0, 3, 0, 5, 86, 17},
+ {15, 0, 3, 0, 5, 86, 12},
+ {7, 0, 3, 0, 5, 120, 12},
+ {26, 0, 3, 0, 5, 120, 12},
+ {15, 0, 3, 0, 5, 120, 12},
+ {7, 0, 3, 0, 5, 116, 12},
+ {15, 0, 3, 0, 5, 116, 12},
+ {7, 0, 3, 0, 5, 128, 12},
+ {15, 0, 3, 0, 5, 128, 12},
+ {7, 0, 3, 0, 5, 63, 12},
+ {15, 0, 3, 0, 5, 63, 12},
+ {21, 0, 18, 0, 5, 63, 17},
+ {7, 0, 3, 0, 5, 75, 12},
+ {21, 0, 3, 0, 5, 75, 12},
+ {7, 0, 3, 0, 5, 97, 12},
+ {7, 0, 3, 0, 5, 96, 12},
+ {15, 0, 3, 0, 5, 96, 12},
+ {7, 0, 3, 0, 5, 60, 12},
+ {12, 0, 13, 0, 5, 60, 21},
+ {12, 220, 13, 0, 5, 60, 21},
+ {12, 230, 13, 0, 5, 60, 21},
+ {12, 1, 13, 0, 5, 60, 21},
+ {12, 9, 13, 0, 5, 60, 21},
+ {15, 0, 3, 0, 5, 60, 12},
+ {21, 0, 3, 0, 5, 60, 17},
+ {21, 0, 3, 0, 5, 60, 12},
+ {7, 0, 3, 0, 5, 87, 12},
+ {15, 0, 3, 0, 5, 87, 12},
+ {21, 0, 3, 0, 5, 87, 12},
+ {7, 0, 3, 0, 5, 117, 12},
+ {15, 0, 3, 0, 5, 117, 12},
+ {7, 0, 3, 0, 5, 112, 12},
+ {26, 0, 3, 0, 5, 112, 12},
+ {12, 230, 13, 0, 5, 112, 21},
+ {12, 220, 13, 0, 5, 112, 21},
+ {15, 0, 3, 0, 5, 112, 12},
+ {21, 0, 3, 0, 5, 112, 17},
+ {21, 0, 3, 0, 5, 112, 15},
+ {7, 0, 3, 0, 5, 79, 12},
+ {21, 0, 18, 0, 5, 79, 17},
+ {7, 0, 3, 0, 5, 88, 12},
+ {15, 0, 3, 0, 5, 88, 12},
+ {7, 0, 3, 0, 5, 89, 12},
+ {15, 0, 3, 0, 5, 89, 12},
+ {7, 0, 3, 0, 5, 122, 12},
+ {21, 0, 3, 0, 5, 122, 12},
+ {15, 0, 3, 0, 5, 122, 12},
+ {7, 0, 3, 0, 5, 90, 12},
+ {9, 0, 3, 0, 5, 130, 12},
+ {5, 0, 3, 0, 5, 130, 12},
+ {15, 0, 3, 0, 5, 130, 12},
+ {15, 0, 11, 0, 5, 6, 12},
+ {10, 0, 0, 0, 5, 93, 21},
+ {12, 0, 13, 0, 5, 93, 21},
+ {7, 0, 0, 0, 5, 93, 12},
+ {12, 9, 13, 0, 5, 93, 21},
+ {21, 0, 0, 0, 5, 93, 17},
+ {21, 0, 0, 0, 5, 93, 12},
+ {15, 0, 18, 0, 5, 93, 12},
+ {13, 0, 0, 0, 5, 93, 11},
+ {12, 0, 13, 0, 5, 91, 21},
+ {10, 0, 0, 0, 5, 91, 21},
+ {7, 0, 0, 0, 5, 91, 12},
+ {12, 9, 13, 0, 5, 91, 21},
+ {12, 7, 13, 0, 5, 91, 21},
+ {21, 0, 0, 0, 5, 91, 12},
+ {1, 0, 0, 0, 5, 91, 12},
+ {21, 0, 0, 0, 5, 91, 17},
+ {7, 0, 0, 0, 5, 100, 12},
+ {13, 0, 0, 0, 5, 100, 11},
+ {12, 230, 13, 0, 5, 95, 21},
+ {7, 0, 0, 0, 5, 95, 12},
+ {12, 0, 13, 0, 5, 95, 21},
+ {10, 0, 0, 0, 5, 95, 21},
+ {12, 9, 13, 0, 5, 95, 21},
+ {13, 0, 0, 0, 5, 95, 11},
+ {21, 0, 0, 0, 5, 95, 17},
+ {7, 0, 0, 0, 5, 111, 12},
+ {12, 7, 13, 0, 5, 111, 21},
+ {21, 0, 0, 0, 5, 111, 12},
+ {21, 0, 0, 0, 5, 111, 18},
+ {12, 0, 13, 0, 5, 99, 21},
+ {10, 0, 0, 0, 5, 99, 21},
+ {7, 0, 0, 0, 5, 99, 12},
+ {10, 9, 0, 0, 5, 99, 21},
+ {21, 0, 0, 0, 5, 99, 17},
+ {21, 0, 0, 0, 5, 99, 12},
+ {12, 7, 13, 0, 5, 99, 21},
+ {13, 0, 0, 0, 5, 99, 11},
+ {21, 0, 0, 0, 5, 99, 18},
+ {15, 0, 0, 0, 5, 18, 12},
+ {7, 0, 0, 0, 5, 108, 12},
+ {10, 0, 0, 0, 5, 108, 21},
+ {12, 0, 13, 0, 5, 108, 21},
+ {10, 9, 0, 0, 5, 108, 21},
+ {12, 7, 13, 0, 5, 108, 21},
+ {21, 0, 0, 0, 5, 108, 17},
+ {21, 0, 0, 0, 5, 108, 12},
+ {7, 0, 0, 0, 5, 129, 12},
+ {21, 0, 0, 0, 5, 129, 17},
+ {7, 0, 0, 0, 5, 109, 12},
+ {12, 0, 13, 0, 5, 109, 21},
+ {10, 0, 0, 0, 5, 109, 21},
+ {12, 7, 13, 0, 5, 109, 21},
+ {12, 9, 13, 0, 5, 109, 21},
+ {13, 0, 0, 0, 5, 109, 11},
+ {12, 0, 13, 0, 5, 107, 21},
+ {10, 0, 0, 0, 5, 107, 21},
+ {7, 0, 0, 0, 5, 107, 12},
+ {12, 7, 13, 0, 5, 107, 21},
+ {10, 9, 0, 0, 5, 107, 21},
+ {12, 230, 13, 0, 5, 107, 21},
+ {7, 0, 0, 0, 5, 135, 12},
+ {10, 0, 0, 0, 5, 135, 21},
+ {12, 0, 13, 0, 5, 135, 21},
+ {12, 9, 13, 0, 5, 135, 21},
+ {12, 7, 13, 0, 5, 135, 21},
+ {21, 0, 0, 0, 5, 135, 17},
+ {21, 0, 0, 0, 5, 135, 12},
+ {13, 0, 0, 0, 5, 135, 11},
+ {7, 0, 0, 0, 5, 124, 12},
+ {10, 0, 0, 0, 5, 124, 21},
+ {12, 0, 13, 0, 5, 124, 21},
+ {12, 9, 13, 0, 5, 124, 21},
+ {12, 7, 13, 0, 5, 124, 21},
+ {21, 0, 0, 0, 5, 124, 12},
+ {13, 0, 0, 0, 5, 124, 11},
+ {7, 0, 0, 0, 5, 123, 12},
+ {10, 0, 0, 0, 5, 123, 21},
+ {12, 0, 13, 0, 5, 123, 21},
+ {12, 9, 13, 0, 5, 123, 21},
+ {12, 7, 13, 0, 5, 123, 21},
+ {21, 0, 0, 0, 5, 123, 18},
+ {21, 0, 0, 0, 5, 123, 17},
+ {21, 0, 0, 0, 5, 123, 6},
+ {21, 0, 0, 0, 5, 123, 12},
+ {7, 0, 0, 0, 5, 114, 12},
+ {10, 0, 0, 0, 5, 114, 21},
+ {12, 0, 13, 0, 5, 114, 21},
+ {12, 9, 13, 0, 5, 114, 21},
+ {21, 0, 0, 0, 5, 114, 17},
+ {21, 0, 0, 0, 5, 114, 12},
+ {13, 0, 0, 0, 5, 114, 11},
+ {21, 0, 18, 0, 5, 31, 18},
+ {7, 0, 0, 0, 5, 101, 12},
+ {12, 0, 13, 0, 5, 101, 21},
+ {10, 0, 0, 0, 5, 101, 21},
+ {10, 9, 0, 0, 5, 101, 21},
+ {12, 7, 13, 0, 5, 101, 21},
+ {13, 0, 0, 0, 5, 101, 11},
+ {7, 0, 0, 0, 5, 126, 38},
+ {12, 0, 13, 0, 5, 126, 38},
+ {10, 0, 0, 0, 5, 126, 38},
+ {12, 9, 13, 0, 5, 126, 38},
+ {13, 0, 0, 0, 5, 126, 11},
+ {15, 0, 0, 0, 5, 126, 38},
+ {21, 0, 0, 0, 5, 126, 17},
+ {26, 0, 0, 0, 5, 126, 38},
+ {9, 0, 0, 0, 5, 125, 12},
+ {5, 0, 0, 0, 5, 125, 12},
+ {13, 0, 0, 0, 5, 125, 11},
+ {15, 0, 0, 0, 5, 125, 12},
+ {7, 0, 0, 0, 5, 125, 12},
+ {7, 0, 0, 0, 5, 121, 12},
+ {7, 0, 0, 0, 5, 133, 12},
+ {10, 0, 0, 0, 5, 133, 21},
+ {12, 0, 13, 0, 5, 133, 21},
+ {12, 9, 0, 0, 5, 133, 21},
+ {21, 0, 0, 0, 5, 133, 17},
+ {13, 0, 0, 0, 5, 133, 11},
+ {15, 0, 0, 0, 5, 133, 12},
+ {21, 0, 0, 0, 5, 134, 18},
+ {21, 0, 0, 0, 5, 134, 6},
+ {7, 0, 0, 0, 5, 134, 12},
+ {12, 0, 13, 0, 5, 134, 21},
+ {10, 0, 0, 0, 5, 134, 21},
+ {7, 0, 0, 0, 5, 62, 12},
+ {14, 0, 0, 0, 5, 62, 12},
+ {21, 0, 0, 0, 5, 62, 17},
+ {7, 0, 0, 0, 5, 80, 12},
+ {7, 0, 0, 0, 5, 80, 0},
+ {7, 0, 0, 0, 5, 80, 1},
+ {7, 0, 0, 0, 5, 127, 12},
+ {7, 0, 0, 0, 5, 127, 0},
+ {7, 0, 0, 0, 5, 127, 1},
+ {7, 0, 0, 0, 5, 115, 12},
+ {13, 0, 0, 0, 5, 115, 11},
+ {21, 0, 0, 0, 5, 115, 17},
+ {7, 0, 0, 0, 5, 103, 12},
+ {12, 1, 13, 0, 5, 103, 21},
+ {21, 0, 0, 0, 5, 103, 17},
+ {7, 0, 0, 0, 5, 119, 12},
+ {12, 230, 13, 0, 5, 119, 21},
+ {21, 0, 0, 0, 5, 119, 17},
+ {21, 0, 0, 0, 5, 119, 12},
+ {26, 0, 0, 0, 5, 119, 12},
+ {6, 0, 0, 0, 5, 119, 12},
+ {13, 0, 0, 0, 5, 119, 11},
+ {15, 0, 0, 0, 5, 119, 12},
+ {7, 0, 0, 0, 5, 98, 12},
+ {10, 0, 0, 0, 5, 98, 21},
+ {12, 0, 13, 0, 5, 98, 21},
+ {6, 0, 0, 0, 5, 98, 12},
+ {6, 0, 0, 0, 2, 137, 5},
+ {7, 0, 0, 0, 2, 137, 14},
+ {7, 0, 0, 0, 5, 105, 12},
+ {26, 0, 0, 0, 5, 105, 12},
+ {12, 0, 13, 0, 5, 105, 21},
+ {12, 1, 13, 0, 5, 105, 21},
+ {21, 0, 0, 0, 5, 105, 17},
+ {10, 216, 0, 0, 5, 0, 21},
+ {10, 226, 0, 0, 5, 0, 21},
+ {12, 230, 13, 0, 5, 2, 21},
+ {25, 0, 0, 0, 5, 0, 12},
+ {13, 0, 8, 0, 5, 0, 11},
+ {26, 0, 0, 0, 5, 131, 12},
+ {12, 0, 13, 0, 5, 131, 21},
+ {21, 0, 0, 0, 5, 131, 17},
+ {21, 0, 0, 0, 5, 131, 12},
+ {12, 230, 13, 0, 5, 56, 21},
+ {7, 0, 3, 0, 5, 113, 12},
+ {15, 0, 3, 0, 5, 113, 12},
+ {12, 220, 13, 0, 5, 113, 21},
+ {9, 0, 3, 0, 5, 132, 12},
+ {5, 0, 3, 0, 5, 132, 12},
+ {12, 230, 13, 0, 5, 132, 21},
+ {12, 7, 13, 0, 5, 132, 21},
+ {13, 0, 3, 0, 5, 132, 11},
+ {21, 0, 3, 0, 5, 132, 0},
+ {2, 0, 18, 0, 5, 102, 14},
+ {26, 0, 0, 0, 2, 0, 29},
+ {26, 0, 0, 0, 5, 0, 28},
+ {26, 0, 0, 0, 2, 32, 14},
+ {24, 0, 18, 0, 2, 0, 41},
+ {26, 0, 18, 0, 5, 0, 5},
};
#define BIDI_MIRROR_LEN 364
@@ -1186,6 +1364,130 @@
{65379, 65378},
};
+#define BIDI_BRACKET_LEN 120
+static const BracketPair bracket_pairs[] = {
+ {40, 41, 0},
+ {41, 40, 1},
+ {91, 93, 0},
+ {93, 91, 1},
+ {123, 125, 0},
+ {125, 123, 1},
+ {3898, 3899, 0},
+ {3899, 3898, 1},
+ {3900, 3901, 0},
+ {3901, 3900, 1},
+ {5787, 5788, 0},
+ {5788, 5787, 1},
+ {8261, 8262, 0},
+ {8262, 8261, 1},
+ {8317, 8318, 0},
+ {8318, 8317, 1},
+ {8333, 8334, 0},
+ {8334, 8333, 1},
+ {8968, 8969, 0},
+ {8969, 8968, 1},
+ {8970, 8971, 0},
+ {8971, 8970, 1},
+ {9001, 9002, 0},
+ {9002, 9001, 1},
+ {10088, 10089, 0},
+ {10089, 10088, 1},
+ {10090, 10091, 0},
+ {10091, 10090, 1},
+ {10092, 10093, 0},
+ {10093, 10092, 1},
+ {10094, 10095, 0},
+ {10095, 10094, 1},
+ {10096, 10097, 0},
+ {10097, 10096, 1},
+ {10098, 10099, 0},
+ {10099, 10098, 1},
+ {10100, 10101, 0},
+ {10101, 10100, 1},
+ {10181, 10182, 0},
+ {10182, 10181, 1},
+ {10214, 10215, 0},
+ {10215, 10214, 1},
+ {10216, 10217, 0},
+ {10217, 10216, 1},
+ {10218, 10219, 0},
+ {10219, 10218, 1},
+ {10220, 10221, 0},
+ {10221, 10220, 1},
+ {10222, 10223, 0},
+ {10223, 10222, 1},
+ {10627, 10628, 0},
+ {10628, 10627, 1},
+ {10629, 10630, 0},
+ {10630, 10629, 1},
+ {10631, 10632, 0},
+ {10632, 10631, 1},
+ {10633, 10634, 0},
+ {10634, 10633, 1},
+ {10635, 10636, 0},
+ {10636, 10635, 1},
+ {10637, 10640, 0},
+ {10638, 10639, 1},
+ {10639, 10638, 0},
+ {10640, 10637, 1},
+ {10641, 10642, 0},
+ {10642, 10641, 1},
+ {10643, 10644, 0},
+ {10644, 10643, 1},
+ {10645, 10646, 0},
+ {10646, 10645, 1},
+ {10647, 10648, 0},
+ {10648, 10647, 1},
+ {10712, 10713, 0},
+ {10713, 10712, 1},
+ {10714, 10715, 0},
+ {10715, 10714, 1},
+ {10748, 10749, 0},
+ {10749, 10748, 1},
+ {11810, 11811, 0},
+ {11811, 11810, 1},
+ {11812, 11813, 0},
+ {11813, 11812, 1},
+ {11814, 11815, 0},
+ {11815, 11814, 1},
+ {11816, 11817, 0},
+ {11817, 11816, 1},
+ {12296, 12297, 0},
+ {12297, 12296, 1},
+ {12298, 12299, 0},
+ {12299, 12298, 1},
+ {12300, 12301, 0},
+ {12301, 12300, 1},
+ {12302, 12303, 0},
+ {12303, 12302, 1},
+ {12304, 12305, 0},
+ {12305, 12304, 1},
+ {12308, 12309, 0},
+ {12309, 12308, 1},
+ {12310, 12311, 0},
+ {12311, 12310, 1},
+ {12312, 12313, 0},
+ {12313, 12312, 1},
+ {12314, 12315, 0},
+ {12315, 12314, 1},
+ {65113, 65114, 0},
+ {65114, 65113, 1},
+ {65115, 65116, 0},
+ {65116, 65115, 1},
+ {65117, 65118, 0},
+ {65118, 65117, 1},
+ {65288, 65289, 0},
+ {65289, 65288, 1},
+ {65339, 65341, 0},
+ {65341, 65339, 1},
+ {65371, 65373, 0},
+ {65373, 65371, 1},
+ {65375, 65376, 0},
+ {65376, 65375, 1},
+ {65378, 65379, 0},
+ {65379, 65378, 1},
+};
+
/* Reindexing of NFC first characters. */
#define TOTAL_FIRST 376
#define TOTAL_LAST 62
@@ -1585,6 +1887,12 @@
#define UCDN_SCRIPT_MULTANI 129
#define UCDN_SCRIPT_OLD_HUNGARIAN 130
#define UCDN_SCRIPT_SIGNWRITING 131
+#define UCDN_SCRIPT_ADLAM 132
+#define UCDN_SCRIPT_BHAIKSUKI 133
+#define UCDN_SCRIPT_MARCHEN 134
+#define UCDN_SCRIPT_NEWA 135
+#define UCDN_SCRIPT_OSAGE 136
+#define UCDN_SCRIPT_TANGUT 137
#define UCDN_GENERAL_CATEGORY_CC 0
#define UCDN_GENERAL_CATEGORY_CF 1
@@ -1654,27 +1962,27 @@
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 54, 55, 56, 56, 56, 57,
- 58, 59, 60, 61, 62, 63, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
- 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
- 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 67, 67, 67,
- 67, 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 52, 69, 70, 71, 72, 73,
- 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 88, 90,
- 91, 92, 93, 94, 95, 96, 97, 98, 88, 99, 88, 88, 88, 88, 88, 100, 100,
- 100, 101, 102, 103, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 104, 104,
- 104, 104, 105, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 106, 106, 107, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 108, 108, 109, 110, 88, 88, 88, 111, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 112, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 113, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 114,
- 115, 116, 117, 118, 119, 120, 121, 122, 122, 123, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 124, 88, 88, 88, 88, 88, 125, 88, 126, 127,
- 128, 129, 130, 131, 132, 133, 134, 135, 88, 88, 88, 88, 88, 88, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+ 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 65, 66, 67, 68,
+ 69, 70, 71, 65, 66, 67, 68, 69, 70, 71, 65, 66, 67, 68, 69, 70, 71, 65,
+ 66, 67, 68, 69, 70, 71, 65, 66, 67, 68, 69, 70, 71, 65, 72, 73, 73, 73,
+ 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 52, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 94, 96,
+ 97, 98, 99, 100, 101, 102, 103, 104, 94, 105, 94, 106, 94, 94, 94, 107,
+ 107, 107, 108, 109, 110, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 111,
+ 111, 112, 113, 114, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 115, 116, 117, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 118, 118, 119, 120, 94, 94, 94, 121, 122, 122, 122, 122, 122,
+ 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+ 122, 122, 122, 122, 123, 122, 122, 124, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 125, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 126, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 127, 128, 129, 130, 131, 132, 133, 134, 135,
+ 135, 136, 94, 94, 94, 94, 94, 137, 94, 94, 94, 94, 94, 94, 94, 138, 139,
+ 94, 94, 94, 94, 140, 94, 141, 142, 143, 144, 145, 146, 147, 148, 149,
+ 150, 151, 151, 151, 151, 151, 152, 52, 52, 52, 52, 52, 52, 52, 52, 52,
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
@@ -1683,215 +1991,216 @@
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 136, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 137, 138, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 139, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 52, 52, 141, 140, 140, 140, 140, 142, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 142, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 143, 144, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 145, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 145,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 153, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 154, 155, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 156,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 52, 52,
+ 158, 157, 157, 157, 157, 159, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 159, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 160, 161,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 162, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 162,
};
static const unsigned short index1[] = {
@@ -1912,992 +2221,1135 @@
146, 147, 148, 149, 128, 128, 128, 128, 128, 128, 150, 150, 150, 150,
151, 152, 153, 120, 154, 155, 156, 156, 156, 157, 158, 159, 160, 160,
161, 162, 163, 164, 165, 166, 167, 167, 167, 168, 120, 120, 120, 120,
- 120, 120, 120, 120, 128, 128, 169, 120, 120, 120, 120, 120, 170, 171,
- 172, 173, 174, 175, 175, 175, 175, 175, 175, 176, 177, 178, 179, 175,
- 180, 181, 182, 175, 183, 184, 185, 186, 186, 187, 188, 189, 190, 191,
- 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 201, 202, 203, 204,
- 205, 206, 207, 208, 209, 210, 211, 120, 212, 213, 214, 215, 215, 216,
- 217, 218, 219, 220, 221, 120, 222, 223, 224, 225, 226, 227, 228, 229,
- 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 120, 240, 241,
- 242, 243, 244, 241, 245, 246, 247, 248, 249, 120, 250, 251, 252, 253,
- 254, 255, 256, 257, 257, 256, 257, 258, 259, 260, 261, 262, 263, 264,
- 120, 265, 266, 267, 268, 269, 269, 268, 270, 271, 272, 273, 274, 275,
- 276, 277, 278, 120, 279, 280, 281, 282, 282, 282, 282, 283, 284, 285,
- 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 293, 293, 296, 297,
- 294, 298, 299, 300, 301, 302, 303, 120, 304, 305, 305, 305, 305, 305,
- 306, 307, 308, 309, 310, 311, 120, 120, 120, 120, 312, 313, 314, 315,
- 316, 317, 318, 319, 320, 321, 322, 323, 120, 120, 120, 120, 324, 325,
- 326, 327, 328, 329, 330, 331, 332, 333, 332, 332, 332, 334, 335, 336,
- 337, 338, 339, 340, 339, 339, 339, 341, 342, 343, 344, 345, 120, 120,
- 120, 120, 346, 346, 346, 346, 346, 347, 348, 349, 350, 351, 352, 353,
- 354, 355, 356, 346, 357, 358, 350, 359, 360, 360, 360, 360, 361, 362,
- 363, 363, 363, 363, 363, 364, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366,
- 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 367, 367, 367, 367,
- 367, 367, 367, 367, 367, 368, 369, 368, 367, 367, 367, 367, 367, 368,
- 367, 367, 367, 367, 368, 369, 368, 367, 369, 367, 367, 367, 367, 367,
- 367, 367, 368, 367, 367, 367, 367, 367, 367, 367, 367, 370, 371, 372,
- 373, 374, 367, 367, 375, 376, 377, 377, 377, 377, 377, 377, 377, 377,
- 377, 377, 378, 379, 380, 381, 381, 381, 381, 381, 381, 381, 381, 381,
- 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
- 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
- 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
- 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
- 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 382, 381, 381,
- 383, 384, 384, 385, 386, 386, 386, 386, 386, 386, 386, 386, 386, 387,
- 388, 389, 390, 391, 392, 120, 393, 393, 394, 120, 395, 395, 396, 120,
- 397, 398, 399, 120, 400, 400, 400, 400, 400, 400, 401, 402, 403, 404,
- 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 415, 415, 415,
- 416, 415, 415, 415, 415, 415, 415, 120, 415, 415, 415, 415, 415, 417,
- 381, 381, 381, 381, 381, 381, 381, 381, 418, 120, 419, 419, 419, 420,
- 421, 422, 423, 424, 425, 426, 427, 427, 427, 428, 429, 120, 430, 430,
- 430, 430, 430, 431, 430, 430, 430, 432, 433, 434, 435, 435, 435, 435,
- 436, 436, 437, 438, 439, 439, 439, 439, 439, 439, 440, 441, 442, 443,
- 444, 445, 446, 447, 446, 447, 448, 449, 450, 451, 120, 120, 120, 120,
- 120, 120, 120, 120, 452, 453, 453, 453, 453, 453, 454, 455, 456, 457,
- 458, 459, 460, 461, 462, 463, 464, 465, 465, 465, 466, 467, 468, 469,
- 470, 470, 470, 470, 471, 472, 473, 474, 475, 475, 475, 475, 476, 477,
- 478, 479, 480, 481, 482, 483, 484, 484, 484, 485, 120, 120, 120, 120,
- 120, 120, 120, 120, 486, 120, 487, 488, 489, 490, 491, 492, 54, 54, 54,
- 54, 493, 494, 56, 56, 56, 56, 56, 495, 496, 497, 54, 498, 54, 54, 54,
- 499, 56, 56, 56, 500, 501, 502, 503, 504, 504, 504, 505, 506, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 507, 508, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 509, 510, 511, 512, 509, 510,
- 509, 510, 511, 512, 509, 513, 509, 510, 509, 511, 509, 514, 509, 514,
- 509, 514, 515, 516, 517, 518, 519, 520, 509, 521, 522, 523, 524, 525,
- 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539,
- 540, 541, 56, 542, 543, 544, 543, 545, 120, 120, 546, 547, 548, 549, 550,
- 120, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563,
- 564, 563, 565, 566, 567, 568, 569, 570, 571, 572, 573, 572, 574, 575,
- 572, 576, 572, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587,
- 588, 589, 590, 591, 592, 587, 587, 593, 594, 595, 596, 597, 587, 587,
- 598, 578, 599, 600, 587, 587, 601, 587, 587, 572, 602, 603, 572, 604,
- 605, 606, 607, 607, 607, 607, 607, 607, 607, 607, 608, 572, 572, 609,
- 610, 578, 578, 611, 572, 572, 572, 572, 577, 612, 572, 572, 613, 572,
- 572, 572, 572, 614, 120, 120, 120, 572, 613, 120, 120, 615, 615, 615,
- 615, 615, 616, 616, 617, 618, 618, 618, 618, 618, 618, 618, 618, 618,
- 619, 615, 615, 620, 620, 620, 620, 620, 620, 620, 620, 620, 621, 620,
- 620, 620, 620, 621, 572, 620, 620, 622, 572, 623, 573, 624, 625, 626,
- 627, 573, 572, 622, 576, 572, 578, 628, 629, 625, 630, 572, 572, 572,
- 572, 631, 572, 572, 572, 632, 633, 572, 572, 572, 572, 572, 634, 572,
- 635, 572, 634, 636, 637, 620, 620, 638, 620, 620, 620, 572, 572, 572,
- 572, 572, 572, 572, 639, 572, 572, 576, 572, 572, 640, 641, 615, 642,
- 642, 643, 572, 572, 572, 572, 572, 644, 645, 646, 647, 648, 649, 578,
- 578, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
- 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
- 650, 650, 650, 650, 650, 578, 578, 578, 578, 578, 578, 578, 578, 578,
- 578, 578, 578, 578, 578, 578, 578, 651, 652, 652, 653, 587, 587, 578,
- 654, 601, 655, 656, 657, 658, 659, 660, 661, 578, 662, 587, 663, 664,
- 665, 666, 647, 578, 578, 590, 654, 666, 667, 668, 669, 587, 587, 587,
- 587, 670, 671, 587, 587, 587, 587, 672, 673, 674, 647, 675, 676, 572,
- 572, 572, 572, 572, 572, 578, 578, 677, 678, 679, 573, 572, 572, 680,
- 572, 572, 572, 681, 572, 572, 572, 572, 682, 572, 683, 684, 120, 120,
- 685, 120, 120, 686, 686, 686, 686, 686, 687, 688, 688, 688, 688, 688,
- 689, 690, 691, 692, 693, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
- 694, 695, 696, 697, 698, 698, 698, 698, 699, 700, 701, 701, 701, 701,
- 701, 701, 701, 702, 703, 704, 367, 367, 369, 120, 369, 369, 369, 369,
- 369, 369, 369, 369, 705, 705, 705, 705, 706, 707, 708, 709, 710, 711,
- 533, 712, 713, 120, 120, 120, 120, 120, 120, 120, 714, 714, 714, 715,
- 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 716, 120, 714, 714,
- 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714,
- 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 717, 120, 120, 120,
- 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 729, 729,
- 729, 729, 729, 729, 729, 729, 730, 731, 732, 733, 733, 733, 733, 733,
- 733, 733, 733, 733, 733, 734, 735, 736, 736, 736, 736, 737, 738, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 739, 740, 741, 736, 736,
- 736, 742, 718, 718, 718, 718, 719, 120, 733, 733, 743, 743, 743, 744,
- 745, 746, 741, 741, 741, 747, 748, 749, 743, 743, 743, 750, 745, 746,
- 741, 741, 741, 741, 751, 749, 741, 752, 753, 753, 753, 753, 753, 754,
- 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 741, 741, 741,
- 755, 756, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 757,
- 741, 741, 741, 755, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
- 758, 758, 759, 760, 572, 572, 572, 572, 572, 572, 572, 572, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 759, 760, 760, 760,
- 760, 760, 761, 761, 762, 761, 761, 761, 761, 761, 761, 761, 761, 761,
- 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761,
- 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761,
- 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761,
- 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761,
- 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 763,
- 764, 764, 764, 764, 764, 764, 765, 120, 766, 766, 766, 766, 766, 767,
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 769, 768, 768, 770, 771, 120, 120, 101, 101,
- 101, 101, 101, 772, 773, 774, 101, 101, 101, 775, 776, 776, 776, 776,
- 776, 776, 776, 776, 777, 778, 779, 120, 64, 64, 780, 781, 782, 27, 783,
- 27, 27, 27, 27, 27, 27, 27, 784, 785, 27, 786, 787, 27, 27, 788, 789,
- 120, 120, 120, 120, 120, 120, 120, 790, 791, 792, 793, 794, 794, 795,
- 796, 797, 798, 799, 799, 799, 799, 799, 799, 800, 120, 801, 802, 802,
- 802, 802, 802, 803, 804, 805, 806, 807, 808, 809, 809, 810, 811, 812,
- 813, 814, 814, 815, 816, 817, 817, 818, 819, 820, 821, 365, 365, 365,
- 822, 823, 824, 824, 824, 824, 824, 825, 826, 827, 828, 829, 830, 831,
- 346, 350, 832, 833, 833, 833, 833, 833, 834, 835, 120, 836, 837, 838,
- 839, 346, 346, 840, 841, 842, 842, 842, 842, 842, 842, 843, 844, 845,
- 120, 120, 846, 847, 848, 849, 120, 850, 850, 850, 120, 369, 369, 54, 54,
- 54, 54, 54, 851, 852, 120, 853, 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 847, 847, 847, 847, 854, 855, 856, 857, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 858, 120, 366, 366, 859, 860, 366, 366, 366,
- 366, 366, 861, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862,
- 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862,
- 862, 862, 862, 862, 862, 862, 862, 863, 863, 863, 863, 863, 863, 863,
- 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863,
- 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 758, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 759, 758, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 864, 760, 760, 760,
- 760, 865, 120, 866, 867, 121, 868, 869, 870, 871, 121, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 872, 873, 874, 120, 875,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 120, 120, 120, 120, 128, 128, 169, 170, 120, 120, 171, 126, 172, 173,
+ 174, 175, 176, 177, 177, 177, 177, 177, 177, 178, 179, 180, 181, 177,
+ 182, 183, 184, 177, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193,
+ 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 203, 204, 205, 206,
+ 207, 208, 209, 210, 211, 212, 213, 120, 214, 215, 216, 217, 217, 218,
+ 219, 220, 221, 222, 223, 120, 224, 225, 226, 227, 228, 229, 230, 231,
+ 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 120, 242, 243,
+ 244, 245, 246, 243, 247, 248, 249, 250, 251, 120, 252, 253, 254, 255,
+ 256, 257, 258, 259, 259, 258, 259, 260, 261, 262, 263, 264, 265, 266,
+ 120, 267, 268, 269, 270, 271, 271, 270, 272, 273, 274, 275, 276, 277,
+ 278, 279, 280, 120, 281, 282, 283, 284, 284, 284, 284, 285, 286, 287,
+ 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 295, 295, 298, 299,
+ 296, 300, 301, 302, 303, 304, 305, 120, 306, 307, 307, 307, 307, 307,
+ 308, 309, 310, 311, 312, 313, 120, 120, 120, 120, 314, 315, 316, 317,
+ 318, 319, 320, 321, 322, 323, 324, 325, 120, 120, 120, 120, 326, 327,
+ 328, 329, 330, 331, 332, 333, 334, 335, 334, 334, 334, 336, 337, 338,
+ 339, 340, 341, 342, 341, 341, 341, 343, 344, 345, 346, 347, 120, 120,
+ 120, 120, 348, 348, 348, 348, 348, 349, 350, 351, 352, 353, 354, 355,
+ 356, 357, 358, 348, 359, 360, 352, 361, 362, 362, 362, 362, 363, 364,
+ 365, 365, 365, 365, 365, 366, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 368, 368, 368, 368, 368, 368, 368, 368, 368, 369,
+ 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 370, 370, 370, 370,
+ 370, 370, 370, 370, 370, 371, 372, 371, 370, 370, 370, 370, 370, 371,
+ 370, 370, 370, 370, 371, 372, 371, 370, 372, 370, 370, 370, 370, 370,
+ 370, 370, 371, 370, 370, 370, 370, 370, 370, 370, 370, 373, 374, 375,
+ 376, 377, 370, 370, 378, 379, 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 381, 382, 383, 384, 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 385, 384, 384,
+ 386, 387, 387, 388, 389, 389, 389, 389, 389, 389, 389, 389, 389, 390,
+ 391, 392, 393, 394, 395, 120, 396, 396, 397, 120, 398, 398, 399, 120,
+ 400, 401, 402, 120, 403, 403, 403, 403, 403, 403, 404, 405, 406, 407,
+ 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 418, 418, 418,
+ 419, 418, 418, 418, 418, 418, 418, 120, 420, 418, 418, 418, 418, 421,
+ 384, 384, 384, 384, 384, 384, 384, 384, 422, 120, 423, 423, 423, 424,
+ 425, 426, 427, 428, 429, 430, 431, 431, 431, 432, 433, 120, 434, 434,
+ 434, 434, 434, 435, 434, 434, 434, 436, 437, 438, 439, 439, 439, 439,
+ 440, 440, 441, 442, 443, 443, 443, 443, 443, 443, 444, 445, 446, 447,
+ 448, 449, 450, 451, 450, 451, 452, 453, 454, 455, 120, 120, 120, 120,
+ 120, 120, 120, 120, 456, 457, 457, 457, 457, 457, 458, 459, 460, 461,
+ 462, 463, 464, 465, 466, 467, 468, 469, 469, 469, 470, 471, 472, 473,
+ 474, 474, 474, 474, 475, 476, 477, 478, 479, 479, 479, 479, 480, 481,
+ 482, 483, 484, 485, 486, 487, 488, 488, 488, 489, 100, 490, 120, 120,
+ 120, 120, 120, 120, 491, 120, 492, 493, 494, 495, 496, 497, 54, 54, 54,
+ 54, 498, 499, 56, 56, 56, 56, 56, 500, 501, 502, 54, 503, 54, 54, 54,
+ 504, 56, 56, 56, 505, 506, 507, 508, 509, 509, 509, 510, 511, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 512, 513, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 514, 515, 516, 517, 514, 515,
+ 514, 515, 516, 517, 514, 518, 514, 515, 514, 516, 514, 519, 514, 519,
+ 514, 519, 520, 521, 522, 523, 524, 525, 514, 526, 527, 528, 529, 530,
+ 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544,
+ 545, 546, 56, 547, 548, 549, 550, 551, 552, 552, 553, 554, 555, 556, 557,
+ 120, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570,
+ 571, 570, 572, 573, 574, 575, 576, 577, 578, 579, 580, 579, 581, 582,
+ 579, 583, 579, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594,
+ 595, 596, 597, 598, 599, 594, 594, 600, 601, 602, 603, 604, 594, 594,
+ 605, 585, 606, 607, 594, 594, 608, 594, 594, 579, 609, 610, 611, 612,
+ 613, 614, 615, 615, 615, 615, 615, 615, 615, 615, 616, 579, 579, 617,
+ 618, 585, 585, 619, 579, 579, 579, 579, 584, 620, 621, 622, 623, 579,
+ 579, 579, 579, 623, 120, 120, 120, 579, 624, 120, 120, 625, 625, 625,
+ 625, 625, 626, 626, 627, 628, 628, 628, 628, 628, 628, 628, 628, 628,
+ 629, 625, 630, 631, 631, 631, 631, 631, 631, 631, 631, 631, 632, 631,
+ 631, 631, 631, 633, 579, 631, 631, 634, 579, 635, 636, 637, 638, 639,
+ 640, 636, 579, 634, 641, 579, 642, 643, 644, 645, 646, 579, 579, 579,
+ 647, 648, 649, 650, 579, 651, 652, 579, 653, 579, 579, 654, 655, 656,
+ 657, 579, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 579,
+ 579, 579, 669, 579, 670, 579, 671, 672, 673, 674, 675, 676, 625, 677,
+ 677, 678, 579, 579, 579, 669, 679, 680, 681, 682, 683, 684, 685, 585,
+ 585, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686,
+ 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686,
+ 686, 686, 686, 686, 686, 585, 585, 585, 585, 585, 585, 585, 585, 585,
+ 585, 585, 585, 585, 585, 585, 585, 687, 688, 688, 689, 594, 594, 585,
+ 690, 691, 692, 693, 694, 695, 696, 697, 698, 585, 699, 594, 700, 701,
+ 702, 703, 683, 585, 585, 597, 690, 703, 704, 705, 706, 594, 594, 594,
+ 594, 707, 708, 594, 594, 594, 594, 709, 710, 711, 683, 712, 713, 579,
+ 579, 579, 714, 579, 579, 585, 585, 715, 716, 717, 636, 579, 579, 718,
+ 579, 579, 579, 719, 579, 579, 579, 579, 720, 579, 721, 722, 120, 120,
+ 723, 120, 120, 724, 724, 724, 724, 724, 725, 726, 726, 726, 726, 726,
+ 727, 728, 729, 730, 731, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 732, 733, 734, 735, 736, 736, 736, 736, 737, 738, 739, 739, 739, 739,
+ 739, 739, 739, 740, 741, 742, 370, 370, 372, 120, 372, 372, 372, 372,
+ 372, 372, 372, 372, 743, 743, 743, 743, 744, 745, 746, 747, 748, 749,
+ 750, 751, 752, 120, 120, 120, 120, 120, 120, 120, 753, 753, 753, 754,
+ 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 755, 120, 753, 753,
+ 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753,
+ 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 756, 120, 120, 120,
+ 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 769,
+ 770, 769, 769, 769, 771, 772, 773, 774, 775, 776, 777, 777, 778, 777,
+ 777, 777, 779, 780, 781, 782, 783, 784, 784, 784, 784, 785, 786, 787,
+ 787, 787, 787, 787, 787, 787, 787, 787, 787, 788, 789, 790, 784, 784,
+ 784, 791, 757, 757, 757, 757, 758, 120, 792, 792, 793, 793, 793, 794,
+ 795, 796, 790, 790, 790, 797, 798, 799, 793, 793, 793, 800, 795, 796,
+ 790, 790, 790, 790, 801, 799, 790, 802, 803, 803, 803, 803, 803, 804,
+ 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 790, 790, 790,
+ 805, 806, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 807,
+ 790, 790, 790, 805, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 809, 810, 579, 579, 579, 579, 579, 579, 579, 579, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 809, 810, 810, 810,
+ 810, 810, 811, 811, 812, 811, 811, 811, 811, 811, 811, 811, 811, 811,
+ 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811,
+ 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811,
+ 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811,
+ 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811,
+ 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 813,
+ 814, 814, 814, 814, 814, 814, 815, 120, 816, 816, 816, 816, 816, 817,
+ 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818,
+ 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818,
+ 818, 818, 818, 818, 818, 819, 818, 818, 820, 821, 120, 120, 101, 101,
+ 101, 101, 101, 822, 823, 824, 101, 101, 101, 825, 826, 826, 826, 826,
+ 826, 826, 826, 826, 827, 828, 829, 120, 64, 64, 830, 831, 832, 27, 833,
+ 27, 27, 27, 27, 27, 27, 27, 834, 835, 27, 836, 837, 27, 27, 838, 839,
+ 120, 120, 120, 120, 120, 120, 120, 840, 841, 842, 843, 844, 844, 845,
+ 846, 847, 848, 849, 849, 849, 849, 849, 849, 850, 120, 851, 852, 852,
+ 852, 852, 852, 853, 854, 855, 856, 857, 858, 859, 859, 860, 861, 862,
+ 863, 864, 864, 865, 866, 867, 867, 868, 869, 870, 871, 367, 367, 367,
+ 872, 873, 874, 874, 874, 874, 874, 875, 876, 877, 878, 879, 880, 881,
+ 348, 352, 882, 883, 883, 883, 883, 883, 884, 885, 120, 886, 887, 888,
+ 889, 348, 348, 890, 891, 892, 892, 892, 892, 892, 892, 893, 894, 895,
+ 120, 120, 896, 897, 898, 899, 120, 900, 900, 900, 120, 372, 372, 54, 54,
+ 54, 54, 54, 901, 902, 120, 903, 903, 903, 903, 903, 903, 903, 903, 903,
+ 903, 897, 897, 897, 897, 904, 905, 906, 907, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 909, 909, 909, 908, 909,
+ 909, 910, 909, 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909,
+ 909, 911, 120, 368, 368, 912, 913, 369, 369, 369, 369, 369, 914, 915,
+ 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915,
+ 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915,
+ 915, 915, 915, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916,
+ 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916,
+ 916, 916, 916, 916, 916, 916, 916, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 809, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 917, 810, 810, 810, 810, 918, 120, 919,
+ 920, 121, 921, 922, 923, 924, 121, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 925, 926, 927, 120, 928, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 876, 120, 120, 128, 128, 128, 128, 128, 128, 128, 128, 877,
- 128, 128, 128, 128, 128, 128, 120, 120, 120, 120, 120, 128, 878, 879,
- 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 893, 894, 895, 896, 897, 898, 899, 899, 900, 901, 902, 902,
- 903, 904, 905, 906, 905, 905, 905, 905, 907, 908, 908, 908, 909, 910,
- 910, 910, 911, 912, 913, 120, 914, 915, 916, 915, 915, 917, 915, 915,
- 918, 915, 919, 915, 919, 120, 120, 120, 120, 915, 915, 915, 915, 915,
- 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 920, 921, 922, 922,
- 922, 922, 922, 923, 607, 924, 924, 924, 924, 924, 924, 925, 926, 927,
- 928, 572, 929, 930, 120, 120, 120, 120, 120, 607, 607, 607, 607, 607,
- 931, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 932, 932, 932, 933, 934, 934, 934, 934, 934, 934, 935,
- 120, 936, 937, 937, 938, 939, 939, 939, 939, 940, 120, 941, 941, 942,
- 943, 944, 944, 944, 944, 945, 946, 947, 947, 947, 948, 949, 949, 949,
- 949, 950, 949, 951, 120, 120, 120, 120, 120, 952, 952, 952, 952, 952,
- 953, 953, 953, 953, 953, 954, 954, 954, 954, 954, 954, 955, 955, 955,
- 956, 957, 958, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 959,
- 959, 959, 959, 959, 120, 960, 960, 960, 960, 960, 960, 961, 962, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963,
- 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963,
- 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 964,
- 120, 963, 963, 965, 120, 963, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 966, 967, 968,
- 968, 968, 968, 969, 970, 971, 971, 972, 973, 974, 974, 975, 976, 977,
- 977, 977, 978, 979, 980, 120, 120, 120, 120, 120, 120, 981, 981, 982,
- 983, 984, 984, 985, 986, 987, 987, 987, 988, 120, 120, 120, 120, 120,
- 120, 120, 120, 989, 989, 989, 989, 990, 990, 990, 991, 992, 992, 993,
- 992, 992, 992, 992, 992, 994, 995, 996, 997, 998, 998, 999, 1000, 1001,
- 120, 1002, 1003, 1004, 1004, 1004, 1005, 1006, 1006, 1006, 1007, 120,
- 120, 120, 120, 1008, 1009, 1008, 1008, 1010, 1011, 1012, 120, 1013, 1013,
- 1013, 1013, 1013, 1013, 1014, 1015, 1016, 1016, 1017, 1018, 1019, 1019,
- 1020, 1021, 1022, 1022, 1023, 1024, 120, 1025, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
- 1026, 1027, 120, 120, 120, 120, 120, 120, 1028, 1028, 1028, 1028, 1028,
- 1028, 1029, 120, 1030, 1030, 1030, 1030, 1030, 1030, 1031, 1032, 120,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 929, 120,
+ 120, 128, 128, 128, 128, 128, 128, 128, 128, 930, 128, 128, 128, 128,
+ 128, 128, 120, 120, 120, 120, 120, 128, 931, 932, 932, 933, 934, 935,
+ 936, 937, 938, 939, 940, 941, 942, 943, 944, 169, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 945, 946,
+ 947, 948, 949, 950, 951, 951, 952, 953, 954, 954, 955, 956, 957, 958,
+ 959, 959, 959, 959, 960, 961, 961, 961, 962, 963, 963, 963, 964, 965,
+ 966, 120, 967, 968, 969, 968, 968, 970, 968, 968, 971, 968, 972, 968,
+ 972, 120, 120, 120, 120, 968, 968, 968, 968, 968, 968, 968, 968, 968,
+ 968, 968, 968, 968, 968, 968, 973, 974, 975, 975, 975, 975, 975, 976,
+ 615, 977, 977, 977, 977, 977, 977, 978, 979, 980, 981, 579, 982, 983,
+ 120, 120, 120, 120, 120, 615, 615, 615, 615, 615, 984, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 985,
+ 985, 985, 986, 987, 987, 987, 987, 987, 987, 988, 120, 989, 990, 990,
+ 991, 992, 992, 992, 992, 993, 120, 994, 994, 995, 996, 997, 997, 997,
+ 997, 998, 999, 1000, 1000, 1000, 1001, 1002, 1002, 1002, 1002, 1003,
+ 1002, 1004, 120, 120, 120, 120, 120, 1005, 1005, 1005, 1005, 1005, 1006,
+ 1006, 1006, 1006, 1006, 1007, 1007, 1007, 1007, 1007, 1007, 1008, 1008,
+ 1008, 1009, 1010, 1011, 1012, 1012, 1012, 1012, 1013, 1014, 1014, 1014,
+ 1014, 1015, 1016, 1016, 1016, 1016, 1016, 120, 1017, 1017, 1017, 1017,
+ 1017, 1017, 1018, 1019, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 1020, 1020, 1020, 1020, 1020,
+ 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020,
+ 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020,
+ 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1021, 120, 1020,
+ 1020, 1022, 120, 1020, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 1023, 1024, 1025, 1025,
+ 1025, 1025, 1026, 1027, 1028, 1028, 1029, 1030, 1031, 1031, 1032, 1033,
+ 1034, 1034, 1034, 1035, 1036, 1037, 120, 120, 120, 120, 120, 120, 1038,
+ 1038, 1039, 1040, 1041, 1041, 1042, 1043, 1044, 1044, 1044, 1045, 120,
+ 120, 120, 120, 120, 120, 120, 120, 1046, 1046, 1046, 1046, 1047, 1047,
+ 1047, 1048, 1049, 1049, 1050, 1049, 1049, 1049, 1049, 1049, 1051, 1052,
+ 1053, 1054, 1055, 1055, 1056, 1057, 1058, 120, 1059, 1060, 1061, 1061,
+ 1061, 1062, 1063, 1063, 1063, 1064, 120, 120, 120, 120, 1065, 1066, 1065,
+ 1065, 1067, 1068, 1069, 120, 1070, 1070, 1070, 1070, 1070, 1070, 1071,
+ 1072, 1073, 1073, 1074, 1075, 1076, 1076, 1077, 1078, 1079, 1079, 1080,
+ 1081, 120, 1082, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1083,
+ 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1084, 120, 120, 120, 120,
+ 120, 120, 1085, 1085, 1085, 1085, 1085, 1085, 1086, 120, 1087, 1087,
+ 1087, 1087, 1087, 1087, 1088, 1089, 120, 120, 120, 120, 120, 120, 120,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 1090, 1090, 1090, 1091, 120,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 1033, 1033, 1033, 1034, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 1035, 1036, 1036, 1036, 1036, 1036,
- 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 120, 1044, 1045, 1046,
- 1046, 1046, 1046, 1046, 1047, 1048, 1049, 120, 1050, 1050, 1050, 1051,
- 1052, 1053, 1054, 1055, 1055, 1055, 1056, 1057, 1058, 1059, 1060, 120,
- 1061, 1061, 1061, 1061, 1062, 120, 1063, 1064, 1064, 1064, 1064, 1064,
- 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 120, 1074, 1074,
- 1075, 1074, 1074, 1076, 1077, 1078, 120, 120, 120, 120, 120, 120, 120,
- 120, 1079, 1080, 1081, 1082, 1081, 1083, 1084, 1084, 1084, 1084, 1084,
- 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1093, 1094, 1095,
- 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1102, 120, 120, 120, 120, 120,
+ 120, 1092, 1093, 1093, 1093, 1093, 1093, 1093, 1094, 1095, 1096, 1097,
+ 1098, 1099, 1100, 120, 1101, 1102, 1103, 1103, 1103, 1103, 1103, 1104,
+ 1105, 1106, 120, 1107, 1107, 1107, 1108, 1109, 1110, 1111, 1112, 1112,
+ 1112, 1113, 1114, 1115, 1116, 1117, 120, 1118, 1118, 1118, 1118, 1119,
+ 120, 1120, 1121, 1121, 1121, 1121, 1121, 1122, 1123, 1124, 1125, 1126,
+ 1127, 1128, 1129, 1130, 120, 1131, 1131, 1132, 1131, 1131, 1133, 1134,
+ 1135, 120, 120, 120, 120, 120, 120, 120, 120, 1136, 1137, 1138, 1139,
+ 1138, 1140, 1141, 1141, 1141, 1141, 1141, 1142, 1143, 1144, 1145, 1146,
+ 1147, 1148, 1149, 1150, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157,
+ 1158, 1159, 1159, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 1160, 1160, 1160, 1160, 1160, 1160, 1161,
+ 1162, 1163, 1164, 1165, 1166, 120, 120, 120, 120, 1167, 1167, 1167, 1167,
+ 1167, 1167, 1168, 1169, 1170, 120, 1171, 1172, 120, 120, 120, 120, 120,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 1103, 1103, 1103, 1103, 1103, 1103, 1104, 1105, 1106, 120, 1107, 1108,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 1109, 1109, 1109, 1109, 1109, 1110, 1111,
- 1112, 1113, 1114, 1114, 1115, 120, 120, 120, 120, 1116, 1116, 1116, 1116,
- 1116, 1116, 1117, 1118, 1119, 120, 1120, 1121, 120, 120, 120, 120, 1122,
- 1122, 1122, 1122, 1122, 1123, 1124, 120, 1125, 1126, 120, 120, 120, 120,
- 120, 120, 1127, 1127, 1127, 1128, 1129, 1130, 1131, 1132, 120, 120, 120,
+ 120, 1173, 1173, 1173, 1173, 1173, 1174, 1175, 1176, 1177, 1178, 1179,
+ 1180, 120, 120, 120, 120, 1181, 1181, 1181, 1181, 1181, 1181, 1182, 1183,
+ 1184, 120, 1185, 1186, 1187, 1188, 120, 120, 1189, 1189, 1189, 1189,
+ 1189, 1190, 1191, 120, 1192, 1193, 120, 120, 120, 120, 120, 120, 1194,
+ 1194, 1194, 1195, 1196, 1197, 1198, 1199, 120, 120, 120, 120, 120, 120,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1133,
- 1133, 1133, 1133, 1134, 1134, 1134, 1134, 1135, 1136, 1137, 1138, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1200, 1200, 1200, 1200,
+ 1201, 1201, 1201, 1201, 1202, 1203, 1204, 1205, 120, 120, 120, 120, 120,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 1139, 1139, 1139, 1139,
- 1139, 1139, 1139, 1140, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141,
- 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141,
- 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141,
- 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141,
- 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1142, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 1143, 1143, 1143, 1143, 1143, 1143,
- 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1144, 1145, 120, 1141, 1141,
- 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141,
- 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1146, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 1147, 1147, 1147, 1147, 1147,
- 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147,
- 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147,
- 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1148, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 1149, 1149, 1149, 1149, 1149,
- 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149,
- 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149,
- 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1150,
+ 120, 120, 120, 120, 120, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1207,
+ 1208, 1209, 1208, 1208, 1208, 1210, 1211, 1212, 1213, 120, 1214, 1215,
+ 1216, 1217, 1218, 1219, 1219, 1219, 1220, 1221, 1221, 1222, 1223, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 1224, 1224, 1224, 1224, 1224,
+ 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224,
+ 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224,
+ 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224,
+ 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1225, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1226, 1226, 1226,
+ 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1227, 1228,
+ 120, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224,
+ 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224,
+ 1224, 1229, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1230, 1230, 1230,
+ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+ 1230, 1230, 1230, 1230, 1231, 1230, 1230, 1230, 1230, 1232, 1233, 1230,
+ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+ 1230, 1230, 1230, 1230, 1234, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+ 1230, 1230, 1235, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 776, 776, 776, 776, 776,
- 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776,
- 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776,
- 776, 776, 776, 776, 776, 776, 1151, 1152, 1152, 1152, 1153, 1154, 1155,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1156, 1156,
- 1156, 1157, 1158, 120, 1159, 1159, 1159, 1159, 1159, 1159, 1160, 1161,
- 1162, 120, 1163, 1164, 1165, 1159, 1159, 1166, 1159, 1159, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1167, 1167, 1167,
- 1167, 1167, 1167, 1167, 1167, 1168, 120, 1169, 1170, 1170, 1170, 1170,
- 1171, 120, 1172, 1173, 1174, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 1175, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1237, 1236,
+ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ 1236, 1238, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 826, 826, 826,
+ 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826,
+ 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826,
+ 826, 826, 826, 826, 826, 826, 826, 826, 1239, 1240, 1240, 1240, 1241,
+ 1242, 1243, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 1244, 1244, 1244, 1245, 1246, 120, 1247, 1247, 1247, 1247, 1247, 1247,
+ 1248, 1249, 1250, 120, 1251, 1252, 1253, 1247, 1247, 1254, 1247, 1247,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 1176, 1176, 1176, 1176, 1176, 1176,
- 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1177, 1176, 1178, 1176, 1179,
- 1176, 1180, 1181, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607,
- 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607,
- 607, 607, 1182, 120, 607, 607, 607, 607, 1183, 1184, 607, 607, 607, 607,
- 607, 607, 1185, 1186, 1187, 1188, 1189, 1190, 607, 607, 607, 1191, 607,
- 607, 607, 607, 607, 607, 607, 1192, 120, 120, 927, 927, 927, 927, 927,
- 927, 927, 927, 1193, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 572,
- 572, 572, 572, 572, 572, 572, 572, 572, 572, 614, 120, 922, 922, 1194,
+ 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1256, 120, 1257, 1258,
+ 1258, 1258, 1258, 1259, 120, 1260, 1261, 1262, 120, 120, 120, 120, 120,
+ 120, 120, 120, 1263, 120, 120, 120, 1264, 1264, 1264, 1264, 1264, 1264,
+ 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264,
+ 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264,
+ 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264,
+ 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264,
+ 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1265, 120, 120, 1264, 1264,
+ 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264,
+ 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264,
+ 1264, 1264, 1264, 1264, 1266, 120, 1267, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1268, 1268, 1268,
+ 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1269, 1268,
+ 1270, 1268, 1271, 1268, 1272, 1273, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615,
+ 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615,
+ 615, 615, 615, 615, 615, 615, 1274, 120, 615, 615, 615, 615, 1275, 1276,
+ 615, 615, 615, 615, 615, 615, 1277, 1278, 1279, 1280, 1281, 1282, 615,
+ 615, 615, 1283, 615, 615, 615, 615, 615, 615, 615, 1284, 120, 120, 980,
+ 980, 980, 980, 980, 980, 980, 980, 1285, 120, 120, 120, 120, 120, 120,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 1195, 1195, 1195, 1196, 1197, 1197, 1198, 1195, 1195,
- 1199, 1200, 1197, 1197, 1195, 1195, 1195, 1196, 1197, 1197, 1201, 1202,
- 1203, 1199, 1204, 1205, 1197, 1195, 1195, 1195, 1196, 1197, 1197, 1206,
- 1207, 1208, 1209, 1197, 1197, 1197, 1210, 1211, 1212, 1213, 1197, 1197,
- 1198, 1195, 1195, 1199, 1197, 1197, 1197, 1195, 1195, 1195, 1196, 1197,
- 1197, 1198, 1195, 1195, 1199, 1197, 1197, 1197, 1195, 1195, 1195, 1196,
- 1197, 1197, 1198, 1195, 1195, 1199, 1197, 1197, 1197, 1195, 1195, 1195,
- 1196, 1197, 1197, 1214, 1195, 1195, 1195, 1215, 1197, 1197, 1216, 1217,
- 1195, 1195, 1218, 1197, 1197, 1219, 1198, 1195, 1195, 1220, 1197, 1197,
- 1221, 1222, 1195, 1195, 1223, 1197, 1197, 1197, 1224, 1195, 1195, 1195,
- 1215, 1197, 1197, 1216, 1225, 1226, 1226, 1226, 1226, 1226, 1226, 1227,
- 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227,
- 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227,
- 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1228, 1228, 1228, 1228, 1228,
- 1228, 1229, 1230, 1228, 1228, 1228, 1228, 1228, 1231, 1232, 1227, 1233,
- 1234, 120, 1235, 1236, 1228, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237,
- 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237,
- 1237, 1238, 1239, 1240, 120, 120, 120, 120, 120, 1241, 128, 128, 128,
- 1242, 1243, 1244, 1245, 1246, 1247, 1242, 1248, 1242, 1244, 1244, 1249,
- 128, 1250, 128, 1251, 1252, 1250, 128, 1251, 120, 120, 120, 120, 120,
- 120, 1253, 120, 572, 572, 572, 572, 572, 929, 572, 572, 572, 572, 572,
- 572, 572, 572, 572, 572, 572, 572, 929, 120, 572, 614, 1254, 572, 1254,
- 572, 1254, 572, 572, 572, 681, 120, 616, 1255, 618, 618, 618, 1256, 618,
- 618, 618, 618, 618, 618, 618, 1257, 618, 618, 618, 618, 618, 1258, 120,
- 120, 120, 120, 120, 120, 120, 120, 1259, 607, 607, 607, 1260, 120, 741,
- 741, 741, 741, 741, 1261, 741, 1262, 1263, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 623,
+ 120, 975, 975, 1286, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 1287, 1287, 1287, 1288, 1289, 1289,
+ 1290, 1287, 1287, 1291, 1292, 1289, 1289, 1287, 1287, 1287, 1288, 1289,
+ 1289, 1293, 1294, 1295, 1291, 1296, 1297, 1289, 1287, 1287, 1287, 1288,
+ 1289, 1289, 1298, 1299, 1300, 1301, 1289, 1289, 1289, 1302, 1303, 1304,
+ 1305, 1289, 1289, 1290, 1287, 1287, 1291, 1289, 1289, 1289, 1287, 1287,
+ 1287, 1288, 1289, 1289, 1290, 1287, 1287, 1291, 1289, 1289, 1289, 1287,
+ 1287, 1287, 1288, 1289, 1289, 1290, 1287, 1287, 1291, 1289, 1289, 1289,
+ 1287, 1287, 1287, 1288, 1289, 1289, 1306, 1287, 1287, 1287, 1307, 1289,
+ 1289, 1308, 1309, 1287, 1287, 1310, 1289, 1289, 1311, 1290, 1287, 1287,
+ 1312, 1289, 1289, 1313, 1314, 1287, 1287, 1315, 1289, 1289, 1289, 1316,
+ 1287, 1287, 1287, 1307, 1289, 1289, 1308, 1317, 1318, 1318, 1318, 1318,
+ 1318, 1318, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319,
+ 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319,
+ 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1320, 1320,
+ 1320, 1320, 1320, 1320, 1321, 1322, 1320, 1320, 1320, 1320, 1320, 1323,
+ 1324, 1319, 1325, 1326, 120, 1327, 1328, 1320, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 1329, 1330, 1330, 1331, 1332, 1333, 120, 120,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572,
- 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572,
- 572, 572, 572, 572, 1264, 572, 572, 572, 572, 572, 572, 572, 572, 572,
- 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572,
- 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572,
- 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 1265, 572, 572, 572,
- 572, 1266, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572,
- 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572,
- 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 1267, 120, 572,
- 1268, 929, 120, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572,
- 572, 572, 572, 929, 120, 572, 572, 572, 572, 572, 572, 572, 572, 572,
- 572, 1268, 120, 120, 120, 120, 120, 572, 929, 572, 572, 572, 572, 572,
- 572, 572, 120, 572, 684, 572, 572, 572, 572, 572, 120, 572, 572, 572,
- 681, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 572,
- 1267, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1268,
- 120, 120, 120, 120, 120, 120, 120, 1267, 120, 120, 120, 120, 120, 120,
- 120, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 1269,
- 760, 760, 760, 760, 760, 758, 758, 758, 758, 758, 758, 1270, 760, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 759, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
- 758, 758, 758, 758, 758, 864, 760, 760, 760, 760, 760, 760, 760, 760,
- 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760,
- 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760,
- 760, 760, 760, 760, 760, 760, 760, 758, 758, 758, 759, 760, 760, 760,
- 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760,
- 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760,
- 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760,
- 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760,
- 1271, 1272, 120, 120, 120, 1273, 1273, 1273, 1273, 1273, 1273, 1273,
- 1273, 1273, 1273, 1273, 1273, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 879, 879, 879, 879, 879, 879,
- 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879,
- 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 120, 120, 863, 863,
- 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863,
- 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863,
- 863, 1274,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1334, 1334, 1334, 1334,
+ 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334,
+ 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1335, 1336, 1337, 120,
+ 120, 120, 120, 120, 1338, 1338, 1338, 1338, 1339, 1340, 1340, 1340, 1341,
+ 1342, 1343, 1344, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 1345, 128, 128, 128, 1346,
+ 1347, 1348, 1349, 1350, 1351, 1346, 1352, 1346, 1348, 1348, 1353, 128,
+ 1354, 128, 1355, 1356, 1354, 128, 1355, 120, 120, 120, 120, 120, 120,
+ 1357, 120, 1358, 1359, 1359, 1359, 1359, 1360, 1359, 1359, 1359, 1359,
+ 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1360, 1361, 1359, 1362,
+ 1363, 1359, 1363, 1364, 1363, 1359, 1359, 1359, 1365, 1361, 626, 1366,
+ 628, 628, 628, 1367, 628, 628, 628, 628, 628, 628, 628, 1368, 628, 628,
+ 628, 1369, 1370, 1371, 628, 1372, 1361, 1361, 1361, 1361, 1361, 1361,
+ 1373, 1374, 1374, 1374, 1375, 1361, 790, 790, 790, 790, 790, 1376, 790,
+ 1377, 1378, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361,
+ 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 757,
+ 757, 757, 757, 1379, 1380, 1381, 757, 757, 757, 757, 757, 757, 757, 757,
+ 1382, 1383, 757, 1384, 1385, 757, 757, 1386, 1387, 1388, 1389, 1384,
+ 1359, 757, 757, 1390, 1391, 757, 757, 757, 757, 757, 757, 757, 1392,
+ 1393, 1394, 1395, 757, 1396, 1397, 1394, 1398, 1399, 757, 757, 757, 1400,
+ 1401, 1402, 757, 757, 757, 757, 757, 757, 757, 757, 1403, 1404, 757,
+ 1405, 649, 1406, 757, 1407, 1408, 579, 1409, 757, 757, 757, 1359, 1410,
+ 1411, 1359, 1359, 1412, 1359, 1358, 1359, 1359, 1359, 1359, 1359, 1413,
+ 1414, 1359, 1359, 1413, 1415, 757, 757, 757, 757, 757, 757, 757, 757,
+ 1416, 1417, 579, 579, 579, 579, 1418, 1419, 757, 757, 757, 757, 1420,
+ 757, 1421, 757, 1422, 1358, 1423, 1361, 1359, 1424, 1425, 1361, 579, 579,
+ 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 1426, 1361,
+ 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 1427, 1361, 1361, 1361,
+ 1361, 1361, 579, 1426, 579, 579, 579, 579, 579, 579, 579, 1361, 579,
+ 1428, 579, 579, 579, 579, 579, 1361, 579, 579, 579, 1429, 1361, 1361,
+ 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 757, 1430,
+ 1431, 1361, 1432, 1433, 757, 1434, 757, 1435, 1361, 1361, 1361, 1361,
+ 757, 757, 1436, 1361, 1361, 1361, 1361, 1361, 1437, 1361, 1361, 1361,
+ 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361,
+ 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361,
+ 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361,
+ 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361,
+ 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361,
+ 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1438, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 1439, 810, 810, 810, 810, 810, 808,
+ 808, 808, 808, 808, 808, 1440, 810, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 809, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 917,
+ 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810,
+ 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810,
+ 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810,
+ 810, 808, 808, 808, 809, 810, 810, 810, 810, 810, 810, 810, 810, 810,
+ 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810,
+ 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810,
+ 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810,
+ 810, 810, 810, 810, 810, 810, 810, 810, 1441, 1442, 120, 120, 120, 1443,
+ 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932,
+ 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932,
+ 932, 932, 932, 120, 120, 916, 916, 916, 916, 916, 916, 916, 916, 916,
+ 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916,
+ 916, 916, 916, 916, 916, 916, 916, 916, 1444,
};
static const unsigned short index2[] = {
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 4, 3, 1, 1, 1, 1, 1, 1, 3, 3, 3, 2,
- 5, 6, 6, 7, 8, 7, 6, 6, 9, 10, 6, 11, 12, 13, 12, 12, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 12, 6, 15, 16, 15, 6, 6, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 6, 10, 18, 19, 18, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 16,
- 10, 16, 1, 1, 1, 1, 1, 1, 3, 1, 1, 21, 22, 8, 8, 23, 8, 24, 22, 25, 26,
- 27, 28, 16, 29, 30, 18, 31, 32, 33, 33, 25, 34, 22, 22, 25, 33, 27, 35,
- 36, 36, 36, 22, 37, 37, 37, 37, 37, 37, 38, 37, 37, 37, 37, 37, 37, 37,
- 37, 37, 38, 37, 37, 37, 37, 37, 37, 39, 38, 37, 37, 37, 37, 37, 38, 40,
- 40, 40, 41, 41, 41, 41, 40, 41, 40, 40, 40, 41, 40, 40, 41, 41, 40, 41,
- 40, 40, 41, 41, 41, 39, 40, 40, 40, 41, 40, 41, 40, 41, 37, 40, 37, 41,
- 37, 41, 37, 41, 37, 41, 37, 41, 37, 41, 37, 41, 37, 40, 37, 40, 37, 41,
- 37, 41, 37, 41, 37, 40, 37, 41, 37, 41, 37, 41, 37, 41, 37, 41, 38, 40,
- 37, 40, 38, 40, 37, 41, 37, 41, 40, 37, 41, 37, 41, 37, 41, 38, 40, 38,
- 40, 37, 40, 37, 41, 37, 40, 40, 38, 40, 37, 40, 37, 41, 37, 41, 38, 40,
- 37, 41, 37, 41, 37, 37, 41, 37, 41, 37, 41, 41, 41, 37, 37, 41, 37, 41,
- 37, 37, 41, 37, 37, 37, 41, 41, 37, 37, 37, 37, 41, 37, 37, 41, 37, 37,
- 37, 41, 41, 41, 37, 37, 41, 37, 37, 41, 37, 41, 37, 41, 37, 37, 41, 37,
- 41, 41, 37, 41, 37, 37, 41, 37, 37, 37, 41, 37, 41, 37, 37, 41, 41, 42,
- 37, 41, 41, 41, 42, 42, 42, 42, 37, 43, 41, 37, 43, 41, 37, 43, 41, 37,
- 40, 37, 40, 37, 40, 37, 40, 37, 40, 37, 40, 37, 40, 37, 40, 41, 37, 41,
- 41, 37, 43, 41, 37, 41, 37, 37, 37, 41, 37, 41, 41, 41, 41, 41, 41, 41,
- 37, 37, 41, 37, 37, 41, 41, 37, 41, 37, 37, 37, 37, 41, 41, 40, 41, 41,
- 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, 41,
- 41, 41, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 46, 46, 46, 46, 46,
- 46, 46, 47, 47, 25, 47, 45, 48, 45, 48, 48, 48, 45, 48, 45, 45, 49, 46,
- 47, 47, 47, 47, 47, 47, 25, 25, 25, 25, 47, 25, 47, 25, 44, 44, 44, 44,
- 44, 47, 47, 47, 47, 47, 50, 50, 45, 47, 46, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 53, 53,
- 53, 53, 52, 54, 53, 53, 53, 53, 53, 55, 55, 53, 53, 53, 53, 55, 55, 53,
- 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 56, 56, 56, 56, 56, 53, 53, 53,
- 53, 51, 51, 51, 51, 51, 51, 51, 51, 57, 51, 53, 53, 53, 51, 51, 51, 53,
- 53, 58, 51, 51, 51, 53, 53, 53, 53, 51, 52, 53, 53, 51, 59, 60, 60, 59,
- 60, 60, 59, 51, 51, 51, 51, 51, 61, 62, 61, 62, 45, 63, 61, 62, 64, 64,
- 65, 62, 62, 62, 66, 61, 64, 64, 64, 64, 63, 47, 61, 66, 61, 61, 61, 64,
- 61, 64, 61, 61, 62, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
- 67, 67, 67, 67, 64, 67, 67, 67, 67, 67, 67, 67, 61, 61, 62, 62, 62, 62,
- 62, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 62, 68, 68, 68, 68, 68, 68, 68, 62, 62, 62, 62, 62, 61, 62, 62, 61, 61,
- 61, 62, 62, 62, 61, 62, 61, 62, 61, 62, 61, 62, 61, 62, 69, 70, 69, 70,
- 69, 70, 69, 70, 69, 70, 69, 70, 69, 70, 62, 62, 62, 62, 61, 62, 71, 61,
- 62, 61, 61, 62, 62, 61, 61, 61, 72, 73, 72, 72, 72, 72, 72, 72, 72, 72,
- 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, 74,
- 74, 74, 74, 74, 75, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
- 75, 75, 72, 75, 72, 75, 72, 75, 72, 75, 72, 75, 76, 77, 77, 78, 78, 77,
- 79, 79, 72, 75, 72, 75, 72, 75, 72, 72, 75, 72, 75, 72, 75, 72, 75, 72,
- 75, 72, 75, 72, 75, 75, 64, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 64, 64, 81, 82, 82, 82, 82,
- 82, 82, 64, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
- 64, 84, 85, 64, 64, 86, 86, 87, 64, 88, 89, 89, 89, 89, 88, 89, 89, 89,
- 90, 88, 89, 89, 89, 89, 89, 89, 88, 88, 88, 88, 88, 88, 89, 89, 88, 89,
- 89, 90, 91, 89, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 101, 102, 103,
- 104, 105, 106, 107, 108, 109, 107, 89, 88, 107, 100, 64, 64, 64, 64, 64,
- 64, 64, 64, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 64,
- 64, 64, 64, 64, 110, 110, 110, 107, 107, 64, 64, 64, 111, 111, 111, 111,
- 111, 112, 113, 113, 114, 115, 115, 116, 117, 118, 119, 119, 120, 120,
- 120, 120, 120, 120, 120, 120, 121, 122, 123, 124, 125, 64, 118, 124, 126,
- 126, 126, 126, 126, 126, 126, 126, 127, 126, 126, 126, 126, 126, 126,
- 126, 126, 126, 126, 128, 129, 130, 131, 132, 133, 134, 135, 78, 78, 136,
- 137, 120, 120, 120, 120, 120, 137, 120, 120, 137, 138, 138, 138, 138,
- 138, 138, 138, 138, 138, 138, 115, 139, 139, 118, 126, 126, 140, 126,
- 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 118, 126, 120, 120,
- 120, 120, 120, 120, 120, 112, 119, 120, 120, 120, 120, 137, 120, 141,
- 141, 120, 120, 119, 137, 120, 120, 137, 126, 126, 142, 142, 142, 142,
- 142, 142, 142, 142, 142, 142, 126, 126, 126, 143, 143, 126, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 64, 145, 146,
- 147, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
- 146, 148, 149, 148, 148, 149, 148, 148, 149, 149, 149, 148, 149, 149,
- 148, 149, 148, 148, 148, 149, 148, 149, 148, 149, 148, 149, 148, 148, 64,
- 64, 146, 146, 146, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
- 150, 150, 150, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
- 150, 64, 64, 64, 64, 64, 64, 152, 152, 152, 152, 152, 152, 152, 152, 152,
- 152, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
- 153, 153, 153, 153, 154, 154, 154, 154, 154, 154, 154, 155, 154, 156,
- 156, 157, 158, 158, 158, 156, 64, 64, 64, 64, 64, 159, 159, 159, 159,
- 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
- 161, 160, 160, 160, 160, 160, 160, 160, 160, 160, 161, 160, 160, 160,
- 161, 160, 160, 160, 160, 160, 64, 64, 162, 162, 162, 162, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 162, 64, 163, 163, 163, 163, 163, 163,
- 163, 163, 163, 164, 164, 164, 64, 64, 165, 64, 126, 126, 126, 126, 126,
- 64, 64, 64, 64, 64, 64, 137, 120, 120, 137, 120, 120, 137, 120, 120, 120,
- 137, 137, 137, 166, 167, 168, 120, 120, 120, 137, 120, 120, 137, 137,
- 120, 120, 120, 120, 120, 169, 169, 169, 170, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 171, 169, 170, 172, 171, 170,
- 170, 170, 169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170,
- 173, 170, 170, 171, 78, 136, 174, 174, 169, 169, 169, 171, 171, 169, 169,
- 84, 84, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 176, 177, 171,
- 171, 171, 171, 171, 171, 178, 179, 180, 180, 64, 178, 178, 178, 178, 178,
- 178, 178, 178, 64, 64, 178, 178, 64, 64, 178, 178, 178, 178, 178, 178,
- 178, 178, 178, 178, 178, 178, 178, 178, 64, 178, 178, 178, 178, 178, 178,
- 178, 64, 178, 64, 64, 64, 178, 178, 178, 178, 64, 64, 181, 178, 180, 180,
- 180, 179, 179, 179, 179, 64, 64, 180, 180, 64, 64, 180, 180, 182, 178,
- 64, 64, 64, 64, 64, 64, 64, 64, 180, 64, 64, 64, 64, 178, 178, 64, 178,
- 178, 178, 179, 179, 64, 64, 183, 183, 183, 183, 183, 183, 183, 183, 183,
- 183, 178, 178, 184, 184, 185, 185, 185, 185, 185, 185, 186, 184, 64, 64,
- 64, 64, 64, 187, 187, 188, 64, 189, 189, 189, 189, 189, 189, 64, 64, 64,
- 64, 189, 189, 64, 64, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
- 189, 189, 189, 189, 64, 189, 189, 189, 189, 189, 189, 189, 64, 189, 189,
- 64, 189, 189, 64, 189, 189, 64, 64, 190, 64, 188, 188, 188, 187, 187, 64,
- 64, 64, 64, 187, 187, 64, 64, 187, 187, 191, 64, 64, 64, 187, 64, 64, 64,
- 64, 64, 64, 64, 189, 189, 189, 189, 64, 189, 64, 64, 64, 64, 64, 64, 64,
- 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 187, 187, 189, 189,
- 189, 187, 64, 64, 64, 193, 193, 194, 64, 195, 195, 195, 195, 195, 195,
- 195, 195, 195, 64, 195, 195, 195, 64, 195, 195, 195, 195, 195, 195, 195,
- 195, 195, 195, 195, 195, 195, 195, 64, 195, 195, 195, 195, 195, 195, 195,
- 64, 195, 195, 64, 195, 195, 195, 195, 195, 64, 64, 196, 195, 194, 194,
- 194, 193, 193, 193, 193, 193, 64, 193, 193, 194, 64, 194, 194, 197, 64,
- 64, 195, 64, 64, 64, 64, 64, 64, 64, 195, 195, 193, 193, 64, 64, 198,
- 198, 198, 198, 198, 198, 198, 198, 198, 198, 199, 200, 64, 64, 64, 64,
- 64, 64, 64, 195, 64, 64, 64, 64, 64, 64, 64, 201, 202, 202, 64, 203, 203,
- 203, 203, 203, 203, 203, 203, 64, 64, 203, 203, 64, 64, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 64, 203, 203, 203,
- 203, 203, 203, 203, 64, 203, 203, 64, 203, 203, 203, 203, 203, 64, 64,
- 204, 203, 202, 201, 202, 201, 201, 201, 201, 64, 64, 202, 202, 64, 64,
- 202, 202, 205, 64, 64, 64, 64, 64, 64, 64, 64, 201, 202, 64, 64, 64, 64,
- 203, 203, 64, 203, 203, 203, 201, 201, 64, 64, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 207, 203, 208, 208, 208, 208, 208, 208, 64, 64,
- 209, 210, 64, 210, 210, 210, 210, 210, 210, 64, 64, 64, 210, 210, 210,
- 64, 210, 210, 210, 210, 64, 64, 64, 210, 210, 64, 210, 64, 210, 210, 64,
- 64, 64, 210, 210, 64, 64, 64, 210, 210, 210, 210, 210, 210, 210, 210,
- 210, 210, 64, 64, 64, 64, 211, 211, 209, 211, 211, 64, 64, 64, 211, 211,
- 211, 64, 211, 211, 211, 212, 64, 64, 210, 64, 64, 64, 64, 64, 64, 211,
- 64, 64, 64, 64, 64, 64, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
- 214, 214, 214, 215, 215, 215, 215, 215, 215, 216, 215, 64, 64, 64, 64,
- 64, 217, 218, 218, 218, 64, 219, 219, 219, 219, 219, 219, 219, 219, 64,
- 219, 219, 219, 64, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 64, 64, 64, 219, 217, 217, 217, 218, 218, 218,
- 218, 64, 217, 217, 217, 64, 217, 217, 217, 220, 64, 64, 64, 64, 64, 64,
- 64, 221, 222, 64, 219, 219, 219, 64, 64, 64, 64, 64, 219, 219, 217, 217,
- 64, 64, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 224, 224, 224,
- 224, 224, 224, 224, 225, 64, 226, 227, 227, 64, 228, 228, 228, 228, 228,
- 228, 228, 228, 64, 228, 228, 228, 64, 228, 228, 228, 228, 228, 228, 228,
- 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 64, 228, 228, 228,
- 228, 228, 64, 64, 229, 228, 227, 230, 227, 227, 227, 227, 227, 64, 230,
- 227, 227, 64, 227, 227, 226, 231, 64, 64, 64, 64, 64, 64, 64, 227, 227,
- 64, 64, 64, 64, 64, 64, 64, 228, 64, 228, 228, 226, 226, 64, 64, 232,
- 232, 232, 232, 232, 232, 232, 232, 232, 232, 64, 228, 228, 64, 64, 64,
- 64, 64, 64, 233, 234, 234, 64, 235, 235, 235, 235, 235, 235, 235, 235,
- 64, 235, 235, 235, 64, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
- 235, 235, 235, 235, 235, 235, 235, 64, 64, 235, 234, 234, 234, 233, 233,
- 233, 233, 64, 234, 234, 234, 64, 234, 234, 234, 236, 235, 64, 64, 64, 64,
- 64, 64, 64, 64, 234, 64, 64, 64, 64, 64, 64, 64, 235, 235, 235, 233, 233,
- 64, 64, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 238, 238, 238,
- 238, 238, 238, 64, 64, 64, 239, 235, 235, 235, 235, 235, 235, 64, 64,
- 240, 240, 64, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
- 241, 241, 241, 241, 241, 241, 64, 64, 64, 241, 241, 241, 241, 241, 241,
- 241, 241, 64, 241, 241, 241, 241, 241, 241, 241, 241, 241, 64, 241, 64,
- 64, 64, 64, 242, 64, 64, 64, 64, 240, 240, 240, 243, 243, 243, 64, 243,
- 64, 240, 240, 240, 240, 240, 240, 240, 240, 64, 64, 64, 64, 64, 64, 244,
- 244, 244, 244, 244, 244, 244, 244, 244, 244, 64, 64, 240, 240, 245, 64,
- 64, 64, 64, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 247, 246, 246, 247, 247, 247, 247, 248, 248, 249, 64,
- 64, 64, 64, 250, 246, 246, 246, 246, 246, 246, 251, 247, 252, 252, 252,
- 252, 247, 247, 247, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254,
- 254, 253, 253, 64, 64, 64, 64, 64, 255, 255, 64, 255, 64, 64, 255, 255,
- 64, 255, 64, 64, 255, 64, 64, 64, 64, 64, 64, 255, 255, 255, 255, 64,
- 255, 255, 255, 255, 255, 255, 255, 64, 255, 255, 255, 64, 255, 64, 255,
- 64, 64, 255, 255, 64, 255, 255, 255, 255, 256, 255, 255, 256, 256, 256,
- 256, 257, 257, 64, 256, 256, 255, 64, 64, 255, 255, 255, 255, 255, 64,
- 258, 64, 259, 259, 259, 259, 256, 256, 64, 64, 260, 260, 260, 260, 260,
- 260, 260, 260, 260, 260, 64, 64, 255, 255, 255, 255, 261, 262, 262, 262,
- 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263,
- 263, 262, 263, 262, 262, 262, 264, 264, 262, 262, 262, 262, 262, 262,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 266, 266, 266, 266,
- 266, 266, 266, 266, 266, 266, 262, 264, 262, 264, 262, 267, 268, 269,
- 268, 269, 270, 270, 261, 261, 261, 261, 261, 261, 261, 261, 64, 261, 261,
- 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 64, 64, 64, 64, 271,
- 272, 273, 274, 273, 273, 273, 273, 273, 272, 272, 272, 272, 273, 270,
- 272, 273, 275, 275, 276, 263, 275, 275, 261, 261, 261, 261, 261, 273,
- 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 64, 273, 273, 273, 273,
- 273, 273, 273, 273, 273, 273, 273, 273, 64, 262, 262, 262, 262, 262, 262,
- 262, 262, 264, 262, 262, 262, 262, 262, 262, 64, 262, 262, 263, 263, 263,
- 263, 263, 277, 277, 277, 277, 263, 263, 64, 64, 64, 64, 64, 278, 278,
- 278, 278, 278, 278, 278, 278, 278, 278, 278, 279, 279, 280, 280, 280,
- 280, 279, 280, 280, 280, 280, 280, 281, 279, 282, 282, 279, 279, 280,
- 280, 278, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 284, 284,
- 284, 284, 284, 284, 278, 278, 278, 278, 278, 278, 279, 279, 280, 280,
- 278, 278, 278, 278, 280, 280, 280, 278, 279, 279, 279, 278, 278, 279,
- 279, 279, 279, 279, 279, 279, 278, 278, 278, 280, 280, 280, 280, 278,
- 278, 278, 278, 278, 280, 279, 279, 280, 280, 279, 279, 279, 279, 279,
- 279, 285, 278, 279, 283, 283, 279, 279, 279, 280, 286, 286, 287, 287,
- 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 64, 287, 64,
- 64, 64, 64, 64, 287, 64, 64, 288, 288, 288, 288, 288, 288, 288, 288, 288,
- 288, 288, 84, 289, 288, 288, 288, 290, 290, 290, 290, 290, 290, 290, 290,
- 291, 291, 291, 291, 291, 291, 291, 291, 292, 292, 292, 292, 292, 292,
- 292, 292, 292, 64, 292, 292, 292, 292, 64, 64, 292, 292, 292, 292, 292,
- 292, 292, 64, 292, 292, 292, 64, 64, 293, 293, 293, 294, 294, 294, 294,
- 294, 294, 294, 294, 294, 295, 295, 295, 295, 295, 295, 295, 295, 295,
- 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 64, 64, 64, 296,
- 296, 296, 296, 296, 296, 296, 296, 296, 296, 64, 64, 64, 64, 64, 64, 297,
- 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 64, 64,
- 298, 298, 298, 298, 298, 298, 64, 64, 299, 300, 300, 300, 300, 300, 300,
- 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300,
- 301, 301, 300, 302, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303,
- 303, 303, 303, 303, 303, 303, 303, 303, 304, 305, 64, 64, 64, 306, 306,
- 306, 306, 306, 306, 306, 306, 306, 306, 306, 84, 84, 84, 307, 307, 307,
- 306, 306, 306, 306, 306, 306, 306, 306, 64, 64, 64, 64, 64, 64, 64, 308,
- 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 64, 308, 308,
- 308, 308, 309, 309, 310, 64, 64, 64, 311, 311, 311, 311, 311, 311, 311,
- 311, 311, 311, 312, 312, 313, 84, 84, 64, 314, 314, 314, 314, 314, 314,
- 314, 314, 314, 314, 315, 315, 64, 64, 64, 64, 316, 316, 316, 316, 316,
- 316, 316, 316, 316, 316, 316, 316, 316, 64, 316, 316, 316, 64, 317, 317,
- 64, 64, 64, 64, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318,
- 318, 319, 319, 320, 319, 319, 319, 319, 319, 319, 319, 320, 320, 320,
- 320, 320, 320, 320, 320, 319, 320, 320, 319, 319, 319, 319, 319, 319,
- 319, 319, 319, 321, 319, 322, 322, 322, 323, 322, 322, 322, 324, 318,
- 325, 64, 64, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 64, 64,
- 64, 64, 64, 64, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 64, 64,
- 64, 64, 64, 64, 328, 328, 66, 66, 328, 66, 329, 328, 328, 328, 328, 330,
- 330, 330, 331, 64, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 64,
- 64, 64, 64, 64, 64, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333,
- 333, 334, 333, 333, 333, 333, 333, 335, 333, 64, 64, 64, 64, 64, 300,
- 300, 300, 300, 300, 300, 64, 64, 336, 336, 336, 336, 336, 336, 336, 336,
- 336, 336, 336, 336, 336, 336, 336, 64, 337, 337, 337, 338, 338, 338, 338,
- 337, 337, 338, 338, 338, 64, 64, 64, 64, 338, 338, 337, 338, 338, 338,
- 338, 338, 338, 339, 340, 341, 64, 64, 64, 64, 342, 64, 64, 64, 343, 343,
- 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 345, 345, 345, 345,
- 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 64, 64, 345, 345, 345,
- 345, 345, 64, 64, 64, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346,
- 346, 346, 64, 64, 64, 64, 346, 346, 64, 64, 64, 64, 64, 64, 347, 347,
- 347, 347, 347, 347, 347, 347, 347, 347, 348, 64, 64, 64, 349, 349, 350,
- 350, 350, 350, 350, 350, 350, 350, 351, 351, 351, 351, 351, 351, 351,
- 351, 351, 351, 351, 351, 351, 351, 351, 352, 353, 354, 354, 355, 64, 64,
- 356, 356, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357,
- 357, 358, 359, 358, 359, 359, 359, 359, 359, 359, 359, 64, 360, 358, 359,
- 358, 358, 359, 359, 359, 359, 359, 359, 359, 359, 358, 358, 358, 358,
- 358, 358, 359, 359, 361, 361, 361, 361, 361, 361, 361, 361, 64, 64, 362,
- 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 64, 64, 64, 64, 64, 64,
- 364, 364, 364, 364, 364, 364, 364, 365, 364, 364, 364, 364, 364, 364, 64,
- 64, 78, 78, 78, 78, 78, 136, 136, 136, 136, 136, 136, 78, 78, 136, 366,
- 64, 367, 367, 367, 367, 368, 369, 369, 369, 369, 369, 369, 369, 369, 369,
- 369, 369, 369, 369, 369, 369, 370, 368, 367, 367, 367, 367, 367, 368,
- 367, 368, 368, 368, 368, 368, 367, 368, 371, 369, 369, 369, 369, 369,
- 369, 369, 64, 64, 64, 64, 372, 372, 372, 372, 372, 372, 372, 372, 372,
- 372, 373, 373, 373, 373, 373, 373, 373, 374, 374, 374, 374, 374, 374,
- 374, 374, 374, 374, 375, 376, 375, 375, 375, 375, 375, 375, 375, 374,
- 374, 374, 374, 374, 374, 374, 374, 374, 64, 64, 64, 377, 377, 378, 379,
- 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 378,
- 377, 377, 377, 377, 378, 378, 377, 377, 380, 381, 377, 377, 379, 379,
- 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 379, 379, 379, 379,
- 379, 379, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383,
- 383, 383, 384, 385, 386, 386, 385, 385, 385, 386, 385, 386, 386, 386,
- 387, 387, 64, 64, 64, 64, 64, 64, 64, 64, 388, 388, 388, 388, 389, 389,
- 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 390, 390, 390, 390,
- 390, 390, 390, 390, 391, 391, 391, 391, 391, 391, 391, 391, 390, 390,
- 391, 392, 64, 64, 64, 393, 393, 393, 393, 393, 394, 394, 394, 394, 394,
- 394, 394, 394, 394, 394, 64, 64, 64, 389, 389, 389, 395, 395, 395, 395,
- 395, 395, 395, 395, 395, 395, 396, 396, 396, 396, 396, 396, 396, 396,
- 396, 396, 396, 396, 396, 396, 397, 397, 397, 397, 397, 397, 398, 398,
- 399, 399, 399, 399, 399, 399, 399, 399, 78, 78, 78, 84, 400, 136, 136,
- 136, 136, 136, 78, 78, 136, 136, 136, 136, 78, 401, 400, 400, 400, 400,
- 400, 400, 400, 402, 402, 402, 402, 136, 402, 402, 402, 402, 401, 401, 78,
- 402, 402, 64, 78, 78, 64, 64, 64, 64, 64, 64, 41, 41, 41, 41, 41, 41, 62,
- 62, 62, 62, 62, 75, 44, 44, 44, 44, 44, 44, 44, 44, 44, 65, 65, 65, 65,
- 65, 44, 44, 44, 44, 65, 65, 65, 65, 65, 41, 41, 41, 41, 41, 403, 41, 41,
- 41, 41, 41, 41, 41, 41, 41, 41, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
- 44, 44, 65, 78, 78, 136, 78, 78, 78, 78, 78, 78, 78, 136, 78, 78, 404,
- 405, 136, 406, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
- 78, 78, 78, 78, 78, 78, 78, 64, 64, 64, 64, 64, 64, 407, 136, 78, 136,
- 37, 41, 37, 41, 37, 41, 41, 41, 41, 41, 41, 41, 41, 41, 37, 41, 62, 62,
- 62, 62, 62, 62, 62, 62, 61, 61, 61, 61, 61, 61, 61, 61, 62, 62, 62, 62,
- 62, 62, 64, 64, 61, 61, 61, 61, 61, 61, 64, 64, 64, 61, 64, 61, 64, 61,
- 64, 61, 408, 408, 408, 408, 408, 408, 408, 408, 62, 62, 62, 62, 62, 64,
- 62, 62, 61, 61, 61, 61, 408, 63, 62, 63, 63, 63, 62, 62, 62, 64, 62, 62,
- 61, 61, 61, 61, 408, 63, 63, 63, 62, 62, 62, 62, 64, 64, 62, 62, 61, 61,
- 61, 61, 64, 63, 63, 63, 61, 61, 61, 61, 61, 63, 63, 63, 64, 64, 62, 62,
- 62, 64, 62, 62, 61, 61, 61, 61, 408, 63, 63, 64, 409, 409, 409, 409, 409,
- 409, 409, 409, 409, 409, 409, 410, 411, 411, 412, 413, 414, 415, 415,
- 414, 414, 414, 22, 66, 416, 417, 418, 419, 416, 417, 418, 419, 22, 22,
- 22, 66, 22, 22, 22, 22, 420, 421, 422, 423, 424, 425, 426, 21, 427, 428,
- 427, 427, 428, 22, 66, 66, 66, 28, 35, 22, 66, 66, 22, 429, 429, 66, 66,
- 66, 430, 431, 432, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 433, 66,
- 429, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 409, 410, 410, 410, 410,
- 410, 64, 434, 435, 436, 437, 410, 410, 410, 410, 410, 410, 438, 44, 64,
- 64, 33, 438, 438, 438, 438, 438, 439, 439, 433, 431, 432, 440, 438, 33,
- 33, 33, 33, 438, 438, 438, 438, 438, 439, 439, 433, 431, 432, 64, 44, 44,
- 44, 44, 44, 64, 64, 64, 250, 250, 250, 250, 250, 250, 250, 250, 250, 441,
- 250, 250, 23, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 64, 78,
- 78, 400, 400, 78, 78, 78, 78, 400, 400, 400, 78, 78, 366, 366, 366, 366,
- 78, 366, 366, 366, 400, 400, 78, 136, 78, 400, 400, 136, 136, 136, 136,
- 78, 64, 64, 64, 64, 64, 64, 64, 26, 26, 442, 30, 26, 30, 26, 442, 26, 30,
- 34, 442, 442, 442, 34, 34, 442, 442, 442, 443, 26, 442, 30, 26, 433, 442,
- 442, 442, 442, 442, 26, 26, 26, 30, 30, 26, 442, 26, 67, 26, 442, 26, 37,
- 38, 442, 442, 444, 34, 442, 442, 37, 442, 34, 402, 402, 402, 402, 34, 26,
- 26, 34, 34, 442, 442, 445, 433, 433, 433, 433, 442, 34, 34, 34, 34, 26,
- 433, 26, 26, 41, 277, 446, 446, 446, 36, 36, 446, 446, 446, 446, 446,
- 446, 36, 36, 36, 36, 446, 447, 447, 447, 447, 447, 447, 447, 447, 447,
- 447, 447, 447, 448, 448, 448, 448, 447, 447, 448, 448, 448, 448, 448,
- 448, 448, 448, 448, 37, 41, 448, 448, 448, 448, 36, 26, 26, 64, 64, 64,
- 64, 39, 39, 39, 39, 39, 30, 30, 30, 30, 30, 433, 433, 26, 26, 26, 26,
- 433, 26, 26, 433, 26, 26, 433, 26, 26, 26, 26, 26, 26, 26, 433, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 433, 433, 26, 26, 39, 26, 39, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 30, 26, 26, 26, 26, 433, 433, 433, 433, 433, 433, 433, 433, 433,
- 433, 433, 433, 39, 445, 449, 449, 445, 433, 433, 39, 449, 445, 445, 449,
- 445, 445, 433, 39, 433, 449, 439, 450, 433, 449, 445, 433, 433, 433, 449,
- 445, 445, 449, 39, 449, 449, 445, 445, 39, 445, 39, 445, 39, 39, 39, 39,
- 449, 449, 445, 449, 445, 445, 445, 445, 445, 39, 39, 39, 39, 433, 445,
- 433, 445, 449, 449, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
- 449, 445, 445, 445, 449, 433, 433, 433, 433, 433, 449, 445, 445, 445,
- 433, 433, 433, 433, 433, 433, 433, 433, 433, 445, 449, 39, 445, 433, 449,
- 449, 449, 449, 445, 445, 449, 449, 433, 433, 449, 449, 445, 445, 449,
- 449, 445, 445, 449, 449, 445, 445, 445, 445, 445, 433, 433, 445, 445,
- 445, 445, 433, 433, 39, 433, 433, 445, 39, 433, 433, 433, 433, 433, 433,
- 433, 433, 445, 445, 433, 39, 445, 445, 445, 433, 433, 433, 433, 433, 445,
- 449, 433, 445, 445, 445, 445, 445, 433, 433, 445, 445, 433, 433, 433,
- 433, 445, 445, 445, 445, 445, 445, 445, 445, 433, 433, 431, 432, 431,
- 432, 26, 26, 26, 26, 26, 26, 30, 26, 26, 26, 26, 26, 445, 445, 26, 26,
- 26, 26, 26, 26, 26, 451, 452, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 26, 433,
- 26, 26, 26, 26, 26, 26, 26, 26, 277, 26, 26, 26, 26, 26, 433, 433, 433,
- 433, 433, 433, 433, 433, 433, 26, 26, 26, 26, 433, 433, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 64, 64, 64, 64, 64, 26, 26, 26, 26, 26, 26, 26, 64,
- 36, 36, 36, 36, 36, 36, 36, 36, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
- 33, 33, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453,
- 453, 446, 36, 36, 36, 36, 36, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 26, 26, 26, 26, 26, 26, 30, 30, 30, 30, 26, 26, 30, 30, 26, 30, 30,
- 30, 30, 30, 26, 26, 30, 30, 26, 26, 30, 39, 26, 26, 26, 26, 30, 30, 26,
- 26, 30, 39, 26, 26, 26, 26, 30, 30, 30, 26, 26, 30, 26, 26, 30, 30, 26,
- 26, 26, 26, 26, 30, 30, 26, 26, 30, 26, 26, 26, 26, 30, 30, 26, 26, 26,
- 26, 30, 26, 30, 26, 30, 26, 30, 26, 26, 26, 26, 26, 30, 30, 26, 30, 30,
- 30, 26, 30, 30, 30, 30, 26, 30, 30, 26, 39, 26, 26, 26, 26, 26, 26, 30,
- 30, 26, 26, 26, 26, 277, 26, 26, 26, 26, 26, 26, 26, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 26, 30, 30, 30, 26, 30, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 30, 26, 26, 431, 432, 431, 432, 431, 432, 431, 432, 431, 432,
- 431, 432, 431, 432, 36, 36, 446, 446, 446, 446, 446, 446, 446, 446, 446,
- 446, 446, 446, 26, 26, 26, 26, 445, 433, 433, 445, 445, 431, 432, 433,
- 445, 445, 433, 445, 445, 445, 433, 433, 433, 433, 433, 445, 445, 445,
- 445, 433, 433, 433, 433, 433, 445, 445, 445, 433, 433, 433, 445, 445,
- 445, 445, 9, 10, 9, 10, 9, 10, 9, 10, 431, 432, 454, 454, 454, 454, 454,
- 454, 454, 454, 433, 433, 433, 431, 432, 9, 10, 431, 432, 431, 432, 431,
- 432, 431, 432, 431, 432, 433, 433, 445, 445, 445, 445, 445, 445, 433,
- 433, 433, 433, 433, 433, 433, 433, 445, 433, 433, 433, 433, 445, 445,
- 445, 445, 445, 433, 445, 445, 433, 433, 431, 432, 431, 432, 445, 433,
- 433, 433, 433, 445, 433, 445, 445, 445, 433, 433, 445, 445, 433, 433,
- 433, 433, 433, 433, 433, 433, 433, 433, 445, 445, 445, 445, 445, 445,
- 433, 433, 431, 432, 433, 433, 433, 433, 445, 445, 445, 445, 445, 445,
- 445, 445, 445, 445, 445, 433, 445, 445, 445, 445, 433, 433, 445, 433,
- 445, 433, 433, 445, 433, 445, 445, 445, 445, 433, 433, 433, 433, 433,
- 445, 445, 433, 433, 433, 433, 445, 445, 445, 445, 433, 445, 445, 433,
- 433, 445, 445, 433, 433, 433, 433, 445, 445, 445, 445, 445, 445, 445,
- 445, 445, 445, 445, 433, 433, 445, 445, 445, 445, 445, 445, 445, 445,
- 433, 445, 445, 445, 445, 445, 445, 445, 445, 433, 433, 433, 433, 433,
- 445, 433, 445, 433, 433, 433, 445, 445, 445, 445, 445, 433, 433, 433,
- 433, 445, 433, 433, 433, 445, 445, 445, 445, 445, 433, 445, 433, 433,
- 433, 433, 433, 433, 433, 26, 26, 433, 433, 433, 433, 433, 433, 26, 26,
- 26, 26, 26, 26, 26, 26, 30, 30, 30, 26, 26, 26, 26, 64, 64, 26, 26, 26,
- 26, 26, 26, 26, 26, 64, 64, 26, 26, 64, 64, 64, 26, 26, 26, 26, 64, 26,
- 26, 26, 26, 26, 26, 26, 26, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 26,
- 26, 26, 26, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455,
- 455, 455, 455, 64, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456,
- 456, 456, 456, 456, 64, 37, 41, 37, 37, 37, 41, 41, 37, 41, 37, 41, 37,
- 41, 37, 37, 37, 37, 41, 37, 41, 41, 37, 41, 41, 41, 41, 41, 41, 44, 44,
- 37, 37, 69, 70, 69, 70, 70, 457, 457, 457, 457, 457, 457, 69, 70, 69, 70,
- 458, 458, 458, 69, 70, 64, 64, 64, 64, 64, 459, 459, 459, 459, 460, 459,
- 459, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461,
- 461, 64, 461, 64, 64, 64, 64, 64, 461, 64, 64, 462, 462, 462, 462, 462,
- 462, 462, 462, 64, 64, 64, 64, 64, 64, 64, 463, 464, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 465, 77, 77, 77, 77, 77, 77, 77, 77,
- 66, 66, 28, 35, 28, 35, 66, 66, 66, 28, 35, 66, 28, 35, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 415, 66, 66, 415, 66, 28, 35, 66, 66, 28, 35, 431,
- 432, 431, 432, 431, 432, 431, 432, 66, 66, 66, 66, 66, 45, 66, 66, 415,
- 415, 66, 66, 66, 66, 415, 66, 418, 64, 64, 64, 64, 64, 466, 466, 466,
- 466, 466, 466, 466, 466, 466, 466, 64, 466, 466, 466, 466, 466, 466, 466,
- 466, 466, 64, 64, 64, 64, 466, 466, 466, 466, 466, 466, 64, 64, 467, 467,
- 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 64, 64, 64, 64, 468,
- 469, 469, 469, 467, 470, 471, 472, 451, 452, 451, 452, 451, 452, 451,
- 452, 451, 452, 467, 467, 451, 452, 451, 452, 451, 452, 451, 452, 473,
- 474, 475, 475, 467, 472, 472, 472, 472, 472, 472, 472, 472, 472, 476,
- 477, 478, 479, 480, 480, 473, 481, 481, 481, 481, 481, 467, 467, 472,
- 472, 472, 470, 471, 469, 467, 26, 64, 482, 482, 482, 482, 482, 482, 482,
- 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482,
- 482, 64, 64, 483, 483, 484, 484, 485, 485, 482, 473, 486, 486, 486, 486,
- 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486,
- 469, 481, 487, 487, 486, 64, 64, 64, 64, 64, 488, 488, 488, 488, 488,
- 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 64, 64, 64,
- 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 64,
- 489, 489, 490, 490, 490, 490, 489, 489, 489, 489, 489, 489, 489, 489,
- 489, 489, 488, 488, 488, 64, 64, 64, 64, 64, 491, 491, 491, 491, 491,
- 491, 491, 491, 491, 491, 491, 491, 491, 492, 492, 64, 490, 490, 490, 490,
- 490, 490, 490, 490, 490, 490, 489, 489, 489, 489, 489, 489, 493, 493,
- 493, 493, 493, 493, 493, 493, 467, 494, 494, 494, 494, 494, 494, 494,
- 494, 494, 494, 494, 494, 494, 494, 494, 491, 491, 491, 491, 492, 492,
- 492, 489, 489, 494, 494, 494, 494, 494, 494, 494, 489, 489, 489, 489,
- 467, 467, 467, 467, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495,
- 495, 495, 495, 495, 495, 64, 489, 489, 489, 489, 489, 489, 489, 467, 467,
- 467, 467, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 467,
- 467, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496,
- 496, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 498, 498, 498,
- 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 499, 498, 498, 498,
- 498, 498, 498, 498, 64, 64, 64, 500, 500, 500, 500, 500, 500, 500, 500,
- 500, 500, 500, 500, 500, 500, 500, 64, 501, 501, 501, 501, 501, 501, 501,
- 501, 502, 502, 502, 502, 502, 502, 503, 503, 504, 504, 504, 504, 504,
- 504, 504, 504, 504, 504, 504, 504, 505, 506, 506, 506, 507, 507, 507,
- 507, 507, 507, 507, 507, 507, 507, 504, 504, 64, 64, 64, 64, 72, 75, 72,
- 75, 72, 75, 508, 77, 79, 79, 79, 509, 77, 77, 77, 77, 77, 77, 77, 77, 77,
- 77, 509, 510, 72, 75, 72, 75, 403, 403, 77, 77, 511, 511, 511, 511, 511,
- 511, 511, 511, 511, 511, 511, 511, 511, 511, 512, 512, 512, 512, 512,
- 512, 512, 512, 512, 512, 513, 513, 514, 514, 514, 514, 514, 514, 47, 47,
- 47, 47, 47, 47, 47, 45, 45, 45, 45, 45, 45, 45, 45, 45, 47, 47, 37, 41,
- 37, 41, 37, 41, 41, 41, 37, 41, 37, 41, 37, 41, 44, 41, 41, 41, 41, 41,
- 41, 41, 41, 37, 41, 37, 41, 37, 37, 41, 45, 515, 515, 37, 41, 37, 41, 42,
- 37, 41, 37, 41, 41, 41, 37, 41, 37, 41, 37, 37, 37, 37, 64, 64, 37, 37,
- 37, 37, 37, 41, 37, 41, 64, 64, 64, 64, 64, 64, 64, 42, 44, 44, 41, 42,
- 42, 42, 42, 42, 516, 516, 517, 516, 516, 516, 518, 516, 516, 516, 516,
- 517, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516,
- 516, 516, 519, 519, 517, 517, 519, 520, 520, 520, 520, 64, 64, 64, 64,
- 521, 521, 521, 521, 521, 521, 277, 277, 250, 444, 64, 64, 64, 64, 64, 64,
- 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 523, 523,
- 523, 523, 524, 524, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525,
- 525, 525, 525, 525, 525, 525, 525, 525, 524, 524, 524, 524, 524, 524,
- 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 526, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 527, 527, 528, 528, 528, 528, 528, 528, 528, 528,
- 528, 528, 64, 64, 64, 64, 64, 64, 174, 174, 174, 174, 174, 174, 174, 174,
- 174, 174, 171, 171, 171, 171, 171, 171, 176, 176, 176, 171, 176, 171, 64,
- 64, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 530, 530, 530, 530,
- 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530,
- 530, 530, 531, 531, 531, 531, 531, 532, 532, 532, 84, 533, 534, 534, 534,
- 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 535, 535,
- 535, 535, 535, 535, 535, 535, 535, 535, 535, 536, 537, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 538, 290, 290, 290, 290, 290, 64, 64, 64,
- 539, 539, 539, 540, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541,
- 541, 541, 541, 541, 541, 542, 540, 540, 539, 539, 539, 539, 540, 540,
- 539, 540, 540, 540, 543, 544, 544, 544, 544, 544, 544, 544, 544, 544,
- 544, 544, 544, 544, 64, 46, 545, 545, 545, 545, 545, 545, 545, 545, 545,
- 545, 64, 64, 64, 64, 544, 544, 278, 278, 278, 278, 278, 280, 546, 278,
- 283, 283, 278, 278, 278, 278, 278, 64, 547, 547, 547, 547, 547, 547, 547,
- 547, 547, 548, 548, 548, 548, 548, 548, 549, 549, 548, 548, 549, 549,
- 548, 548, 64, 547, 547, 547, 548, 547, 547, 547, 547, 547, 547, 547, 547,
- 548, 549, 64, 64, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 64,
- 64, 551, 551, 551, 551, 546, 278, 278, 278, 278, 278, 278, 286, 286, 286,
- 278, 279, 280, 279, 278, 278, 552, 552, 552, 552, 552, 552, 552, 552,
- 553, 552, 553, 553, 554, 552, 552, 553, 553, 552, 552, 552, 552, 552,
- 553, 553, 552, 553, 552, 64, 64, 64, 64, 64, 64, 64, 64, 552, 552, 555,
- 556, 556, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 558,
- 559, 559, 558, 558, 560, 560, 557, 561, 561, 558, 562, 64, 64, 292, 292,
- 292, 292, 292, 292, 64, 41, 41, 41, 515, 44, 44, 44, 44, 41, 41, 41, 41,
- 41, 62, 64, 64, 298, 298, 298, 298, 298, 298, 298, 298, 557, 557, 557,
- 558, 558, 559, 558, 558, 559, 558, 558, 560, 558, 562, 64, 64, 563, 563,
- 563, 563, 563, 563, 563, 563, 563, 563, 64, 64, 64, 64, 64, 64, 290, 290,
- 290, 290, 64, 64, 64, 64, 291, 291, 291, 291, 291, 291, 291, 64, 64, 64,
- 64, 291, 291, 291, 291, 291, 291, 291, 291, 291, 64, 64, 64, 64, 564,
- 564, 564, 564, 564, 564, 564, 564, 565, 565, 565, 565, 565, 565, 565,
- 565, 496, 496, 497, 497, 497, 497, 497, 497, 41, 41, 41, 41, 41, 41, 41,
- 64, 64, 64, 64, 83, 83, 83, 83, 83, 64, 64, 64, 64, 64, 110, 566, 110,
- 110, 567, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
- 110, 64, 110, 110, 110, 110, 110, 64, 110, 64, 110, 110, 64, 110, 110,
- 64, 110, 110, 126, 126, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568,
- 568, 568, 568, 568, 568, 568, 64, 64, 64, 64, 64, 64, 64, 64, 64, 126,
- 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 569, 418, 64, 64, 126,
- 126, 126, 126, 126, 126, 126, 126, 126, 126, 116, 119, 64, 64, 58, 58,
- 58, 58, 58, 58, 58, 58, 469, 469, 469, 469, 469, 469, 469, 474, 475, 469,
- 64, 64, 64, 64, 64, 64, 78, 78, 78, 78, 78, 78, 78, 136, 136, 136, 136,
- 136, 136, 136, 77, 77, 469, 473, 473, 570, 570, 474, 475, 474, 475, 474,
- 475, 474, 475, 474, 475, 474, 475, 474, 475, 474, 475, 469, 469, 474,
- 475, 469, 469, 469, 469, 570, 570, 570, 571, 469, 571, 64, 469, 571, 469,
- 469, 473, 451, 452, 451, 452, 451, 452, 572, 469, 469, 573, 574, 575,
- 575, 576, 64, 469, 577, 572, 469, 64, 64, 64, 64, 126, 126, 126, 126,
- 126, 64, 126, 126, 126, 126, 126, 126, 126, 64, 64, 410, 64, 578, 578,
- 579, 580, 579, 578, 578, 581, 582, 578, 583, 584, 585, 584, 584, 586,
- 586, 586, 586, 586, 586, 586, 586, 586, 586, 584, 578, 587, 588, 587,
- 578, 578, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589,
- 589, 589, 589, 589, 589, 589, 581, 578, 582, 590, 591, 590, 592, 592,
- 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592,
- 592, 592, 581, 588, 582, 588, 581, 582, 593, 594, 595, 593, 593, 596,
- 596, 596, 596, 596, 596, 596, 596, 596, 596, 597, 596, 596, 596, 596,
- 596, 596, 596, 596, 596, 596, 596, 596, 596, 597, 597, 598, 598, 598,
- 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 64, 64, 64,
- 598, 598, 598, 598, 598, 598, 64, 64, 598, 598, 598, 64, 64, 64, 580,
- 580, 588, 590, 599, 580, 580, 64, 600, 601, 601, 601, 601, 600, 600, 64,
- 64, 602, 602, 602, 26, 30, 64, 64, 603, 603, 603, 603, 603, 603, 603,
- 603, 603, 603, 603, 603, 64, 603, 603, 603, 603, 603, 603, 603, 603, 603,
- 603, 64, 603, 603, 603, 64, 603, 603, 64, 603, 603, 603, 603, 603, 603,
- 603, 64, 64, 603, 603, 603, 64, 64, 64, 64, 64, 84, 66, 84, 64, 64, 64,
- 64, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 64,
- 64, 64, 277, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604,
- 604, 605, 605, 605, 605, 606, 606, 606, 606, 606, 606, 606, 606, 606,
- 606, 606, 606, 606, 606, 606, 606, 606, 605, 605, 606, 64, 64, 64, 26,
- 26, 26, 26, 64, 64, 64, 64, 606, 64, 64, 64, 64, 64, 64, 64, 277, 277,
- 277, 277, 277, 136, 64, 64, 607, 607, 607, 607, 607, 607, 607, 607, 607,
- 607, 607, 607, 607, 64, 64, 64, 608, 608, 608, 608, 608, 608, 608, 608,
- 608, 64, 64, 64, 64, 64, 64, 64, 136, 438, 438, 438, 438, 438, 438, 438,
- 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 64, 64, 64,
- 64, 609, 609, 609, 609, 609, 609, 609, 609, 610, 610, 610, 610, 64, 64,
- 64, 64, 611, 611, 611, 611, 611, 611, 611, 611, 611, 612, 611, 611, 611,
- 611, 611, 611, 611, 611, 612, 64, 64, 64, 64, 64, 613, 613, 613, 613,
- 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 614, 614, 614, 614,
- 614, 64, 64, 64, 64, 64, 615, 615, 615, 615, 615, 615, 615, 615, 615,
- 615, 615, 615, 615, 615, 64, 616, 617, 617, 617, 617, 617, 617, 617, 617,
- 617, 617, 617, 617, 64, 64, 64, 64, 618, 619, 619, 619, 619, 619, 64, 64,
- 620, 620, 620, 620, 620, 620, 620, 620, 621, 621, 621, 621, 621, 621,
- 621, 621, 622, 622, 622, 622, 622, 622, 622, 622, 623, 623, 623, 623,
- 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 64, 64, 624, 624, 624,
- 624, 624, 624, 624, 624, 624, 624, 64, 64, 64, 64, 64, 64, 625, 625, 625,
- 625, 625, 625, 625, 625, 626, 626, 626, 626, 626, 626, 626, 626, 626,
- 626, 626, 626, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 627, 628, 628,
- 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 64, 628,
- 628, 628, 628, 628, 628, 64, 64, 629, 629, 629, 629, 629, 629, 64, 64,
- 629, 64, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629,
- 629, 629, 629, 629, 629, 629, 629, 64, 629, 629, 64, 64, 64, 629, 64, 64,
- 629, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630,
- 630, 64, 631, 632, 632, 632, 632, 632, 632, 632, 632, 633, 633, 633, 633,
- 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 634, 634, 635,
- 635, 635, 635, 635, 635, 635, 636, 636, 636, 636, 636, 636, 636, 636,
- 636, 636, 636, 636, 636, 636, 636, 64, 64, 64, 64, 64, 64, 64, 64, 637,
- 637, 637, 637, 637, 637, 637, 637, 637, 638, 638, 638, 638, 638, 638,
- 638, 638, 638, 638, 638, 64, 638, 638, 64, 64, 64, 64, 64, 639, 639, 639,
- 639, 639, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640,
- 640, 640, 641, 641, 641, 641, 641, 641, 64, 64, 64, 642, 643, 643, 643,
- 643, 643, 643, 643, 643, 643, 643, 64, 64, 64, 64, 64, 644, 645, 645,
- 645, 645, 645, 645, 645, 645, 646, 646, 646, 646, 646, 646, 646, 646, 64,
- 64, 64, 64, 647, 647, 646, 646, 647, 647, 647, 647, 647, 647, 647, 647,
- 64, 64, 647, 647, 647, 647, 647, 647, 648, 649, 649, 649, 64, 649, 649,
- 64, 64, 64, 64, 64, 649, 650, 649, 651, 648, 648, 648, 648, 64, 648, 648,
- 648, 64, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648,
- 648, 648, 648, 648, 648, 648, 64, 64, 64, 64, 651, 652, 650, 64, 64, 64,
- 64, 653, 654, 654, 654, 654, 654, 654, 654, 654, 655, 655, 655, 655, 655,
- 655, 655, 655, 655, 64, 64, 64, 64, 64, 64, 64, 656, 656, 656, 656, 656,
- 656, 656, 656, 656, 656, 656, 656, 656, 657, 657, 658, 659, 659, 659,
- 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 660, 660, 660, 661,
- 661, 661, 661, 661, 661, 661, 661, 662, 661, 661, 661, 661, 661, 661,
- 661, 661, 661, 661, 661, 661, 663, 664, 64, 64, 64, 64, 665, 665, 665,
- 665, 665, 666, 666, 666, 666, 666, 666, 666, 64, 667, 667, 667, 667, 667,
- 667, 667, 667, 667, 667, 667, 667, 667, 667, 64, 64, 64, 668, 668, 668,
- 668, 668, 668, 668, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669,
- 669, 669, 669, 669, 64, 64, 670, 670, 670, 670, 670, 670, 670, 670, 671,
- 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 64, 64, 64, 64, 64,
- 672, 672, 672, 672, 672, 672, 672, 672, 673, 673, 673, 673, 673, 673,
- 673, 673, 673, 673, 64, 64, 64, 64, 64, 64, 64, 674, 674, 674, 674, 64,
- 64, 64, 64, 675, 675, 675, 675, 675, 675, 675, 676, 676, 676, 676, 676,
- 676, 676, 676, 676, 64, 64, 64, 64, 64, 64, 64, 677, 677, 677, 677, 677,
- 677, 677, 677, 677, 677, 677, 64, 64, 64, 64, 64, 678, 678, 678, 678,
- 678, 678, 678, 678, 678, 678, 678, 64, 64, 64, 64, 64, 64, 64, 679, 679,
- 679, 679, 679, 679, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680,
- 680, 680, 680, 680, 680, 64, 681, 682, 681, 683, 683, 683, 683, 683, 683,
- 683, 683, 683, 683, 683, 683, 683, 682, 682, 682, 682, 682, 682, 682,
- 682, 682, 682, 682, 682, 682, 682, 684, 685, 685, 685, 685, 685, 685,
- 685, 64, 64, 64, 64, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686,
- 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 687, 687, 687, 687,
- 687, 687, 687, 687, 687, 687, 64, 64, 64, 64, 64, 64, 64, 684, 688, 688,
- 689, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690,
- 689, 689, 689, 688, 688, 688, 688, 689, 689, 691, 692, 693, 693, 694,
- 693, 693, 693, 693, 64, 64, 64, 64, 64, 64, 695, 695, 695, 695, 695, 695,
- 695, 695, 695, 64, 64, 64, 64, 64, 64, 64, 696, 696, 696, 696, 696, 696,
- 696, 696, 696, 696, 64, 64, 64, 64, 64, 64, 697, 697, 697, 698, 698, 698,
- 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698,
- 698, 698, 698, 699, 699, 699, 699, 699, 700, 699, 699, 699, 699, 699,
- 699, 701, 701, 64, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 703,
- 703, 703, 703, 64, 64, 64, 64, 704, 704, 704, 704, 704, 704, 704, 704,
- 704, 704, 704, 705, 706, 706, 704, 64, 707, 707, 708, 709, 709, 709, 709,
- 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 708, 708,
- 708, 707, 707, 707, 707, 707, 707, 707, 707, 707, 708, 710, 709, 709,
- 709, 709, 711, 711, 711, 711, 711, 712, 707, 707, 711, 64, 64, 713, 713,
- 713, 713, 713, 713, 713, 713, 713, 713, 709, 711, 709, 711, 711, 711, 64,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 1, 7, 7, 7, 8,
+ 9, 10, 11, 12, 13, 14, 15, 11, 16, 17, 15, 18, 19, 20, 19, 21, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 19, 23, 24, 25, 24, 10, 15, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 16, 27, 17,
+ 28, 29, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 16, 31, 32, 25, 1, 1, 1, 1, 1, 1, 33, 1, 1, 34, 35, 36, 13,
+ 37, 13, 38, 39, 40, 41, 42, 43, 25, 44, 45, 28, 46, 47, 48, 48, 49, 50,
+ 39, 39, 40, 48, 42, 51, 52, 52, 52, 35, 53, 53, 53, 53, 53, 53, 54, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 54, 53, 53, 53, 53, 53, 53, 55, 54, 53,
+ 53, 53, 53, 53, 54, 56, 56, 56, 57, 57, 57, 57, 56, 57, 56, 56, 56, 57,
+ 56, 56, 57, 57, 56, 57, 56, 56, 57, 57, 57, 55, 56, 56, 56, 57, 56, 57,
+ 56, 57, 53, 56, 53, 57, 53, 57, 53, 57, 53, 57, 53, 57, 53, 57, 53, 57,
+ 53, 56, 53, 56, 53, 57, 53, 57, 53, 57, 53, 56, 53, 57, 53, 57, 53, 57,
+ 53, 57, 53, 57, 54, 56, 53, 56, 54, 56, 53, 57, 53, 57, 56, 53, 57, 53,
+ 57, 53, 57, 54, 56, 54, 56, 53, 56, 53, 57, 53, 56, 56, 54, 56, 53, 56,
+ 53, 57, 53, 57, 54, 56, 53, 57, 53, 57, 53, 53, 57, 53, 57, 53, 57, 57,
+ 57, 53, 53, 57, 53, 57, 53, 53, 57, 53, 53, 53, 57, 57, 53, 53, 53, 53,
+ 57, 53, 53, 57, 53, 53, 53, 57, 57, 57, 53, 53, 57, 53, 53, 57, 53, 57,
+ 53, 57, 53, 53, 57, 53, 57, 57, 53, 57, 53, 53, 57, 53, 53, 53, 57, 53,
+ 57, 53, 53, 57, 57, 58, 53, 57, 57, 57, 58, 58, 58, 58, 53, 59, 57, 53,
+ 59, 57, 53, 59, 57, 53, 56, 53, 56, 53, 56, 53, 56, 53, 56, 53, 56, 53,
+ 56, 53, 56, 57, 53, 57, 57, 53, 59, 57, 53, 57, 53, 53, 53, 57, 53, 57,
+ 57, 57, 57, 57, 57, 57, 53, 53, 57, 53, 53, 57, 57, 53, 57, 53, 53, 53,
+ 53, 57, 57, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 58, 57, 57, 57, 60, 60, 60, 60, 60, 60, 60, 60, 60, 61,
+ 61, 62, 62, 62, 62, 62, 62, 62, 63, 63, 64, 63, 61, 65, 66, 65, 65, 65,
+ 66, 65, 61, 61, 67, 62, 63, 63, 63, 63, 63, 63, 40, 40, 40, 40, 63, 40,
+ 63, 49, 60, 60, 60, 60, 60, 63, 63, 63, 63, 63, 68, 68, 61, 63, 62, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 70, 71, 71, 71, 71, 70, 72, 71, 71, 71, 71, 71, 73, 73, 71,
+ 71, 71, 71, 73, 73, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 74, 74,
+ 74, 74, 74, 71, 71, 71, 71, 69, 69, 69, 69, 69, 69, 69, 69, 75, 69, 71,
+ 71, 71, 69, 69, 69, 71, 71, 76, 69, 69, 69, 71, 71, 71, 71, 69, 70, 71,
+ 71, 69, 77, 78, 78, 77, 78, 78, 77, 69, 69, 69, 69, 69, 79, 80, 79, 80,
+ 61, 81, 79, 80, 82, 82, 83, 80, 80, 80, 84, 79, 82, 82, 82, 82, 81, 63,
+ 79, 85, 79, 79, 79, 82, 79, 82, 79, 79, 80, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 82, 86, 86, 86, 86, 86, 86, 86,
+ 79, 79, 80, 80, 80, 80, 80, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 80, 87, 87, 87, 87, 87, 87, 87, 80, 80, 80, 80,
+ 80, 79, 80, 80, 79, 79, 79, 80, 80, 80, 79, 80, 79, 80, 79, 80, 79, 80,
+ 79, 80, 88, 89, 88, 89, 88, 89, 88, 89, 88, 89, 88, 89, 88, 89, 80, 80,
+ 80, 80, 79, 80, 90, 79, 80, 79, 79, 80, 80, 79, 79, 79, 91, 92, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92,
+ 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 94, 93, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 91, 94, 91, 94, 91, 94, 91, 94, 91, 94,
+ 95, 96, 96, 97, 97, 96, 98, 98, 91, 94, 91, 94, 91, 94, 91, 91, 94, 91,
+ 94, 91, 94, 91, 94, 91, 94, 91, 94, 91, 94, 94, 82, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 82,
+ 82, 100, 101, 101, 101, 101, 101, 101, 82, 102, 102, 102, 102, 102, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102, 102, 82, 103, 104, 82, 82, 105,
+ 105, 106, 82, 107, 108, 108, 108, 108, 107, 108, 108, 108, 109, 107, 108,
+ 108, 108, 108, 108, 108, 107, 107, 107, 107, 107, 107, 108, 108, 107,
+ 108, 108, 109, 110, 108, 111, 112, 113, 114, 115, 116, 117, 118, 119,
+ 120, 120, 121, 122, 123, 124, 125, 126, 127, 128, 126, 108, 107, 129,
+ 119, 82, 82, 82, 82, 82, 82, 82, 82, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 82, 82, 82, 82, 82, 130, 130, 130, 126, 126, 82, 82,
+ 82, 131, 131, 131, 131, 131, 132, 133, 133, 134, 135, 135, 136, 137, 138,
+ 139, 139, 140, 140, 140, 140, 140, 140, 140, 140, 141, 142, 143, 144,
+ 145, 82, 146, 144, 147, 147, 147, 147, 147, 147, 147, 147, 148, 147, 147,
+ 147, 147, 147, 147, 147, 147, 147, 147, 149, 150, 151, 152, 153, 154,
+ 155, 156, 97, 97, 157, 158, 140, 140, 140, 140, 140, 158, 140, 140, 158,
+ 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 135, 160, 160, 161,
+ 147, 147, 162, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+ 146, 147, 140, 140, 140, 140, 140, 140, 140, 132, 139, 140, 140, 140,
+ 140, 158, 140, 163, 163, 140, 140, 139, 158, 140, 140, 158, 147, 147,
+ 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 147, 147, 147, 165,
+ 165, 147, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+ 166, 166, 82, 167, 168, 169, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 170, 171, 170, 170, 171, 170, 170, 171, 171,
+ 171, 170, 171, 171, 170, 171, 170, 170, 170, 171, 170, 171, 170, 171,
+ 170, 171, 170, 170, 82, 82, 168, 168, 168, 172, 172, 172, 172, 172, 172,
+ 172, 172, 172, 172, 172, 172, 172, 172, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 172, 82, 82, 82, 82, 82, 82, 174, 174, 174, 174,
+ 174, 174, 174, 174, 174, 174, 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175, 175, 176, 176, 176, 176, 176,
+ 176, 176, 177, 176, 178, 178, 179, 180, 181, 182, 178, 82, 82, 82, 82,
+ 82, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+ 184, 184, 184, 184, 185, 184, 184, 184, 184, 184, 184, 184, 184, 184,
+ 185, 184, 184, 184, 185, 184, 184, 184, 184, 184, 82, 82, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 82, 187, 187,
+ 187, 187, 187, 187, 187, 187, 187, 188, 188, 188, 82, 82, 189, 82, 147,
+ 147, 147, 147, 147, 82, 147, 147, 147, 147, 147, 147, 147, 147, 82, 82,
+ 82, 82, 82, 82, 140, 140, 140, 140, 140, 140, 132, 158, 140, 140, 158,
+ 140, 140, 158, 140, 140, 140, 158, 158, 158, 190, 191, 192, 140, 140,
+ 140, 158, 140, 140, 158, 158, 140, 140, 140, 140, 140, 193, 193, 193,
+ 194, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 193, 194, 196, 195, 194, 194, 194, 193, 193, 193, 193, 193, 193,
+ 193, 193, 194, 194, 194, 194, 197, 194, 194, 195, 97, 157, 198, 198, 193,
+ 193, 193, 195, 195, 193, 193, 199, 199, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 201, 202, 195, 195, 195, 195, 195, 195, 203, 204,
+ 205, 205, 82, 203, 203, 203, 203, 203, 203, 203, 203, 82, 82, 203, 203,
+ 82, 82, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 82, 203, 203, 203, 203, 203, 203, 203, 82, 203, 82, 82, 82, 203,
+ 203, 203, 203, 82, 82, 206, 203, 205, 205, 205, 204, 204, 204, 204, 82,
+ 82, 205, 205, 82, 82, 205, 205, 207, 203, 82, 82, 82, 82, 82, 82, 82, 82,
+ 205, 82, 82, 82, 82, 203, 203, 82, 203, 203, 203, 204, 204, 82, 82, 208,
+ 208, 208, 208, 208, 208, 208, 208, 208, 208, 203, 203, 209, 209, 210,
+ 210, 210, 210, 210, 211, 212, 213, 82, 82, 82, 82, 82, 214, 214, 215, 82,
+ 216, 216, 216, 216, 216, 216, 82, 82, 82, 82, 216, 216, 82, 82, 216, 216,
+ 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 82, 216, 216,
+ 216, 216, 216, 216, 216, 82, 216, 216, 82, 216, 216, 82, 216, 216, 82,
+ 82, 217, 82, 215, 215, 215, 214, 214, 82, 82, 82, 82, 214, 214, 82, 82,
+ 214, 214, 218, 82, 82, 82, 214, 82, 82, 82, 82, 82, 82, 82, 216, 216,
+ 216, 216, 82, 216, 82, 82, 82, 82, 82, 82, 82, 219, 219, 219, 219, 219,
+ 219, 219, 219, 219, 219, 214, 214, 216, 216, 216, 214, 82, 82, 82, 220,
+ 220, 221, 82, 222, 222, 222, 222, 222, 222, 222, 222, 222, 82, 222, 222,
+ 222, 82, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222,
+ 222, 82, 222, 222, 222, 222, 222, 222, 222, 82, 222, 222, 82, 222, 222,
+ 222, 222, 222, 82, 82, 223, 222, 221, 221, 221, 220, 220, 220, 220, 220,
+ 82, 220, 220, 221, 82, 221, 221, 224, 82, 82, 222, 82, 82, 82, 82, 82,
+ 82, 82, 222, 222, 220, 220, 82, 82, 225, 225, 225, 225, 225, 225, 225,
+ 225, 225, 225, 226, 227, 82, 82, 82, 82, 82, 82, 82, 222, 82, 82, 82, 82,
+ 82, 82, 82, 228, 229, 229, 82, 230, 230, 230, 230, 230, 230, 230, 230,
+ 82, 82, 230, 230, 82, 82, 230, 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 82, 230, 230, 230, 230, 230, 230, 230, 82, 230,
+ 230, 82, 230, 230, 230, 230, 230, 82, 82, 231, 230, 229, 228, 229, 228,
+ 228, 228, 228, 82, 82, 229, 229, 82, 82, 229, 229, 232, 82, 82, 82, 82,
+ 82, 82, 82, 82, 228, 229, 82, 82, 82, 82, 230, 230, 82, 230, 230, 230,
+ 228, 228, 82, 82, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 234,
+ 230, 235, 235, 235, 235, 235, 235, 82, 82, 236, 237, 82, 237, 237, 237,
+ 237, 237, 237, 82, 82, 82, 237, 237, 237, 82, 237, 237, 237, 237, 82, 82,
+ 82, 237, 237, 82, 237, 82, 237, 237, 82, 82, 82, 237, 237, 82, 82, 82,
+ 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 82, 82, 82, 82, 238,
+ 238, 236, 238, 238, 82, 82, 82, 238, 238, 238, 82, 238, 238, 238, 239,
+ 82, 82, 237, 82, 82, 82, 82, 82, 82, 238, 82, 82, 82, 82, 82, 82, 240,
+ 240, 240, 240, 240, 240, 240, 240, 240, 240, 241, 241, 241, 242, 242,
+ 242, 242, 242, 242, 243, 242, 82, 82, 82, 82, 82, 244, 245, 245, 245, 82,
+ 246, 246, 246, 246, 246, 246, 246, 246, 82, 246, 246, 246, 82, 246, 246,
+ 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 82,
+ 82, 82, 246, 244, 244, 244, 245, 245, 245, 245, 82, 244, 244, 244, 82,
+ 244, 244, 244, 247, 82, 82, 82, 82, 82, 82, 82, 248, 249, 82, 246, 246,
+ 246, 82, 82, 82, 82, 82, 246, 246, 244, 244, 82, 82, 250, 250, 250, 250,
+ 250, 250, 250, 250, 250, 250, 251, 251, 251, 251, 251, 251, 251, 252,
+ 253, 254, 255, 255, 82, 253, 253, 253, 253, 253, 253, 253, 253, 82, 253,
+ 253, 253, 82, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253,
+ 253, 253, 253, 253, 253, 253, 82, 253, 253, 253, 253, 253, 82, 82, 256,
+ 253, 255, 257, 255, 255, 255, 255, 255, 82, 257, 255, 255, 82, 255, 255,
+ 254, 258, 82, 82, 82, 82, 82, 82, 82, 255, 255, 82, 82, 82, 82, 82, 82,
+ 82, 253, 82, 253, 253, 254, 254, 82, 82, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 82, 253, 253, 82, 82, 82, 82, 82, 82, 260, 261, 261,
+ 82, 262, 262, 262, 262, 262, 262, 262, 262, 82, 262, 262, 262, 82, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 82, 82, 262, 261, 261, 261, 260, 260, 260, 260, 82, 261, 261,
+ 261, 82, 261, 261, 261, 263, 262, 264, 82, 82, 82, 82, 262, 262, 262,
+ 261, 265, 265, 265, 265, 265, 265, 265, 262, 262, 262, 260, 260, 82, 82,
+ 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 265, 265, 265, 265,
+ 265, 265, 265, 265, 265, 267, 262, 262, 262, 262, 262, 262, 82, 82, 268,
+ 268, 82, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 269, 269, 269, 269, 82, 82, 82, 269, 269, 269, 269, 269, 269, 269,
+ 269, 82, 269, 269, 269, 269, 269, 269, 269, 269, 269, 82, 269, 82, 82,
+ 82, 82, 270, 82, 82, 82, 82, 268, 268, 268, 271, 271, 271, 82, 271, 82,
+ 268, 268, 268, 268, 268, 268, 268, 268, 82, 82, 82, 82, 82, 82, 272, 272,
+ 272, 272, 272, 272, 272, 272, 272, 272, 82, 82, 268, 268, 273, 82, 82,
+ 82, 82, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
+ 274, 274, 274, 275, 274, 274, 275, 275, 275, 275, 276, 276, 277, 82, 82,
+ 82, 82, 278, 274, 274, 274, 274, 274, 274, 279, 275, 280, 280, 280, 280,
+ 275, 275, 275, 281, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282,
+ 283, 283, 82, 82, 82, 82, 82, 284, 284, 82, 284, 82, 82, 284, 284, 82,
+ 284, 82, 82, 284, 82, 82, 82, 82, 82, 82, 284, 284, 284, 284, 82, 284,
+ 284, 284, 284, 284, 284, 284, 82, 284, 284, 284, 82, 284, 82, 284, 82,
+ 82, 284, 284, 82, 284, 284, 284, 284, 285, 284, 284, 285, 285, 285, 285,
+ 286, 286, 82, 285, 285, 284, 82, 82, 284, 284, 284, 284, 284, 82, 287,
+ 82, 288, 288, 288, 288, 285, 285, 82, 82, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 82, 82, 284, 284, 284, 284, 290, 291, 291, 291, 292,
+ 293, 292, 292, 294, 292, 292, 295, 294, 296, 296, 296, 296, 296, 294,
+ 297, 296, 297, 297, 297, 298, 298, 297, 297, 297, 297, 297, 297, 299,
+ 299, 299, 299, 299, 299, 299, 299, 299, 299, 300, 300, 300, 300, 300,
+ 300, 300, 300, 300, 300, 301, 298, 297, 298, 297, 302, 303, 304, 303,
+ 304, 305, 305, 290, 290, 290, 290, 290, 290, 290, 290, 82, 290, 290, 290,
+ 290, 290, 290, 290, 290, 290, 290, 290, 290, 82, 82, 82, 82, 306, 307,
+ 308, 309, 308, 308, 308, 308, 308, 307, 307, 307, 307, 308, 310, 307,
+ 308, 311, 311, 312, 295, 311, 311, 290, 290, 290, 290, 290, 308, 308,
+ 308, 308, 308, 308, 308, 308, 308, 308, 308, 82, 308, 308, 308, 308, 308,
+ 308, 308, 308, 308, 308, 308, 308, 82, 301, 301, 297, 297, 297, 297, 297,
+ 297, 298, 297, 297, 297, 297, 297, 297, 82, 297, 297, 292, 292, 295, 292,
+ 293, 313, 313, 313, 313, 294, 294, 82, 82, 82, 82, 82, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314, 315, 315, 316, 316, 316, 316,
+ 315, 316, 316, 316, 316, 316, 317, 315, 318, 318, 315, 315, 316, 316,
+ 314, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 320, 320, 321,
+ 321, 321, 321, 314, 314, 314, 314, 314, 314, 315, 315, 316, 316, 314,
+ 314, 314, 314, 316, 316, 316, 314, 315, 315, 315, 314, 314, 315, 315,
+ 315, 315, 315, 315, 315, 314, 314, 314, 316, 316, 316, 316, 314, 314,
+ 314, 314, 314, 316, 315, 315, 316, 316, 315, 315, 315, 315, 315, 315,
+ 322, 314, 315, 319, 319, 315, 315, 315, 316, 323, 323, 324, 324, 324,
+ 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 82, 324, 82, 82,
+ 82, 82, 82, 324, 82, 82, 325, 325, 325, 325, 325, 325, 325, 325, 325,
+ 325, 325, 326, 327, 325, 325, 325, 328, 328, 328, 328, 328, 328, 328,
+ 328, 329, 329, 329, 329, 329, 329, 329, 329, 330, 330, 330, 330, 330,
+ 330, 330, 330, 331, 331, 331, 331, 331, 331, 331, 331, 331, 82, 331, 331,
+ 331, 331, 82, 82, 331, 331, 331, 331, 331, 331, 331, 82, 331, 331, 331,
+ 82, 82, 332, 332, 332, 333, 334, 333, 333, 333, 333, 333, 333, 333, 335,
+ 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335,
+ 335, 335, 335, 335, 335, 82, 82, 82, 336, 336, 336, 336, 336, 336, 336,
+ 336, 336, 336, 82, 82, 82, 82, 82, 82, 337, 337, 337, 337, 337, 337, 337,
+ 337, 337, 337, 337, 337, 337, 337, 82, 82, 338, 338, 338, 338, 338, 338,
+ 82, 82, 339, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 341, 341, 340, 342, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 344, 345, 82, 82, 82, 346, 346, 346, 346, 346, 346, 346, 346,
+ 346, 346, 346, 199, 199, 199, 347, 347, 347, 346, 346, 346, 346, 346,
+ 346, 346, 346, 82, 82, 82, 82, 82, 82, 82, 348, 348, 348, 348, 348, 348,
+ 348, 348, 348, 348, 348, 348, 348, 82, 348, 348, 348, 348, 349, 349, 350,
+ 82, 82, 82, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 352, 352,
+ 353, 199, 199, 82, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 355,
+ 355, 82, 82, 82, 82, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
+ 356, 356, 356, 82, 356, 356, 356, 82, 357, 357, 82, 82, 82, 82, 358, 358,
+ 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 359, 359, 360, 359,
+ 359, 359, 359, 359, 359, 359, 360, 360, 360, 360, 360, 360, 360, 360,
+ 359, 360, 360, 359, 359, 359, 359, 359, 359, 359, 359, 359, 361, 359,
+ 362, 362, 363, 364, 362, 365, 362, 366, 358, 367, 82, 82, 368, 368, 368,
+ 368, 368, 368, 368, 368, 368, 368, 82, 82, 82, 82, 82, 82, 369, 369, 369,
+ 369, 369, 369, 369, 369, 369, 369, 82, 82, 82, 82, 82, 82, 370, 370, 371,
+ 371, 372, 373, 374, 370, 375, 375, 370, 376, 376, 376, 377, 82, 378, 378,
+ 378, 378, 378, 378, 378, 378, 378, 378, 82, 82, 82, 82, 82, 82, 379, 379,
+ 379, 379, 379, 379, 379, 379, 379, 379, 379, 380, 379, 379, 379, 379,
+ 379, 379, 379, 379, 379, 376, 376, 379, 379, 381, 379, 82, 82, 82, 82,
+ 82, 340, 340, 340, 340, 340, 340, 82, 82, 382, 382, 382, 382, 382, 382,
+ 382, 382, 382, 382, 382, 382, 382, 382, 382, 82, 383, 383, 383, 384, 384,
+ 384, 384, 383, 383, 384, 384, 384, 82, 82, 82, 82, 384, 384, 383, 384,
+ 384, 384, 384, 384, 384, 385, 386, 387, 82, 82, 82, 82, 388, 82, 82, 82,
+ 389, 389, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 391, 391,
+ 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 82, 82, 391,
+ 391, 391, 391, 391, 82, 82, 82, 392, 392, 392, 392, 392, 392, 392, 392,
+ 392, 392, 392, 392, 82, 82, 82, 82, 392, 392, 82, 82, 82, 82, 82, 82,
+ 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 394, 82, 82, 82, 395,
+ 395, 396, 396, 396, 396, 396, 396, 396, 396, 397, 397, 397, 397, 397,
+ 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 398, 399, 400, 400,
+ 401, 82, 82, 402, 402, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403,
+ 403, 403, 403, 404, 405, 404, 405, 405, 405, 405, 405, 405, 405, 82, 406,
+ 404, 405, 404, 404, 405, 405, 405, 405, 405, 405, 405, 405, 404, 404,
+ 404, 404, 404, 404, 405, 405, 407, 407, 407, 407, 407, 407, 407, 407, 82,
+ 82, 408, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 82, 82, 82,
+ 82, 82, 82, 410, 410, 410, 410, 410, 410, 410, 411, 410, 410, 410, 410,
+ 410, 410, 82, 82, 97, 97, 97, 97, 97, 157, 157, 157, 157, 157, 157, 97,
+ 97, 157, 412, 82, 413, 413, 413, 413, 414, 415, 415, 415, 415, 415, 415,
+ 415, 415, 415, 415, 415, 415, 415, 415, 415, 416, 414, 413, 413, 413,
+ 413, 413, 414, 413, 414, 414, 414, 414, 414, 413, 414, 417, 415, 415,
+ 415, 415, 415, 415, 415, 82, 82, 82, 82, 418, 418, 418, 418, 418, 418,
+ 418, 418, 418, 418, 419, 419, 420, 419, 419, 419, 419, 421, 421, 421,
+ 421, 421, 421, 421, 421, 421, 421, 422, 423, 422, 422, 422, 422, 422,
+ 422, 422, 421, 421, 421, 421, 421, 421, 421, 421, 421, 82, 82, 82, 424,
+ 424, 425, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426,
+ 426, 426, 425, 424, 424, 424, 424, 425, 425, 424, 424, 427, 428, 424,
+ 424, 426, 426, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 426,
+ 426, 426, 426, 426, 426, 430, 430, 430, 430, 430, 430, 430, 430, 430,
+ 430, 430, 430, 430, 430, 431, 432, 433, 433, 432, 432, 432, 433, 432,
+ 433, 433, 433, 434, 434, 82, 82, 82, 82, 82, 82, 82, 82, 435, 435, 435,
+ 435, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 437,
+ 437, 437, 437, 437, 437, 437, 437, 438, 438, 438, 438, 438, 438, 438,
+ 438, 437, 437, 438, 439, 82, 82, 82, 440, 440, 440, 440, 440, 441, 441,
+ 441, 441, 441, 441, 441, 441, 441, 441, 82, 82, 82, 436, 436, 436, 442,
+ 442, 442, 442, 442, 442, 442, 442, 442, 442, 443, 443, 443, 443, 443,
+ 443, 443, 443, 443, 443, 443, 443, 443, 443, 444, 444, 444, 444, 444,
+ 444, 445, 445, 94, 82, 82, 82, 82, 82, 82, 82, 446, 446, 446, 446, 446,
+ 446, 446, 446, 97, 97, 97, 326, 447, 157, 157, 157, 157, 157, 97, 97,
+ 157, 157, 157, 157, 97, 448, 447, 447, 447, 447, 447, 447, 447, 449, 449,
+ 449, 449, 157, 449, 449, 449, 449, 448, 448, 97, 449, 449, 82, 97, 97,
+ 82, 82, 82, 82, 82, 82, 57, 57, 57, 57, 57, 57, 80, 80, 80, 80, 80, 94,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 83, 83, 83, 83, 83, 60, 60, 60, 60,
+ 83, 83, 83, 83, 83, 57, 57, 57, 57, 57, 450, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 83, 97, 97,
+ 157, 97, 97, 97, 97, 97, 97, 97, 157, 97, 97, 451, 452, 157, 453, 97, 97,
+ 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
+ 97, 82, 82, 82, 82, 82, 97, 454, 157, 97, 157, 53, 57, 53, 57, 53, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57, 53, 57, 80, 80, 80, 80, 80, 80, 80, 80,
+ 79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 82, 82, 79, 79,
+ 79, 79, 79, 79, 82, 82, 82, 79, 82, 79, 82, 79, 82, 79, 455, 455, 455,
+ 455, 455, 455, 455, 455, 80, 80, 80, 80, 80, 82, 80, 80, 79, 79, 79, 79,
+ 455, 81, 80, 81, 81, 81, 80, 80, 80, 82, 80, 80, 79, 79, 79, 79, 455, 81,
+ 81, 81, 80, 80, 80, 80, 82, 82, 80, 80, 79, 79, 79, 79, 82, 81, 81, 81,
+ 79, 79, 79, 79, 79, 81, 81, 81, 82, 82, 80, 80, 80, 82, 80, 80, 79, 79,
+ 79, 79, 455, 456, 81, 82, 457, 457, 457, 457, 457, 457, 457, 458, 457,
+ 457, 457, 459, 460, 461, 462, 463, 464, 465, 466, 464, 467, 468, 39, 85,
+ 469, 470, 471, 472, 469, 470, 471, 472, 39, 39, 473, 85, 474, 474, 474,
+ 475, 476, 477, 478, 479, 480, 481, 482, 34, 483, 484, 483, 483, 484, 485,
+ 486, 486, 85, 43, 51, 39, 487, 487, 473, 488, 488, 85, 85, 85, 489, 490,
+ 491, 487, 487, 487, 85, 85, 85, 85, 85, 85, 85, 85, 492, 85, 488, 85,
+ 373, 85, 373, 373, 373, 373, 85, 373, 373, 457, 493, 494, 494, 494, 494,
+ 82, 495, 496, 497, 498, 499, 499, 499, 499, 499, 499, 500, 60, 82, 82,
+ 48, 500, 500, 500, 500, 500, 501, 501, 492, 490, 491, 502, 500, 48, 48,
+ 48, 48, 500, 500, 500, 500, 500, 501, 501, 492, 490, 491, 82, 60, 60, 60,
+ 60, 60, 82, 82, 82, 278, 278, 278, 278, 278, 278, 278, 503, 278, 504,
+ 278, 278, 37, 278, 278, 278, 278, 278, 278, 278, 278, 278, 503, 278, 278,
+ 278, 278, 503, 278, 278, 503, 505, 505, 505, 505, 505, 505, 505, 505,
+ 505, 97, 97, 447, 447, 97, 97, 97, 97, 447, 447, 447, 97, 97, 412, 412,
+ 412, 412, 97, 412, 412, 412, 447, 447, 97, 157, 97, 447, 447, 157, 157,
+ 157, 157, 97, 82, 82, 82, 82, 82, 82, 82, 41, 41, 506, 507, 41, 508, 41,
+ 506, 41, 507, 50, 506, 506, 506, 50, 50, 506, 506, 506, 509, 41, 506,
+ 510, 41, 492, 506, 506, 506, 506, 506, 41, 41, 41, 508, 508, 41, 506, 41,
+ 86, 41, 506, 41, 53, 511, 506, 506, 512, 50, 506, 506, 53, 506, 50, 449,
+ 449, 449, 449, 50, 41, 41, 50, 50, 506, 506, 513, 492, 492, 492, 492,
+ 506, 50, 50, 50, 50, 41, 492, 41, 41, 57, 313, 514, 514, 514, 515, 52,
+ 516, 514, 514, 514, 514, 514, 52, 515, 515, 52, 514, 517, 517, 517, 517,
+ 517, 517, 517, 517, 517, 517, 517, 517, 518, 518, 518, 518, 517, 517,
+ 518, 518, 518, 518, 518, 518, 518, 518, 518, 53, 57, 518, 518, 518, 518,
+ 52, 41, 41, 82, 82, 82, 82, 55, 55, 55, 55, 55, 508, 508, 508, 508, 508,
+ 492, 492, 41, 41, 41, 41, 492, 41, 41, 492, 41, 41, 492, 41, 41, 41, 41,
+ 41, 41, 41, 492, 41, 41, 41, 41, 41, 41, 41, 41, 41, 45, 45, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 492, 492, 41, 41, 55, 41, 55, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 45, 41, 41, 41, 41, 492, 492, 492, 492,
+ 492, 492, 492, 492, 492, 492, 492, 492, 55, 513, 519, 519, 513, 492, 492,
+ 55, 519, 513, 513, 519, 513, 513, 492, 55, 492, 519, 520, 521, 492, 519,
+ 513, 492, 492, 492, 519, 513, 513, 519, 55, 519, 519, 513, 513, 55, 513,
+ 55, 513, 55, 55, 55, 55, 519, 519, 513, 519, 513, 513, 513, 513, 513, 55,
+ 55, 55, 55, 492, 513, 492, 513, 519, 519, 513, 513, 513, 513, 513, 513,
+ 513, 513, 513, 513, 519, 513, 513, 513, 519, 492, 492, 492, 492, 492,
+ 519, 513, 513, 513, 492, 492, 492, 492, 492, 492, 492, 492, 492, 513,
+ 519, 55, 513, 492, 519, 519, 519, 519, 513, 513, 519, 519, 492, 492, 519,
+ 519, 513, 513, 519, 519, 513, 513, 519, 519, 513, 513, 513, 513, 513,
+ 492, 492, 513, 513, 513, 513, 492, 492, 55, 492, 492, 513, 55, 492, 492,
+ 492, 492, 492, 492, 492, 492, 513, 513, 492, 55, 513, 513, 513, 492, 492,
+ 492, 492, 492, 513, 519, 492, 513, 513, 513, 513, 513, 492, 492, 513,
+ 513, 492, 492, 492, 492, 513, 513, 513, 513, 513, 513, 513, 513, 492,
+ 522, 490, 491, 490, 491, 41, 41, 41, 41, 41, 41, 508, 41, 41, 41, 41, 41,
+ 41, 41, 523, 523, 41, 41, 41, 41, 513, 513, 41, 41, 41, 41, 41, 41, 41,
+ 524, 525, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 313, 313, 313, 313,
+ 313, 313, 313, 313, 313, 313, 313, 313, 313, 41, 492, 41, 41, 41, 41, 41,
+ 41, 41, 41, 313, 41, 41, 41, 41, 41, 492, 492, 492, 492, 492, 492, 492,
+ 492, 492, 41, 41, 41, 41, 492, 492, 41, 41, 41, 41, 41, 41, 41, 526, 526,
+ 526, 526, 41, 41, 41, 523, 527, 527, 523, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 82, 41, 41, 41, 82, 82, 82, 82, 82, 52, 52, 52, 52, 52, 52,
+ 52, 52, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 516, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 515, 508, 508, 508, 508, 508, 508,
+ 508, 508, 508, 508, 508, 508, 41, 41, 41, 41, 508, 508, 508, 508, 529,
+ 41, 41, 41, 41, 41, 508, 508, 508, 508, 41, 41, 508, 508, 41, 508, 508,
+ 508, 508, 508, 508, 508, 41, 41, 41, 41, 41, 41, 41, 41, 508, 508, 41,
+ 41, 508, 55, 41, 41, 41, 41, 508, 508, 41, 41, 508, 55, 41, 41, 41, 41,
+ 508, 508, 508, 41, 41, 508, 41, 41, 508, 508, 41, 41, 41, 41, 41, 41, 41,
+ 508, 492, 492, 492, 492, 492, 530, 530, 492, 527, 527, 527, 527, 41, 508,
+ 508, 41, 41, 508, 41, 41, 41, 41, 508, 508, 41, 41, 41, 41, 523, 523,
+ 529, 529, 527, 41, 527, 527, 531, 532, 531, 527, 41, 527, 527, 527, 41,
+ 41, 41, 41, 508, 41, 508, 41, 41, 41, 41, 41, 526, 526, 526, 526, 526,
+ 526, 526, 526, 526, 526, 526, 526, 41, 41, 41, 41, 508, 508, 41, 508,
+ 508, 508, 41, 508, 531, 508, 508, 41, 508, 508, 41, 55, 41, 41, 41, 41,
+ 41, 41, 41, 523, 41, 41, 41, 526, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 508, 508, 41, 526, 41, 41, 41, 41, 41, 41, 41, 41, 526, 526, 313, 41, 41,
+ 41, 41, 41, 41, 41, 41, 523, 523, 531, 527, 527, 527, 527, 523, 523, 531,
+ 531, 531, 508, 508, 508, 508, 531, 526, 531, 531, 531, 508, 531, 523,
+ 508, 508, 508, 531, 531, 508, 508, 531, 508, 508, 531, 531, 531, 41, 508,
+ 41, 41, 41, 41, 508, 508, 523, 508, 508, 508, 508, 508, 508, 531, 523,
+ 523, 531, 523, 508, 531, 531, 533, 523, 508, 508, 523, 531, 531, 527,
+ 527, 527, 527, 527, 526, 41, 41, 527, 527, 534, 534, 532, 532, 41, 41,
+ 526, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 45, 41, 41, 41, 41,
+ 41, 41, 526, 41, 526, 41, 41, 41, 41, 526, 526, 526, 41, 535, 41, 41, 41,
+ 536, 536, 536, 536, 536, 536, 41, 537, 537, 527, 41, 41, 41, 490, 491,
+ 490, 491, 490, 491, 490, 491, 490, 491, 490, 491, 490, 491, 52, 52, 516,
+ 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 41, 526, 526, 526,
+ 41, 41, 41, 41, 41, 41, 41, 526, 513, 492, 492, 513, 513, 490, 491, 492,
+ 513, 513, 492, 513, 513, 513, 492, 492, 492, 492, 492, 513, 513, 513,
+ 513, 492, 492, 492, 492, 492, 513, 513, 513, 492, 492, 492, 513, 513,
+ 513, 513, 16, 32, 16, 32, 16, 32, 16, 32, 490, 491, 538, 538, 538, 538,
+ 538, 538, 538, 538, 492, 492, 492, 490, 491, 16, 32, 490, 491, 490, 491,
+ 490, 491, 490, 491, 490, 491, 492, 492, 513, 513, 513, 513, 513, 513,
+ 492, 492, 492, 492, 492, 492, 492, 513, 513, 513, 513, 513, 513, 492,
+ 492, 492, 513, 492, 492, 492, 492, 513, 513, 513, 513, 513, 492, 513,
+ 513, 492, 492, 490, 491, 490, 491, 513, 492, 492, 492, 492, 513, 492,
+ 513, 513, 513, 492, 492, 513, 513, 492, 492, 492, 492, 492, 492, 492,
+ 492, 492, 492, 513, 513, 513, 513, 513, 513, 492, 492, 490, 491, 492,
+ 492, 492, 492, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513,
+ 492, 513, 513, 513, 513, 492, 492, 513, 492, 513, 492, 492, 513, 492,
+ 513, 513, 513, 513, 492, 492, 492, 492, 492, 513, 513, 492, 492, 492,
+ 492, 513, 513, 513, 513, 492, 513, 513, 492, 492, 513, 513, 492, 492,
+ 492, 492, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 492,
+ 492, 513, 513, 513, 513, 513, 513, 513, 513, 492, 513, 513, 513, 513,
+ 513, 513, 513, 513, 492, 492, 492, 492, 492, 513, 492, 513, 492, 492,
+ 492, 513, 513, 513, 513, 513, 492, 492, 492, 492, 513, 492, 492, 492,
+ 513, 513, 513, 513, 513, 492, 513, 492, 492, 41, 41, 41, 526, 526, 41,
+ 41, 41, 492, 492, 492, 492, 492, 41, 41, 492, 492, 492, 492, 492, 492,
+ 41, 41, 41, 526, 41, 41, 41, 41, 535, 508, 508, 41, 41, 41, 41, 82, 82,
+ 41, 41, 41, 41, 41, 41, 41, 41, 82, 82, 41, 41, 82, 82, 82, 41, 41, 41,
+ 41, 82, 41, 41, 41, 41, 41, 41, 41, 41, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 41, 41, 41, 41, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539,
+ 539, 539, 539, 539, 539, 82, 540, 540, 540, 540, 540, 540, 540, 540, 540,
+ 540, 540, 540, 540, 540, 540, 82, 53, 57, 53, 53, 53, 57, 57, 53, 57, 53,
+ 57, 53, 57, 53, 53, 53, 53, 57, 53, 57, 57, 53, 57, 57, 57, 57, 57, 57,
+ 60, 60, 53, 53, 88, 89, 88, 89, 89, 541, 541, 541, 541, 541, 541, 88, 89,
+ 88, 89, 542, 542, 542, 88, 89, 82, 82, 82, 82, 82, 543, 544, 544, 544,
+ 545, 543, 544, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
+ 546, 546, 546, 82, 546, 82, 82, 82, 82, 82, 546, 82, 82, 547, 547, 547,
+ 547, 547, 547, 547, 547, 82, 82, 82, 82, 82, 82, 82, 548, 549, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 550, 96, 96, 96, 96, 96,
+ 96, 96, 96, 551, 551, 43, 51, 43, 51, 551, 551, 551, 43, 51, 551, 43, 51,
+ 373, 373, 373, 373, 373, 373, 373, 373, 85, 466, 552, 373, 553, 85, 43,
+ 51, 85, 85, 43, 51, 490, 491, 490, 491, 490, 491, 490, 491, 373, 373,
+ 373, 373, 371, 61, 373, 373, 85, 373, 373, 85, 85, 85, 85, 85, 554, 554,
+ 373, 373, 373, 85, 466, 373, 471, 373, 373, 82, 82, 82, 555, 555, 555,
+ 555, 555, 555, 555, 555, 555, 555, 82, 555, 555, 555, 555, 555, 555, 555,
+ 555, 555, 82, 82, 82, 82, 555, 555, 555, 555, 555, 555, 82, 82, 523, 523,
+ 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 82, 82, 82, 82, 556,
+ 557, 557, 558, 523, 559, 560, 561, 524, 525, 524, 525, 524, 525, 524,
+ 525, 524, 525, 523, 523, 524, 525, 524, 525, 524, 525, 524, 525, 562,
+ 563, 564, 564, 523, 561, 561, 561, 561, 561, 561, 561, 561, 561, 565,
+ 566, 567, 568, 569, 569, 570, 571, 571, 571, 571, 572, 523, 523, 561,
+ 561, 561, 559, 573, 558, 523, 527, 82, 574, 575, 574, 575, 574, 575, 574,
+ 575, 574, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 574, 575, 575, 575, 575, 575, 575, 575, 574,
+ 575, 574, 575, 574, 575, 575, 575, 575, 575, 575, 574, 575, 575, 575,
+ 575, 575, 575, 574, 574, 82, 82, 576, 576, 577, 577, 578, 578, 575, 562,
+ 579, 580, 579, 580, 579, 580, 579, 580, 579, 580, 580, 580, 580, 580,
+ 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 579, 580,
+ 580, 580, 580, 580, 580, 580, 579, 580, 579, 580, 579, 580, 580, 580,
+ 580, 580, 580, 579, 580, 580, 580, 580, 580, 580, 579, 579, 580, 580,
+ 580, 580, 581, 582, 583, 583, 580, 82, 82, 82, 82, 82, 584, 584, 584,
+ 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 82,
+ 82, 82, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585,
+ 585, 585, 585, 585, 585, 585, 585, 585, 585, 82, 586, 586, 587, 587, 587,
+ 587, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 584, 584, 584, 82,
+ 82, 82, 82, 82, 579, 579, 579, 579, 579, 579, 579, 579, 588, 588, 588,
+ 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 589, 589, 82, 587, 587,
+ 587, 587, 587, 587, 587, 587, 587, 587, 586, 586, 586, 586, 586, 586,
+ 590, 590, 590, 590, 590, 590, 590, 590, 523, 591, 591, 591, 591, 591,
+ 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 588, 588, 588, 588,
+ 589, 589, 589, 586, 586, 591, 591, 591, 591, 591, 591, 591, 586, 586,
+ 586, 586, 523, 523, 523, 523, 592, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 592, 592, 82, 586, 586, 586, 586, 586, 586, 586,
+ 523, 523, 523, 523, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586,
+ 586, 523, 523, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593,
+ 593, 593, 593, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 595,
+ 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 596, 595,
+ 595, 595, 595, 595, 595, 595, 82, 82, 82, 597, 597, 597, 597, 597, 597,
+ 597, 597, 597, 597, 597, 597, 597, 597, 597, 82, 598, 598, 598, 598, 598,
+ 598, 598, 598, 599, 599, 599, 599, 599, 599, 600, 600, 601, 601, 601,
+ 601, 601, 601, 601, 601, 601, 601, 601, 601, 602, 603, 604, 603, 605,
+ 605, 605, 605, 605, 605, 605, 605, 605, 605, 601, 601, 82, 82, 82, 82,
+ 91, 94, 91, 94, 91, 94, 606, 96, 98, 98, 98, 607, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 607, 608, 91, 94, 91, 94, 450, 450, 96, 96, 609, 609,
+ 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 610, 610,
+ 610, 610, 610, 610, 610, 610, 610, 610, 611, 611, 612, 613, 613, 613,
+ 613, 613, 63, 63, 63, 63, 63, 63, 63, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 63, 63, 53, 57, 53, 57, 53, 57, 57, 57, 53, 57, 53, 57, 53, 57, 60, 57,
+ 57, 57, 57, 57, 57, 57, 57, 53, 57, 53, 57, 53, 53, 57, 61, 614, 614, 53,
+ 57, 53, 57, 58, 53, 57, 53, 57, 57, 57, 53, 57, 53, 57, 53, 53, 53, 53,
+ 53, 82, 53, 53, 53, 53, 53, 57, 53, 57, 82, 82, 82, 82, 82, 82, 82, 58,
+ 60, 60, 57, 58, 58, 58, 58, 58, 615, 615, 616, 615, 615, 615, 617, 615,
+ 615, 615, 615, 616, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615,
+ 615, 615, 615, 615, 615, 618, 618, 616, 616, 618, 619, 619, 619, 619, 82,
+ 82, 82, 82, 620, 620, 620, 620, 620, 620, 313, 313, 503, 512, 82, 82, 82,
+ 82, 82, 82, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621,
+ 622, 622, 623, 623, 624, 624, 625, 625, 625, 625, 625, 625, 625, 625,
+ 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 624, 624, 624, 624,
+ 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 626, 627, 82,
+ 82, 82, 82, 82, 82, 82, 82, 628, 628, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 82, 82, 82, 82, 82, 82, 198, 198, 198, 198, 198, 198, 198,
+ 198, 198, 198, 195, 195, 195, 195, 195, 195, 201, 201, 201, 195, 630,
+ 195, 82, 82, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 632, 632,
+ 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632,
+ 632, 632, 632, 632, 633, 633, 633, 633, 633, 634, 634, 634, 199, 635,
+ 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636,
+ 636, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 638, 639, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 640, 328, 328, 328, 328, 328, 82,
+ 82, 82, 641, 641, 641, 642, 643, 643, 643, 643, 643, 643, 643, 643, 643,
+ 643, 643, 643, 643, 643, 643, 644, 642, 642, 641, 641, 641, 641, 642,
+ 642, 641, 642, 642, 642, 645, 646, 646, 646, 646, 646, 646, 647, 647,
+ 647, 646, 646, 646, 646, 82, 62, 648, 648, 648, 648, 648, 648, 648, 648,
+ 648, 648, 82, 82, 82, 82, 646, 646, 314, 314, 314, 314, 314, 316, 649,
+ 314, 319, 319, 314, 314, 314, 314, 314, 82, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650, 651, 651, 651, 651, 651, 651, 652, 652, 651, 651, 652,
+ 652, 651, 651, 82, 650, 650, 650, 651, 650, 650, 650, 650, 650, 650, 650,
+ 650, 651, 652, 82, 82, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653,
+ 82, 82, 654, 655, 655, 655, 649, 314, 314, 314, 314, 314, 314, 323, 323,
+ 323, 314, 315, 316, 315, 314, 314, 656, 656, 656, 656, 656, 656, 656,
+ 656, 657, 656, 657, 657, 658, 656, 656, 657, 657, 656, 656, 656, 656,
+ 656, 657, 657, 656, 657, 656, 82, 82, 82, 82, 82, 82, 82, 82, 656, 656,
+ 659, 660, 660, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661,
+ 662, 663, 663, 662, 662, 664, 664, 661, 665, 665, 662, 666, 82, 82, 331,
+ 331, 331, 331, 331, 331, 82, 57, 57, 57, 614, 60, 60, 60, 60, 57, 57, 57,
+ 57, 57, 80, 82, 82, 338, 338, 338, 338, 338, 338, 338, 338, 661, 661,
+ 661, 662, 662, 663, 662, 662, 663, 662, 662, 664, 662, 666, 82, 82, 667,
+ 667, 667, 667, 667, 667, 667, 667, 667, 667, 82, 82, 82, 82, 82, 82, 668,
+ 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669,
+ 669, 669, 669, 669, 669, 668, 669, 669, 669, 669, 669, 669, 669, 82, 82,
+ 82, 82, 329, 329, 329, 329, 329, 329, 329, 82, 82, 82, 82, 330, 330, 330,
+ 330, 330, 330, 330, 330, 330, 82, 82, 82, 82, 670, 670, 670, 670, 670,
+ 670, 670, 670, 671, 671, 671, 671, 671, 671, 671, 671, 593, 593, 594,
+ 594, 594, 594, 594, 594, 57, 57, 57, 57, 57, 57, 57, 82, 82, 82, 82, 102,
+ 102, 102, 102, 102, 82, 82, 82, 82, 82, 130, 672, 130, 130, 673, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 82, 130, 130,
+ 130, 130, 130, 82, 130, 82, 130, 130, 82, 130, 130, 82, 130, 130, 147,
+ 147, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674,
+ 674, 674, 674, 82, 82, 82, 82, 82, 82, 82, 82, 82, 147, 147, 147, 147,
+ 147, 147, 147, 147, 147, 147, 147, 675, 471, 82, 82, 147, 147, 147, 147,
+ 147, 147, 147, 147, 147, 147, 136, 139, 82, 82, 676, 676, 676, 676, 676,
+ 676, 676, 676, 677, 557, 557, 677, 677, 678, 678, 563, 564, 679, 82, 82,
+ 82, 82, 82, 82, 97, 97, 97, 97, 97, 97, 97, 157, 157, 157, 157, 157, 157,
+ 157, 96, 96, 558, 570, 570, 680, 680, 563, 564, 563, 564, 563, 564, 563,
+ 564, 563, 564, 563, 564, 563, 564, 563, 564, 558, 558, 563, 564, 558,
+ 558, 558, 558, 680, 680, 680, 681, 558, 681, 82, 581, 682, 678, 678, 570,
+ 524, 525, 524, 525, 524, 525, 683, 558, 558, 684, 685, 686, 686, 687, 82,
+ 558, 688, 689, 558, 82, 82, 82, 82, 147, 147, 147, 147, 147, 82, 82, 493,
+ 82, 690, 691, 692, 693, 694, 691, 691, 695, 696, 691, 697, 698, 699, 698,
+ 700, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 702, 703, 704,
+ 705, 704, 690, 691, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 695, 691, 696, 707, 708, 707,
+ 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709,
+ 709, 709, 709, 709, 695, 705, 696, 705, 695, 696, 710, 711, 712, 710,
+ 713, 714, 715, 715, 715, 715, 715, 715, 715, 715, 715, 716, 714, 714,
714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714,
- 714, 714, 714, 714, 714, 714, 64, 64, 64, 715, 715, 715, 715, 715, 715,
- 715, 715, 715, 715, 64, 715, 715, 715, 715, 715, 715, 715, 715, 715, 716,
- 716, 716, 717, 717, 717, 716, 716, 717, 718, 719, 717, 720, 720, 720,
- 720, 720, 720, 64, 64, 721, 721, 721, 721, 721, 721, 721, 64, 721, 64,
- 721, 721, 721, 721, 64, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721,
- 721, 721, 721, 721, 721, 64, 721, 721, 722, 64, 64, 64, 64, 64, 64, 723,
- 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723,
- 724, 725, 725, 725, 724, 724, 724, 724, 724, 724, 726, 727, 64, 64, 64,
- 64, 64, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 64, 64, 64, 64,
- 64, 64, 729, 729, 730, 730, 64, 731, 731, 731, 731, 731, 731, 731, 731,
- 64, 64, 731, 731, 64, 64, 731, 731, 731, 731, 731, 731, 731, 731, 731,
- 731, 731, 731, 731, 731, 64, 731, 731, 731, 731, 731, 731, 731, 64, 731,
- 731, 64, 731, 731, 731, 731, 731, 64, 64, 732, 731, 730, 730, 729, 730,
- 730, 730, 730, 64, 64, 730, 730, 64, 64, 730, 730, 733, 64, 64, 731, 64,
- 64, 64, 64, 64, 64, 730, 64, 64, 64, 64, 64, 731, 731, 731, 731, 731,
- 730, 730, 64, 64, 734, 734, 734, 734, 734, 734, 734, 64, 64, 64, 735,
- 735, 735, 735, 735, 735, 735, 735, 736, 736, 736, 737, 737, 737, 737,
- 737, 737, 736, 737, 736, 736, 736, 736, 737, 737, 736, 738, 739, 735,
- 735, 740, 735, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 64, 64,
- 64, 64, 64, 64, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742,
- 742, 742, 742, 742, 743, 743, 743, 744, 744, 744, 744, 64, 64, 743, 743,
- 743, 743, 744, 744, 743, 745, 746, 747, 747, 747, 747, 747, 747, 747,
- 747, 747, 747, 747, 747, 747, 747, 747, 742, 742, 742, 742, 744, 744, 64,
- 64, 748, 748, 748, 748, 748, 748, 748, 748, 749, 749, 749, 750, 750, 750,
- 750, 750, 750, 750, 750, 749, 749, 750, 749, 751, 750, 752, 752, 752,
- 748, 64, 64, 64, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 64,
- 64, 64, 64, 64, 64, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754,
- 754, 755, 756, 755, 756, 756, 755, 755, 755, 755, 755, 755, 757, 758,
- 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 64, 64, 64, 64, 64, 64,
- 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 64, 64, 64, 761, 761,
- 761, 762, 762, 761, 761, 761, 761, 762, 761, 761, 761, 761, 763, 64, 64,
- 64, 64, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 765, 765, 766,
- 766, 766, 767, 768, 768, 768, 768, 768, 768, 768, 768, 769, 769, 769,
- 769, 769, 769, 769, 769, 770, 770, 770, 770, 770, 770, 770, 770, 770,
- 770, 771, 771, 771, 771, 771, 771, 771, 771, 771, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 772, 773, 773, 773, 773, 773, 773, 773, 773, 773,
- 64, 64, 64, 64, 64, 64, 64, 774, 774, 774, 774, 774, 774, 774, 774, 774,
- 774, 64, 64, 64, 64, 64, 64, 775, 775, 775, 775, 775, 775, 775, 775, 775,
- 775, 775, 775, 775, 775, 775, 64, 776, 776, 776, 776, 776, 64, 64, 64,
- 774, 774, 774, 774, 64, 64, 64, 64, 777, 777, 777, 777, 777, 777, 777,
- 777, 777, 777, 777, 777, 777, 777, 777, 64, 778, 778, 778, 778, 778, 778,
- 778, 778, 778, 778, 778, 778, 778, 778, 778, 64, 511, 64, 64, 64, 64, 64,
- 64, 64, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779,
- 779, 779, 64, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 64, 64,
- 64, 64, 781, 781, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782,
- 782, 782, 782, 64, 64, 783, 783, 783, 783, 783, 784, 64, 64, 785, 785,
- 785, 785, 785, 785, 785, 785, 786, 786, 786, 786, 786, 786, 786, 787,
- 787, 787, 787, 787, 788, 788, 788, 788, 789, 789, 789, 789, 787, 788, 64,
- 64, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 64, 791, 791, 791,
- 791, 791, 791, 791, 64, 785, 785, 785, 785, 785, 64, 64, 64, 64, 64, 785,
- 785, 785, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792,
- 792, 64, 64, 64, 792, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793,
- 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 64, 64, 64,
- 64, 64, 64, 64, 64, 794, 794, 794, 794, 795, 795, 795, 795, 795, 795,
- 795, 795, 795, 795, 795, 795, 795, 486, 482, 64, 64, 64, 64, 64, 64, 796,
- 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 64, 64, 64, 64, 64,
- 796, 796, 796, 796, 796, 64, 64, 64, 796, 64, 64, 64, 64, 64, 64, 64,
- 796, 796, 64, 64, 797, 798, 799, 800, 410, 410, 410, 410, 64, 64, 64, 64,
- 277, 277, 277, 277, 277, 277, 64, 64, 277, 277, 277, 277, 277, 277, 277,
- 64, 64, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 801,
- 801, 400, 400, 400, 277, 277, 277, 802, 801, 801, 801, 801, 801, 410,
- 410, 410, 410, 410, 410, 410, 410, 136, 136, 136, 136, 136, 136, 136,
- 136, 277, 277, 78, 78, 78, 78, 78, 136, 136, 277, 277, 277, 277, 277,
- 277, 78, 78, 78, 78, 277, 277, 277, 64, 64, 64, 64, 64, 64, 64, 606, 606,
- 803, 803, 803, 606, 64, 64, 521, 521, 64, 64, 64, 64, 64, 64, 442, 442,
- 442, 442, 442, 442, 442, 442, 442, 442, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 442, 442, 442, 442, 442, 442,
- 442, 442, 442, 442, 34, 34, 34, 34, 34, 34, 34, 64, 34, 34, 34, 34, 34,
- 34, 442, 64, 442, 442, 64, 64, 442, 64, 64, 442, 442, 64, 64, 442, 442,
- 442, 442, 64, 442, 442, 34, 34, 64, 34, 64, 34, 34, 34, 34, 34, 34, 34,
- 64, 34, 34, 34, 34, 34, 34, 34, 442, 442, 64, 442, 442, 442, 442, 64, 64,
- 442, 442, 442, 442, 442, 442, 442, 442, 64, 442, 442, 442, 442, 442, 442,
- 442, 64, 34, 34, 442, 442, 64, 442, 442, 442, 442, 64, 442, 442, 442,
- 442, 442, 64, 442, 64, 64, 64, 442, 442, 442, 442, 442, 442, 442, 64, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 64, 64, 442, 804, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 445, 34, 34, 34, 34, 34, 34, 442, 442, 442, 442,
- 442, 442, 442, 442, 442, 804, 34, 34, 34, 34, 34, 34, 34, 34, 34, 445,
- 34, 34, 442, 442, 442, 442, 442, 804, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 445, 34, 34, 34, 34, 34, 34, 442, 442, 442, 442, 442, 442, 442, 442, 442,
- 804, 34, 445, 34, 34, 34, 34, 34, 34, 34, 34, 442, 34, 64, 64, 805, 805,
- 805, 805, 805, 805, 805, 805, 805, 805, 806, 806, 806, 806, 806, 806,
- 806, 806, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807,
- 807, 807, 807, 806, 806, 806, 806, 807, 807, 807, 807, 807, 807, 807,
- 807, 807, 807, 806, 806, 806, 806, 806, 806, 806, 806, 807, 806, 806,
- 806, 806, 806, 806, 807, 806, 806, 808, 808, 808, 808, 808, 64, 64, 64,
- 64, 64, 64, 64, 807, 807, 807, 807, 807, 64, 807, 807, 807, 807, 807,
- 807, 807, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809,
- 809, 64, 64, 810, 810, 810, 810, 810, 810, 810, 810, 810, 811, 811, 811,
- 811, 811, 811, 811, 64, 126, 126, 126, 126, 64, 126, 126, 126, 64, 126,
- 126, 64, 126, 64, 64, 126, 64, 126, 126, 126, 126, 126, 126, 126, 126,
- 126, 126, 64, 126, 126, 126, 126, 64, 126, 64, 126, 64, 64, 64, 64, 64,
- 64, 126, 64, 64, 64, 64, 126, 64, 126, 64, 126, 64, 126, 126, 126, 64,
- 126, 64, 126, 64, 126, 64, 126, 64, 126, 126, 126, 126, 64, 126, 64, 126,
- 126, 64, 126, 126, 126, 126, 126, 126, 126, 126, 126, 64, 64, 64, 64, 64,
- 126, 126, 126, 64, 126, 126, 126, 113, 113, 64, 64, 64, 64, 64, 64, 64,
- 26, 26, 26, 26, 26, 26, 26, 33, 33, 33, 446, 446, 64, 64, 64, 453, 453,
- 453, 453, 453, 453, 277, 64, 453, 453, 26, 26, 64, 64, 64, 64, 453, 453,
- 453, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 277, 277, 812, 489, 489,
- 64, 64, 64, 64, 64, 489, 489, 489, 64, 64, 64, 64, 64, 489, 64, 64, 64,
- 64, 64, 64, 64, 489, 489, 64, 64, 64, 64, 64, 64, 26, 26, 26, 47, 47, 47,
- 47, 47, 26, 26, 64, 26, 26, 26, 26, 26, 26, 26, 26, 26, 64, 26, 26, 26,
- 26, 64, 64, 64, 64, 64, 64, 64, 26, 26, 26, 26, 26, 64, 64, 64, 496, 496,
- 496, 496, 496, 496, 496, 497, 496, 496, 496, 496, 496, 497, 497, 497,
- 497, 497, 497, 497, 497, 497, 64, 64, 64, 410, 64, 64, 64, 64, 64, 64,
- 410, 410, 410, 410, 410, 410, 410, 410, 565, 565, 565, 565, 565, 565, 64,
- 64,
+ 714, 714, 714, 714, 714, 717, 717, 718, 718, 718, 718, 718, 718, 718,
+ 718, 718, 718, 718, 718, 718, 718, 718, 82, 82, 82, 718, 718, 718, 718,
+ 718, 718, 82, 82, 718, 718, 718, 82, 82, 82, 719, 693, 705, 707, 720,
+ 693, 693, 82, 721, 722, 722, 722, 722, 721, 721, 82, 82, 723, 723, 723,
+ 724, 508, 82, 82, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725,
+ 725, 82, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 82, 725, 725,
+ 725, 82, 725, 725, 82, 725, 725, 725, 725, 725, 725, 725, 82, 82, 725,
+ 725, 725, 82, 82, 82, 82, 82, 199, 373, 199, 82, 82, 82, 82, 620, 620,
+ 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 82, 82, 82, 313,
+ 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 727,
+ 727, 727, 727, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 727, 727, 728, 729, 729, 82, 41, 41, 41,
+ 41, 82, 82, 82, 82, 728, 82, 82, 82, 82, 82, 82, 82, 313, 313, 313, 313,
+ 313, 157, 82, 82, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730,
+ 730, 730, 82, 82, 82, 731, 731, 731, 731, 731, 731, 731, 731, 731, 82,
+ 82, 82, 82, 82, 82, 82, 157, 500, 500, 500, 500, 500, 500, 500, 500, 500,
+ 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 82, 82, 82, 82, 732,
+ 732, 732, 732, 732, 732, 732, 732, 733, 733, 733, 733, 82, 82, 82, 82,
+ 734, 734, 734, 734, 734, 734, 734, 734, 734, 735, 734, 734, 734, 734,
+ 734, 734, 734, 734, 735, 82, 82, 82, 82, 82, 736, 736, 736, 736, 736,
+ 736, 736, 736, 736, 736, 736, 736, 736, 736, 737, 737, 737, 737, 737, 82,
+ 82, 82, 82, 82, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738,
+ 738, 738, 738, 82, 739, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740,
+ 740, 740, 82, 82, 82, 82, 741, 742, 742, 742, 742, 742, 82, 82, 743, 743,
+ 743, 743, 743, 743, 743, 743, 744, 744, 744, 744, 744, 744, 744, 744,
+ 745, 745, 745, 745, 745, 745, 745, 745, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746, 82, 82, 747, 747, 747, 747, 747,
+ 747, 747, 747, 747, 747, 82, 82, 82, 82, 82, 82, 748, 748, 748, 748, 748,
+ 748, 748, 748, 748, 748, 748, 748, 82, 82, 82, 82, 749, 749, 749, 749,
+ 749, 749, 749, 749, 749, 749, 749, 749, 82, 82, 82, 82, 750, 750, 750,
+ 750, 750, 750, 750, 750, 751, 751, 751, 751, 751, 751, 751, 751, 751,
+ 751, 751, 751, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 752, 753, 753,
+ 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 82, 753,
+ 753, 753, 753, 753, 753, 82, 82, 754, 754, 754, 754, 754, 754, 82, 82,
+ 754, 82, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 82, 754, 754, 82, 82, 82, 754, 82, 82,
+ 754, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755,
+ 755, 82, 756, 757, 757, 757, 757, 757, 757, 757, 757, 758, 758, 758, 758,
+ 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 759, 759, 760,
+ 760, 760, 760, 760, 760, 760, 761, 761, 761, 761, 761, 761, 761, 761,
+ 761, 761, 761, 761, 761, 761, 761, 82, 82, 82, 82, 82, 82, 82, 82, 762,
+ 762, 762, 762, 762, 762, 762, 762, 762, 763, 763, 763, 763, 763, 763,
+ 763, 763, 763, 763, 763, 82, 763, 763, 82, 82, 82, 82, 82, 764, 764, 764,
+ 764, 764, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765,
+ 765, 765, 766, 766, 766, 766, 766, 766, 82, 82, 82, 767, 768, 768, 768,
+ 768, 768, 768, 768, 768, 768, 768, 82, 82, 82, 82, 82, 769, 770, 770,
+ 770, 770, 770, 770, 770, 770, 771, 771, 771, 771, 771, 771, 771, 771, 82,
+ 82, 82, 82, 772, 772, 771, 771, 772, 772, 772, 772, 772, 772, 772, 772,
+ 82, 82, 772, 772, 772, 772, 772, 772, 773, 774, 774, 774, 82, 774, 774,
+ 82, 82, 82, 82, 82, 774, 775, 774, 776, 773, 773, 773, 773, 82, 773, 773,
+ 773, 82, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 82, 82, 82, 82, 776, 777, 775, 82, 82, 82,
+ 82, 778, 779, 779, 779, 779, 779, 779, 779, 779, 780, 780, 780, 780, 780,
+ 780, 780, 780, 781, 82, 82, 82, 82, 82, 82, 82, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782, 783, 783, 784, 785, 785, 785,
+ 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 786, 786, 786, 787,
+ 787, 787, 787, 787, 787, 787, 787, 788, 787, 787, 787, 787, 787, 787,
+ 787, 787, 787, 787, 787, 787, 789, 790, 82, 82, 82, 82, 791, 791, 791,
+ 791, 791, 792, 792, 792, 792, 792, 792, 793, 82, 794, 794, 794, 794, 794,
+ 794, 794, 794, 794, 794, 794, 794, 794, 794, 82, 82, 82, 795, 795, 795,
+ 795, 795, 795, 795, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796,
+ 796, 796, 796, 796, 82, 82, 797, 797, 797, 797, 797, 797, 797, 797, 798,
+ 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 82, 82, 82, 82, 82,
+ 799, 799, 799, 799, 799, 799, 799, 799, 800, 800, 800, 800, 800, 800,
+ 800, 800, 800, 800, 82, 82, 82, 82, 82, 82, 82, 801, 801, 801, 801, 82,
+ 82, 82, 82, 802, 802, 802, 802, 802, 802, 802, 803, 803, 803, 803, 803,
+ 803, 803, 803, 803, 82, 82, 82, 82, 82, 82, 82, 804, 804, 804, 804, 804,
+ 804, 804, 804, 804, 804, 804, 82, 82, 82, 82, 82, 805, 805, 805, 805,
+ 805, 805, 805, 805, 805, 805, 805, 82, 82, 82, 82, 82, 82, 82, 806, 806,
+ 806, 806, 806, 806, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807,
+ 807, 807, 807, 807, 807, 82, 808, 809, 808, 810, 810, 810, 810, 810, 810,
+ 810, 810, 810, 810, 810, 810, 810, 809, 809, 809, 809, 809, 809, 809,
+ 809, 809, 809, 809, 809, 809, 809, 811, 812, 812, 813, 813, 813, 813,
+ 813, 82, 82, 82, 82, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814,
+ 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 815, 815, 815, 815,
+ 815, 815, 815, 815, 815, 815, 82, 82, 82, 82, 82, 82, 82, 811, 816, 816,
+ 817, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818,
+ 817, 817, 817, 816, 816, 816, 816, 817, 817, 819, 820, 821, 821, 822,
+ 823, 823, 823, 823, 82, 82, 82, 82, 82, 82, 824, 824, 824, 824, 824, 824,
+ 824, 824, 824, 82, 82, 82, 82, 82, 82, 82, 825, 825, 825, 825, 825, 825,
+ 825, 825, 825, 825, 82, 82, 82, 82, 82, 82, 826, 826, 826, 827, 827, 827,
+ 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827,
+ 827, 827, 827, 828, 828, 828, 828, 828, 829, 828, 828, 828, 828, 828,
+ 828, 830, 830, 82, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 832,
+ 832, 832, 832, 82, 82, 82, 82, 833, 833, 833, 833, 833, 833, 833, 833,
+ 833, 833, 833, 834, 835, 836, 833, 82, 837, 837, 838, 839, 839, 839, 839,
+ 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 838, 838,
+ 838, 837, 837, 837, 837, 837, 837, 837, 837, 837, 838, 840, 839, 839,
+ 839, 839, 841, 841, 842, 841, 842, 843, 837, 837, 842, 82, 82, 844, 844,
+ 844, 844, 844, 844, 844, 844, 844, 844, 839, 845, 839, 841, 841, 841, 82,
+ 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846,
+ 846, 846, 846, 846, 846, 846, 82, 82, 82, 847, 847, 847, 847, 847, 847,
+ 847, 847, 847, 847, 82, 847, 847, 847, 847, 847, 847, 847, 847, 847, 848,
+ 848, 848, 849, 849, 849, 848, 848, 849, 850, 851, 849, 852, 852, 853,
+ 852, 852, 853, 849, 82, 854, 854, 854, 854, 854, 854, 854, 82, 854, 82,
+ 854, 854, 854, 854, 82, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854,
+ 854, 854, 854, 854, 854, 82, 854, 854, 855, 82, 82, 82, 82, 82, 82, 856,
+ 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856,
+ 857, 858, 858, 858, 857, 857, 857, 857, 857, 857, 859, 860, 82, 82, 82,
+ 82, 82, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 82, 82, 82, 82,
+ 82, 82, 862, 862, 863, 863, 82, 864, 864, 864, 864, 864, 864, 864, 864,
+ 82, 82, 864, 864, 82, 82, 864, 864, 864, 864, 864, 864, 864, 864, 864,
+ 864, 864, 864, 864, 864, 82, 864, 864, 864, 864, 864, 864, 864, 82, 864,
+ 864, 82, 864, 864, 864, 864, 864, 82, 82, 865, 864, 863, 863, 862, 863,
+ 863, 863, 863, 82, 82, 863, 863, 82, 82, 863, 863, 866, 82, 82, 864, 82,
+ 82, 82, 82, 82, 82, 863, 82, 82, 82, 82, 82, 864, 864, 864, 864, 864,
+ 863, 863, 82, 82, 867, 867, 867, 867, 867, 867, 867, 82, 82, 82, 868,
+ 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 869, 869,
+ 869, 870, 870, 870, 870, 870, 870, 870, 870, 869, 869, 871, 870, 870,
+ 869, 872, 868, 868, 868, 868, 873, 873, 873, 873, 874, 875, 875, 875,
+ 875, 875, 875, 875, 875, 875, 875, 82, 873, 82, 874, 82, 82, 876, 876,
+ 876, 876, 876, 876, 876, 876, 877, 877, 877, 878, 878, 878, 878, 878,
+ 878, 877, 878, 877, 877, 877, 877, 878, 878, 877, 879, 880, 876, 876,
+ 881, 876, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 82, 82, 82,
+ 82, 82, 82, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883,
+ 883, 883, 883, 884, 884, 884, 885, 885, 885, 885, 82, 82, 884, 884, 884,
+ 884, 885, 885, 884, 886, 887, 888, 889, 889, 890, 890, 891, 891, 891,
+ 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889,
+ 889, 883, 883, 883, 883, 885, 885, 82, 82, 892, 892, 892, 892, 892, 892,
+ 892, 892, 893, 893, 893, 894, 894, 894, 894, 894, 894, 894, 894, 893,
+ 893, 894, 893, 895, 894, 896, 896, 897, 892, 82, 82, 82, 898, 898, 898,
+ 898, 898, 898, 898, 898, 898, 898, 82, 82, 82, 82, 82, 82, 899, 899, 899,
+ 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 82, 82, 82, 900, 900,
+ 900, 900, 900, 900, 900, 900, 900, 900, 900, 901, 902, 901, 902, 902,
+ 901, 901, 901, 901, 901, 901, 903, 904, 905, 905, 905, 905, 905, 905,
+ 905, 905, 905, 905, 82, 82, 82, 82, 82, 82, 906, 906, 906, 906, 906, 906,
+ 906, 906, 906, 906, 82, 82, 82, 907, 907, 907, 908, 908, 907, 907, 907,
+ 907, 908, 907, 907, 907, 907, 909, 82, 82, 82, 82, 910, 910, 910, 910,
+ 910, 910, 910, 910, 910, 910, 911, 911, 912, 912, 912, 913, 914, 914,
+ 914, 914, 914, 914, 914, 914, 915, 915, 915, 915, 915, 915, 915, 915,
+ 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 917, 917, 917, 917,
+ 917, 917, 917, 917, 917, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 918, 919, 919, 919, 919, 919, 919, 919, 919, 919, 82, 82, 82, 82, 82, 82,
+ 82, 920, 920, 920, 920, 920, 920, 920, 920, 920, 82, 920, 920, 920, 920,
+ 920, 920, 920, 920, 920, 920, 920, 920, 920, 921, 922, 922, 922, 922,
+ 922, 922, 922, 82, 922, 922, 922, 922, 922, 922, 921, 923, 920, 924, 924,
+ 924, 924, 924, 82, 82, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925,
+ 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926,
+ 926, 926, 926, 926, 926, 82, 82, 82, 927, 928, 929, 929, 929, 929, 929,
+ 929, 929, 929, 929, 929, 929, 929, 929, 929, 82, 82, 930, 930, 930, 930,
+ 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 82, 931, 930, 930, 930,
+ 930, 930, 930, 930, 931, 930, 930, 931, 930, 930, 82, 932, 932, 932, 932,
+ 932, 932, 932, 932, 932, 932, 82, 82, 82, 82, 82, 82, 933, 933, 933, 933,
+ 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 82, 934, 934, 934,
+ 934, 934, 82, 82, 82, 932, 932, 932, 932, 82, 82, 82, 82, 935, 935, 935,
+ 935, 935, 935, 935, 935, 936, 936, 936, 937, 937, 937, 935, 935, 935,
+ 935, 937, 935, 935, 935, 936, 937, 936, 937, 935, 935, 935, 935, 935,
+ 935, 935, 936, 937, 937, 935, 935, 935, 935, 935, 935, 935, 935, 935,
+ 935, 935, 82, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938,
+ 938, 938, 939, 940, 938, 938, 938, 938, 938, 938, 938, 82, 609, 82, 82,
+ 82, 82, 82, 82, 82, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941,
+ 941, 941, 941, 941, 941, 82, 942, 942, 942, 942, 942, 942, 942, 942, 942,
+ 942, 82, 82, 82, 82, 943, 943, 944, 944, 944, 944, 944, 944, 944, 944,
+ 944, 944, 944, 944, 944, 944, 82, 82, 945, 945, 945, 945, 945, 946, 82,
+ 82, 947, 947, 947, 947, 947, 947, 947, 947, 948, 948, 948, 948, 948, 948,
+ 948, 949, 949, 949, 950, 950, 951, 951, 951, 951, 952, 952, 952, 952,
+ 949, 951, 82, 82, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 82,
+ 954, 954, 954, 954, 954, 954, 954, 82, 947, 947, 947, 947, 947, 82, 82,
+ 82, 82, 82, 947, 947, 947, 955, 955, 955, 955, 955, 955, 955, 955, 955,
+ 955, 955, 955, 955, 82, 82, 82, 955, 956, 956, 956, 956, 956, 956, 956,
+ 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956,
+ 956, 82, 82, 82, 82, 82, 82, 82, 82, 957, 957, 957, 957, 958, 958, 958,
+ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 959, 82, 82, 82, 82,
+ 82, 82, 82, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960,
+ 960, 82, 82, 82, 960, 960, 960, 82, 82, 82, 82, 82, 580, 575, 82, 82, 82,
+ 82, 82, 82, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 82,
+ 82, 82, 82, 82, 961, 961, 961, 961, 961, 82, 82, 82, 961, 82, 82, 82, 82,
+ 82, 82, 82, 961, 961, 82, 82, 962, 963, 964, 965, 499, 499, 499, 499, 82,
+ 82, 82, 82, 313, 313, 313, 313, 313, 313, 82, 82, 313, 313, 313, 313,
+ 313, 313, 313, 82, 82, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313,
+ 313, 313, 966, 966, 447, 447, 447, 313, 313, 313, 967, 966, 966, 966,
+ 966, 966, 499, 499, 499, 499, 499, 499, 499, 499, 157, 157, 157, 157,
+ 157, 157, 157, 157, 313, 313, 97, 97, 97, 97, 97, 157, 157, 313, 313,
+ 313, 313, 313, 313, 97, 97, 97, 97, 313, 313, 313, 82, 82, 82, 82, 82,
+ 82, 82, 728, 728, 968, 968, 968, 728, 82, 82, 620, 620, 82, 82, 82, 82,
+ 82, 82, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 506, 506, 506,
+ 506, 506, 506, 506, 506, 506, 506, 50, 50, 50, 50, 50, 50, 50, 82, 50,
+ 50, 50, 50, 50, 50, 506, 82, 506, 506, 82, 82, 506, 82, 82, 506, 506, 82,
+ 82, 506, 506, 506, 506, 82, 506, 506, 50, 50, 82, 50, 82, 50, 50, 50, 50,
+ 50, 50, 50, 82, 50, 50, 50, 50, 50, 50, 50, 506, 506, 82, 506, 506, 506,
+ 506, 82, 82, 506, 506, 506, 506, 506, 506, 506, 506, 82, 506, 506, 506,
+ 506, 506, 506, 506, 82, 50, 50, 506, 506, 82, 506, 506, 506, 506, 82,
+ 506, 506, 506, 506, 506, 82, 506, 82, 82, 82, 506, 506, 506, 506, 506,
+ 506, 506, 82, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 82, 82,
+ 506, 969, 50, 50, 50, 50, 50, 50, 50, 50, 50, 513, 50, 50, 50, 50, 50,
+ 50, 506, 506, 506, 506, 506, 506, 506, 506, 506, 969, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 513, 50, 50, 506, 506, 506, 506, 506, 969, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 513, 50, 50, 50, 50, 50, 50, 506, 506, 506, 506,
+ 506, 506, 506, 506, 506, 969, 50, 513, 50, 50, 50, 50, 50, 50, 50, 50,
+ 506, 50, 82, 82, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 971,
+ 971, 971, 971, 971, 971, 971, 971, 972, 972, 972, 972, 972, 972, 972,
+ 972, 972, 972, 972, 972, 972, 972, 972, 971, 971, 971, 971, 972, 972,
+ 972, 972, 972, 972, 972, 972, 972, 972, 971, 971, 971, 971, 971, 971,
+ 971, 971, 972, 971, 971, 971, 971, 971, 971, 972, 971, 971, 973, 973,
+ 973, 973, 974, 82, 82, 82, 82, 82, 82, 82, 972, 972, 972, 972, 972, 82,
+ 972, 972, 972, 972, 972, 972, 972, 975, 975, 975, 975, 975, 975, 975, 82,
+ 975, 975, 975, 975, 975, 975, 975, 975, 975, 82, 82, 975, 975, 975, 975,
+ 975, 975, 975, 82, 975, 975, 82, 975, 975, 975, 975, 975, 82, 82, 82, 82,
+ 82, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 82,
+ 82, 977, 977, 977, 977, 977, 977, 977, 977, 977, 978, 978, 978, 978, 978,
+ 978, 978, 82, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 980, 980,
+ 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980,
+ 980, 980, 981, 981, 981, 981, 981, 981, 982, 82, 82, 82, 82, 82, 983,
+ 983, 983, 983, 983, 983, 983, 983, 983, 983, 82, 82, 82, 82, 984, 984,
+ 147, 147, 147, 147, 82, 147, 147, 147, 82, 147, 147, 82, 147, 82, 82,
+ 147, 82, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 82, 147, 147,
+ 147, 147, 82, 147, 82, 147, 82, 82, 82, 82, 82, 82, 147, 82, 82, 82, 82,
+ 147, 82, 147, 82, 147, 82, 147, 147, 147, 82, 147, 82, 147, 82, 147, 82,
+ 147, 82, 147, 147, 147, 147, 82, 147, 82, 147, 147, 82, 147, 147, 147,
+ 147, 147, 147, 147, 147, 147, 82, 82, 82, 82, 82, 147, 147, 147, 82, 147,
+ 147, 147, 133, 133, 82, 82, 82, 82, 82, 82, 527, 527, 527, 527, 523, 527,
+ 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 527, 527,
+ 527, 527, 527, 527, 527, 985, 985, 527, 527, 527, 527, 527, 527, 527,
+ 527, 527, 527, 527, 527, 527, 527, 523, 527, 527, 527, 527, 527, 527,
+ 985, 985, 48, 48, 48, 516, 516, 985, 985, 985, 528, 528, 528, 528, 528,
+ 528, 313, 985, 528, 528, 41, 41, 985, 985, 985, 985, 528, 528, 528, 528,
+ 528, 528, 986, 528, 528, 986, 986, 986, 986, 986, 986, 986, 986, 986,
+ 986, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 987, 987, 987, 987, 987, 987, 987, 987,
+ 987, 987, 988, 586, 586, 985, 985, 985, 985, 985, 586, 586, 586, 586,
+ 985, 985, 985, 985, 586, 985, 985, 985, 985, 985, 985, 985, 586, 586,
+ 985, 985, 985, 985, 985, 985, 523, 527, 527, 527, 527, 527, 527, 527,
+ 527, 527, 527, 527, 527, 523, 523, 523, 523, 523, 523, 523, 523, 523,
+ 527, 523, 523, 523, 523, 523, 523, 527, 523, 523, 523, 523, 523, 523,
+ 523, 534, 523, 523, 523, 523, 523, 523, 527, 527, 527, 527, 527, 527,
+ 527, 527, 41, 41, 527, 527, 523, 523, 523, 523, 523, 526, 526, 523, 523,
+ 523, 523, 523, 526, 523, 523, 523, 523, 523, 523, 534, 534, 523, 523,
+ 523, 523, 523, 534, 532, 527, 527, 527, 523, 523, 527, 527, 527, 523,
+ 527, 527, 527, 523, 523, 523, 989, 989, 989, 989, 989, 523, 523, 523,
+ 523, 523, 523, 523, 527, 523, 527, 534, 534, 523, 523, 534, 534, 534,
+ 534, 534, 534, 534, 534, 534, 534, 534, 523, 523, 523, 523, 523, 523,
+ 523, 523, 523, 523, 523, 523, 523, 534, 534, 534, 534, 523, 523, 523,
+ 523, 534, 523, 534, 523, 523, 523, 534, 523, 523, 523, 523, 534, 534,
+ 534, 523, 534, 534, 534, 526, 523, 526, 523, 526, 523, 523, 523, 523,
+ 523, 534, 523, 523, 523, 523, 526, 523, 526, 526, 523, 523, 523, 523,
+ 523, 523, 523, 523, 523, 523, 527, 527, 523, 526, 526, 526, 526, 526,
+ 526, 526, 523, 523, 523, 523, 523, 523, 523, 523, 526, 526, 526, 526,
+ 526, 526, 523, 523, 523, 523, 523, 526, 526, 526, 526, 526, 526, 526,
+ 526, 526, 526, 526, 526, 41, 41, 41, 41, 527, 523, 523, 523, 523, 527,
+ 527, 527, 527, 527, 527, 532, 527, 527, 527, 527, 534, 527, 527, 527,
+ 527, 527, 532, 527, 527, 527, 527, 534, 534, 527, 527, 527, 527, 527, 41,
+ 41, 41, 41, 41, 41, 41, 41, 527, 527, 527, 527, 41, 41, 527, 523, 523,
+ 523, 523, 523, 523, 523, 523, 523, 523, 534, 534, 534, 523, 523, 523,
+ 534, 534, 534, 534, 534, 41, 41, 41, 41, 41, 41, 536, 536, 536, 990, 990,
+ 990, 41, 41, 41, 41, 523, 523, 523, 534, 523, 523, 523, 523, 523, 523,
+ 523, 523, 534, 534, 534, 523, 534, 523, 523, 523, 523, 523, 527, 527,
+ 523, 523, 523, 985, 985, 985, 985, 985, 527, 527, 527, 523, 523, 985,
+ 985, 985, 527, 527, 527, 527, 523, 523, 523, 985, 41, 41, 41, 41, 985,
+ 985, 985, 985, 41, 41, 41, 41, 41, 985, 985, 985, 41, 41, 985, 985, 985,
+ 985, 985, 985, 41, 41, 41, 41, 41, 41, 985, 985, 534, 534, 534, 534, 534,
+ 534, 534, 985, 523, 523, 523, 523, 523, 523, 534, 523, 534, 985, 985,
+ 534, 534, 534, 534, 534, 534, 534, 523, 523, 534, 534, 534, 985, 523,
+ 523, 523, 523, 985, 985, 985, 985, 523, 523, 523, 523, 523, 523, 523,
+ 985, 523, 523, 985, 985, 985, 985, 985, 985, 523, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 82, 82, 593, 593, 593, 593,
+ 593, 593, 593, 594, 593, 593, 593, 593, 593, 594, 594, 594, 594, 594,
+ 594, 594, 594, 594, 82, 82, 82, 499, 82, 82, 82, 82, 82, 82, 499, 499,
+ 499, 499, 499, 499, 499, 499, 671, 671, 671, 671, 671, 671, 82, 82,
};
/* decomposition data */
@@ -3874,98 +4326,98 @@
25429, 266, 19968, 266, 19977, 266, 36938, 266, 24038, 266, 20013, 266,
21491, 266, 25351, 266, 36208, 266, 25171, 266, 31105, 266, 31354, 266,
21512, 266, 28288, 266, 26377, 266, 26376, 266, 30003, 266, 21106, 266,
- 21942, 770, 12308, 26412, 12309, 770, 12308, 19977, 12309, 770, 12308,
- 20108, 12309, 770, 12308, 23433, 12309, 770, 12308, 28857, 12309, 770,
- 12308, 25171, 12309, 770, 12308, 30423, 12309, 770, 12308, 21213, 12309,
- 770, 12308, 25943, 12309, 263, 24471, 263, 21487, 256, 20029, 256, 20024,
- 256, 20033, 256, 55360, 56610, 256, 20320, 256, 20398, 256, 20411, 256,
- 20482, 256, 20602, 256, 20633, 256, 20711, 256, 20687, 256, 13470, 256,
- 55361, 56890, 256, 20813, 256, 20820, 256, 20836, 256, 20855, 256, 55361,
- 56604, 256, 13497, 256, 20839, 256, 20877, 256, 55361, 56651, 256, 20887,
- 256, 20900, 256, 20172, 256, 20908, 256, 20917, 256, 55396, 56799, 256,
- 20981, 256, 20995, 256, 13535, 256, 21051, 256, 21062, 256, 21106, 256,
- 21111, 256, 13589, 256, 21191, 256, 21193, 256, 21220, 256, 21242, 256,
- 21253, 256, 21254, 256, 21271, 256, 21321, 256, 21329, 256, 21338, 256,
- 21363, 256, 21373, 256, 21375, 256, 21375, 256, 21375, 256, 55362, 56876,
- 256, 28784, 256, 21450, 256, 21471, 256, 55362, 57187, 256, 21483, 256,
- 21489, 256, 21510, 256, 21662, 256, 21560, 256, 21576, 256, 21608, 256,
- 21666, 256, 21750, 256, 21776, 256, 21843, 256, 21859, 256, 21892, 256,
- 21892, 256, 21913, 256, 21931, 256, 21939, 256, 21954, 256, 22294, 256,
- 22022, 256, 22295, 256, 22097, 256, 22132, 256, 20999, 256, 22766, 256,
- 22478, 256, 22516, 256, 22541, 256, 22411, 256, 22578, 256, 22577, 256,
- 22700, 256, 55365, 56548, 256, 22770, 256, 22775, 256, 22790, 256, 22810,
- 256, 22818, 256, 22882, 256, 55365, 57000, 256, 55365, 57066, 256, 23020,
- 256, 23067, 256, 23079, 256, 23000, 256, 23142, 256, 14062, 256, 14076,
- 256, 23304, 256, 23358, 256, 23358, 256, 55366, 56776, 256, 23491, 256,
- 23512, 256, 23527, 256, 23539, 256, 55366, 57112, 256, 23551, 256, 23558,
- 256, 24403, 256, 23586, 256, 14209, 256, 23648, 256, 23662, 256, 23744,
- 256, 23693, 256, 55367, 56804, 256, 23875, 256, 55367, 56806, 256, 23918,
- 256, 23915, 256, 23932, 256, 24033, 256, 24034, 256, 14383, 256, 24061,
- 256, 24104, 256, 24125, 256, 24169, 256, 14434, 256, 55368, 56707, 256,
- 14460, 256, 24240, 256, 24243, 256, 24246, 256, 24266, 256, 55400, 57234,
- 256, 24318, 256, 55368, 57137, 256, 55368, 57137, 256, 33281, 256, 24354,
- 256, 24354, 256, 14535, 256, 55372, 57016, 256, 55384, 56794, 256, 24418,
- 256, 24427, 256, 14563, 256, 24474, 256, 24525, 256, 24535, 256, 24569,
- 256, 24705, 256, 14650, 256, 14620, 256, 24724, 256, 55369, 57044, 256,
- 24775, 256, 24904, 256, 24908, 256, 24910, 256, 24908, 256, 24954, 256,
- 24974, 256, 25010, 256, 24996, 256, 25007, 256, 25054, 256, 25074, 256,
- 25078, 256, 25104, 256, 25115, 256, 25181, 256, 25265, 256, 25300, 256,
- 25424, 256, 55370, 57100, 256, 25405, 256, 25340, 256, 25448, 256, 25475,
- 256, 25572, 256, 55370, 57329, 256, 25634, 256, 25541, 256, 25513, 256,
- 14894, 256, 25705, 256, 25726, 256, 25757, 256, 25719, 256, 14956, 256,
- 25935, 256, 25964, 256, 55372, 56330, 256, 26083, 256, 26360, 256, 26185,
- 256, 15129, 256, 26257, 256, 15112, 256, 15076, 256, 20882, 256, 20885,
- 256, 26368, 256, 26268, 256, 32941, 256, 17369, 256, 26391, 256, 26395,
- 256, 26401, 256, 26462, 256, 26451, 256, 55372, 57283, 256, 15177, 256,
- 26618, 256, 26501, 256, 26706, 256, 26757, 256, 55373, 56429, 256, 26766,
- 256, 26655, 256, 26900, 256, 15261, 256, 26946, 256, 27043, 256, 27114,
- 256, 27304, 256, 55373, 56995, 256, 27355, 256, 15384, 256, 27425, 256,
- 55374, 56487, 256, 27476, 256, 15438, 256, 27506, 256, 27551, 256, 27578,
- 256, 27579, 256, 55374, 56973, 256, 55367, 56587, 256, 55374, 57082, 256,
- 27726, 256, 55375, 56508, 256, 27839, 256, 27853, 256, 27751, 256, 27926,
- 256, 27966, 256, 28023, 256, 27969, 256, 28009, 256, 28024, 256, 28037,
- 256, 55375, 56606, 256, 27956, 256, 28207, 256, 28270, 256, 15667, 256,
- 28363, 256, 28359, 256, 55375, 57041, 256, 28153, 256, 28526, 256, 55375,
- 57182, 256, 55375, 57230, 256, 28614, 256, 28729, 256, 28702, 256, 28699,
- 256, 15766, 256, 28746, 256, 28797, 256, 28791, 256, 28845, 256, 55361,
- 56613, 256, 28997, 256, 55376, 56931, 256, 29084, 256, 55376, 57259, 256,
- 29224, 256, 29237, 256, 29264, 256, 55377, 56840, 256, 29312, 256, 29333,
- 256, 55377, 57141, 256, 55378, 56340, 256, 29562, 256, 29579, 256, 16044,
- 256, 29605, 256, 16056, 256, 16056, 256, 29767, 256, 29788, 256, 29809,
- 256, 29829, 256, 29898, 256, 16155, 256, 29988, 256, 55379, 56374, 256,
- 30014, 256, 55379, 56466, 256, 30064, 256, 55368, 56735, 256, 30224, 256,
- 55379, 57249, 256, 55379, 57272, 256, 55380, 56388, 256, 16380, 256,
- 16392, 256, 30452, 256, 55380, 56563, 256, 55380, 56562, 256, 55380,
- 56601, 256, 55380, 56627, 256, 30494, 256, 30495, 256, 30495, 256, 30538,
- 256, 16441, 256, 30603, 256, 16454, 256, 16534, 256, 55381, 56349, 256,
- 30798, 256, 30860, 256, 30924, 256, 16611, 256, 55381, 56870, 256, 31062,
- 256, 55381, 56986, 256, 55381, 57029, 256, 31119, 256, 31211, 256, 16687,
- 256, 31296, 256, 31306, 256, 31311, 256, 55382, 56700, 256, 55382, 56999,
- 256, 55382, 56999, 256, 31470, 256, 16898, 256, 55382, 57259, 256, 31686,
- 256, 31689, 256, 16935, 256, 55383, 56448, 256, 31954, 256, 17056, 256,
- 31976, 256, 31971, 256, 32000, 256, 55383, 57222, 256, 32099, 256, 17153,
- 256, 32199, 256, 32258, 256, 32325, 256, 17204, 256, 55384, 56872, 256,
- 55384, 56903, 256, 17241, 256, 55384, 57049, 256, 32634, 256, 55384,
- 57150, 256, 32661, 256, 32762, 256, 32773, 256, 55385, 56538, 256, 55385,
- 56611, 256, 32864, 256, 55385, 56744, 256, 32880, 256, 55372, 57183, 256,
- 17365, 256, 32946, 256, 33027, 256, 17419, 256, 33086, 256, 23221, 256,
- 55385, 57255, 256, 55385, 57269, 256, 55372, 57235, 256, 55372, 57244,
- 256, 33281, 256, 33284, 256, 36766, 256, 17515, 256, 33425, 256, 33419,
- 256, 33437, 256, 21171, 256, 33457, 256, 33459, 256, 33469, 256, 33510,
- 256, 55386, 57148, 256, 33509, 256, 33565, 256, 33635, 256, 33709, 256,
- 33571, 256, 33725, 256, 33767, 256, 33879, 256, 33619, 256, 33738, 256,
- 33740, 256, 33756, 256, 55387, 56374, 256, 55387, 56683, 256, 55387,
- 56533, 256, 17707, 256, 34033, 256, 34035, 256, 34070, 256, 55388, 57290,
- 256, 34148, 256, 55387, 57132, 256, 17757, 256, 17761, 256, 55387, 57265,
- 256, 55388, 56530, 256, 17771, 256, 34384, 256, 34396, 256, 34407, 256,
- 34409, 256, 34473, 256, 34440, 256, 34574, 256, 34530, 256, 34681, 256,
- 34600, 256, 34667, 256, 34694, 256, 17879, 256, 34785, 256, 34817, 256,
- 17913, 256, 34912, 256, 34915, 256, 55389, 56935, 256, 35031, 256, 35038,
- 256, 17973, 256, 35066, 256, 13499, 256, 55390, 56494, 256, 55390, 56678,
- 256, 18110, 256, 18119, 256, 35488, 256, 35565, 256, 35722, 256, 35925,
- 256, 55391, 56488, 256, 36011, 256, 36033, 256, 36123, 256, 36215, 256,
- 55391, 57135, 256, 55362, 56324, 256, 36299, 256, 36284, 256, 36336, 256,
- 55362, 56542, 256, 36564, 256, 36664, 256, 55393, 56786, 256, 55393,
+ 21942, 266, 37197, 770, 12308, 26412, 12309, 770, 12308, 19977, 12309,
+ 770, 12308, 20108, 12309, 770, 12308, 23433, 12309, 770, 12308, 28857,
+ 12309, 770, 12308, 25171, 12309, 770, 12308, 30423, 12309, 770, 12308,
+ 21213, 12309, 770, 12308, 25943, 12309, 263, 24471, 263, 21487, 256,
+ 20029, 256, 20024, 256, 20033, 256, 55360, 56610, 256, 20320, 256, 20398,
+ 256, 20411, 256, 20482, 256, 20602, 256, 20633, 256, 20711, 256, 20687,
+ 256, 13470, 256, 55361, 56890, 256, 20813, 256, 20820, 256, 20836, 256,
+ 20855, 256, 55361, 56604, 256, 13497, 256, 20839, 256, 20877, 256, 55361,
+ 56651, 256, 20887, 256, 20900, 256, 20172, 256, 20908, 256, 20917, 256,
+ 55396, 56799, 256, 20981, 256, 20995, 256, 13535, 256, 21051, 256, 21062,
+ 256, 21106, 256, 21111, 256, 13589, 256, 21191, 256, 21193, 256, 21220,
+ 256, 21242, 256, 21253, 256, 21254, 256, 21271, 256, 21321, 256, 21329,
+ 256, 21338, 256, 21363, 256, 21373, 256, 21375, 256, 21375, 256, 21375,
+ 256, 55362, 56876, 256, 28784, 256, 21450, 256, 21471, 256, 55362, 57187,
+ 256, 21483, 256, 21489, 256, 21510, 256, 21662, 256, 21560, 256, 21576,
+ 256, 21608, 256, 21666, 256, 21750, 256, 21776, 256, 21843, 256, 21859,
+ 256, 21892, 256, 21892, 256, 21913, 256, 21931, 256, 21939, 256, 21954,
+ 256, 22294, 256, 22022, 256, 22295, 256, 22097, 256, 22132, 256, 20999,
+ 256, 22766, 256, 22478, 256, 22516, 256, 22541, 256, 22411, 256, 22578,
+ 256, 22577, 256, 22700, 256, 55365, 56548, 256, 22770, 256, 22775, 256,
+ 22790, 256, 22810, 256, 22818, 256, 22882, 256, 55365, 57000, 256, 55365,
+ 57066, 256, 23020, 256, 23067, 256, 23079, 256, 23000, 256, 23142, 256,
+ 14062, 256, 14076, 256, 23304, 256, 23358, 256, 23358, 256, 55366, 56776,
+ 256, 23491, 256, 23512, 256, 23527, 256, 23539, 256, 55366, 57112, 256,
+ 23551, 256, 23558, 256, 24403, 256, 23586, 256, 14209, 256, 23648, 256,
+ 23662, 256, 23744, 256, 23693, 256, 55367, 56804, 256, 23875, 256, 55367,
+ 56806, 256, 23918, 256, 23915, 256, 23932, 256, 24033, 256, 24034, 256,
+ 14383, 256, 24061, 256, 24104, 256, 24125, 256, 24169, 256, 14434, 256,
+ 55368, 56707, 256, 14460, 256, 24240, 256, 24243, 256, 24246, 256, 24266,
+ 256, 55400, 57234, 256, 24318, 256, 55368, 57137, 256, 55368, 57137, 256,
+ 33281, 256, 24354, 256, 24354, 256, 14535, 256, 55372, 57016, 256, 55384,
+ 56794, 256, 24418, 256, 24427, 256, 14563, 256, 24474, 256, 24525, 256,
+ 24535, 256, 24569, 256, 24705, 256, 14650, 256, 14620, 256, 24724, 256,
+ 55369, 57044, 256, 24775, 256, 24904, 256, 24908, 256, 24910, 256, 24908,
+ 256, 24954, 256, 24974, 256, 25010, 256, 24996, 256, 25007, 256, 25054,
+ 256, 25074, 256, 25078, 256, 25104, 256, 25115, 256, 25181, 256, 25265,
+ 256, 25300, 256, 25424, 256, 55370, 57100, 256, 25405, 256, 25340, 256,
+ 25448, 256, 25475, 256, 25572, 256, 55370, 57329, 256, 25634, 256, 25541,
+ 256, 25513, 256, 14894, 256, 25705, 256, 25726, 256, 25757, 256, 25719,
+ 256, 14956, 256, 25935, 256, 25964, 256, 55372, 56330, 256, 26083, 256,
+ 26360, 256, 26185, 256, 15129, 256, 26257, 256, 15112, 256, 15076, 256,
+ 20882, 256, 20885, 256, 26368, 256, 26268, 256, 32941, 256, 17369, 256,
+ 26391, 256, 26395, 256, 26401, 256, 26462, 256, 26451, 256, 55372, 57283,
+ 256, 15177, 256, 26618, 256, 26501, 256, 26706, 256, 26757, 256, 55373,
+ 56429, 256, 26766, 256, 26655, 256, 26900, 256, 15261, 256, 26946, 256,
+ 27043, 256, 27114, 256, 27304, 256, 55373, 56995, 256, 27355, 256, 15384,
+ 256, 27425, 256, 55374, 56487, 256, 27476, 256, 15438, 256, 27506, 256,
+ 27551, 256, 27578, 256, 27579, 256, 55374, 56973, 256, 55367, 56587, 256,
+ 55374, 57082, 256, 27726, 256, 55375, 56508, 256, 27839, 256, 27853, 256,
+ 27751, 256, 27926, 256, 27966, 256, 28023, 256, 27969, 256, 28009, 256,
+ 28024, 256, 28037, 256, 55375, 56606, 256, 27956, 256, 28207, 256, 28270,
+ 256, 15667, 256, 28363, 256, 28359, 256, 55375, 57041, 256, 28153, 256,
+ 28526, 256, 55375, 57182, 256, 55375, 57230, 256, 28614, 256, 28729, 256,
+ 28702, 256, 28699, 256, 15766, 256, 28746, 256, 28797, 256, 28791, 256,
+ 28845, 256, 55361, 56613, 256, 28997, 256, 55376, 56931, 256, 29084, 256,
+ 55376, 57259, 256, 29224, 256, 29237, 256, 29264, 256, 55377, 56840, 256,
+ 29312, 256, 29333, 256, 55377, 57141, 256, 55378, 56340, 256, 29562, 256,
+ 29579, 256, 16044, 256, 29605, 256, 16056, 256, 16056, 256, 29767, 256,
+ 29788, 256, 29809, 256, 29829, 256, 29898, 256, 16155, 256, 29988, 256,
+ 55379, 56374, 256, 30014, 256, 55379, 56466, 256, 30064, 256, 55368,
+ 56735, 256, 30224, 256, 55379, 57249, 256, 55379, 57272, 256, 55380,
+ 56388, 256, 16380, 256, 16392, 256, 30452, 256, 55380, 56563, 256, 55380,
+ 56562, 256, 55380, 56601, 256, 55380, 56627, 256, 30494, 256, 30495, 256,
+ 30495, 256, 30538, 256, 16441, 256, 30603, 256, 16454, 256, 16534, 256,
+ 55381, 56349, 256, 30798, 256, 30860, 256, 30924, 256, 16611, 256, 55381,
+ 56870, 256, 31062, 256, 55381, 56986, 256, 55381, 57029, 256, 31119, 256,
+ 31211, 256, 16687, 256, 31296, 256, 31306, 256, 31311, 256, 55382, 56700,
+ 256, 55382, 56999, 256, 55382, 56999, 256, 31470, 256, 16898, 256, 55382,
+ 57259, 256, 31686, 256, 31689, 256, 16935, 256, 55383, 56448, 256, 31954,
+ 256, 17056, 256, 31976, 256, 31971, 256, 32000, 256, 55383, 57222, 256,
+ 32099, 256, 17153, 256, 32199, 256, 32258, 256, 32325, 256, 17204, 256,
+ 55384, 56872, 256, 55384, 56903, 256, 17241, 256, 55384, 57049, 256,
+ 32634, 256, 55384, 57150, 256, 32661, 256, 32762, 256, 32773, 256, 55385,
+ 56538, 256, 55385, 56611, 256, 32864, 256, 55385, 56744, 256, 32880, 256,
+ 55372, 57183, 256, 17365, 256, 32946, 256, 33027, 256, 17419, 256, 33086,
+ 256, 23221, 256, 55385, 57255, 256, 55385, 57269, 256, 55372, 57235, 256,
+ 55372, 57244, 256, 33281, 256, 33284, 256, 36766, 256, 17515, 256, 33425,
+ 256, 33419, 256, 33437, 256, 21171, 256, 33457, 256, 33459, 256, 33469,
+ 256, 33510, 256, 55386, 57148, 256, 33509, 256, 33565, 256, 33635, 256,
+ 33709, 256, 33571, 256, 33725, 256, 33767, 256, 33879, 256, 33619, 256,
+ 33738, 256, 33740, 256, 33756, 256, 55387, 56374, 256, 55387, 56683, 256,
+ 55387, 56533, 256, 17707, 256, 34033, 256, 34035, 256, 34070, 256, 55388,
+ 57290, 256, 34148, 256, 55387, 57132, 256, 17757, 256, 17761, 256, 55387,
+ 57265, 256, 55388, 56530, 256, 17771, 256, 34384, 256, 34396, 256, 34407,
+ 256, 34409, 256, 34473, 256, 34440, 256, 34574, 256, 34530, 256, 34681,
+ 256, 34600, 256, 34667, 256, 34694, 256, 17879, 256, 34785, 256, 34817,
+ 256, 17913, 256, 34912, 256, 34915, 256, 55389, 56935, 256, 35031, 256,
+ 35038, 256, 17973, 256, 35066, 256, 13499, 256, 55390, 56494, 256, 55390,
+ 56678, 256, 18110, 256, 18119, 256, 35488, 256, 35565, 256, 35722, 256,
+ 35925, 256, 55391, 56488, 256, 36011, 256, 36033, 256, 36123, 256, 36215,
+ 256, 55391, 57135, 256, 55362, 56324, 256, 36299, 256, 36284, 256, 36336,
+ 256, 55362, 56542, 256, 36564, 256, 36664, 256, 55393, 56786, 256, 55393,
56813, 256, 37012, 256, 37105, 256, 37137, 256, 55393, 57134, 256, 37147,
256, 37432, 256, 37591, 256, 37592, 256, 37500, 256, 37881, 256, 37909,
256, 55394, 57338, 256, 38283, 256, 18837, 256, 38327, 256, 55395, 56695,
@@ -4642,64 +5094,64 @@
13103, 13105, 13107, 13109, 13111, 13113, 13115, 13117, 13119, 13121,
13123, 13125, 13127, 13129, 13131, 13133, 13135, 13137, 13139, 13141,
13143, 13145, 13147, 13149, 13151, 13153, 13155, 13157, 13159, 13161,
- 13163, 13165, 13167, 13169, 13171, 13173, 13175, 13177, 0, 0, 0, 0, 0,
- 13179, 13183, 13187, 13191, 13195, 13199, 13203, 13207, 13211, 0, 0, 0,
- 0, 0, 0, 0, 13215, 13217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 13219, 13221, 13223, 13225, 13228, 13230, 13232, 13234, 13236, 13238,
- 13240, 13242, 13244, 13246, 13249, 13251, 13253, 13255, 13257, 13260,
- 13262, 13264, 13266, 13269, 13271, 13273, 13275, 13277, 13279, 13282,
- 13284, 13286, 13288, 13290, 13292, 13294, 13296, 13298, 13300, 13302,
- 13304, 13306, 13308, 13310, 13312, 13314, 13316, 13318, 13320, 13322,
- 13324, 13326, 13328, 13331, 13333, 13335, 13337, 13340, 13342, 13344,
- 13346, 13348, 13350, 13352, 13354, 13356, 13358, 13360, 13362, 13364,
- 13366, 13368, 13370, 13372, 13374, 13376, 13378, 13380, 13382, 13384,
- 13386, 13388, 13390, 13392, 13394, 13396, 13398, 13400, 13402, 13404,
- 13407, 13409, 13411, 13413, 13415, 13417, 13419, 13422, 13425, 13427,
- 13429, 13431, 13433, 13435, 13437, 13439, 13441, 13443, 13445, 13448,
- 13450, 13452, 13454, 13456, 13459, 13461, 13463, 13465, 13467, 13469,
- 13471, 13473, 13475, 13477, 13480, 13482, 13485, 13487, 13489, 13491,
- 13493, 13495, 13497, 13499, 13501, 13503, 13505, 13507, 13510, 13512,
- 13514, 13516, 13518, 13520, 13523, 13525, 13528, 13531, 13533, 13535,
- 13537, 13539, 13542, 13545, 13547, 13549, 13551, 13553, 13555, 13557,
- 13559, 13561, 13563, 13565, 13567, 13570, 13572, 13574, 13576, 13578,
- 13580, 13582, 13584, 13586, 13588, 13590, 13592, 13594, 13596, 13598,
- 13600, 13602, 13604, 13606, 13608, 13611, 13613, 13615, 13617, 13619,
- 13621, 13624, 13626, 13628, 13630, 13632, 13634, 13636, 13638, 13640,
- 13642, 13644, 13646, 13649, 13651, 13653, 13655, 13657, 13659, 13661,
- 13663, 13665, 13667, 13669, 13671, 13673, 13675, 13677, 13679, 13681,
- 13683, 13685, 13688, 13690, 13692, 13694, 13696, 13698, 13701, 13703,
- 13705, 13707, 13709, 13711, 13713, 13715, 13717, 13720, 13722, 13724,
- 13726, 13729, 13731, 13733, 13735, 13737, 13739, 13741, 13744, 13747,
- 13750, 13752, 13755, 13757, 13759, 13761, 13763, 13765, 13767, 13769,
- 13771, 13773, 13775, 13778, 13780, 13782, 13784, 13786, 13788, 13790,
- 13793, 13795, 13797, 13800, 13803, 13805, 13807, 13809, 13811, 13813,
- 13815, 13817, 13819, 13821, 13824, 13826, 13829, 13831, 13834, 13836,
- 13838, 13840, 13843, 13845, 13847, 13850, 13853, 13855, 13857, 13859,
- 13861, 13863, 13865, 13867, 13869, 13871, 13873, 13875, 13877, 13879,
- 13882, 13884, 13887, 13889, 13892, 13894, 13897, 13900, 13903, 13905,
- 13907, 13909, 13912, 13915, 13918, 13921, 13923, 13925, 13927, 13929,
- 13931, 13933, 13935, 13937, 13940, 13942, 13944, 13946, 13948, 13951,
- 13953, 13956, 13959, 13961, 13963, 13965, 13967, 13969, 13971, 13974,
- 13977, 13980, 13982, 13984, 13987, 13989, 13991, 13993, 13996, 13998,
- 14000, 14002, 14004, 14006, 14009, 14011, 14013, 14015, 14017, 14019,
- 14021, 14024, 14027, 14029, 14032, 14034, 14037, 14039, 14041, 14043,
- 14046, 14049, 14051, 14054, 14056, 14059, 14061, 14063, 14065, 14067,
- 14069, 14071, 14074, 14077, 14080, 14083, 14085, 14087, 14089, 14091,
- 14093, 14095, 14097, 14099, 14101, 14103, 14105, 14107, 14110, 14112,
- 14114, 14116, 14118, 14120, 14122, 14124, 14126, 14128, 14130, 14132,
- 14134, 14137, 14140, 14143, 14145, 14147, 14149, 14151, 14154, 14156,
- 14159, 14161, 14163, 14166, 14169, 14171, 14173, 14175, 14177, 14179,
- 14181, 14183, 14185, 14187, 14189, 14191, 14193, 14195, 14197, 14199,
- 14201, 14203, 14205, 14207, 14210, 14212, 14214, 14216, 14218, 14220,
- 14223, 14226, 14228, 14230, 14232, 14234, 14236, 14238, 14241, 14243,
- 14245, 14247, 14249, 14252, 14255, 14257, 14259, 14261, 14264, 14266,
- 14268, 14271, 14274, 14276, 14278, 14280, 14283, 14285, 14287, 14289,
- 14291, 14293, 14295, 14297, 14300, 14302, 14304, 14306, 14309, 14311,
- 14313, 14315, 14317, 14320, 14323, 14325, 14327, 14329, 14332, 14334,
- 14337, 14339, 14341, 14343, 14346, 14348, 14350, 14352, 14354, 14356,
- 14358, 14360, 14363, 14365, 14367, 14369, 14371, 14373, 14375, 14378,
- 14380, 14383, 14386, 14389, 14391, 14393, 14395, 14397, 14399, 14401,
- 14403, 14405, 0, 0,
+ 13163, 13165, 13167, 13169, 13171, 13173, 13175, 13177, 13179, 0, 0, 0,
+ 0, 13181, 13185, 13189, 13193, 13197, 13201, 13205, 13209, 13213, 0, 0,
+ 0, 0, 0, 0, 0, 13217, 13219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 13221, 13223, 13225, 13227, 13230, 13232, 13234, 13236, 13238, 13240,
+ 13242, 13244, 13246, 13248, 13251, 13253, 13255, 13257, 13259, 13262,
+ 13264, 13266, 13268, 13271, 13273, 13275, 13277, 13279, 13281, 13284,
+ 13286, 13288, 13290, 13292, 13294, 13296, 13298, 13300, 13302, 13304,
+ 13306, 13308, 13310, 13312, 13314, 13316, 13318, 13320, 13322, 13324,
+ 13326, 13328, 13330, 13333, 13335, 13337, 13339, 13342, 13344, 13346,
+ 13348, 13350, 13352, 13354, 13356, 13358, 13360, 13362, 13364, 13366,
+ 13368, 13370, 13372, 13374, 13376, 13378, 13380, 13382, 13384, 13386,
+ 13388, 13390, 13392, 13394, 13396, 13398, 13400, 13402, 13404, 13406,
+ 13409, 13411, 13413, 13415, 13417, 13419, 13421, 13424, 13427, 13429,
+ 13431, 13433, 13435, 13437, 13439, 13441, 13443, 13445, 13447, 13450,
+ 13452, 13454, 13456, 13458, 13461, 13463, 13465, 13467, 13469, 13471,
+ 13473, 13475, 13477, 13479, 13482, 13484, 13487, 13489, 13491, 13493,
+ 13495, 13497, 13499, 13501, 13503, 13505, 13507, 13509, 13512, 13514,
+ 13516, 13518, 13520, 13522, 13525, 13527, 13530, 13533, 13535, 13537,
+ 13539, 13541, 13544, 13547, 13549, 13551, 13553, 13555, 13557, 13559,
+ 13561, 13563, 13565, 13567, 13569, 13572, 13574, 13576, 13578, 13580,
+ 13582, 13584, 13586, 13588, 13590, 13592, 13594, 13596, 13598, 13600,
+ 13602, 13604, 13606, 13608, 13610, 13613, 13615, 13617, 13619, 13621,
+ 13623, 13626, 13628, 13630, 13632, 13634, 13636, 13638, 13640, 13642,
+ 13644, 13646, 13648, 13651, 13653, 13655, 13657, 13659, 13661, 13663,
+ 13665, 13667, 13669, 13671, 13673, 13675, 13677, 13679, 13681, 13683,
+ 13685, 13687, 13690, 13692, 13694, 13696, 13698, 13700, 13703, 13705,
+ 13707, 13709, 13711, 13713, 13715, 13717, 13719, 13722, 13724, 13726,
+ 13728, 13731, 13733, 13735, 13737, 13739, 13741, 13743, 13746, 13749,
+ 13752, 13754, 13757, 13759, 13761, 13763, 13765, 13767, 13769, 13771,
+ 13773, 13775, 13777, 13780, 13782, 13784, 13786, 13788, 13790, 13792,
+ 13795, 13797, 13799, 13802, 13805, 13807, 13809, 13811, 13813, 13815,
+ 13817, 13819, 13821, 13823, 13826, 13828, 13831, 13833, 13836, 13838,
+ 13840, 13842, 13845, 13847, 13849, 13852, 13855, 13857, 13859, 13861,
+ 13863, 13865, 13867, 13869, 13871, 13873, 13875, 13877, 13879, 13881,
+ 13884, 13886, 13889, 13891, 13894, 13896, 13899, 13902, 13905, 13907,
+ 13909, 13911, 13914, 13917, 13920, 13923, 13925, 13927, 13929, 13931,
+ 13933, 13935, 13937, 13939, 13942, 13944, 13946, 13948, 13950, 13953,
+ 13955, 13958, 13961, 13963, 13965, 13967, 13969, 13971, 13973, 13976,
+ 13979, 13982, 13984, 13986, 13989, 13991, 13993, 13995, 13998, 14000,
+ 14002, 14004, 14006, 14008, 14011, 14013, 14015, 14017, 14019, 14021,
+ 14023, 14026, 14029, 14031, 14034, 14036, 14039, 14041, 14043, 14045,
+ 14048, 14051, 14053, 14056, 14058, 14061, 14063, 14065, 14067, 14069,
+ 14071, 14073, 14076, 14079, 14082, 14085, 14087, 14089, 14091, 14093,
+ 14095, 14097, 14099, 14101, 14103, 14105, 14107, 14109, 14112, 14114,
+ 14116, 14118, 14120, 14122, 14124, 14126, 14128, 14130, 14132, 14134,
+ 14136, 14139, 14142, 14145, 14147, 14149, 14151, 14153, 14156, 14158,
+ 14161, 14163, 14165, 14168, 14171, 14173, 14175, 14177, 14179, 14181,
+ 14183, 14185, 14187, 14189, 14191, 14193, 14195, 14197, 14199, 14201,
+ 14203, 14205, 14207, 14209, 14212, 14214, 14216, 14218, 14220, 14222,
+ 14225, 14228, 14230, 14232, 14234, 14236, 14238, 14240, 14243, 14245,
+ 14247, 14249, 14251, 14254, 14257, 14259, 14261, 14263, 14266, 14268,
+ 14270, 14273, 14276, 14278, 14280, 14282, 14285, 14287, 14289, 14291,
+ 14293, 14295, 14297, 14299, 14302, 14304, 14306, 14308, 14311, 14313,
+ 14315, 14317, 14319, 14322, 14325, 14327, 14329, 14331, 14334, 14336,
+ 14339, 14341, 14343, 14345, 14348, 14350, 14352, 14354, 14356, 14358,
+ 14360, 14362, 14365, 14367, 14369, 14371, 14373, 14375, 14377, 14380,
+ 14382, 14385, 14388, 14391, 14393, 14395, 14397, 14399, 14401, 14403,
+ 14405, 14407, 0, 0,
};
/* NFC pairs */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode-private.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode-private.hh Fri Aug 26 10:14:15 2016 -0700
@@ -115,6 +115,8 @@
/* XXX This hack belongs to the Tibetan shaper:
* Reorder PADMA to ensure it comes after any vowel marks. */
if (unlikely (unicode == 0x0FC6u)) return 254;
+ /* Reorder TSA -PHRU to reorder before U+0F74 */
+ if (unlikely (unicode == 0x0F39u)) return 127;
return _hb_modified_combining_class[combining_class (unicode)];
}
@@ -180,8 +182,8 @@
case 0x17: return hb_in_range (ch, 0x17B4u, 0x17B5u);
case 0x18: return hb_in_range (ch, 0x180Bu, 0x180Eu);
case 0x20: return hb_in_ranges (ch, 0x200Bu, 0x200Fu,
- 0x202Au, 0x202Eu,
- 0x2060u, 0x206Fu);
+ 0x202Au, 0x202Eu,
+ 0x2060u, 0x206Fu);
case 0xFE: return hb_in_range (ch, 0xFE00u, 0xFE0Fu) || ch == 0xFEFFu;
case 0xFF: return hb_in_range (ch, 0xFFF0u, 0xFFF8u);
default: return false;
@@ -199,6 +201,50 @@
}
}
+ /* Space estimates based on:
+ * http://www.unicode.org/charts/PDF/U2000.pdf
+ * https://www.microsoft.com/typography/developers/fdsspec/spaces.aspx
+ */
+ enum space_t {
+ NOT_SPACE = 0,
+ SPACE_EM = 1,
+ SPACE_EM_2 = 2,
+ SPACE_EM_3 = 3,
+ SPACE_EM_4 = 4,
+ SPACE_EM_5 = 5,
+ SPACE_EM_6 = 6,
+ SPACE_EM_16 = 16,
+ SPACE_4_EM_18, /* 4/18th of an EM! */
+ SPACE,
+ SPACE_FIGURE,
+ SPACE_PUNCTUATION,
+ SPACE_NARROW,
+ };
+ static inline space_t
+ space_fallback_type (hb_codepoint_t u)
+ {
+ switch (u)
+ {
+ /* All GC=Zs chars that can use a fallback. */
+ default: return NOT_SPACE; /* U+1680 OGHAM SPACE MARK */
+ case 0x0020u: return SPACE; /* U+0020 SPACE */
+ case 0x00A0u: return SPACE; /* U+00A0 NO-BREAK SPACE */
+ case 0x2000u: return SPACE_EM_2; /* U+2000 EN QUAD */
+ case 0x2001u: return SPACE_EM; /* U+2001 EM QUAD */
+ case 0x2002u: return SPACE_EM_2; /* U+2002 EN SPACE */
+ case 0x2003u: return SPACE_EM; /* U+2003 EM SPACE */
+ case 0x2004u: return SPACE_EM_3; /* U+2004 THREE-PER-EM SPACE */
+ case 0x2005u: return SPACE_EM_4; /* U+2005 FOUR-PER-EM SPACE */
+ case 0x2006u: return SPACE_EM_6; /* U+2006 SIX-PER-EM SPACE */
+ case 0x2007u: return SPACE_FIGURE; /* U+2007 FIGURE SPACE */
+ case 0x2008u: return SPACE_PUNCTUATION; /* U+2008 PUNCTUATION SPACE */
+ case 0x2009u: return SPACE_EM_5; /* U+2009 THIN SPACE */
+ case 0x200Au: return SPACE_EM_16; /* U+200A HAIR SPACE */
+ case 0x202Fu: return SPACE_NARROW; /* U+202F NARROW NO-BREAK SPACE */
+ case 0x205Fu: return SPACE_4_EM_18; /* U+205F MEDIUM MATHEMATICAL SPACE */
+ case 0x3000u: return SPACE_EM; /* U+3000 IDEOGRAPHIC SPACE */
+ }
+ }
struct {
#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_func_t name;
@@ -299,10 +345,12 @@
#define HB_MODIFIED_COMBINING_CLASS_CCC118 118 /* sign u / sign uu */
#define HB_MODIFIED_COMBINING_CLASS_CCC122 122 /* mai * */
-/* Tibetan */
+/* Tibetan
+ * Modify U+0F74 (ccc=132) to reorder before ccc=130 marks.
+ */
#define HB_MODIFIED_COMBINING_CLASS_CCC129 129 /* sign aa */
#define HB_MODIFIED_COMBINING_CLASS_CCC130 130 /* sign i */
-#define HB_MODIFIED_COMBINING_CLASS_CCC132 132 /* sign u */
+#define HB_MODIFIED_COMBINING_CLASS_CCC132 128 /* sign u */
/* Misc */
@@ -313,5 +361,10 @@
FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \
FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)))
+#define HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL(gen_cat) \
+ (FLAG_SAFE (gen_cat) & \
+ (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL)))
#endif /* HB_UNICODE_PRIVATE_HH */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode.h Fri Aug 26 10:14:15 2016 -0700
@@ -174,23 +174,23 @@
/*
* just give me the best implementation you've got there.
*/
-hb_unicode_funcs_t *
+HB_EXTERN hb_unicode_funcs_t *
hb_unicode_funcs_get_default (void);
-hb_unicode_funcs_t *
+HB_EXTERN hb_unicode_funcs_t *
hb_unicode_funcs_create (hb_unicode_funcs_t *parent);
-hb_unicode_funcs_t *
+HB_EXTERN hb_unicode_funcs_t *
hb_unicode_funcs_get_empty (void);
-hb_unicode_funcs_t *
+HB_EXTERN hb_unicode_funcs_t *
hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs);
-void
+HB_EXTERN void
hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs,
hb_user_data_key_t *key,
void * data,
@@ -198,18 +198,18 @@
hb_bool_t replace);
-void *
+HB_EXTERN void *
hb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs,
hb_user_data_key_t *key);
-void
+HB_EXTERN void
hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs);
-hb_unicode_funcs_t *
+HB_EXTERN hb_unicode_funcs_t *
hb_unicode_funcs_get_parent (hb_unicode_funcs_t *ufuncs);
@@ -285,7 +285,7 @@
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_unicode_funcs_set_combining_class_func (hb_unicode_funcs_t *ufuncs,
hb_unicode_combining_class_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -301,7 +301,7 @@
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_unicode_funcs_set_eastasian_width_func (hb_unicode_funcs_t *ufuncs,
hb_unicode_eastasian_width_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -317,7 +317,7 @@
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_unicode_funcs_set_general_category_func (hb_unicode_funcs_t *ufuncs,
hb_unicode_general_category_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -333,7 +333,7 @@
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_unicode_funcs_set_mirroring_func (hb_unicode_funcs_t *ufuncs,
hb_unicode_mirroring_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -349,7 +349,7 @@
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_unicode_funcs_set_script_func (hb_unicode_funcs_t *ufuncs,
hb_unicode_script_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -365,7 +365,7 @@
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_unicode_funcs_set_compose_func (hb_unicode_funcs_t *ufuncs,
hb_unicode_compose_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -381,7 +381,7 @@
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_unicode_funcs_set_decompose_func (hb_unicode_funcs_t *ufuncs,
hb_unicode_decompose_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -397,7 +397,7 @@
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_unicode_funcs_set_decompose_compatibility_func (hb_unicode_funcs_t *ufuncs,
hb_unicode_decompose_compatibility_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -405,62 +405,63 @@
/* accessors */
/**
+ * hb_unicode_combining_class:
+ *
* Since: 0.9.2
**/
-hb_unicode_combining_class_t
+HB_EXTERN hb_unicode_combining_class_t
hb_unicode_combining_class (hb_unicode_funcs_t *ufuncs,
hb_codepoint_t unicode);
/**
+ * hb_unicode_eastasian_width:
+ *
* Since: 0.9.2
**/
-unsigned int
+HB_EXTERN unsigned int
hb_unicode_eastasian_width (hb_unicode_funcs_t *ufuncs,
hb_codepoint_t unicode);
/**
+ * hb_unicode_general_category:
+ *
* Since: 0.9.2
**/
-hb_unicode_general_category_t
+HB_EXTERN hb_unicode_general_category_t
hb_unicode_general_category (hb_unicode_funcs_t *ufuncs,
hb_codepoint_t unicode);
/**
+ * hb_unicode_mirroring:
+ *
* Since: 0.9.2
**/
-hb_codepoint_t
+HB_EXTERN hb_codepoint_t
hb_unicode_mirroring (hb_unicode_funcs_t *ufuncs,
hb_codepoint_t unicode);
/**
+ * hb_unicode_script:
+ *
* Since: 0.9.2
**/
-hb_script_t
+HB_EXTERN hb_script_t
hb_unicode_script (hb_unicode_funcs_t *ufuncs,
hb_codepoint_t unicode);
-/**
- * Since: 0.9.2
- **/
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_unicode_compose (hb_unicode_funcs_t *ufuncs,
hb_codepoint_t a,
hb_codepoint_t b,
hb_codepoint_t *ab);
-/**
- * Since: 0.9.2
- **/
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_unicode_decompose (hb_unicode_funcs_t *ufuncs,
hb_codepoint_t ab,
hb_codepoint_t *a,
hb_codepoint_t *b);
-/**
- * Since: 0.9.2
- **/
-unsigned int
+HB_EXTERN unsigned int
hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs,
hb_codepoint_t u,
hb_codepoint_t *decomposed);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-utf-private.hh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-utf-private.hh Fri Aug 26 10:14:15 2016 -0700
@@ -146,11 +146,11 @@
return text;
}
- if (likely (hb_in_range (c, 0xD800u, 0xDBFFu)))
+ if (likely (c <= 0xDBFFu && text < end))
{
/* High-surrogate in c */
- hb_codepoint_t l;
- if (text < end && ((l = *text), likely (hb_in_range (l, 0xDC00u, 0xDFFFu))))
+ hb_codepoint_t l = *text;
+ if (likely (hb_in_range (l, 0xDC00u, 0xDFFFu)))
{
/* Low-surrogate in l */
*unicode = (c << 10) + l - ((0xD800u << 10) - 0x10000u + 0xDC00u);
@@ -170,8 +170,7 @@
hb_codepoint_t *unicode,
hb_codepoint_t replacement)
{
- const uint16_t *end = text--;
- hb_codepoint_t c = *text;
+ hb_codepoint_t c = *--text;
if (likely (!hb_in_range (c, 0xD800u, 0xDFFFu)))
{
@@ -179,14 +178,22 @@
return text;
}
- if (likely (start < text && hb_in_range (c, 0xDC00u, 0xDFFFu)))
- text--;
+ if (likely (c >= 0xDC00u && start < text))
+ {
+ /* Low-surrogate in c */
+ hb_codepoint_t h = text[-1];
+ if (likely (hb_in_range (h, 0xD800u, 0xDBFFu)))
+ {
+ /* High-surrogate in h */
+ *unicode = (h << 10) + c - ((0xD800u << 10) - 0x10000u + 0xDC00u);
+ text--;
+ return text;
+ }
+ }
- if (likely (next (text, end, unicode, replacement) == end))
- return text;
-
+ /* Lonely / out-of-order surrogate. */
*unicode = replacement;
- return end - 1;
+ return text;
}
@@ -211,14 +218,9 @@
hb_codepoint_t *unicode,
hb_codepoint_t replacement)
{
- hb_codepoint_t c = *text++;
- if (validate && unlikely (c > 0x10FFFFu || hb_in_range (c, 0xD800u, 0xDFFFu)))
- goto error;
- *unicode = c;
- return text;
-
- error:
- *unicode = replacement;
+ hb_codepoint_t c = *unicode = *text++;
+ if (validate && unlikely (c >= 0xD800u && (c <= 0xDFFFu || c > 0x10FFFFu)))
+ *unicode = replacement;
return text;
}
@@ -228,8 +230,10 @@
hb_codepoint_t *unicode,
hb_codepoint_t replacement)
{
- next (text - 1, text, unicode, replacement);
- return text - 1;
+ hb_codepoint_t c = *unicode = *--text;
+ if (validate && unlikely (c >= 0xD800u && (c <= 0xDFFFu || c > 0x10FFFFu)))
+ *unicode = replacement;
+ return text;
}
static inline unsigned int
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-version.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-version.h Fri Aug 26 10:14:15 2016 -0700
@@ -37,25 +37,25 @@
#define HB_VERSION_MAJOR 1
-#define HB_VERSION_MINOR 0
-#define HB_VERSION_MICRO 5
+#define HB_VERSION_MINOR 3
+#define HB_VERSION_MICRO 0
-#define HB_VERSION_STRING "1.0.5"
+#define HB_VERSION_STRING "1.3.0"
#define HB_VERSION_ATLEAST(major,minor,micro) \
((major)*10000+(minor)*100+(micro) <= \
HB_VERSION_MAJOR*10000+HB_VERSION_MINOR*100+HB_VERSION_MICRO)
-void
+HB_EXTERN void
hb_version (unsigned int *major,
unsigned int *minor,
unsigned int *micro);
-const char *
+HB_EXTERN const char *
hb_version_string (void);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_version_atleast (unsigned int major,
unsigned int minor,
unsigned int micro);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb.h Fri Aug 26 10:14:15 2016 -0700
@@ -28,6 +28,10 @@
#define HB_H
#define HB_H_IN
+#ifndef HB_EXTERN
+#define HB_EXTERN extern
+#endif
+
#include "hb-blob.h"
#include "hb-buffer.h"
#include "hb-common.h"
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/CHANGES Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/CHANGES Fri Aug 26 10:14:15 2016 -0700
@@ -5088,7 +5088,8 @@
Version 1.6.15beta05 [November 5, 2014]
Use png_get_libpng_ver(NULL) instead of PNG_LIBPNG_VER_STRING in
example.c, pngtest.c, and applications in the contrib directory.
- Avoid out-of-bounds memory access in png_user_version_check().
+ Fixed an out-of-range read in png_user_version_check() (Bug report from
+ Qixue Xiao, CVE-2015-8540).
Simplified and future-proofed png_user_version_check().
Fixed GCC unsigned int->float warnings. Various versions of GCC
seem to generate warnings when an unsigned value is implicitly
@@ -5446,7 +5447,7 @@
Version 1.6.20beta02 [November 23, 2015]
Fixed incorrect implementation of png_set_PLTE() that uses png_ptr
not info_ptr, that left png_set_PLTE() open to the CVE-2015-8126
- vulnerability.
+ vulnerability. Fixes CVE-2015-8472.
Version 1.6.20beta03 [November 24, 2015]
Backported tests from libpng-1.7.0beta69.
@@ -5471,6 +5472,155 @@
Version 1.6.20 [December 3, 2015]
No changes.
+Version 1.6.21beta01 [December 11, 2015]
+ Fixed syntax "$(command)" in tests/pngstest that some shells other than
+ bash could not parse (Bug report by Nelson Beebe). Use `command` instead.
+
+Version 1.6.21beta02 [December 14, 2015]
+ Moved png_check_keyword() from pngwutil.c to pngset.c
+ Removed LE/BE dependencies in pngvalid, to 'fix' the current problem
+ in the BigEndian tests by not testing it, making the BE code the same
+ as the LE version.
+ Fixes to pngvalid for various reduced build configurations (eliminate unused
+ statics) and a fix for the case in rgb_to_gray when the digitize option
+ reduces graylo to 0, producing a large error.
+
+Version 1.6.21beta03 [December 18, 2015]
+ Widened the 'limit' check on the internally calculated error limits in
+ the 'DIGITIZE' case (the code used prior to 1.7 for rgb_to_gray error
+ checks) and changed the check to only operate in non-release builds
+ (base build type not RC or RELEASE.)
+ Fixed undefined behavior in pngvalid.c, undefined because
+ (png_byte) << shift is undefined if it changes the signed bit
+ (because png_byte is promoted to int). The libpng exported functions
+ png_get_uint_32 and png_get_uint_16 handle this. (Bug reported by
+ David Drysdale as a result of reports from UBSAN in clang 3.8).
+ This changes pngvalid to use BE random numbers; this used to produce
+ errors but these should not be fixed as a result of the previous changes.
+
+Version 1.6.21rc01 [January 4, 2016]
+ In projects/vstudio, combined readme.txt and WARNING into README.txt
+
+Version 1.6.21rc02 [January 7, 2016]
+ Relocated assert() in contrib/tools/pngfix.c, bug found by American
+ Fuzzy Lop, reported by Brian Carpenter.
+ Marked 'limit' UNUSED in transform_range_check(). This only affects
+ release builds.
+
+Version 1.6.21 [January 15, 2016]
+ Worked around a false-positive Coverity issue in pngvalid.c.
+
+Version 1.6.22beta01 [January 23, 2016]
+ Changed PNG_USE_MKSTEMP to __COVERITY__ to select alternate
+ "tmpfile()" implementation in contrib/libtests/pngstest.c
+ Fixed NO_STDIO build of pngunknown.c to skip calling png_init_io()
+ if there is no stdio.h support.
+ Added a png_image_write_to_memory() API and a number of assist macros
+ to allow an application that uses the simplified API write to bypass
+ stdio and write directly to memory.
+ Added some warnings (png.h) and some check code to detect *possible*
+ overflow in the ROW_STRIDE and simplified image SIZE macros. This
+ disallows image width/height/format that *might* overflow. This is
+ a quiet API change that limits in-memory image size (uncompressed) to
+ less than 4GByte and image row size (stride) to less than 2GByte.
+ Revised workaround for false-positive Coverity issue in pngvalid.c.
+
+Version 1.6.22beta02 [February 8, 2016]
+ Only use exit(77) in configure builds.
+ Corrected error in PNG_IMAGE_PNG_SIZE_MAX. This new macro underreported
+ the palette size because it failed to take into account that the memory
+ palette has to be expanded to full RGB when it is written to PNG.
+ Updated CMakeLists.txt, added supporting scripts/gen*.cmake.in
+ and test.cmake.in (Roger Leigh).
+ Relaxed limit checks on gamma values in pngrtran.c. As suggested in
+ the comments gamma values outside the range currently permitted
+ by png_set_alpha_mode are useful for HDR data encoding. These values
+ are already permitted by png_set_gamma so it is reasonable caution to
+ extend the png_set_alpha_mode range as HDR imaging systems are starting
+ to emerge.
+
+Version 1.6.22beta03 [March 9, 2016]
+ Added a common-law trademark notice and export control information
+ to the LICENSE file, png.h, and the man page.
+ Restored "& 0xff" in png_save_uint_16() and png_save_uint_32() that
+ were accidentally removed from libpng-1.6.17.
+ Changed PNG_INFO_cHNK and PNG_FREE_cHNK from 0xnnnn to 0xnnnnU in png.h
+ (Robert C. Seacord).
+ Removed dubious "#if INT_MAX" test from png.h that was added to
+ libpng-1.6.19beta02 (John Bowler).
+ Add ${INCLUDES} in scripts/genout.cmake.in (Bug report by Nixon Kwok).
+ Updated LICENSE to say files in the contrib directory are not
+ necessarily under the libpng license, and that some makefiles have
+ other copyright owners.
+ Added INTEL-SSE2 support (Mike Klein and Matt Sarett, Google, Inc.).
+ Made contrib/libtests/timepng more robust. The code no longer gives
+ up/fails on invalid PNG data, it just skips it (with error messages).
+ The code no longer fails on PNG files with data beyond IEND. Options
+ exist to use png_read_png (reading the whole image, not by row) and, in
+ that case, to apply any of the supported transforms. This makes for
+ more realistic testing; the decoded data actually gets used in a
+ meaningful fashion (John Bowler).
+ Fixed some misleading indentation (Krishnaraj Bhat).
+
+Version 1.6.22beta04 [April 5, 2016]
+ Force GCC compilation to C89 if needed (Dagobert Michelsen).
+ SSE filter speed improvements for bpp=3:
+ memcpy-free implementations of load3() / store3().
+ call load3() only when needed at the end of a scanline.
+
+Version 1.6.22beta05 [April 27, 2016]
+ Added PNG_FAST_FILTERS macro (defined as
+ PNG_FILTER_NONE|PNG_FILTER_SUB|PNG_FILTER_UP).
+ Various fixes for contrib/libtests/timepng.c
+ Moved INTEL-SSE code from pngpriv.h into contrib/intel/intel_sse.patch.
+ Fixed typo (missing underscore) in #define PNG_READ_16_TO_8_SUPPORTED
+ (Bug report by Y.Ohashik).
+
+Version 1.6.22beta06 [May 5, 2016]
+ Rebased contrib/intel_sse.patch.
+ Quieted two Coverity issues in contrib/libtests/timepng.c.
+ Fixed issues with scripts/genout.cmake.in (David Capello, Nixon Kwok):
+ Added support to use multiple directories in ZLIBINCDIR variable,
+ Fixed CMAKE_C_FLAGS with multiple values when genout is compiled on MSVC,
+ Fixed pnglibconf.c compilation on OS X including the sysroot path.
+
+Version 1.6.22rc01 [May 14, 2016]
+ No changes.
+
+Version 1.6.22rc02 [May 16, 2016]
+ Removed contrib/timepng from default build; it does not build on platforms
+ that don't supply clock_gettime().
+
+Version 1.6.22rc03 [May 17, 2016]
+ Restored contrib/timepng to default build but check for the presence
+ of clock_gettime() in configure.ac and Makefile.am.
+
+Version 1.6.22 [May 26, 2016]
+ No changes.
+
+Version 1.6.23beta01 [May 29, 2016]
+ Stop a potential memory leak in png_set_tRNS() (Bug report by Ted Ying).
+ Fixed the progressive reader to handle empty first IDAT chunk properly
+ (patch by Timothy Nikkel). This bug was introduced in libpng-1.6.0 and
+ only affected the libpng16 branch.
+ Added tests in pngvalid.c to check zero-length IDAT chunks in various
+ positions. Fixed the sequential reader to handle these more robustly
+ (John Bowler).
+
+Version 1.6.23rc01 [June 2, 2016]
+ Corrected progressive read input buffer in pngvalid.c. The previous version
+ the code invariably passed just one byte at a time to libpng. The intent
+ was to pass a random number of bytes in the range 0..511.
+ Moved sse2 prototype from pngpriv.h to contrib/intel/intel_sse.patch.
+ Added missing ")" in pngerror.c (Matt Sarrett).
+
+Version 1.6.23rc02 [June 4, 2016]
+ Fixed undefined behavior in png_push_save_buffer(). Do not call
+ memcpy() with a null source, even if count is zero (Leon Scroggins III).
+
+Version 1.6.23 [June 9, 2016]
+ Fixed bad link to RFC2083 in png.5 (Nikola Forro).
+
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
(subscription required; visit
https://lists.sourceforge.net/lists/listinfo/png-mng-implement
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/LICENSE Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/LICENSE Fri Aug 26 10:14:15 2016 -0700
@@ -10,8 +10,8 @@
This code is released under the libpng license.
-libpng versions 1.0.7, July 1, 2000, through 1.6.20, December 3, 2015, are
-Copyright (c) 2000-2002, 2004, 2006-2015 Glenn Randers-Pehrson, are
+libpng versions 1.0.7, July 1, 2000 through 1.6.23, June 9, 2016 are
+Copyright (c) 2000-2002, 2004, 2006-2016 Glenn Randers-Pehrson, are
derived from libpng-1.0.6, and are distributed according to the same
disclaimer and license as libpng-1.0.6 with the following individuals
added to the list of Contributing Authors:
@@ -32,6 +32,10 @@
risk of satisfactory quality, performance, accuracy, and effort is with
the user.
+Some files in the "contrib" directory and some configure-generated
+files that are distributed with libpng have other copyright owners and
+are released under other open source licenses.
+
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
libpng-0.96, and are distributed according to the same disclaimer and
@@ -55,6 +59,9 @@
Greg Roelofs
Tom Tanner
+Some files in the "scripts" directory have other copyright owners
+but are released under this license.
+
libpng versions 0.5, May 1995, through 0.88, January 1996, are
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
@@ -95,18 +102,29 @@
END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE.
-A "png_get_copyright" function is available, for convenient use in "about"
-boxes and the like:
+TRADEMARK:
- printf("%s", png_get_copyright(NULL));
+The name "libpng" has not been registered by the Copyright owner
+as a trademark in any jurisdiction. However, because libpng has
+been distributed and maintained world-wide, continually since 1995,
+the Copyright owner claims "common-law trademark protection" in any
+jurisdiction where common-law trademark is recognized.
-Also, the PNG logo (in PNG format, of course) is supplied in the
-files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
+OSI CERTIFICATION:
Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
a certification mark of the Open Source Initiative. OSI has not addressed
the additional disclaimers inserted at version 1.0.7.
+EXPORT CONTROL:
+
+The Copyright owner believes that the Export Control Classification
+Number (ECCN) for libpng is EAR99, which means not subject to export
+controls or International Traffic in Arms Regulations (ITAR) because
+it is open source, publicly available software, that does not contain
+any encryption software. See the EAR, paragraphs 734.3(b)(3) and
+734.7(b).
+
Glenn Randers-Pehrson
glennrp at users.sourceforge.net
-December 3, 2015
+June 9, 2016
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/README Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/README Fri Aug 26 10:14:15 2016 -0700
@@ -1,4 +1,4 @@
-README for libpng version 1.6.20 - December 3, 2015 (shared library 16.0)
+README for libpng version 1.6.23 - June 9, 2016 (shared library 16.0)
See the note about version numbers near the top of png.h
See INSTALL for instructions on how to install libpng.
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/png.c Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/png.c Fri Aug 26 10:14:15 2016 -0700
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.19 [November 12, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -42,7 +42,7 @@
#include "pngpriv.h"
/* Generate a compiler error if there is an old png.h in the search path. */
-typedef png_libpng_version_1_6_20 Your_png_h_is_not_version_1_6_20;
+typedef png_libpng_version_1_6_23 Your_png_h_is_not_version_1_6_23;
/* Tells libpng that we have already handled the first "num_bytes" bytes
* of the PNG file signature. If the PNG data is embedded into another
@@ -803,14 +803,15 @@
#else
# ifdef __STDC__
return PNG_STRING_NEWLINE \
- "libpng version 1.6.20 - December 3, 2015" PNG_STRING_NEWLINE \
- "Copyright (c) 1998-2015 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \
+ "libpng version 1.6.23 - June 9, 2016" PNG_STRING_NEWLINE \
+ "Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson" \
+ PNG_STRING_NEWLINE \
"Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
"Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \
PNG_STRING_NEWLINE;
# else
- return "libpng version 1.6.20 - December 3, 2015\
- Copyright (c) 1998-2015 Glenn Randers-Pehrson\
+ return "libpng version 1.6.23 - June 9, 2016\
+ Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson\
Copyright (c) 1996-1997 Andreas Dilger\
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.";
# endif
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/png.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/png.h Fri Aug 26 10:14:15 2016 -0700
@@ -29,9 +29,9 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * libpng version 1.6.20, December 3, 2015
+ * libpng version 1.6.23, June 9, 2016
*
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -40,7 +40,7 @@
* Authors and maintainers:
* libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
* libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger
- * libpng versions 0.97, January 1998, through 1.6.20, December 3, 2015:
+ * libpng versions 0.97, January 1998, through 1.6.23, June 9, 2016:
* Glenn Randers-Pehrson.
* See also "Contributing Authors", below.
*/
@@ -53,8 +53,12 @@
*
* This code is released under the libpng license.
*
- * libpng versions 1.0.7, July 1, 2000, through 1.6.20, December 3, 2015, are
- * Copyright (c) 2000-2002, 2004, 2006-2015 Glenn Randers-Pehrson, are
+ * Some files in the "contrib" directory and some configure-generated
+ * files that are distributed with libpng have other copyright owners and
+ * are released under other open source licenses.
+ *
+ * libpng versions 1.0.7, July 1, 2000 through 1.6.23, June 9, 2016 are
+ * Copyright (c) 2000-2002, 2004, 2006-2016 Glenn Randers-Pehrson, are
* derived from libpng-1.0.6, and are distributed according to the same
* disclaimer and license as libpng-1.0.6 with the following individuals
* added to the list of Contributing Authors:
@@ -75,6 +79,10 @@
* risk of satisfactory quality, performance, accuracy, and effort is with
* the user.
*
+ * Some files in the "contrib" directory have other copyright owners and
+ * are released under other open source licenses.
+ *
+ *
* libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
* Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
* libpng-0.96, and are distributed according to the same disclaimer and
@@ -85,6 +93,9 @@
* Glenn Randers-Pehrson
* Willem van Schaik
*
+ * Some files in the "scripts" directory have different copyright owners
+ * but are also released under this license.
+ *
* libpng versions 0.89, June 1996, through 0.96, May 1997, are
* Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88,
* and are distributed according to the same disclaimer and license as
@@ -98,6 +109,9 @@
* Greg Roelofs
* Tom Tanner
*
+ * Some files in the "scripts" directory have other copyright owners
+ * but are released under this license.
+ *
* libpng versions 0.5, May 1995, through 0.88, January 1996, are
* Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
*
@@ -137,6 +151,29 @@
* appreciated.
*
* END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE.
+ *
+ * TRADEMARK:
+ *
+ * The name "libpng" has not been registered by the Copyright owner
+ * as a trademark in any jurisdiction. However, because libpng has
+ * been distributed and maintained world-wide, continually since 1995,
+ * the Copyright owner claims "common-law trademark protection" in any
+ * jurisdiction where common-law trademark is recognized.
+ *
+ * OSI CERTIFICATION:
+ *
+ * Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
+ * a certification mark of the Open Source Initiative. OSI has not addressed
+ * the additional disclaimers inserted at version 1.0.7.
+ *
+ * EXPORT CONTROL:
+ *
+ * The Copyright owner believes that the Export Control Classification
+ * Number (ECCN) for libpng is EAR99, which means not subject to export
+ * controls or International Traffic in Arms Regulations (ITAR) because
+ * it is open source, publicly available software, that does not contain
+ * any encryption software. See the EAR, paragraphs 734.3(b)(3) and
+ * 734.7(b).
*/
/*
@@ -150,12 +187,6 @@
*/
/*
- * Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
- * a certification mark of the Open Source Initiative. OSI has not addressed
- * the additional disclaimers inserted at version 1.0.7.
- */
-
-/*
* The contributing authors would like to thank all those who helped
* with testing, bug fixes, and patience. This wouldn't have been
* possible without all of you.
@@ -210,11 +241,11 @@
* ...
* 1.0.19 10 10019 10.so.0.19[.0]
* ...
- * 1.2.53 13 10253 12.so.0.53[.0]
+ * 1.2.56 13 10256 12.so.0.56[.0]
* ...
- * 1.5.23 15 10523 15.so.15.23[.0]
+ * 1.5.27 15 10527 15.so.15.27[.0]
* ...
- * 1.6.20 16 10620 16.so.16.20[.0]
+ * 1.6.23 16 10623 16.so.16.23[.0]
*
* Henceforth the source version will match the shared-library major
* and minor numbers; the shared-library major version number will be
@@ -242,13 +273,13 @@
* Y2K compliance in libpng:
* =========================
*
- * December 3, 2015
+ * June 9, 2016
*
* Since the PNG Development group is an ad-hoc body, we can't make
* an official declaration.
*
* This is your unofficial assurance that libpng from version 0.71 and
- * upward through 1.6.20 are Y2K compliant. It is my belief that
+ * upward through 1.6.23 are Y2K compliant. It is my belief that
* earlier versions were also Y2K compliant.
*
* Libpng only has two year fields. One is a 2-byte unsigned integer
@@ -310,9 +341,9 @@
*/
/* Version information for png.h - this should match the version in png.c */
-#define PNG_LIBPNG_VER_STRING "1.6.20"
+#define PNG_LIBPNG_VER_STRING "1.6.23"
#define PNG_HEADER_VERSION_STRING \
- " libpng version 1.6.20 - December 3, 2015\n"
+ " libpng version 1.6.23 - June 9, 2016\n"
#define PNG_LIBPNG_VER_SONUM 16
#define PNG_LIBPNG_VER_DLLNUM 16
@@ -320,7 +351,7 @@
/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
#define PNG_LIBPNG_VER_MAJOR 1
#define PNG_LIBPNG_VER_MINOR 6
-#define PNG_LIBPNG_VER_RELEASE 20
+#define PNG_LIBPNG_VER_RELEASE 23
/* This should match the numeric part of the final component of
* PNG_LIBPNG_VER_STRING, omitting any leading zero:
@@ -351,7 +382,7 @@
* version 1.0.0 was mis-numbered 100 instead of 10000). From
* version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release
*/
-#define PNG_LIBPNG_VER 10620 /* 1.6.20 */
+#define PNG_LIBPNG_VER 10623 /* 1.6.23 */
/* Library configuration: these options cannot be changed after
* the library has been built.
@@ -461,7 +492,7 @@
/* This triggers a compiler error in png.c, if png.c and png.h
* do not agree upon the version number.
*/
-typedef char* png_libpng_version_1_6_20;
+typedef char* png_libpng_version_1_6_23;
/* Basic control structions. Read libpng-manual.txt or libpng.3 for more info.
*
@@ -762,24 +793,22 @@
* data in the info_struct to be written into the output file. The values
* of the PNG_INFO_<chunk> defines should NOT be changed.
*/
-#define PNG_INFO_gAMA 0x0001
-#define PNG_INFO_sBIT 0x0002
-#define PNG_INFO_cHRM 0x0004
-#define PNG_INFO_PLTE 0x0008
-#define PNG_INFO_tRNS 0x0010
-#define PNG_INFO_bKGD 0x0020
-#define PNG_INFO_hIST 0x0040
-#define PNG_INFO_pHYs 0x0080
-#define PNG_INFO_oFFs 0x0100
-#define PNG_INFO_tIME 0x0200
-#define PNG_INFO_pCAL 0x0400
-#define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */
-#define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */
-#define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */
-#define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */
-#if INT_MAX >= 0x8000 /* else this might break */
-#define PNG_INFO_IDAT 0x8000 /* ESR, 1.0.6 */
-#endif
+#define PNG_INFO_gAMA 0x0001U
+#define PNG_INFO_sBIT 0x0002U
+#define PNG_INFO_cHRM 0x0004U
+#define PNG_INFO_PLTE 0x0008U
+#define PNG_INFO_tRNS 0x0010U
+#define PNG_INFO_bKGD 0x0020U
+#define PNG_INFO_hIST 0x0040U
+#define PNG_INFO_pHYs 0x0080U
+#define PNG_INFO_oFFs 0x0100U
+#define PNG_INFO_tIME 0x0200U
+#define PNG_INFO_pCAL 0x0400U
+#define PNG_INFO_sRGB 0x0800U /* GR-P, 0.96a */
+#define PNG_INFO_iCCP 0x1000U /* ESR, 1.0.6 */
+#define PNG_INFO_sPLT 0x2000U /* ESR, 1.0.6 */
+#define PNG_INFO_sCAL 0x4000U /* ESR, 1.0.6 */
+#define PNG_INFO_IDAT 0x8000U /* ESR, 1.0.6 */
/* This is used for the transformation routines, as some of them
* change these values for the row. It also should enable using
@@ -1350,7 +1379,7 @@
#endif
#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
-#define PNG_READ_16_TO_8 SUPPORTED /* Name prior to 1.5.4 */
+#define PNG_READ_16_TO_8_SUPPORTED /* Name prior to 1.5.4 */
/* Strip the second byte of information from a 16-bit depth file. */
PNG_EXPORT(48, void, png_set_strip_16, (png_structrp png_ptr));
#endif
@@ -1501,8 +1530,8 @@
#define PNG_FILTER_UP 0x20
#define PNG_FILTER_AVG 0x40
#define PNG_FILTER_PAETH 0x80
-#define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \
- PNG_FILTER_AVG | PNG_FILTER_PAETH)
+#define PNG_FAST_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP)
+#define PNG_ALL_FILTERS (PNG_FAST_FILTERS | PNG_FILTER_AVG | PNG_FILTER_PAETH)
/* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now.
* These defines should NOT be changed.
@@ -1779,21 +1808,21 @@
#define PNG_SET_WILL_FREE_DATA 1
#define PNG_USER_WILL_FREE_DATA 2
/* Flags for png_ptr->free_me and info_ptr->free_me */
-#define PNG_FREE_HIST 0x0008
-#define PNG_FREE_ICCP 0x0010
-#define PNG_FREE_SPLT 0x0020
-#define PNG_FREE_ROWS 0x0040
-#define PNG_FREE_PCAL 0x0080
-#define PNG_FREE_SCAL 0x0100
+#define PNG_FREE_HIST 0x0008U
+#define PNG_FREE_ICCP 0x0010U
+#define PNG_FREE_SPLT 0x0020U
+#define PNG_FREE_ROWS 0x0040U
+#define PNG_FREE_PCAL 0x0080U
+#define PNG_FREE_SCAL 0x0100U
#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
-# define PNG_FREE_UNKN 0x0200
+# define PNG_FREE_UNKN 0x0200U
#endif
-/* PNG_FREE_LIST 0x0400 removed in 1.6.0 because it is ignored */
-#define PNG_FREE_PLTE 0x1000
-#define PNG_FREE_TRNS 0x2000
-#define PNG_FREE_TEXT 0x4000
-#define PNG_FREE_ALL 0x7fff
-#define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */
+/* PNG_FREE_LIST 0x0400U removed in 1.6.0 because it is ignored */
+#define PNG_FREE_PLTE 0x1000U
+#define PNG_FREE_TRNS 0x2000U
+#define PNG_FREE_TEXT 0x4000U
+#define PNG_FREE_ALL 0x7fffU
+#define PNG_FREE_MUL 0x4220U /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */
#ifdef PNG_USER_MEM_SUPPORTED
PNG_EXPORTA(100, png_voidp, png_malloc_default, (png_const_structrp png_ptr,
@@ -2917,12 +2946,19 @@
* is the minimum 'row stride', the minimum count of components between each
* row. For a color-mapped image this is the minimum number of bytes in a
* row.
+ *
+ * WARNING: this macro overflows for some images with more than one component
+ * and very large image widths. libpng will refuse to process an image where
+ * this macro would overflow.
*/
#define PNG_IMAGE_BUFFER_SIZE(image, row_stride)\
(PNG_IMAGE_PIXEL_COMPONENT_SIZE((image).format)*(image).height*(row_stride))
/* Return the size, in bytes, of an image buffer given a png_image and a row
* stride - the number of components to leave space for in each row.
+ *
+ * WARNING: this macro overflows a 32-bit integer for some large PNG images,
+ * libpng will refuse to process an image where such an overflow would occur.
*/
#define PNG_IMAGE_SIZE(image)\
@@ -3043,7 +3079,6 @@
#endif /* SIMPLIFIED_READ */
#ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED
-#ifdef PNG_STDIO_SUPPORTED
/* WRITE APIS
* ----------
* For write you must initialize a png_image structure to describe the image to
@@ -3060,6 +3095,7 @@
* values do not correspond to the colors in sRGB.
* colormap_entries: set to the number of entries in the color-map (0 to 256)
*/
+#ifdef PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED
PNG_EXPORT(239, int, png_image_write_to_file, (png_imagep image,
const char *file, int convert_to_8bit, const void *buffer,
png_int_32 row_stride, const void *colormap));
@@ -3069,8 +3105,9 @@
int convert_to_8_bit, const void *buffer, png_int_32 row_stride,
const void *colormap));
/* Write the image to the given (FILE*). */
-
-/* With both write APIs if image is in one of the linear formats with 16-bit
+#endif /* SIMPLIFIED_WRITE_STDIO */
+
+/* With all write APIs if image is in one of the linear formats with 16-bit
* data then setting convert_to_8_bit will cause the output to be an 8-bit PNG
* gamma encoded according to the sRGB specification, otherwise a 16-bit linear
* encoded PNG file is written.
@@ -3082,13 +3119,103 @@
*
* With all APIs row_stride is handled as in the read APIs - it is the spacing
* from one row to the next in component sized units (1 or 2 bytes) and if
- * negative indicates a bottom-up row layout in the buffer. If row_stride is zero,
- * libpng will calculate it for you from the image width and number of channels.
+ * negative indicates a bottom-up row layout in the buffer. If row_stride is
+ * zero, libpng will calculate it for you from the image width and number of
+ * channels.
*
- * Note that the write API does not support interlacing, sub-8-bit pixels, indexed
- * PNG (color_type 3) or most ancillary chunks.
+ * Note that the write API does not support interlacing, sub-8-bit pixels or
+ * most ancillary chunks. If you need to write text chunks (e.g. for copyright
+ * notices) you need to use one of the other APIs.
*/
-#endif /* STDIO */
+
+PNG_EXPORT(245, int, png_image_write_to_memory, (png_imagep image, void *memory,
+ png_alloc_size_t * PNG_RESTRICT memory_bytes, int convert_to_8_bit,
+ const void *buffer, png_int_32 row_stride, const void *colormap));
+ /* Write the image to the given memory buffer. The function both writes the
+ * whole PNG data stream to *memory and updates *memory_bytes with the count
+ * of bytes written.
+ *
+ * 'memory' may be NULL. In this case *memory_bytes is not read however on
+ * success the number of bytes which would have been written will still be
+ * stored in *memory_bytes. On failure *memory_bytes will contain 0.
+ *
+ * If 'memory' is not NULL it must point to memory[*memory_bytes] of
+ * writeable memory.
+ *
+ * If the function returns success memory[*memory_bytes] (if 'memory' is not
+ * NULL) contains the written PNG data. *memory_bytes will always be less
+ * than or equal to the original value.
+ *
+ * If the function returns false and *memory_bytes was not changed an error
+ * occured during write. If *memory_bytes was changed, or is not 0 if
+ * 'memory' was NULL, the write would have succeeded but for the memory
+ * buffer being too small. *memory_bytes contains the required number of
+ * bytes and will be bigger that the original value.
+ */
+
+#define png_image_write_get_memory_size(image, size, convert_to_8_bit, buffer,\
+ row_stride, colormap)\
+ png_image_write_to_memory(&(image), 0, &(size), convert_to_8_bit, buffer,\
+ row_stride, colormap)
+ /* Return the amount of memory in 'size' required to compress this image.
+ * The png_image structure 'image' must be filled in as in the above
+ * function and must not be changed before the actual write call, the buffer
+ * and all other parameters must also be identical to that in the final
+ * write call. The 'size' variable need not be initialized.
+ *
+ * NOTE: the macro returns true/false, if false is returned 'size' will be
+ * set to zero and the write failed and probably will fail if tried again.
+ */
+
+/* You can pre-allocate the buffer by making sure it is of sufficient size
+ * regardless of the amount of compression achieved. The buffer size will
+ * always be bigger than the original image and it will never be filled. The
+ * following macros are provided to assist in allocating the buffer.
+ */
+#define PNG_IMAGE_DATA_SIZE(image) (PNG_IMAGE_SIZE(image)+(image).height)
+ /* The number of uncompressed bytes in the PNG byte encoding of the image;
+ * uncompressing the PNG IDAT data will give this number of bytes.
+ *
+ * NOTE: while PNG_IMAGE_SIZE cannot overflow for an image in memory this
+ * macro can because of the extra bytes used in the PNG byte encoding. You
+ * need to avoid this macro if your image size approaches 2^30 in width or
+ * height. The same goes for the remainder of these macros; they all produce
+ * bigger numbers than the actual in-memory image size.
+ */
+#ifndef PNG_ZLIB_MAX_SIZE
+# define PNG_ZLIB_MAX_SIZE(b) ((b)+(((b)+7U)>>3)+(((b)+63U)>>6)+11U)
+ /* An upper bound on the number of compressed bytes given 'b' uncompressed
+ * bytes. This is based on deflateBounds() in zlib; different
+ * implementations of zlib compression may conceivably produce more data so
+ * if your zlib implementation is not zlib itself redefine this macro
+ * appropriately.
+ */
+#endif
+
+#define PNG_IMAGE_COMPRESSED_SIZE_MAX(image)\
+ PNG_ZLIB_MAX_SIZE((png_alloc_size_t)PNG_IMAGE_DATA_SIZE(image))
+ /* An upper bound on the size of the data in the PNG IDAT chunks. */
+
+#define PNG_IMAGE_PNG_SIZE_MAX_(image, image_size)\
+ ((8U/*sig*/+25U/*IHDR*/+16U/*gAMA*/+44U/*cHRM*/+12U/*IEND*/+\
+ (((image).format&PNG_FORMAT_FLAG_COLORMAP)?/*colormap: PLTE, tRNS*/\
+ 12U+3U*(image).colormap_entries/*PLTE data*/+\
+ (((image).format&PNG_FORMAT_FLAG_ALPHA)?\
+ 12U/*tRNS*/+(image).colormap_entries:0U):0U)+\
+ 12U)+(12U*((image_size)/PNG_ZBUF_SIZE))/*IDAT*/+(image_size))
+ /* A helper for the following macro; if your compiler cannot handle the
+ * following macro use this one with the result of
+ * PNG_IMAGE_COMPRESSED_SIZE_MAX(image) as the second argument (most
+ * compilers should handle this just fine.)
+ */
+
+#define PNG_IMAGE_PNG_SIZE_MAX(image)\
+ PNG_IMAGE_PNG_SIZE_MAX_(image, PNG_IMAGE_COMPRESSED_SIZE_MAX(image))
+ /* An upper bound on the total length of the PNG data stream for 'image'.
+ * The result is of type png_alloc_size_t, on 32-bit systems this may
+ * overflow even though PNG_IMAGE_DATA_SIZE does not overflow; the write will
+ * run out of buffer space but return a corrected size which should work.
+ */
#endif /* SIMPLIFIED_WRITE */
/*******************************************************************************
* END OF SIMPLIFIED API
@@ -3146,7 +3273,7 @@
* one to use is one more than this.)
*/
#ifdef PNG_EXPORT_LAST_ORDINAL
- PNG_EXPORT_LAST_ORDINAL(244);
+ PNG_EXPORT_LAST_ORDINAL(245);
#endif
#ifdef __cplusplus
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngconf.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngconf.h Fri Aug 26 10:14:15 2016 -0700
@@ -29,9 +29,9 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * libpng version 1.6.20, December 3, 2015
+ * libpng version 1.6.23, June 9, 2016
*
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngdebug.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngdebug.h Fri Aug 26 10:14:15 2016 -0700
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.8 [December 19, 2013]
- * Copyright (c) 1998-2013 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2013 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngerror.c Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngerror.c Fri Aug 26 10:14:15 2016 -0700
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.15 [November 20, 2014]
- * Copyright (c) 1998-2014 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -72,7 +72,7 @@
if (png_ptr != NULL)
{
if ((png_ptr->flags &
- (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) != 0
+ (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) != 0)
{
if (*error_message == PNG_LITERAL_SHARP)
{
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngget.c Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngget.c Fri Aug 26 10:14:15 2016 -0700
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.17 [March 26, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -484,11 +484,11 @@
return (retval);
}
#endif /* pHYs */
-#endif /* INCH_CONVERSIONS */
+#endif /* INCH_CONVERSIONS */
/* png_get_channels really belongs in here, too, but it's been around longer */
-#endif /* EASY_ACCESS */
+#endif /* EASY_ACCESS */
png_byte PNGAPI
@@ -1170,19 +1170,19 @@
return 0;
#ifdef PNG_WRITE_SUPPORTED
- if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
+ if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
#endif
{
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
- return png_ptr->IDAT_read_size;
+ return png_ptr->IDAT_read_size;
#else
- return PNG_IDAT_READ_SIZE;
+ return PNG_IDAT_READ_SIZE;
#endif
}
#ifdef PNG_WRITE_SUPPORTED
- else
- return png_ptr->zbuffer_size;
+ else
+ return png_ptr->zbuffer_size;
#endif
}
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pnginfo.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pnginfo.h Fri Aug 26 10:14:15 2016 -0700
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.1 [March 28, 2013]
- * Copyright (c) 1998-2013 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2013 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pnglibconf.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pnglibconf.h Fri Aug 26 10:14:15 2016 -0700
@@ -27,16 +27,15 @@
/* libpng STANDARD API DEFINITION */
/* pnglibconf.h - library build configuration */
-
/* This file is available under and governed by the GNU General Public
* License version 2 only, as published by the Free Software Foundation.
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*/
-/* libpng version 1.6.20, December 3, 2015 */
+/* libpng version 1.6.23, June 9, 2016 */
-/* Copyright (c) 1998-2014 Glenn Randers-Pehrson */
+/* Copyright (c) 1998-2016 Glenn Randers-Pehrson */
/* This code is released under the libpng license. */
/* For conditions of distribution and use, see the disclaimer */
@@ -141,6 +140,7 @@
#define PNG_SIMPLIFIED_READ_SUPPORTED
/*#undef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED*/
/*#undef PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED*/
+/*#undef PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED*/
/*#undef PNG_SIMPLIFIED_WRITE_SUPPORTED*/
#define PNG_STDIO_SUPPORTED
#define PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngmem.c Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngmem.c Fri Aug 26 10:14:15 2016 -0700
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.15 [November 20, 2014]
- * Copyright (c) 1998-2014 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngpread.c Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngpread.c Fri Aug 26 10:14:15 2016 -0700
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.18 [July 23, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.23 [June 9, 2016]
+ * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -238,12 +238,14 @@
(png_ptr->mode & PNG_HAVE_PLTE) == 0)
png_error(png_ptr, "Missing PLTE before IDAT");
- png_ptr->mode |= PNG_HAVE_IDAT;
png_ptr->process_mode = PNG_READ_IDAT_MODE;
- if ((png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) == 0)
- if (png_ptr->push_length == 0)
- return;
+ if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
+ if ((png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) == 0)
+ if (png_ptr->push_length == 0)
+ return;
+
+ png_ptr->mode |= PNG_HAVE_IDAT;
if ((png_ptr->mode & PNG_AFTER_IDAT) != 0)
png_benign_error(png_ptr, "Too many IDATs found");
@@ -527,7 +529,10 @@
png_error(png_ptr, "Insufficient memory for save_buffer");
}
- memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
+ if (old_buffer)
+ memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
+ else if (png_ptr->save_buffer_size)
+ png_error(png_ptr, "save_buffer error");
png_free(png_ptr, old_buffer);
png_ptr->save_buffer_max = new_max;
}
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngpriv.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngpriv.h Fri Aug 26 10:14:15 2016 -0700
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.18 [July 23, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.22 [May 26, 2016]
+ * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -1945,6 +1945,9 @@
(png_structp png_ptr, unsigned int bpp), PNG_EMPTY);
#endif
+PNG_INTERNAL_FUNCTION(png_uint_32, png_check_keyword, (png_structrp png_ptr,
+ png_const_charp key, png_bytep new_key), PNG_EMPTY);
+
/* Maintainer: Put new private prototypes here ^ */
#include "pngdebug.h"
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngread.c Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngread.c Fri Aug 26 10:14:15 2016 -0700
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.17 [March 26, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.23 [June 9, 2016]
+ * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -155,7 +155,10 @@
}
else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
+ {
+ png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
png_ptr->mode |= PNG_AFTER_IDAT;
+ }
/* This should be a binary subdivision search or a hash for
* matching the chunk name rather than a linear search.
@@ -813,6 +816,9 @@
png_uint_32 length = png_read_chunk_header(png_ptr);
png_uint_32 chunk_name = png_ptr->chunk_name;
+ if (chunk_name != png_IDAT)
+ png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
+
if (chunk_name == png_IEND)
png_handle_IEND(png_ptr, info_ptr, length);
@@ -827,9 +833,9 @@
{
if (chunk_name == png_IDAT)
{
- if ((length > 0) ||
- (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
- png_benign_error(png_ptr, "Too many IDATs found");
+ if ((length > 0 && !(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED))
+ || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
+ png_benign_error(png_ptr, ".Too many IDATs found");
}
png_handle_unknown(png_ptr, info_ptr, length, keep);
if (chunk_name == png_PLTE)
@@ -840,10 +846,14 @@
else if (chunk_name == png_IDAT)
{
/* Zero length IDATs are legal after the last IDAT has been
- * read, but not after other chunks have been read.
+ * read, but not after other chunks have been read. 1.6 does not
+ * always read all the deflate data; specifically it cannot be relied
+ * upon to read the Adler32 at the end. If it doesn't ignore IDAT
+ * chunks which are longer than zero as well:
*/
- if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
- png_benign_error(png_ptr, "Too many IDATs found");
+ if ((length > 0 && !(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED))
+ || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
+ png_benign_error(png_ptr, "..Too many IDATs found");
png_crc_finish(png_ptr, length);
}
@@ -3876,16 +3886,16 @@
else
filler = 255;
-# ifdef PNG_FORMAT_AFIRST_SUPPORTED
- if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
- {
- where = PNG_FILLER_BEFORE;
- change &= ~PNG_FORMAT_FLAG_AFIRST;
- }
-
- else
-# endif
- where = PNG_FILLER_AFTER;
+#ifdef PNG_FORMAT_AFIRST_SUPPORTED
+ if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
+ {
+ where = PNG_FILLER_BEFORE;
+ change &= ~PNG_FORMAT_FLAG_AFIRST;
+ }
+
+ else
+#endif
+ where = PNG_FILLER_AFTER;
png_set_add_alpha(png_ptr, filler, where);
}
@@ -3993,12 +4003,12 @@
if (info_ptr->bit_depth == 16)
info_format |= PNG_FORMAT_FLAG_LINEAR;
-# ifdef PNG_FORMAT_BGR_SUPPORTED
- if ((png_ptr->transformations & PNG_BGR) != 0)
- info_format |= PNG_FORMAT_FLAG_BGR;
-# endif
-
-# ifdef PNG_FORMAT_AFIRST_SUPPORTED
+#ifdef PNG_FORMAT_BGR_SUPPORTED
+ if ((png_ptr->transformations & PNG_BGR) != 0)
+ info_format |= PNG_FORMAT_FLAG_BGR;
+#endif
+
+#ifdef PNG_FORMAT_AFIRST_SUPPORTED
if (do_local_background == 2)
{
if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
@@ -4099,58 +4109,84 @@
{
if (image != NULL && image->version == PNG_IMAGE_VERSION)
{
- png_uint_32 check;
-
- if (row_stride == 0)
- row_stride = PNG_IMAGE_ROW_STRIDE(*image);
-
- if (row_stride < 0)
- check = -row_stride;
-
- else
- check = row_stride;
-
- if (image->opaque != NULL && buffer != NULL &&
- check >= PNG_IMAGE_ROW_STRIDE(*image))
+ /* Check for row_stride overflow. This check is not performed on the
+ * original PNG format because it may not occur in the output PNG format
+ * and libpng deals with the issues of reading the original.
+ */
+ const unsigned int channels = PNG_IMAGE_PIXEL_CHANNELS(image->format);
+
+ if (image->width <= 0x7FFFFFFFU/channels) /* no overflow */
{
- if ((image->format & PNG_FORMAT_FLAG_COLORMAP) == 0 ||
- (image->colormap_entries > 0 && colormap != NULL))
+ png_uint_32 check;
+ const png_uint_32 png_row_stride = image->width * channels;
+
+ if (row_stride == 0)
+ row_stride = (png_int_32)/*SAFE*/png_row_stride;
+
+ if (row_stride < 0)
+ check = -row_stride;
+
+ else
+ check = row_stride;
+
+ if (image->opaque != NULL && buffer != NULL && check >= png_row_stride)
{
- int result;
- png_image_read_control display;
-
- memset(&display, 0, (sizeof display));
- display.image = image;
- display.buffer = buffer;
- display.row_stride = row_stride;
- display.colormap = colormap;
- display.background = background;
- display.local_row = NULL;
-
- /* Choose the correct 'end' routine; for the color-map case all the
- * setup has already been done.
+ /* Now check for overflow of the image buffer calculation; this
+ * limits the whole image size to 32 bits for API compatibility with
+ * the current, 32-bit, PNG_IMAGE_BUFFER_SIZE macro.
*/
- if ((image->format & PNG_FORMAT_FLAG_COLORMAP) != 0)
- result =
- png_safe_execute(image, png_image_read_colormap, &display) &&
- png_safe_execute(image, png_image_read_colormapped, &display);
+ if (image->height <= 0xFFFFFFFF/png_row_stride)
+ {
+ if ((image->format & PNG_FORMAT_FLAG_COLORMAP) == 0 ||
+ (image->colormap_entries > 0 && colormap != NULL))
+ {
+ int result;
+ png_image_read_control display;
+
+ memset(&display, 0, (sizeof display));
+ display.image = image;
+ display.buffer = buffer;
+ display.row_stride = row_stride;
+ display.colormap = colormap;
+ display.background = background;
+ display.local_row = NULL;
+
+ /* Choose the correct 'end' routine; for the color-map case
+ * all the setup has already been done.
+ */
+ if ((image->format & PNG_FORMAT_FLAG_COLORMAP) != 0)
+ result = png_safe_execute(image,
+ png_image_read_colormap, &display) &&
+ png_safe_execute(image,
+ png_image_read_colormapped, &display);
+
+ else
+ result =
+ png_safe_execute(image,
+ png_image_read_direct, &display);
+
+ png_image_free(image);
+ return result;
+ }
+
+ else
+ return png_image_error(image,
+ "png_image_finish_read[color-map]: no color-map");
+ }
else
- result =
- png_safe_execute(image, png_image_read_direct, &display);
-
- png_image_free(image);
- return result;
+ return png_image_error(image,
+ "png_image_finish_read: image too large");
}
else
return png_image_error(image,
- "png_image_finish_read[color-map]: no color-map");
+ "png_image_finish_read: invalid argument");
}
else
return png_image_error(image,
- "png_image_finish_read: invalid argument");
+ "png_image_finish_read: row_stride too large");
}
else if (image != NULL)
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrio.c Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrio.c Fri Aug 26 10:14:15 2016 -0700
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.17 [March 26, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrtran.c Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrtran.c Fri Aug 26 10:14:15 2016 -0700
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.19 [November 12, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.22 [May 26, 2016]
+ * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -187,7 +187,7 @@
png_set_background_fixed(png_ptr, background_color, background_gamma_code,
need_expand, png_fixed(png_ptr, background_gamma, "png_set_background"));
}
-# endif /* FLOATING_POINT */
+# endif /* FLOATING_POINT */
#endif /* READ_BACKGROUND */
/* Scale 16-bit depth files to 8-bit depth. If both of these are set then the
@@ -317,9 +317,12 @@
* is expected to be 1 or greater, but this range test allows for some
* viewing correction values. The intent is to weed out users of this API
* who use the inverse of the gamma value accidentally! Since some of these
- * values are reasonable this may have to be changed.
+ * values are reasonable this may have to be changed:
+ *
+ * 1.6.x: changed from 0.07..3 to 0.01..100 (to accomodate the optimal 16-bit
+ * gamma of 36, and its reciprocal.)
*/
- if (output_gamma < 70000 || output_gamma > 300000)
+ if (output_gamma < 1000 || output_gamma > 10000000)
png_error(png_ptr, "output gamma out of expected range");
/* The default file gamma is the inverse of the output gamma; the output
@@ -1940,7 +1943,7 @@
png_ptr->palette[i].blue = (png_byte)component;
}
}
-#endif /* READ_SHIFT */
+#endif /* READ_SHIFT */
}
/* Modify the info structure to reflect the transformations. The
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrutil.c Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrutil.c Fri Aug 26 10:14:15 2016 -0700
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.20 [December 3, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.20 [December 3, 2014]
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngset.c Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngset.c Fri Aug 26 10:14:15 2016 -0700
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.19 [November 12, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.23 [June 9, 2016]
+ * Copyright (c) 1998-2016 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -980,12 +980,14 @@
png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0);
- /* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */
- png_ptr->trans_alpha = info_ptr->trans_alpha = png_voidcast(png_bytep,
- png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH));
-
if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH)
+ {
+ /* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */
+ info_ptr->trans_alpha = png_voidcast(png_bytep,
+ png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH));
memcpy(info_ptr->trans_alpha, trans_alpha, (png_size_t)num_trans);
+ }
+ png_ptr->trans_alpha = info_ptr->trans_alpha;
}
if (trans_color != NULL)
@@ -1672,4 +1674,88 @@
png_ptr->num_palette_max = -1;
}
#endif
+
+#if defined(PNG_TEXT_SUPPORTED) || defined(PNG_pCAL_SUPPORTED) || \
+ defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED)
+/* Check that the tEXt or zTXt keyword is valid per PNG 1.0 specification,
+ * and if invalid, correct the keyword rather than discarding the entire
+ * chunk. The PNG 1.0 specification requires keywords 1-79 characters in
+ * length, forbids leading or trailing whitespace, multiple internal spaces,
+ * and the non-break space (0x80) from ISO 8859-1. Returns keyword length.
+ *
+ * The 'new_key' buffer must be 80 characters in size (for the keyword plus a
+ * trailing '\0'). If this routine returns 0 then there was no keyword, or a
+ * valid one could not be generated, and the caller must png_error.
+ */
+png_uint_32 /* PRIVATE */
+png_check_keyword(png_structrp png_ptr, png_const_charp key, png_bytep new_key)
+{
+ png_const_charp orig_key = key;
+ png_uint_32 key_len = 0;
+ int bad_character = 0;
+ int space = 1;
+
+ png_debug(1, "in png_check_keyword");
+
+ if (key == NULL)
+ {
+ *new_key = 0;
+ return 0;
+ }
+
+ while (*key && key_len < 79)
+ {
+ png_byte ch = (png_byte)*key++;
+
+ if ((ch > 32 && ch <= 126) || (ch >= 161 /*&& ch <= 255*/))
+ *new_key++ = ch, ++key_len, space = 0;
+
+ else if (space == 0)
+ {
+ /* A space or an invalid character when one wasn't seen immediately
+ * before; output just a space.
+ */
+ *new_key++ = 32, ++key_len, space = 1;
+
+ /* If the character was not a space then it is invalid. */
+ if (ch != 32)
+ bad_character = ch;
+ }
+
+ else if (bad_character == 0)
+ bad_character = ch; /* just skip it, record the first error */
+ }
+
+ if (key_len > 0 && space != 0) /* trailing space */
+ {
+ --key_len, --new_key;
+ if (bad_character == 0)
+ bad_character = 32;
+ }
+
+ /* Terminate the keyword */
+ *new_key = 0;
+
+ if (key_len == 0)
+ return 0;
+
+#ifdef PNG_WARNINGS_SUPPORTED
+ /* Try to only output one warning per keyword: */
+ if (*key != 0) /* keyword too long */
+ png_warning(png_ptr, "keyword truncated");
+
+ else if (bad_character != 0)
+ {
+ PNG_WARNING_PARAMETERS(p)
+
+ png_warning_parameter(p, 1, orig_key);
+ png_warning_parameter_signed(p, 2, PNG_NUMBER_FORMAT_02x, bad_character);
+
+ png_formatted_warning(png_ptr, p, "keyword \"@1\": bad character '0x@2'");
+ }
+#endif /* WARNINGS */
+
+ return key_len;
+}
+#endif /* TEXT || pCAL || iCCP || sPLT */
#endif /* READ || WRITE */
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngstruct.h Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngstruct.h Fri Aug 26 10:14:15 2016 -0700
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.18 [July 23, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngtest.c Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngtest.c Fri Aug 26 10:14:15 2016 -0700
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.5.25 [December 3, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -71,6 +71,15 @@
#include "png.h"
+/* 1.6.1 added support for the configure test harness, which uses 77 to indicate
+ * a skipped test, in earlier versions we need to succeed on a skipped test, so:
+ */
+#if PNG_LIBPNG_VER >= 10601 && defined(HAVE_CONFIG_H)
+# define SKIP 77
+#else
+# define SKIP 0
+#endif
+
/* Known chunks that exist in pngtest.png must be supported or pngtest will fail
* simply as a result of re-ordering them. This may be fixed in 1.7
*
@@ -2093,9 +2102,9 @@
fprintf(STDERR,
" test ignored because libpng was not built with read support\n");
/* And skip this test */
- return PNG_LIBPNG_VER < 10600 ? 0 : 77;
+ return SKIP;
}
#endif
/* Generate a compiler error if there is an old png.h in the search path. */
-typedef png_libpng_version_1_6_20 Your_png_h_is_not_version_1_6_20;
+typedef png_libpng_version_1_6_23 Your_png_h_is_not_version_1_6_23;
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngtrans.c Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngtrans.c Fri Aug 26 10:14:15 2016 -0700
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.18 [July 23, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwio.c Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwio.c Fri Aug 26 10:14:15 2016 -0700
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.15 [November 20, 2014]
- * Copyright (c) 1998-2014 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwrite.c Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwrite.c Fri Aug 26 10:14:15 2016 -0700
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.19 [November 12, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -40,9 +40,9 @@
*/
#include "pngpriv.h"
-#if defined(PNG_SIMPLIFIED_WRITE_SUPPORTED) && defined(PNG_STDIO_SUPPORTED)
+#ifdef PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED
# include <errno.h>
-#endif
+#endif /* SIMPLIFIED_WRITE_STDIO */
#ifdef PNG_WRITE_SUPPORTED
@@ -1480,7 +1480,6 @@
#ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED
-# ifdef PNG_STDIO_SUPPORTED /* currently required for png_image_write_* */
/* Initialize the write structure - general purpose utility. */
static int
png_image_write_init(png_imagep image)
@@ -1532,6 +1531,10 @@
png_const_voidp first_row;
ptrdiff_t row_bytes;
png_voidp local_row;
+ /* Byte count for memory writing */
+ png_bytep memory;
+ png_alloc_size_t memory_bytes; /* not used for STDIO */
+ png_alloc_size_t output_bytes; /* running total */
} png_image_write_control;
/* Write png_uint_16 input to a 16-bit PNG; the png_ptr has already been set to
@@ -1959,9 +1962,43 @@
png_set_benign_errors(png_ptr, 0/*error*/);
# endif
- /* Default the 'row_stride' parameter if required. */
- if (display->row_stride == 0)
- display->row_stride = PNG_IMAGE_ROW_STRIDE(*image);
+ /* Default the 'row_stride' parameter if required, also check the row stride
+ * and total image size to ensure that they are within the system limits.
+ */
+ {
+ const unsigned int channels = PNG_IMAGE_PIXEL_CHANNELS(image->format);
+
+ if (image->width <= 0x7FFFFFFFU/channels) /* no overflow */
+ {
+ png_uint_32 check;
+ const png_uint_32 png_row_stride = image->width * channels;
+
+ if (display->row_stride == 0)
+ display->row_stride = (png_int_32)/*SAFE*/png_row_stride;
+
+ if (display->row_stride < 0)
+ check = -display->row_stride;
+
+ else
+ check = display->row_stride;
+
+ if (check >= png_row_stride)
+ {
+ /* Now check for overflow of the image buffer calculation; this
+ * limits the whole image size to 32 bits for API compatibility with
+ * the current, 32-bit, PNG_IMAGE_BUFFER_SIZE macro.
+ */
+ if (image->height > 0xFFFFFFFF/png_row_stride)
+ png_error(image->opaque->png_ptr, "memory image too large");
+ }
+
+ else
+ png_error(image->opaque->png_ptr, "supplied row stride too small");
+ }
+
+ else
+ png_error(image->opaque->png_ptr, "image row stride too large");
+ }
/* Set the required transforms then write the rows in the correct order. */
if ((format & PNG_FORMAT_FLAG_COLORMAP) != 0)
@@ -2138,6 +2175,122 @@
return 1;
}
+
+static void (PNGCBAPI
+image_memory_write)(png_structp png_ptr, png_bytep/*const*/ data,
+ png_size_t size)
+{
+ png_image_write_control *display = png_voidcast(png_image_write_control*,
+ png_ptr->io_ptr/*backdoor: png_get_io_ptr(png_ptr)*/);
+ const png_alloc_size_t ob = display->output_bytes;
+
+ /* Check for overflow; this should never happen: */
+ if (size <= ((png_alloc_size_t)-1) - ob)
+ {
+ /* I don't think libpng ever does this, but just in case: */
+ if (size > 0)
+ {
+ if (display->memory_bytes >= ob+size) /* writing */
+ memcpy(display->memory+ob, data, size);
+
+ /* Always update the size: */
+ display->output_bytes = ob+size;
+ }
+ }
+
+ else
+ png_error(png_ptr, "png_image_write_to_memory: PNG too big");
+}
+
+static void (PNGCBAPI
+image_memory_flush)(png_structp png_ptr)
+{
+ PNG_UNUSED(png_ptr)
+}
+
+static int
+png_image_write_memory(png_voidp argument)
+{
+ png_image_write_control *display = png_voidcast(png_image_write_control*,
+ argument);
+
+ /* The rest of the memory-specific init and write_main in an error protected
+ * environment. This case needs to use callbacks for the write operations
+ * since libpng has no built in support for writing to memory.
+ */
+ png_set_write_fn(display->image->opaque->png_ptr, display/*io_ptr*/,
+ image_memory_write, image_memory_flush);
+
+ return png_image_write_main(display);
+}
+
+int PNGAPI
+png_image_write_to_memory(png_imagep image, void *memory,
+ png_alloc_size_t * PNG_RESTRICT memory_bytes, int convert_to_8bit,
+ const void *buffer, png_int_32 row_stride, const void *colormap)
+{
+ /* Write the image to the given buffer, or count the bytes if it is NULL */
+ if (image != NULL && image->version == PNG_IMAGE_VERSION)
+ {
+ if (memory_bytes != NULL && buffer != NULL)
+ {
+ /* This is to give the caller an easier error detection in the NULL
+ * case and guard against uninitialized variable problems:
+ */
+ if (memory == NULL)
+ *memory_bytes = 0;
+
+ if (png_image_write_init(image) != 0)
+ {
+ png_image_write_control display;
+ int result;
+
+ memset(&display, 0, (sizeof display));
+ display.image = image;
+ display.buffer = buffer;
+ display.row_stride = row_stride;
+ display.colormap = colormap;
+ display.convert_to_8bit = convert_to_8bit;
+ display.memory = png_voidcast(png_bytep, memory);
+ display.memory_bytes = *memory_bytes;
+ display.output_bytes = 0;
+
+ result = png_safe_execute(image, png_image_write_memory, &display);
+ png_image_free(image);
+
+ /* write_memory returns true even if we ran out of buffer. */
+ if (result)
+ {
+ /* On out-of-buffer this function returns '0' but still updates
+ * memory_bytes:
+ */
+ if (memory != NULL && display.output_bytes > *memory_bytes)
+ result = 0;
+
+ *memory_bytes = display.output_bytes;
+ }
+
+ return result;
+ }
+
+ else
+ return 0;
+ }
+
+ else
+ return png_image_error(image,
+ "png_image_write_to_memory: invalid argument");
+ }
+
+ else if (image != NULL)
+ return png_image_error(image,
+ "png_image_write_to_memory: incorrect PNG_IMAGE_VERSION");
+
+ else
+ return 0;
+}
+
+#ifdef PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED
int PNGAPI
png_image_write_to_stdio(png_imagep image, FILE *file, int convert_to_8bit,
const void *buffer, png_int_32 row_stride, const void *colormap)
@@ -2145,7 +2298,7 @@
/* Write the image to the given (FILE*). */
if (image != NULL && image->version == PNG_IMAGE_VERSION)
{
- if (file != NULL)
+ if (file != NULL && buffer != NULL)
{
if (png_image_write_init(image) != 0)
{
@@ -2195,7 +2348,7 @@
/* Write the image to the named file. */
if (image != NULL && image->version == PNG_IMAGE_VERSION)
{
- if (file_name != NULL)
+ if (file_name != NULL && buffer != NULL)
{
FILE *fp = fopen(file_name, "wb");
@@ -2253,6 +2406,6 @@
else
return 0;
}
-# endif /* STDIO */
+#endif /* SIMPLIFIED_WRITE_STDIO */
#endif /* SIMPLIFIED_WRITE */
#endif /* WRITE */
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwtran.c Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwtran.c Fri Aug 26 10:14:15 2016 -0700
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.18 [July 23, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwutil.c Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwutil.c Fri Aug 26 10:14:15 2016 -0700
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.19 [November 12, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.22 [May 26, 2016]
+ * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -51,10 +51,10 @@
void PNGAPI
png_save_uint_32(png_bytep buf, png_uint_32 i)
{
- buf[0] = (png_byte)(i >> 24);
- buf[1] = (png_byte)(i >> 16);
- buf[2] = (png_byte)(i >> 8);
- buf[3] = (png_byte)(i );
+ buf[0] = (png_byte)((i >> 24) & 0xffU);
+ buf[1] = (png_byte)((i >> 16) & 0xffU);
+ buf[2] = (png_byte)((i >> 8) & 0xffU);
+ buf[3] = (png_byte)( i & 0xffU);
}
/* Place a 16-bit number into a buffer in PNG byte order.
@@ -64,8 +64,8 @@
void PNGAPI
png_save_uint_16(png_bytep buf, unsigned int i)
{
- buf[0] = (png_byte)(i >> 8);
- buf[1] = (png_byte)(i );
+ buf[0] = (png_byte)((i >> 8) & 0xffU);
+ buf[1] = (png_byte)( i & 0xffU);
}
#endif
@@ -693,90 +693,6 @@
}
#endif /* WRITE_COMPRESSED_TEXT */
-#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \
- defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED)
-/* Check that the tEXt or zTXt keyword is valid per PNG 1.0 specification,
- * and if invalid, correct the keyword rather than discarding the entire
- * chunk. The PNG 1.0 specification requires keywords 1-79 characters in
- * length, forbids leading or trailing whitespace, multiple internal spaces,
- * and the non-break space (0x80) from ISO 8859-1. Returns keyword length.
- *
- * The 'new_key' buffer must be 80 characters in size (for the keyword plus a
- * trailing '\0'). If this routine returns 0 then there was no keyword, or a
- * valid one could not be generated, and the caller must png_error.
- */
-static png_uint_32
-png_check_keyword(png_structrp png_ptr, png_const_charp key, png_bytep new_key)
-{
- png_const_charp orig_key = key;
- png_uint_32 key_len = 0;
- int bad_character = 0;
- int space = 1;
-
- png_debug(1, "in png_check_keyword");
-
- if (key == NULL)
- {
- *new_key = 0;
- return 0;
- }
-
- while (*key && key_len < 79)
- {
- png_byte ch = (png_byte)*key++;
-
- if ((ch > 32 && ch <= 126) || (ch >= 161 /*&& ch <= 255*/))
- *new_key++ = ch, ++key_len, space = 0;
-
- else if (space == 0)
- {
- /* A space or an invalid character when one wasn't seen immediately
- * before; output just a space.
- */
- *new_key++ = 32, ++key_len, space = 1;
-
- /* If the character was not a space then it is invalid. */
- if (ch != 32)
- bad_character = ch;
- }
-
- else if (bad_character == 0)
- bad_character = ch; /* just skip it, record the first error */
- }
-
- if (key_len > 0 && space != 0) /* trailing space */
- {
- --key_len, --new_key;
- if (bad_character == 0)
- bad_character = 32;
- }
-
- /* Terminate the keyword */
- *new_key = 0;
-
- if (key_len == 0)
- return 0;
-
-#ifdef PNG_WARNINGS_SUPPORTED
- /* Try to only output one warning per keyword: */
- if (*key != 0) /* keyword too long */
- png_warning(png_ptr, "keyword truncated");
-
- else if (bad_character != 0)
- {
- PNG_WARNING_PARAMETERS(p)
-
- png_warning_parameter(p, 1, orig_key);
- png_warning_parameter_signed(p, 2, PNG_NUMBER_FORMAT_02x, bad_character);
-
- png_formatted_warning(png_ptr, p, "keyword \"@1\": bad character '0x@2'");
- }
-#endif /* WARNINGS */
-
- return key_len;
-}
-#endif /* WRITE_TEXT || WRITE_pCAL || WRITE_iCCP || WRITE_sPLT */
-
/* Write the IHDR chunk, and update the png_struct with the necessary
* information. Note that the rest of this code depends upon this
* information being correct.
--- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XTrayIconPeer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XTrayIconPeer.java Fri Aug 26 10:14:15 2016 -0700
@@ -93,7 +93,6 @@
if (XWM.getWMID() != XWM.METACITY_WM) {
parentXED = dummyXED; // We don't like to leave it 'null'.
-
} else {
parentXED = new XEventDispatcher() {
// It's executed under AWTLock.
@@ -300,10 +299,19 @@
removeXED(getWindow(), eframeXED);
removeXED(eframeParentID, parentXED);
+ removeListeners();
eframe.realDispose();
balloon.dispose();
+ tooltip.dispose();
isTrayIconDisplayed = false;
+ canvas.dispose();
+ canvas = null;
+ popup = null;
+ balloon = null;
+ tooltip = null;
XToolkit.targetDisposedPeer(target, this);
+ target = null;
+ eframe = null;
}
public static void suppressWarningString(Window w) {
@@ -416,6 +424,12 @@
eframe.addMouseListener(eventProxy);
}
+ void removeListeners() {
+ canvas.removeMouseListener(eventProxy);
+ canvas.removeMouseMotionListener(eventProxy);
+ eframe.removeMouseListener(eventProxy);
+ }
+
long getWindow() {
return AWTAccessor.getComponentAccessor()
.<XEmbeddedFramePeer>getPeer(eframe).getWindow();
@@ -550,6 +564,11 @@
super.repaintImage(doClear || (old_autosize != autosize));
}
+
+ public void dispose() {
+ super.dispose();
+ target = null;
+ }
}
@SuppressWarnings("serial") // JDK-implementation class
@@ -573,6 +592,10 @@
repaintImage(true);
}
+ public void dispose() {
+ observer = null;
+ }
+
// Invoke on EDT.
protected void repaintImage(boolean doClear) {
Graphics g = getGraphics();
--- a/jdk/src/java.desktop/windows/native/libfontmanager/fontpath.c Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.desktop/windows/native/libfontmanager/fontpath.c Fri Aug 26 10:14:15 2016 -0700
@@ -263,6 +263,7 @@
jstring familyLC;
size_t slen;
LOGFONTW lfw;
+ jboolean mapHasKey;
/* Exceptions indicate critical errors such that program cannot continue
* with further execution. Henceforth, the function returns immediately
@@ -311,10 +312,10 @@
}
/* check if already seen this family with a different charset */
- jboolean mapHasKey = (*env)->CallBooleanMethod(env,
- fmi->familyToFontListMap,
- fmi->containsKeyMID,
- familyLC);
+ mapHasKey = (*env)->CallBooleanMethod(env,
+ fmi->familyToFontListMap,
+ fmi->containsKeyMID,
+ familyLC);
if ((*env)->ExceptionCheck(env)) {
/* Delete the created references before return */
DeleteLocalReference(env, fmi->family);
@@ -535,6 +536,7 @@
jclass classIDString;
jmethodID putMID;
GdiFontMapInfo fmi;
+ LOGFONTW lfw;
/* Check we were passed all the maps we need, and do lookup of
* methods for JNI up-calls
@@ -598,7 +600,6 @@
}
/* Enumerate fonts via GDI to build maps of fonts and families */
- LOGFONTW lfw;
memset(&lfw, 0, sizeof(lfw));
lfw.lfCharSet = DEFAULT_CHARSET; /* all charsets */
wcscpy(lfw.lfFaceName, L""); /* one face per family (CHECK) */
--- a/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/JdkLDAP.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/JdkLDAP.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -29,6 +29,7 @@
import java.util.List;
import java.security.*;
import java.security.cert.CertStoreParameters;
+import static sun.security.util.SecurityConstants.PROVIDER_VER;
/**
* Provider class for the JdkLDAP provider.
@@ -69,7 +70,7 @@
}
public JdkLDAP() {
- super("JdkLDAP", 9.0d, "JdkLDAP Provider (implements LDAP CertStore)");
+ super("JdkLDAP", PROVIDER_VER, "JdkLDAP Provider (implements LDAP CertStore)");
final Provider p = this;
AccessController.doPrivileged(new PrivilegedAction<Void>() {
--- a/jdk/src/java.se.ee/share/classes/module-info.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.se.ee/share/classes/module-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -23,6 +23,12 @@
* questions.
*/
+/**
+ * Defines the full API of the Java SE Platform.
+ * <P>
+ * This module requires {@code java.se} and supplements it with modules
+ * that define CORBA and Java EE APIs. These modules are upgradeable.
+ */
module java.se.ee {
requires public java.se;
--- a/jdk/src/java.security.jgss/share/classes/sun/security/jgss/SunProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/jgss/SunProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -33,6 +33,7 @@
import java.security.ProviderException;
import sun.security.jgss.krb5.Krb5MechFactory;
import sun.security.jgss.spnego.SpNegoMechFactory;
+import static sun.security.util.SecurityConstants.PROVIDER_VER;
/**
* Defines the Sun JGSS provider.
@@ -99,7 +100,7 @@
public SunProvider() {
/* We are the Sun JGSS provider */
- super("SunJGSS", 9.0d, INFO);
+ super("SunJGSS", PROVIDER_VER, INFO);
final Provider p = this;
AccessController.doPrivileged(new PrivilegedAction<Void>() {
--- a/jdk/src/java.security.jgss/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -31,6 +31,7 @@
import java.security.PrivilegedAction;
import org.ietf.jgss.Oid;
import sun.security.action.PutAllAction;
+import static sun.security.util.SecurityConstants.PROVIDER_VER;
/**
* Defines the Sun NativeGSS provider for plugging in the
@@ -120,7 +121,7 @@
public SunNativeProvider() {
/* We are the Sun NativeGSS provider */
- super(NAME, 9.0d, INFO);
+ super(NAME, PROVIDER_VER, INFO);
if (MECH_MAP != null) {
AccessController.doPrivileged(new PutAllAction(this, MECH_MAP));
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KdcComm.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KdcComm.java Fri Aug 26 10:14:15 2016 -0700
@@ -390,35 +390,27 @@
for (int i=1; i <= retries; i++) {
String proto = useTCP?"TCP":"UDP";
- try (NetClient kdcClient = NetClient.getInstance(
- proto, kdc, port, timeout)) {
- if (DEBUG) {
- System.out.println(">>> KDCCommunication: kdc=" + kdc
+ if (DEBUG) {
+ System.out.println(">>> KDCCommunication: kdc=" + kdc
+ " " + proto + ":"
+ port + ", timeout="
+ timeout
+ ",Attempt =" + i
+ ", #bytes=" + obuf.length);
+ }
+ try (NetClient kdcClient = NetClient.getInstance(
+ proto, kdc, port, timeout)) {
+ kdcClient.send(obuf);
+ ibuf = kdcClient.receive();
+ break;
+ } catch (SocketTimeoutException se) {
+ if (DEBUG) {
+ System.out.println ("SocketTimeOutException with " +
+ "attempt: " + i);
}
- try {
- /*
- * Send the data to the kdc.
- */
- kdcClient.send(obuf);
- /*
- * And get a response.
- */
- ibuf = kdcClient.receive();
- break;
- } catch (SocketTimeoutException se) {
- if (DEBUG) {
- System.out.println ("SocketTimeOutException with " +
- "attempt: " + i);
- }
- if (i == retries) {
- ibuf = null;
- throw se;
- }
+ if (i == retries) {
+ ibuf = null;
+ throw se;
}
}
}
--- a/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/Provider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/Provider.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -29,6 +29,7 @@
import java.security.NoSuchAlgorithmException;
import java.security.InvalidParameterException;
import java.security.ProviderException;
+import static sun.security.util.SecurityConstants.PROVIDER_VER;
/**
* The SASL provider.
@@ -98,7 +99,7 @@
}
public Provider() {
- super("SunSASL", 9.0d, info);
+ super("SunSASL", PROVIDER_VER, info);
final Provider p = this;
AccessController.doPrivileged(new PrivilegedAction<Void>() {
--- a/jdk/src/java.smartcardio/share/classes/javax/smartcardio/TerminalFactory.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.smartcardio/share/classes/javax/smartcardio/TerminalFactory.java Fri Aug 26 10:14:15 2016 -0700
@@ -134,7 +134,7 @@
private static final long serialVersionUID = 2745808869881593918L;
final static Provider INSTANCE = new NoneProvider();
private NoneProvider() {
- super("None", 1.0d, "none");
+ super("None", "1.0", "none");
}
}
--- a/jdk/src/java.smartcardio/share/classes/sun/security/smartcardio/SunPCSC.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.smartcardio/share/classes/sun/security/smartcardio/SunPCSC.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,7 @@
import java.security.*;
import javax.smartcardio.*;
+import static sun.security.util.SecurityConstants.PROVIDER_VER;
/**
* Provider object for PC/SC.
@@ -65,7 +66,7 @@
}
public SunPCSC() {
- super("SunPCSC", 9.0d, "Sun PC/SC provider");
+ super("SunPCSC", PROVIDER_VER, "Sun PC/SC provider");
final Provider p = this;
AccessController.doPrivileged(new PrivilegedAction<Void>() {
--- a/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/BaseRowSet.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/BaseRowSet.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -3204,7 +3204,6 @@
* this method is called on a closed <code>CallableStatement</code>
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
- * @since 1.4
*/
public void setNull(String parameterName, int sqlType) throws SQLException {
throw new SQLFeatureNotSupportedException("Feature not supported");
@@ -3240,7 +3239,6 @@
* this method is called on a closed <code>CallableStatement</code>
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
- * @since 1.4
*/
public void setNull (String parameterName, int sqlType, String typeName)
throws SQLException{
@@ -3259,7 +3257,6 @@
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @see #getParams
- * @since 1.4
*/
public void setBoolean(String parameterName, boolean x) throws SQLException{
throw new SQLFeatureNotSupportedException("Feature not supported");
@@ -3277,7 +3274,6 @@
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @see #getParams
- * @since 1.4
*/
public void setByte(String parameterName, byte x) throws SQLException{
throw new SQLFeatureNotSupportedException("Feature not supported");
@@ -3295,7 +3291,6 @@
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @see #getParams
- * @since 1.4
*/
public void setShort(String parameterName, short x) throws SQLException{
throw new SQLFeatureNotSupportedException("Feature not supported");
@@ -3313,7 +3308,6 @@
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @see #getParams
- * @since 1.4
*/
public void setInt(String parameterName, int x) throws SQLException{
throw new SQLFeatureNotSupportedException("Feature not supported");
@@ -3332,7 +3326,6 @@
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @see #getParams
- * @since 1.4
*/
public void setLong(String parameterName, long x) throws SQLException{
throw new SQLFeatureNotSupportedException("Feature not supported");
@@ -3350,7 +3343,6 @@
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @see #getParams
- * @since 1.4
*/
public void setFloat(String parameterName, float x) throws SQLException{
throw new SQLFeatureNotSupportedException("Feature not supported");
@@ -3368,7 +3360,6 @@
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @see #getParams
- * @since 1.4
*/
public void setDouble(String parameterName, double x) throws SQLException{
throw new SQLFeatureNotSupportedException("Feature not supported");
@@ -3387,7 +3378,6 @@
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @see #getParams
- * @since 1.4
*/
public void setBigDecimal(String parameterName, BigDecimal x) throws SQLException{
throw new SQLFeatureNotSupportedException("Feature not supported");
@@ -3408,7 +3398,6 @@
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @see #getParams
- * @since 1.4
*/
public void setString(String parameterName, String x) throws SQLException{
throw new SQLFeatureNotSupportedException("Feature not supported");
@@ -3428,7 +3417,6 @@
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @see #getParams
- * @since 1.4
*/
public void setBytes(String parameterName, byte x[]) throws SQLException{
throw new SQLFeatureNotSupportedException("Feature not supported");
@@ -3447,7 +3435,6 @@
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @see #getParams
- * @since 1.4
*/
public void setTimestamp(String parameterName, java.sql.Timestamp x)
throws SQLException{
@@ -3474,7 +3461,6 @@
* this method is called on a closed <code>CallableStatement</code>
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
- * @since 1.4
*/
public void setAsciiStream(String parameterName, java.io.InputStream x, int length)
throws SQLException{
@@ -3500,7 +3486,6 @@
* this method is called on a closed <code>CallableStatement</code>
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
- * @since 1.4
*/
public void setBinaryStream(String parameterName, java.io.InputStream x,
int length) throws SQLException{
@@ -3528,7 +3513,6 @@
* this method is called on a closed <code>CallableStatement</code>
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
- * @since 1.4
*/
public void setCharacterStream(String parameterName,
java.io.Reader reader,
@@ -3684,7 +3668,6 @@
* this data type
* @see Types
* @see #getParams
- * @since 1.4
*/
public void setObject(String parameterName, Object x, int targetSqlType, int scale)
throws SQLException{
@@ -3710,7 +3693,6 @@
* or <code>STRUCT</code> data type and the JDBC driver does not support
* this data type
* @see #getParams
- * @since 1.4
*/
public void setObject(String parameterName, Object x, int targetSqlType)
throws SQLException{
@@ -3751,7 +3733,6 @@
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @see #getParams
- * @since 1.4
*/
public void setObject(String parameterName, Object x) throws SQLException{
throw new SQLFeatureNotSupportedException("Feature not supported");
@@ -4024,7 +4005,6 @@
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @see #getParams
- * @since 1.4
*/
public void setDate(String parameterName, java.sql.Date x)
throws SQLException {
@@ -4050,7 +4030,6 @@
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @see #getParams
- * @since 1.4
*/
public void setDate(String parameterName, java.sql.Date x, Calendar cal)
throws SQLException {
@@ -4069,7 +4048,6 @@
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @see #getParams
- * @since 1.4
*/
public void setTime(String parameterName, java.sql.Time x)
throws SQLException {
@@ -4095,7 +4073,6 @@
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @see #getParams
- * @since 1.4
*/
public void setTime(String parameterName, java.sql.Time x, Calendar cal)
throws SQLException {
@@ -4121,7 +4098,6 @@
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @see #getParams
- * @since 1.4
*/
public void setTimestamp(String parameterName, java.sql.Timestamp x, Calendar cal)
throws SQLException {
@@ -4459,7 +4435,6 @@
* @exception SQLException if a database access error occurs or
* this method is called on a closed <code>PreparedStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
- * @since 1.4
*/
public void setURL(int parameterIndex, java.net.URL x) throws SQLException {
throw new SQLFeatureNotSupportedException("Feature not supported");
--- a/jdk/src/java.sql/share/classes/javax/sql/CommonDataSource.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.sql/share/classes/javax/sql/CommonDataSource.java Fri Aug 26 10:14:15 2016 -0700
@@ -57,7 +57,6 @@
* logging is disabled
* @exception java.sql.SQLException if a database access error occurs
* @see #setLogWriter
- * @since 1.4
*/
java.io.PrintWriter getLogWriter() throws SQLException;
@@ -79,7 +78,6 @@
* @param out the new log writer; to disable logging, set to null
* @exception SQLException if a database access error occurs
* @see #getLogWriter
- * @since 1.4
*/
void setLogWriter(java.io.PrintWriter out) throws SQLException;
@@ -94,7 +92,6 @@
* @param seconds the data source login time limit
* @exception SQLException if a database access error occurs.
* @see #getLoginTimeout
- * @since 1.4
*/
void setLoginTimeout(int seconds) throws SQLException;
@@ -109,7 +106,6 @@
* @return the data source login time limit
* @exception SQLException if a database access error occurs.
* @see #setLoginTimeout
- * @since 1.4
*/
int getLoginTimeout() throws SQLException;
--- a/jdk/src/java.sql/share/classes/javax/sql/ConnectionPoolDataSource.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.sql/share/classes/javax/sql/ConnectionPoolDataSource.java Fri Aug 26 10:14:15 2016 -0700
@@ -72,6 +72,34 @@
PooledConnection getPooledConnection(String user, String password)
throws SQLException;
+ /**
+ * {@inheritDoc}
+ * @since 1.4
+ */
+ @Override
+ java.io.PrintWriter getLogWriter() throws SQLException;
+
+ /**
+ * {@inheritDoc}
+ * @since 1.4
+ */
+ @Override
+ void setLogWriter(java.io.PrintWriter out) throws SQLException;
+
+ /**
+ * {@inheritDoc}
+ * @since 1.4
+ */
+ @Override
+ void setLoginTimeout(int seconds) throws SQLException;
+
+ /**
+ * {@inheritDoc}
+ * @since 1.4
+ */
+ @Override
+ int getLoginTimeout() throws SQLException;
+
//------------------------- JDBC 4.3 -----------------------------------
/**
--- a/jdk/src/java.sql/share/classes/javax/sql/DataSource.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.sql/share/classes/javax/sql/DataSource.java Fri Aug 26 10:14:15 2016 -0700
@@ -109,6 +109,34 @@
Connection getConnection(String username, String password)
throws SQLException;
+ /**
+ * {@inheritDoc}
+ * @since 1.4
+ */
+ @Override
+ java.io.PrintWriter getLogWriter() throws SQLException;
+
+ /**
+ * {@inheritDoc}
+ * @since 1.4
+ */
+ @Override
+ void setLogWriter(java.io.PrintWriter out) throws SQLException;
+
+ /**
+ * {@inheritDoc}
+ * @since 1.4
+ */
+ @Override
+ void setLoginTimeout(int seconds) throws SQLException;
+
+ /**
+ * {@inheritDoc}
+ * @since 1.4
+ */
+ @Override
+ int getLoginTimeout() throws SQLException;
+
// JDBC 4.3
/**
--- a/jdk/src/java.sql/share/classes/javax/sql/XADataSource.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.sql/share/classes/javax/sql/XADataSource.java Fri Aug 26 10:14:15 2016 -0700
@@ -81,7 +81,35 @@
XAConnection getXAConnection(String user, String password)
throws SQLException;
- // JDBC 4.3
+ /**
+ * {@inheritDoc}
+ * @since 1.4
+ */
+ @Override
+ java.io.PrintWriter getLogWriter() throws SQLException;
+
+ /**
+ * {@inheritDoc}
+ * @since 1.4
+ */
+ @Override
+ void setLogWriter(java.io.PrintWriter out) throws SQLException;
+
+ /**
+ * {@inheritDoc}
+ * @since 1.4
+ */
+ @Override
+ void setLoginTimeout(int seconds) throws SQLException;
+
+ /**
+ * {@inheritDoc}
+ * @since 1.4
+ */
+ @Override
+ int getLoginTimeout() throws SQLException;
+
+ // JDBC 4.3
/**
* Creates a new {@code XAConnectionBuilder} instance
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/IntegrityHmac.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/IntegrityHmac.java Fri Aug 26 10:14:15 2016 -0700
@@ -150,7 +150,7 @@
this.macAlgorithm.init(secretKey);
} catch (InvalidKeyException ex) {
// reinstantiate Mac object to work around bug in JDK
- // see: http://bugs.sun.com/view_bug.do?bug_id=4953555
+ // see: http://bugs.java.com/view_bug.do?bug_id=4953555
Mac mac = this.macAlgorithm;
try {
this.macAlgorithm = Mac.getInstance(macAlgorithm.getAlgorithm());
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/SignatureBaseRSA.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/SignatureBaseRSA.java Fri Aug 26 10:14:15 2016 -0700
@@ -112,7 +112,7 @@
this.signatureAlgorithm.initVerify((PublicKey) publicKey);
} catch (InvalidKeyException ex) {
// reinstantiate Signature object to work around bug in JDK
- // see: http://bugs.sun.com/view_bug.do?bug_id=4953555
+ // see: http://bugs.java.com/view_bug.do?bug_id=4953555
Signature sig = this.signatureAlgorithm;
try {
this.signatureAlgorithm = Signature.getInstance(signatureAlgorithm.getAlgorithm());
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/SignatureDSA.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/SignatureDSA.java Fri Aug 26 10:14:15 2016 -0700
@@ -139,7 +139,7 @@
this.signatureAlgorithm.initVerify((PublicKey) publicKey);
} catch (InvalidKeyException ex) {
// reinstantiate Signature object to work around bug in JDK
- // see: http://bugs.sun.com/view_bug.do?bug_id=4953555
+ // see: http://bugs.java.com/view_bug.do?bug_id=4953555
Signature sig = this.signatureAlgorithm;
try {
this.signatureAlgorithm = Signature.getInstance(signatureAlgorithm.getAlgorithm());
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/SignatureECDSA.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/SignatureECDSA.java Fri Aug 26 10:14:15 2016 -0700
@@ -252,7 +252,7 @@
this.signatureAlgorithm.initVerify((PublicKey) publicKey);
} catch (InvalidKeyException ex) {
// reinstantiate Signature object to work around bug in JDK
- // see: http://bugs.sun.com/view_bug.do?bug_id=4953555
+ // see: http://bugs.java.com/view_bug.do?bug_id=4953555
Signature sig = this.signatureAlgorithm;
try {
this.signatureAlgorithm = Signature.getInstance(signatureAlgorithm.getAlgorithm());
--- a/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/ApacheTransform.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/ApacheTransform.java Fri Aug 26 10:14:15 2016 -0700
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
*/
/*
* $Id: ApacheTransform.java 1333869 2012-05-04 10:42:44Z coheigea $
@@ -38,7 +38,6 @@
import com.sun.org.apache.xml.internal.security.signature.XMLSignatureInput;
import com.sun.org.apache.xml.internal.security.transforms.Transform;
-import com.sun.org.apache.xml.internal.security.transforms.Transforms;
import javax.xml.crypto.*;
import javax.xml.crypto.dom.DOMCryptoContext;
@@ -150,7 +149,7 @@
if (Utils.secureValidation(xc)) {
String algorithm = getAlgorithm();
- if (Transforms.TRANSFORM_XSLT.equals(algorithm)) {
+ if (Policy.restrictAlg(algorithm)) {
throw new TransformException(
"Transform " + algorithm + " is forbidden when secure validation is enabled"
);
--- a/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/DOMManifest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/DOMManifest.java Fri Aug 26 10:14:15 2016 -0700
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
*/
/*
* $Id: DOMManifest.java 1333415 2012-05-03 12:03:51Z coheigea $
@@ -110,9 +110,10 @@
localName + ", expected Reference");
}
refs.add(new DOMReference(refElem, context, provider));
- if (secVal && (refs.size() > DOMSignedInfo.MAXIMUM_REFERENCE_COUNT)) {
- String error = "A maxiumum of " + DOMSignedInfo.MAXIMUM_REFERENCE_COUNT + " "
- + "references per Manifest are allowed with secure validation";
+ if (secVal && Policy.restrictNumReferences(refs.size())) {
+ String error = "A maximum of " + Policy.maxReferences()
+ + " references per Manifest are allowed when"
+ + " secure validation is enabled";
throw new MarshalException(error);
}
refElem = DOMUtils.getNextSiblingElement(refElem);
--- a/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/DOMReference.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/DOMReference.java Fri Aug 26 10:14:15 2016 -0700
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
*/
/*
* ===========================================================================
@@ -51,7 +51,6 @@
import org.w3c.dom.Node;
import org.jcp.xml.dsig.internal.DigesterOutputStream;
-import com.sun.org.apache.xml.internal.security.algorithms.MessageDigestAlgorithm;
import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException;
import com.sun.org.apache.xml.internal.security.signature.XMLSignatureInput;
import com.sun.org.apache.xml.internal.security.utils.Base64;
@@ -67,11 +66,6 @@
implements Reference, DOMURIReference {
/**
- * The maximum number of transforms per reference, if secure validation is enabled.
- */
- public static final int MAXIMUM_TRANSFORM_COUNT = 5;
-
- /**
* Look up useC14N11 system property. If true, an explicit C14N11 transform
* will be added if necessary when generating the signature. See section
* 3.1.1 of http://www.w3.org/2007/xmlsec/Drafts/xmldsig-core/ for more info.
@@ -208,9 +202,10 @@
}
transforms.add
(new DOMTransform(transformElem, context, provider));
- if (secVal && (transforms.size() > MAXIMUM_TRANSFORM_COUNT)) {
- String error = "A maxiumum of " + MAXIMUM_TRANSFORM_COUNT + " "
- + "transforms per Reference are allowed with secure validation";
+ if (secVal && Policy.restrictNumTransforms(transforms.size())) {
+ String error = "A maximum of " + Policy.maxTransforms()
+ + " transforms per Reference are allowed when"
+ + " secure validation is enabled";
throw new MarshalException(error);
}
transformElem = DOMUtils.getNextSiblingElement(transformElem);
@@ -227,10 +222,10 @@
Element dmElem = nextSibling;
this.digestMethod = DOMDigestMethod.unmarshal(dmElem);
String digestMethodAlgorithm = this.digestMethod.getAlgorithm();
- if (secVal
- && MessageDigestAlgorithm.ALGO_ID_DIGEST_NOT_RECOMMENDED_MD5.equals(digestMethodAlgorithm)) {
+ if (secVal && Policy.restrictAlg(digestMethodAlgorithm)) {
throw new MarshalException(
- "It is forbidden to use algorithm " + digestMethod + " when secure validation is enabled"
+ "It is forbidden to use algorithm " + digestMethodAlgorithm +
+ " when secure validation is enabled"
);
}
--- a/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/DOMRetrievalMethod.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/DOMRetrievalMethod.java Fri Aug 26 10:14:15 2016 -0700
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
*/
/*
* ===========================================================================
@@ -149,9 +149,10 @@
}
transforms.add
(new DOMTransform(transformElem, context, provider));
- if (secVal && (transforms.size() > DOMReference.MAXIMUM_TRANSFORM_COUNT)) {
- String error = "A maxiumum of " + DOMReference.MAXIMUM_TRANSFORM_COUNT + " "
- + "transforms per Reference are allowed with secure validation";
+ if (secVal && Policy.restrictNumTransforms(transforms.size())) {
+ String error = "A maximum of " + Policy.maxTransforms()
+ + " transforms per Reference are allowed when"
+ + " secure validation is enabled";
throw new MarshalException(error);
}
transformElem = DOMUtils.getNextSiblingElement(transformElem);
@@ -238,7 +239,8 @@
}
// guard against RetrievalMethod loops
- if ((data instanceof NodeSetData) && Utils.secureValidation(context)) {
+ if ((data instanceof NodeSetData) && Utils.secureValidation(context)
+ && Policy.restrictRetrievalMethodLoops()) {
NodeSetData<?> nsd = (NodeSetData<?>)data;
Iterator<?> i = nsd.iterator();
if (i.hasNext()) {
--- a/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignedInfo.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignedInfo.java Fri Aug 26 10:14:15 2016 -0700
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
*/
/*
* $Id: DOMSignedInfo.java 1333415 2012-05-03 12:03:51Z coheigea $
@@ -45,7 +45,6 @@
import org.w3c.dom.Node;
import com.sun.org.apache.xml.internal.security.utils.Base64;
-import com.sun.org.apache.xml.internal.security.utils.Constants;
import com.sun.org.apache.xml.internal.security.utils.UnsyncBufferedOutputStream;
/**
@@ -55,22 +54,9 @@
*/
public final class DOMSignedInfo extends DOMStructure implements SignedInfo {
- /**
- * The maximum number of references per Manifest, if secure validation is enabled.
- */
- public static final int MAXIMUM_REFERENCE_COUNT = 30;
-
private static java.util.logging.Logger log =
java.util.logging.Logger.getLogger("org.jcp.xml.dsig.internal.dom");
- /** Signature - NOT Recommended RSAwithMD5 */
- private static final String ALGO_ID_SIGNATURE_NOT_RECOMMENDED_RSA_MD5 =
- Constants.MoreAlgorithmsSpecNS + "rsa-md5";
-
- /** HMAC - NOT Recommended HMAC-MD5 */
- private static final String ALGO_ID_MAC_HMAC_NOT_RECOMMENDED_MD5 =
- Constants.MoreAlgorithmsSpecNS + "hmac-md5";
-
private List<Reference> references;
private CanonicalizationMethod canonicalizationMethod;
private SignatureMethod signatureMethod;
@@ -158,10 +144,10 @@
boolean secVal = Utils.secureValidation(context);
String signatureMethodAlgorithm = signatureMethod.getAlgorithm();
- if (secVal && ((ALGO_ID_MAC_HMAC_NOT_RECOMMENDED_MD5.equals(signatureMethodAlgorithm)
- || ALGO_ID_SIGNATURE_NOT_RECOMMENDED_RSA_MD5.equals(signatureMethodAlgorithm)))) {
+ if (secVal && Policy.restrictAlg(signatureMethodAlgorithm)) {
throw new MarshalException(
- "It is forbidden to use algorithm " + signatureMethod + " when secure validation is enabled"
+ "It is forbidden to use algorithm " + signatureMethodAlgorithm +
+ " when secure validation is enabled"
);
}
@@ -179,9 +165,10 @@
}
refList.add(new DOMReference(refElem, context, provider));
- if (secVal && (refList.size() > MAXIMUM_REFERENCE_COUNT)) {
- String error = "A maxiumum of " + MAXIMUM_REFERENCE_COUNT + " "
- + "references per Manifest are allowed with secure validation";
+ if (secVal && Policy.restrictNumReferences(refList.size())) {
+ String error = "A maximum of " + Policy.maxReferences()
+ + " references per Manifest are allowed when"
+ + " secure validation is enabled";
throw new MarshalException(error);
}
refElem = DOMUtils.getNextSiblingElement(refElem);
--- a/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/DOMURIDereferencer.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/DOMURIDereferencer.java Fri Aug 26 10:14:15 2016 -0700
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
*/
/*
* $Id: DOMURIDereferencer.java 1231033 2012-01-13 12:12:12Z coheigea $
@@ -73,6 +73,11 @@
boolean secVal = Utils.secureValidation(context);
+ if (secVal && Policy.restrictReferenceUriScheme(uri)) {
+ throw new URIReferenceException(
+ "Uri " + uri + " is forbidden when secure validation is enabled");
+ }
+
// Check if same-document URI and already registered on the context
if (uri != null && uri.length() != 0 && uri.charAt(0) == '#') {
String id = uri.substring(1);
@@ -83,12 +88,19 @@
id = id.substring(i1+1, i2);
}
- Node referencedElem = dcc.getElementById(id);
+ // check if element is registered by Id
+ Node referencedElem = uriAttr.getOwnerDocument().getElementById(id);
+ if (referencedElem == null) {
+ // see if element is registered in DOMCryptoContext
+ referencedElem = dcc.getElementById(id);
+ }
if (referencedElem != null) {
- if (secVal) {
+ if (secVal && Policy.restrictDuplicateIds()) {
Element start = referencedElem.getOwnerDocument().getDocumentElement();
if (!XMLUtils.protectAgainstWrappingAttack(start, (Element)referencedElem, id)) {
- String error = "Multiple Elements with the same ID " + id + " were detected";
+ String error = "Multiple Elements with the same ID "
+ + id + " detected when secure validation"
+ + " is enabled";
throw new URIReferenceException(error);
}
}
@@ -110,9 +122,9 @@
try {
ResourceResolver apacheResolver =
- ResourceResolver.getInstance(uriAttr, baseURI, secVal);
+ ResourceResolver.getInstance(uriAttr, baseURI, false);
XMLSignatureInput in = apacheResolver.resolve(uriAttr,
- baseURI, secVal);
+ baseURI, false);
if (in.isOctetStream()) {
return new ApacheOctetStreamData(in);
} else {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/Policy.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package org.jcp.xml.dsig.internal.dom;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.security.AccessController;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.security.Security;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Set;
+
+/**
+ * The secure validation policy as specified by the
+ * jdk.xml.dsig.secureValidationPolicy security property.
+ */
+public final class Policy {
+
+ // all restrictions are initialized to be unconstrained
+ private static Set<URI> disallowedAlgs = new HashSet<>();
+ private static int maxTrans = Integer.MAX_VALUE;
+ private static int maxRefs = Integer.MAX_VALUE;
+ private static Set<String> disallowedRefUriSchemes = new HashSet<>();
+ private static boolean noDuplicateIds = false;
+ private static boolean noRMLoops = false;
+
+ static {
+ try {
+ initialize();
+ } catch (Exception e) {
+ throw new SecurityException(
+ "Cannot initialize the secure validation policy", e);
+ }
+ }
+
+ private Policy() {}
+
+ private static void initialize() {
+ String prop =
+ AccessController.doPrivileged((PrivilegedAction<String>) () ->
+ Security.getProperty("jdk.xml.dsig.secureValidationPolicy"));
+ if (prop == null || prop.isEmpty()) {
+ // no policy specified, so don't enforce any restrictions
+ return;
+ }
+ String[] entries = prop.split(",");
+ for (String entry : entries) {
+ String[] tokens = entry.split("\\s");
+ String type = tokens[0];
+ switch(type) {
+ case "disallowAlg":
+ if (tokens.length != 2) {
+ error(entry);
+ }
+ disallowedAlgs.add(URI.create(tokens[1]));
+ break;
+ case "maxTransforms":
+ if (tokens.length != 2) {
+ error(entry);
+ }
+ maxTrans = Integer.parseUnsignedInt(tokens[1]);
+ break;
+ case "maxReferences":
+ if (tokens.length != 2) {
+ error(entry);
+ }
+ maxRefs = Integer.parseUnsignedInt(tokens[1]);
+ break;
+ case "disallowReferenceUriSchemes":
+ if (tokens.length == 1) {
+ error(entry);
+ }
+ for (int i = 1; i < tokens.length; i++) {
+ String scheme = tokens[i];
+ disallowedRefUriSchemes.add(
+ scheme.toLowerCase(Locale.ROOT));
+ }
+ break;
+ case "noDuplicateIds":
+ if (tokens.length != 1) {
+ error(entry);
+ }
+ noDuplicateIds = true;
+ break;
+ case "noRetrievalMethodLoops":
+ if (tokens.length != 1) {
+ error(entry);
+ }
+ noRMLoops = true;
+ break;
+ default:
+ error(entry);
+ }
+ }
+ }
+
+ public static boolean restrictAlg(String alg) {
+ try {
+ URI uri = new URI(alg);
+ return disallowedAlgs.contains(uri);
+ } catch (URISyntaxException use) {
+ return false;
+ }
+ }
+
+ public static boolean restrictNumTransforms(int numTrans) {
+ return (numTrans > maxTrans);
+ }
+
+ public static boolean restrictNumReferences(int numRefs) {
+ return (numRefs > maxRefs);
+ }
+
+ public static boolean restrictReferenceUriScheme(String uri) {
+ if (uri != null) {
+ String scheme = java.net.URI.create(uri).getScheme();
+ if (scheme != null) {
+ return disallowedRefUriSchemes.contains(
+ scheme.toLowerCase(Locale.ROOT));
+ }
+ }
+ return false;
+ }
+
+ public static boolean restrictDuplicateIds() {
+ return noDuplicateIds;
+ }
+
+ public static boolean restrictRetrievalMethodLoops() {
+ return noRMLoops;
+ }
+
+ public static Set<URI> disabledAlgs() {
+ return Collections.<URI>unmodifiableSet(disallowedAlgs);
+ }
+
+ public static int maxTransforms() {
+ return maxTrans;
+ }
+
+ public static int maxReferences() {
+ return maxRefs;
+ }
+
+ public static Set<String> disabledReferenceUriSchemes() {
+ return Collections.<String>unmodifiableSet(disallowedRefUriSchemes);
+ }
+
+ private static void error(String entry) {
+ throw new IllegalArgumentException(
+ "Invalid jdk.xml.dsig.secureValidationPolicy entry: " + entry);
+ }
+}
--- a/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/XMLDSigRI.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/XMLDSigRI.java Fri Aug 26 10:14:15 2016 -0700
@@ -28,7 +28,7 @@
* ===========================================================================
*/
/*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
*/
/*
* $Id: XMLDSigRI.java 1400021 2012-10-19 10:16:04Z coheigea $
@@ -59,6 +59,13 @@
"C14N 1.0, C14N 1.1, Exclusive C14N, Base64, Enveloped, XPath, " +
"XPath2, XSLT TransformServices)";
+ private static final String VER =
+ AccessController.doPrivileged(new PrivilegedAction<>() {
+ public String run() {
+ return System.getProperty("java.specification.version");
+ }
+ });
+
private static final class ProviderService extends Provider.Service {
ProviderService(Provider p, String type, String algo, String cn) {
@@ -129,7 +136,7 @@
public XMLDSigRI() {
/* We are the XMLDSig provider */
- super("XMLDSig", 9.0d, INFO);
+ super("XMLDSig", VER, INFO);
final Provider p = this;
AccessController.doPrivileged(new PrivilegedAction<Void>() {
--- a/jdk/src/jdk.crypto.ec/share/classes/sun/security/ec/SunEC.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/jdk.crypto.ec/share/classes/sun/security/ec/SunEC.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -31,6 +31,7 @@
import sun.security.util.CurveDB;
import sun.security.util.NamedCurve;
import sun.security.util.ECParameters;
+import static sun.security.util.SecurityConstants.PROVIDER_VER;
/**
* Provider class for the Elliptic Curve provider.
@@ -142,7 +143,8 @@
}
public SunEC() {
- super("SunEC", 9.0d, "Sun Elliptic Curve provider (EC, ECDSA, ECDH)");
+ super("SunEC", PROVIDER_VER,
+ "Sun Elliptic Curve provider (EC, ECDSA, ECDH)");
AccessController.doPrivileged(new PrivilegedAction<Void>() {
public Void run() {
putEntries(useFullImplementation);
--- a/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/SunMSCAPI.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/SunMSCAPI.java Fri Aug 26 10:14:15 2016 -0700
@@ -33,6 +33,7 @@
import java.security.ProviderException;
import java.util.HashMap;
import java.util.Arrays;
+import static sun.security.util.SecurityConstants.PROVIDER_VER;
/**
* A Cryptographic Service Provider for the Microsoft Crypto API.
@@ -124,7 +125,7 @@
}
public SunMSCAPI() {
- super("SunMSCAPI", 9.0d, INFO);
+ super("SunMSCAPI", PROVIDER_VER, INFO);
final Provider p = this;
AccessController.doPrivileged(new PrivilegedAction<Void>() {
--- a/jdk/src/jdk.crypto.mscapi/windows/native/libsunmscapi/security.cpp Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/jdk.crypto.mscapi/windows/native/libsunmscapi/security.cpp Fri Aug 26 10:14:15 2016 -0700
@@ -358,38 +358,50 @@
BOOL bHasNoPrivateKey = FALSE;
DWORD dwPublicKeyLength = 0;
- if (::CryptAcquireCertificatePrivateKey(pCertContext, NULL, NULL,
- &hCryptProv, &dwKeySpec, &bCallerFreeProv) == FALSE)
+ // First, probe it silently
+ if (::CryptAcquireCertificatePrivateKey(pCertContext, CRYPT_ACQUIRE_SILENT_FLAG, NULL,
+ &hCryptProv, &dwKeySpec, &bCallerFreeProv) == FALSE
+ && GetLastError() != NTE_SILENT_CONTEXT)
{
bHasNoPrivateKey = TRUE;
-
- } else {
- // Private key is available
-
- BOOL bGetUserKey = ::CryptGetUserKey(hCryptProv, dwKeySpec, &hUserKey);
-
- // Skip certificate if cannot find private key
- if (bGetUserKey == FALSE)
- {
- if (bCallerFreeProv)
- ::CryptReleaseContext(hCryptProv, NULL);
-
- continue;
+ }
+ else
+ {
+ if (bCallerFreeProv == TRUE) {
+ ::CryptReleaseContext(hCryptProv, NULL);
+ bCallerFreeProv = FALSE;
}
- // Set cipher mode to ECB
- DWORD dwCipherMode = CRYPT_MODE_ECB;
- ::CryptSetKeyParam(hUserKey, KP_MODE, (BYTE*)&dwCipherMode, NULL);
-
+ // Second, acquire the key normally (not silently)
+ if (::CryptAcquireCertificatePrivateKey(pCertContext, 0, NULL,
+ &hCryptProv, &dwKeySpec, &bCallerFreeProv) == FALSE)
+ {
+ bHasNoPrivateKey = TRUE;
+ }
+ else
+ {
+ // Private key is available
+ BOOL bGetUserKey = ::CryptGetUserKey(hCryptProv, dwKeySpec, &hUserKey);
- // If the private key is present in smart card, we may not be able to
- // determine the key length by using the private key handle. However,
- // since public/private key pairs must have the same length, we could
- // determine the key length of the private key by using the public key
- // in the certificate.
- dwPublicKeyLength = ::CertGetPublicKeyLength(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
- &(pCertContext->pCertInfo->SubjectPublicKeyInfo));
+ // Skip certificate if cannot find private key
+ if (bGetUserKey == FALSE) {
+ if (bCallerFreeProv)
+ ::CryptReleaseContext(hCryptProv, NULL);
+ continue;
+ }
+ // Set cipher mode to ECB
+ DWORD dwCipherMode = CRYPT_MODE_ECB;
+ ::CryptSetKeyParam(hUserKey, KP_MODE, (BYTE*)&dwCipherMode, NULL);
+
+ // If the private key is present in smart card, we may not be able to
+ // determine the key length by using the private key handle. However,
+ // since public/private key pairs must have the same length, we could
+ // determine the key length of the private key by using the public key
+ // in the certificate.
+ dwPublicKeyLength = ::CertGetPublicKeyLength(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
+ &(pCertContext->pCertInfo->SubjectPublicKeyInfo));
+ }
}
PCCERT_CHAIN_CONTEXT pCertChainContext = NULL;
@@ -398,8 +410,7 @@
//
if (GetCertificateChain(OID_EKU_ANY, pCertContext, &pCertChainContext))
{
-
- for (unsigned int i=0; i < pCertChainContext->cChain; i++)
+ for (DWORD i = 0; i < pCertChainContext->cChain; i++)
{
// Found cert chain
PCERT_SIMPLE_CHAIN rgpChain =
@@ -449,6 +460,7 @@
// cert collection
env->CallVoidMethod(obj, mGenCert, byteArray, jArrayList);
}
+
if (bHasNoPrivateKey)
{
// Generate certificate chain and store into cert chain
@@ -1367,43 +1379,57 @@
HCRYPTPROV hCryptProv = NULL;
HCRYPTKEY hKey = NULL;
DWORD dwKeySpec;
+ BOOL bCallerFreeProv = FALSE;
+ BOOL bRes;
__try
{
if (usePrivateKey == JNI_TRUE) {
// Locate the key container for the certificate's private key
- if (!(::CryptAcquireCertificatePrivateKey(
- (PCCERT_CONTEXT) pCertContext, 0, NULL, &hCryptProv,
- &dwKeySpec, NULL))) {
+
+ // First, probe it silently
+ bRes = ::CryptAcquireCertificatePrivateKey(
+ (PCCERT_CONTEXT) pCertContext, CRYPT_ACQUIRE_SILENT_FLAG,
+ NULL, &hCryptProv, &dwKeySpec, &bCallerFreeProv);
+ if (bRes == FALSE && GetLastError() != NTE_SILENT_CONTEXT)
+ {
+ ThrowException(env, KEYSTORE_EXCEPTION, GetLastError());
+ __leave;
+ }
+
+ if (bCallerFreeProv == TRUE) {
+ ::CryptReleaseContext(hCryptProv, NULL);
+ bCallerFreeProv = FALSE;
+ }
+
+ // Now, do it normally (not silently)
+ if (::CryptAcquireCertificatePrivateKey(
+ (PCCERT_CONTEXT) pCertContext, 0, NULL, &hCryptProv,
+ &dwKeySpec, &bCallerFreeProv) == FALSE)
+ {
ThrowException(env, KEYSTORE_EXCEPTION, GetLastError());
__leave;
}
// Get a handle to the private key
- if (!(::CryptGetUserKey(hCryptProv, dwKeySpec, &hKey))) {
+ if (::CryptGetUserKey(hCryptProv, dwKeySpec, &hKey) == FALSE) {
ThrowException(env, KEY_EXCEPTION, GetLastError());
__leave;
}
-
- } else { // use public key
+ }
+ else // use public key
+ {
+ bCallerFreeProv = TRUE;
// Acquire a CSP context.
- if(::CryptAcquireContext(
- &hCryptProv,
- "J2SE",
- NULL,
- PROV_RSA_FULL,
- 0) == FALSE)
+ if (::CryptAcquireContext(&hCryptProv, "J2SE", NULL,
+ PROV_RSA_FULL, 0) == FALSE)
{
// If CSP context hasn't been created, create one.
//
- if (::CryptAcquireContext(
- &hCryptProv,
- "J2SE",
- NULL,
- PROV_RSA_FULL,
- CRYPT_NEWKEYSET) == FALSE)
+ if (::CryptAcquireContext(&hCryptProv, "J2SE", NULL,
+ PROV_RSA_FULL, CRYPT_NEWKEYSET) == FALSE)
{
ThrowException(env, KEYSTORE_EXCEPTION, GetLastError());
__leave;
@@ -1411,10 +1437,10 @@
}
// Import the certificate's public key into the key container
- if (!(::CryptImportPublicKeyInfo(hCryptProv, X509_ASN_ENCODING,
- &(((PCCERT_CONTEXT) pCertContext)->pCertInfo->SubjectPublicKeyInfo),
- &hKey))) {
-
+ if (::CryptImportPublicKeyInfo(hCryptProv, X509_ASN_ENCODING,
+ &(((PCCERT_CONTEXT) pCertContext)->pCertInfo->SubjectPublicKeyInfo),
+ &hKey) == FALSE)
+ {
ThrowException(env, KEY_EXCEPTION, GetLastError());
__leave;
}
@@ -1425,7 +1451,7 @@
//--------------------------------------------------------------------
// Clean up.
- if (hCryptProv)
+ if (bCallerFreeProv == TRUE && hCryptProv != NULL)
::CryptReleaseContext(hCryptProv, 0);
}
--- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Key.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Key.java Fri Aug 26 10:14:15 2016 -0700
@@ -340,25 +340,33 @@
} else {
switch (algorithm) {
case "RSA":
- // XXX better test for RSA CRT keys (single getAttributes() call)
- // we need to determine whether this is a CRT key
- // see if we can obtain the public exponent
- // this should also be readable for sensitive/extractable keys
+ // In order to decide if this is RSA CRT key, we first query
+ // and see if all extra CRT attributes are available.
CK_ATTRIBUTE[] attrs2 = new CK_ATTRIBUTE[] {
new CK_ATTRIBUTE(CKA_PUBLIC_EXPONENT),
+ new CK_ATTRIBUTE(CKA_PRIME_1),
+ new CK_ATTRIBUTE(CKA_PRIME_2),
+ new CK_ATTRIBUTE(CKA_EXPONENT_1),
+ new CK_ATTRIBUTE(CKA_EXPONENT_2),
+ new CK_ATTRIBUTE(CKA_COEFFICIENT),
};
boolean crtKey;
try {
session.token.p11.C_GetAttributeValue
(session.id(), keyID, attrs2);
- crtKey = (attrs2[0].pValue instanceof byte[]);
+ crtKey = ((attrs2[0].pValue instanceof byte[]) &&
+ (attrs2[1].pValue instanceof byte[]) &&
+ (attrs2[2].pValue instanceof byte[]) &&
+ (attrs2[3].pValue instanceof byte[]) &&
+ (attrs2[4].pValue instanceof byte[]) &&
+ (attrs2[5].pValue instanceof byte[])) ;
} catch (PKCS11Exception e) {
// ignore, assume not available
crtKey = false;
}
if (crtKey) {
return new P11RSAPrivateKey
- (session, keyID, algorithm, keyLength, attributes);
+ (session, keyID, algorithm, keyLength, attributes, attrs2);
} else {
return new P11RSAPrivateNonCRTKey
(session, keyID, algorithm, keyLength, attributes);
@@ -475,8 +483,24 @@
private BigInteger n, e, d, p, q, pe, qe, coeff;
private byte[] encoded;
P11RSAPrivateKey(Session session, long keyID, String algorithm,
- int keyLength, CK_ATTRIBUTE[] attributes) {
- super(PRIVATE, session, keyID, algorithm, keyLength, attributes);
+ int keyLength, CK_ATTRIBUTE[] attrs, CK_ATTRIBUTE[] crtAttrs) {
+ super(PRIVATE, session, keyID, algorithm, keyLength, attrs);
+
+ for (CK_ATTRIBUTE a : crtAttrs) {
+ if (a.type == CKA_PUBLIC_EXPONENT) {
+ e = a.getBigInteger();
+ } else if (a.type == CKA_PRIME_1) {
+ p = a.getBigInteger();
+ } else if (a.type == CKA_PRIME_2) {
+ q = a.getBigInteger();
+ } else if (a.type == CKA_EXPONENT_1) {
+ pe = a.getBigInteger();
+ } else if (a.type == CKA_EXPONENT_2) {
+ qe = a.getBigInteger();
+ } else if (a.type == CKA_COEFFICIENT) {
+ coeff = a.getBigInteger();
+ }
+ }
}
private synchronized void fetchValues() {
token.ensureValid();
@@ -485,24 +509,13 @@
}
CK_ATTRIBUTE[] attributes = new CK_ATTRIBUTE[] {
new CK_ATTRIBUTE(CKA_MODULUS),
- new CK_ATTRIBUTE(CKA_PUBLIC_EXPONENT),
new CK_ATTRIBUTE(CKA_PRIVATE_EXPONENT),
- new CK_ATTRIBUTE(CKA_PRIME_1),
- new CK_ATTRIBUTE(CKA_PRIME_2),
- new CK_ATTRIBUTE(CKA_EXPONENT_1),
- new CK_ATTRIBUTE(CKA_EXPONENT_2),
- new CK_ATTRIBUTE(CKA_COEFFICIENT),
};
fetchAttributes(attributes);
n = attributes[0].getBigInteger();
- e = attributes[1].getBigInteger();
- d = attributes[2].getBigInteger();
- p = attributes[3].getBigInteger();
- q = attributes[4].getBigInteger();
- pe = attributes[5].getBigInteger();
- qe = attributes[6].getBigInteger();
- coeff = attributes[7].getBigInteger();
+ d = attributes[1].getBigInteger();
}
+
public String getFormat() {
token.ensureValid();
return "PKCS#8";
@@ -529,7 +542,6 @@
return n;
}
public BigInteger getPublicExponent() {
- fetchValues();
return e;
}
public BigInteger getPrivateExponent() {
@@ -537,23 +549,18 @@
return d;
}
public BigInteger getPrimeP() {
- fetchValues();
return p;
}
public BigInteger getPrimeQ() {
- fetchValues();
return q;
}
public BigInteger getPrimeExponentP() {
- fetchValues();
return pe;
}
public BigInteger getPrimeExponentQ() {
- fetchValues();
return qe;
}
public BigInteger getCrtCoefficient() {
- fetchValues();
return coeff;
}
}
--- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11RSACipher.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11RSACipher.java Fri Aug 26 10:14:15 2016 -0700
@@ -358,7 +358,9 @@
System.arraycopy(buffer, 0, tmpBuffer, 0, bufOfs);
tmpBuffer = p11.C_Sign(session.id(), tmpBuffer);
if (tmpBuffer.length > outLen) {
- throw new BadPaddingException("Output buffer too small");
+ throw new BadPaddingException(
+ "Output buffer (" + outLen + ") is too small to " +
+ "hold the produced data (" + tmpBuffer.length + ")");
}
System.arraycopy(tmpBuffer, 0, out, outOfs, tmpBuffer.length);
n = tmpBuffer.length;
--- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/SunPKCS11.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/SunPKCS11.java Fri Aug 26 10:14:15 2016 -0700
@@ -44,6 +44,7 @@
import sun.security.util.Debug;
import sun.security.util.ResourcesMgr;
+import static sun.security.util.SecurityConstants.PROVIDER_VER;
import sun.security.pkcs11.Secmod.*;
@@ -89,7 +90,8 @@
}
public SunPKCS11() {
- super("SunPKCS11", 9.0d, "Unconfigured and unusable PKCS11 provider");
+ super("SunPKCS11", PROVIDER_VER,
+ "Unconfigured and unusable PKCS11 provider");
p11 = null;
config = null;
slotID = 0;
@@ -132,7 +134,7 @@
// Used by Secmod
SunPKCS11(Config c) {
- super("SunPKCS11-" + c.getName(), 9.0d, c.getDescription());
+ super("SunPKCS11-" + c.getName(), PROVIDER_VER, c.getDescription());
this.config = c;
if (debug != null) {
@@ -816,6 +818,7 @@
}
final TokenPoller poller = new TokenPoller(this);
Thread t = new Thread(null, poller, "Poller " + getName(), 0, false);
+ t.setContextClassLoader(null);
t.setDaemon(true);
t.setPriority(Thread.MIN_PRIORITY);
t.start();
--- a/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/UcryptoProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/UcryptoProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -30,6 +30,8 @@
import java.lang.reflect.Constructor;
import java.util.*;
import java.security.*;
+import static sun.security.util.SecurityConstants.PROVIDER_VER;
+
/**
* OracleUcrypto provider main class.
@@ -196,7 +198,7 @@
}
public UcryptoProvider() {
- super("OracleUcrypto", 9.0d, "Provider using Oracle Ucrypto API");
+ super("OracleUcrypto", PROVIDER_VER, "Provider using Oracle Ucrypto API");
AccessController.doPrivileged(new PrivilegedAction<>() {
public Void run() {
--- a/jdk/src/jdk.internal.opt/share/classes/module-info.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/jdk.internal.opt/share/classes/module-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -24,5 +24,5 @@
*/
module jdk.internal.opt {
- exports jdk.internal.joptsimple to jdk.jlink;
+ exports jdk.internal.joptsimple to jdk.jlink, jdk.jshell;
}
--- a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties Fri Aug 26 10:14:15 2016 -0700
@@ -68,15 +68,15 @@
error.versioned.info.name.notequal=\
module-info.class in a versioned directory contains incorrect name
error.versioned.info.requires.public=\
- module-info.class in a versioned directory contains additional requires public
+ module-info.class in a versioned directory contains additional "requires public"
error.versioned.info.requires.added=\
- module-info.class in a versioned directory contains additional requires
+ module-info.class in a versioned directory contains additional "requires"
error.versioned.info.requires.dropped=\
- module-info.class in a versioned directory contains missing requires
+ module-info.class in a versioned directory contains missing "requires"
error.versioned.info.exports.notequal=\
- module-info.class in a versioned directory contains different exports
+ module-info.class in a versioned directory contains different "exports"
error.versioned.info.provides.notequal=\
- module-info.class in a versioned directory contains different provides
+ module-info.class in a versioned directory contains different "provides"
error.invalid.versioned.module.attribute=\
Invalid module descriptor attribute {0}
error.missing.provider=\
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginStack.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginStack.java Fri Aug 26 10:14:15 2016 -0700
@@ -172,7 +172,7 @@
private final Plugin lastSorter;
private final List<Plugin> plugins = new ArrayList<>();
private final List<ResourcePrevisitor> resourcePrevisitors = new ArrayList<>();
-
+ private final boolean validate;
public ImagePluginStack() {
this(null, Collections.emptyList(), null);
@@ -181,6 +181,13 @@
public ImagePluginStack(ImageBuilder imageBuilder,
List<Plugin> plugins,
Plugin lastSorter) {
+ this(imageBuilder, plugins, lastSorter, true);
+ }
+
+ public ImagePluginStack(ImageBuilder imageBuilder,
+ List<Plugin> plugins,
+ Plugin lastSorter,
+ boolean validate) {
this.imageBuilder = Objects.requireNonNull(imageBuilder);
this.lastSorter = lastSorter;
this.plugins.addAll(Objects.requireNonNull(plugins));
@@ -190,6 +197,7 @@
resourcePrevisitors.add((ResourcePrevisitor) p);
}
});
+ this.validate = validate;
}
public void operate(ImageProvider provider) throws Exception {
@@ -268,6 +276,7 @@
frozenOrder = ((OrderedResourcePoolManager.OrderedResourcePool)resPool).getOrderedList();
}
}
+
return resPool;
}
@@ -458,7 +467,11 @@
throws Exception {
Objects.requireNonNull(original);
Objects.requireNonNull(transformed);
- imageBuilder.storeFiles(new LastPoolManager(transformed).resourcePool());
+ ResourcePool lastPool = new LastPoolManager(transformed).resourcePool();
+ if (validate) {
+ ResourcePoolConfiguration.validate(lastPool);
+ }
+ imageBuilder.storeFiles(lastPool);
}
public ExecutableImage getExecutableImage() throws IOException {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ResourcePoolConfiguration.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,128 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.tools.jlink.internal;
+
+import java.lang.module.Configuration;
+import java.lang.module.ModuleDescriptor;
+import java.lang.module.ModuleFinder;
+import java.lang.module.ModuleReference;
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.nio.ByteBuffer;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+import jdk.tools.jlink.plugin.PluginException;
+import jdk.tools.jlink.plugin.ResourcePool;
+import jdk.tools.jlink.plugin.ResourcePoolEntry;
+import jdk.tools.jlink.plugin.ResourcePoolModule;
+
+final class ResourcePoolConfiguration {
+ private ResourcePoolConfiguration() {}
+
+ private static ModuleDescriptor descriptorOf(ResourcePoolModule mod) {
+ ModuleDescriptor md = mod.descriptor();
+
+ // drop hashes
+ ModuleDescriptor.Builder builder = new ModuleDescriptor.Builder(md.name());
+ md.requires().stream()
+ .forEach(builder::requires);
+ md.exports().stream()
+ .forEach(builder::exports);
+ md.uses().stream()
+ .forEach(builder::uses);
+ md.provides().values().stream()
+ .forEach(builder::provides);
+
+ // build the proper concealed packages
+ Set<String> exps = md.exports().stream()
+ .map(ModuleDescriptor.Exports::source)
+ .collect(Collectors.toSet());
+
+ mod.packages().stream()
+ .filter(pn -> !exps.contains(pn))
+ .forEach(builder::conceals);
+
+ md.version().ifPresent(builder::version);
+ md.mainClass().ifPresent(builder::mainClass);
+ md.osName().ifPresent(builder::osName);
+ md.osArch().ifPresent(builder::osArch);
+ md.osVersion().ifPresent(builder::osVersion);
+
+ return builder.build();
+ }
+
+ private static ModuleReference moduleReference(ModuleDescriptor desc) {
+ return new ModuleReference(desc, null, () -> {
+ IOException ioe = new IOException("<module reader unsupported>");
+ throw new UncheckedIOException(ioe);
+ });
+ }
+
+ private static Map<String, ModuleReference> allModRefs(ResourcePool pool) {
+ return pool.moduleView().modules().
+ collect(Collectors.toMap(ResourcePoolModule::name,
+ m -> moduleReference(descriptorOf(m))));
+ }
+
+ private static void checkPackages(ResourcePool pool) {
+ // check that each resource pool module's packages()
+ // returns a set that is consistent with the module
+ // descriptor of that module.
+
+ pool.moduleView().modules().forEach(m -> {
+ ModuleDescriptor desc = m.descriptor();
+ if (!desc.packages().equals(m.packages())) {
+ throw new RuntimeException("Module " + m.name() +
+ "'s descriptor returns inconsistent package set");
+ }
+ });
+ }
+
+ static Configuration validate(ResourcePool pool) {
+ checkPackages(pool);
+ final Map<String, ModuleReference> nameToModRef = allModRefs(pool);
+ final Set<ModuleReference> allRefs = new HashSet<>(nameToModRef.values());
+
+ final ModuleFinder finder = new ModuleFinder() {
+ @Override
+ public Optional<ModuleReference> find(String name) {
+ return Optional.ofNullable(nameToModRef.get(name));
+ }
+
+ @Override
+ public Set<ModuleReference> findAll() {
+ return allRefs;
+ }
+ };
+
+ return Configuration.empty().resolveRequires(
+ finder, ModuleFinder.of(), nameToModRef.keySet());
+ }
+}
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java Fri Aug 26 10:14:15 2016 -0700
@@ -48,14 +48,12 @@
private static final String NAME = "generate-jli-classes";
private static final String BMH_PARAM = "bmh";
-
private static final String BMH_SPECIES_PARAM = "bmh-species";
- private static final String DMH_PARAM = "dmh";
-
private static final String DESCRIPTION = PluginsResourceBundle.getDescription(NAME);
- private static final String DIRECT_METHOD_HANDLE = "java/lang/invoke/DirectMethodHandle$Holder";
+ private static final String DMH_PARAM = "dmh";
+ private static final String DIRECT_HOLDER = "java/lang/invoke/DirectMethodHandle$Holder";
private static final String DMH_INVOKE_VIRTUAL = "invokeVirtual";
private static final String DMH_INVOKE_STATIC = "invokeStatic";
private static final String DMH_INVOKE_SPECIAL = "invokeSpecial";
@@ -63,15 +61,22 @@
private static final String DMH_INVOKE_INTERFACE = "invokeInterface";
private static final String DMH_INVOKE_STATIC_INIT = "invokeStaticInit";
- private static final String DELEGATING_METHOD_HANDLE = "java/lang/invoke/DelegatingMethodHandle$Holder";
+ private static final String INVOKERS_PARAM = "invokers";
+
+ private static final String DELEGATING_HOLDER = "java/lang/invoke/DelegatingMethodHandle$Holder";
+ private static final String BASIC_FORMS_HOLDER = "java/lang/invoke/LambdaForm$Holder";
+ private static final String INVOKERS_HOLDER = "java/lang/invoke/Invokers$Holder";
private static final JavaLangInvokeAccess JLIA
= SharedSecrets.getJavaLangInvokeAccess();
List<String> speciesTypes;
+ List<String> invokerTypes;
+
Map<String, List<String>> dmhMethods;
+
public GenerateJLIClassesPlugin() {
}
@@ -115,6 +120,13 @@
}
/**
+ * @return the default invoker forms to generate.
+ */
+ public static List<String> defaultInvokers() {
+ return List.of("_L", "_I", "I_I", "LI_I", "ILL_I", "LIL_I", "L_L", "LL_V", "LLLL_L");
+ }
+
+ /**
* @return the list of default DirectMethodHandle methods to generate.
*/
public static Map<String, List<String>> defaultDMHMethods() {
@@ -151,6 +163,7 @@
// Enable by default
boolean bmhEnabled = true;
boolean dmhEnabled = true;
+ boolean invokersEnabled = true;
if (mainArgument != null) {
List<String> args = Arrays.asList(mainArgument.split(","));
if (!args.contains(BMH_PARAM)) {
@@ -159,6 +172,9 @@
if (!args.contains(DMH_PARAM)) {
dmhEnabled = false;
}
+ if (!args.contains(INVOKERS_PARAM)) {
+ dmhEnabled = false;
+ }
}
if (!bmhEnabled) {
@@ -181,6 +197,21 @@
.collect(Collectors.toList());
}
+ if (!invokersEnabled) {
+ invokerTypes = List.of();
+ } else {
+ String args = config.get(INVOKERS_PARAM);
+ if (args != null && !args.isEmpty()) {
+ invokerTypes = Arrays.stream(args.split(","))
+ .map(String::trim)
+ .filter(s -> !s.isEmpty())
+ .collect(Collectors.toList());
+ validateMethodTypes(invokerTypes);
+ } else {
+ invokerTypes = defaultInvokers();
+ }
+
+ }
// DirectMethodHandles
if (!dmhEnabled) {
dmhMethods = Map.of();
@@ -194,18 +225,7 @@
.filter(s -> !s.isEmpty())
.collect(Collectors.toList());
dmhMethods.put(dmhParam, dmhMethodTypes);
- // Validation check
- for (String type : dmhMethodTypes) {
- String[] typeParts = type.split("_");
- // check return type (second part)
- if (typeParts.length != 2 || typeParts[1].length() != 1
- || "LJIFDV".indexOf(typeParts[1].charAt(0)) == -1) {
- throw new PluginException(
- "Method type signature must be of form [LJIFD]*_[LJIFDV]");
- }
- // expand and check arguments (first part)
- expandSignature(typeParts[0]);
- }
+ validateMethodTypes(dmhMethodTypes);
}
}
if (dmhMethods.isEmpty()) {
@@ -214,6 +234,20 @@
}
}
+ void validateMethodTypes(List<String> dmhMethodTypes) {
+ for (String type : dmhMethodTypes) {
+ String[] typeParts = type.split("_");
+ // check return type (second part)
+ if (typeParts.length != 2 || typeParts[1].length() != 1
+ || "LJIFDV".indexOf(typeParts[1].charAt(0)) == -1) {
+ throw new PluginException(
+ "Method type signature must be of form [LJIFD]*_[LJIFDV]");
+ }
+ // expand and check arguments (first part)
+ expandSignature(typeParts[0]);
+ }
+ }
+
private static void requireBasicType(char c) {
if ("LIJFD".indexOf(c) < 0) {
throw new PluginException(
@@ -226,15 +260,17 @@
// Copy all but DMH_ENTRY to out
in.transformAndCopy(entry -> {
// filter out placeholder entries
- if (entry.path().equals(DIRECT_METHOD_HANDLE_ENTRY) ||
- entry.path().equals(DELEGATING_METHOD_HANDLE_ENTRY)) {
+ if (entry.path().equals(DIRECT_METHOD_HOLDER_ENTRY) ||
+ entry.path().equals(DELEGATING_METHOD_HOLDER_ENTRY) ||
+ entry.path().equals(INVOKERS_HOLDER_ENTRY) ||
+ entry.path().equals(BASIC_FORMS_HOLDER_ENTRY)) {
return null;
} else {
return entry;
}
}, out);
speciesTypes.forEach(types -> generateBMHClass(types, out));
- generateDMHClass(out);
+ generateHolderClasses(out);
return out.build();
}
@@ -257,41 +293,58 @@
}
}
- private void generateDMHClass(ResourcePoolBuilder out) {
+ private void generateHolderClasses(ResourcePoolBuilder out) {
int count = 0;
for (List<String> entry : dmhMethods.values()) {
count += entry.size();
}
- MethodType[] methodTypes = new MethodType[count];
+ MethodType[] directMethodTypes = new MethodType[count];
int[] dmhTypes = new int[count];
int index = 0;
for (Map.Entry<String, List<String>> entry : dmhMethods.entrySet()) {
String dmhType = entry.getKey();
for (String type : entry.getValue()) {
- methodTypes[index] = asMethodType(type);
+ directMethodTypes[index] = asMethodType(type);
dmhTypes[index] = DMH_METHOD_TYPE_MAP.get(dmhType);
index++;
}
}
+ MethodType[] invokerMethodTypes = new MethodType[this.invokerTypes.size()];
+ for (int i = 0; i < invokerTypes.size(); i++) {
+ invokerMethodTypes[i] = asMethodType(invokerTypes.get(i));
+ }
try {
byte[] bytes = JLIA.generateDirectMethodHandleHolderClassBytes(
- DIRECT_METHOD_HANDLE, methodTypes, dmhTypes);
+ DIRECT_HOLDER, directMethodTypes, dmhTypes);
ResourcePoolEntry ndata = ResourcePoolEntry
- .create(DIRECT_METHOD_HANDLE_ENTRY, bytes);
+ .create(DIRECT_METHOD_HOLDER_ENTRY, bytes);
out.add(ndata);
bytes = JLIA.generateDelegatingMethodHandleHolderClassBytes(
- DELEGATING_METHOD_HANDLE, methodTypes);
- ndata = ResourcePoolEntry.create(DELEGATING_METHOD_HANDLE_ENTRY, bytes);
+ DELEGATING_HOLDER, directMethodTypes);
+ ndata = ResourcePoolEntry.create(DELEGATING_METHOD_HOLDER_ENTRY, bytes);
+ out.add(ndata);
+
+ bytes = JLIA.generateInvokersHolderClassBytes(INVOKERS_HOLDER,
+ invokerMethodTypes);
+ ndata = ResourcePoolEntry.create(INVOKERS_HOLDER_ENTRY, bytes);
+ out.add(ndata);
+
+ bytes = JLIA.generateBasicFormsClassBytes(BASIC_FORMS_HOLDER);
+ ndata = ResourcePoolEntry.create(BASIC_FORMS_HOLDER_ENTRY, bytes);
out.add(ndata);
} catch (Exception ex) {
throw new PluginException(ex);
}
}
- private static final String DIRECT_METHOD_HANDLE_ENTRY =
- "/java.base/" + DIRECT_METHOD_HANDLE + ".class";
- private static final String DELEGATING_METHOD_HANDLE_ENTRY =
- "/java.base/" + DELEGATING_METHOD_HANDLE + ".class";
+ private static final String DIRECT_METHOD_HOLDER_ENTRY =
+ "/java.base/" + DIRECT_HOLDER + ".class";
+ private static final String DELEGATING_METHOD_HOLDER_ENTRY =
+ "/java.base/" + DELEGATING_HOLDER + ".class";
+ private static final String BASIC_FORMS_HOLDER_ENTRY =
+ "/java.base/" + BASIC_FORMS_HOLDER + ".class";
+ private static final String INVOKERS_HOLDER_ENTRY =
+ "/java.base/" + INVOKERS_HOLDER + ".class";
// Convert LL -> LL, L3 -> LLL
private static String expandSignature(String signature) {
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/plugins.properties Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/plugins.properties Fri Aug 26 10:14:15 2016 -0700
@@ -56,7 +56,7 @@
copy-files.description=\
If files to copy are not absolute path, JDK home dir is used.\n\
-e.g.: jrt-fs.jar,LICENSE,/home/me/myfile.txt=somewehere/conf.txt
+e.g.: jrt-fs.jar,LICENSE,/home/me/myfile.txt=somewhere/conf.txt
exclude-files.argument=<pattern-list> of files to exclude
--- a/jdk/src/jdk.security.auth/share/classes/module-info.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/jdk.security.auth/share/classes/module-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,6 +23,10 @@
* questions.
*/
+/**
+ * Contains the implementation of the javax.security.auth.* interfaces and
+ * various authentication modules.
+ */
module jdk.security.auth {
requires public java.naming;
requires java.security.jgss;
--- a/jdk/src/jdk.security.jgss/share/classes/com/sun/security/sasl/gsskerb/JdkSASL.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/jdk.security.jgss/share/classes/com/sun/security/sasl/gsskerb/JdkSASL.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -30,6 +30,8 @@
import java.security.NoSuchAlgorithmException;
import java.security.InvalidParameterException;
import java.security.ProviderException;
+import static sun.security.util.SecurityConstants.PROVIDER_VER;
+
/**
* The JdkSASL provider class -
@@ -73,7 +75,7 @@
}
public JdkSASL() {
- super("JdkSASL", 9.0d, info);
+ super("JdkSASL", PROVIDER_VER, info);
final Provider p = this;
AccessController.doPrivileged(new PrivilegedAction<Void>() {
--- a/jdk/src/jdk.security.jgss/share/classes/module-info.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/jdk.security.jgss/share/classes/module-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,6 +23,10 @@
* questions.
*/
+/**
+ * Defines Java extensions to the GSS-API and an implementation of the SASL
+ * GSSAPI mechanism.
+ */
module jdk.security.jgss {
requires public java.security.jgss;
requires java.logging;
--- a/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/JarFileSystem.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/JarFileSystem.java Fri Aug 26 10:14:15 2016 -0700
@@ -165,8 +165,8 @@
walk(inode.child, process);
} else {
process.accept(inode);
- walk(inode.sibling, process);
}
+ walk(inode.sibling, process);
}
/**
--- a/jdk/test/ProblemList.txt Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/ProblemList.txt Fri Aug 26 10:14:15 2016 -0700
@@ -124,10 +124,6 @@
# jdk_lang
java/lang/StringCoding/CheckEncodings.sh 7008363 generic-all
-java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessBoolean.java 8160690 generic-all
-java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessByte.java 8160690 generic-all
-java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessChar.java 8160690 generic-all
-java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessShort.java 8160690 generic-all
############################################################################
@@ -211,8 +207,6 @@
java/rmi/transport/dgcDeadLock/DGCDeadLock.java 8029360 macosx-all
-sun/rmi/runtime/Log/6409194/NoConsoleOutput.java 8164124 windows-all
-
############################################################################
# jdk_security
--- a/jdk/test/com/sun/crypto/provider/KeyFactory/TestProviderLeak.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/com/sun/crypto/provider/KeyFactory/TestProviderLeak.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -53,7 +53,20 @@
// or throws out TimeoutException.
private static final int RESERVATION = 3;
// The maximum time, 5 seconds, to wait for each iteration.
- private static final int TIME_OUT = 5;
+ private static final int TIME_OUT;
+ static {
+ int timeout = 5;
+ try {
+ double timeoutFactor = Double.parseDouble(
+ System.getProperty("test.timeout.factor", "1.0"));
+ timeout = (int) (timeout * timeoutFactor);
+ } catch (Exception e) {
+ System.out.println("Warning: " + e);
+ }
+ TIME_OUT = timeout;
+ System.out.println("Timeout for each iteration is "
+ + TIME_OUT + " seconds");
+ }
private static Deque<byte []> eatupMemory() throws Exception {
dumpMemoryStats("Before memory allocation");
--- a/jdk/test/com/sun/net/ssl/SSLSecurity/ProviderTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/com/sun/net/ssl/SSLSecurity/ProviderTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4667976
+ * @bug 4667976 8130181
* @modules java.base/com.sun.net.ssl
* @compile JavaxSSLContextImpl.java ComSSLContextImpl.java
* JavaxTrustManagerFactoryImpl.java ComTrustManagerFactoryImpl.java
@@ -85,7 +85,7 @@
public MyProvider()
{
- super("BRAD", 1.0, info);
+ super("BRAD", "1.0", info);
AccessController.doPrivileged(new java.security.PrivilegedAction() {
public Object run() {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Container/MoveToOtherScreenTest/MoveToOtherScreenTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.swing.JFrame;
+import javax.swing.SwingUtilities;
+import java.awt.Canvas;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.lang.reflect.InvocationTargetException;
+
+
+
+/* @test
+ @bug 8160696
+ @summary IllegalArgumentException: adding a component to a container on a different GraphicsDevice
+ @author Mikhail Cherkasov
+ @run main MoveToOtherScreenTest
+ @key headful
+*/
+public class MoveToOtherScreenTest {
+
+ private static volatile boolean twoDisplays = true;
+ private static final Canvas canvas = new Canvas();
+ private static final Frame[] frms = new JFrame[2];
+
+ public static void main(String[] args) throws InterruptedException, InvocationTargetException {
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ GraphicsEnvironment ge = GraphicsEnvironment.
+ getLocalGraphicsEnvironment();
+ GraphicsDevice[] gds = ge.getScreenDevices();
+ if (gds.length < 2) {
+ System.out.println("Test requires at least 2 displays");
+ twoDisplays = false;
+ return;
+ }
+ for (int i = 0; i < 2; i++) {
+ GraphicsConfiguration conf = gds[i].getConfigurations()[0];
+ JFrame frm = new JFrame("Frame " + i);
+ frm.setLocation(conf.getBounds().x, 0); // On first screen
+ frm.setSize(new Dimension(400, 400));
+ frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ frm.setVisible(true);
+ frms[i] = frm;
+ }
+ canvas.setBackground(Color.red);
+ frms[0].add(canvas);
+ }
+ });
+ if(!twoDisplays){
+ return;
+ }
+ Thread.sleep(200);
+ SwingUtilities.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ frms[1].add(canvas);
+ }
+ });
+ for (Frame frm : frms) {
+ frm.dispose();
+ }
+ }
+}
--- a/jdk/test/java/awt/Modal/ToBack/ToBackModeless5Test.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/awt/Modal/ToBack/ToBackModeless5Test.java Fri Aug 26 10:14:15 2016 -0700
@@ -26,7 +26,7 @@
/*
* @test
* @key headful
- * @bug 8054143
+ * @bug 8054143 8163583
* @summary Check if toBack method works correctly for a modeless dialog
* having a visible Frame constructor.
*
--- a/jdk/test/java/awt/Modal/ToBack/ToBackModeless6Test.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/awt/Modal/ToBack/ToBackModeless6Test.java Fri Aug 26 10:14:15 2016 -0700
@@ -26,7 +26,7 @@
/*
* @test
* @key headful
- * @bug 8054143
+ * @bug 8054143 8163583
* @summary Check if toBack method works correctly for a modeless dialog
* having a visible Dialog constructor.
*
--- a/jdk/test/java/awt/Modal/ToBack/ToBackNonModal5Test.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/awt/Modal/ToBack/ToBackNonModal5Test.java Fri Aug 26 10:14:15 2016 -0700
@@ -25,7 +25,7 @@
/*
* @test
* @key headful
- * @bug 8054143
+ * @bug 8054143 8163583
* @summary Check if toBack method works correctly for a non-modal dialog
* having a visible Frame constructor.
*
--- a/jdk/test/java/awt/Modal/ToBack/ToBackNonModal6Test.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/awt/Modal/ToBack/ToBackNonModal6Test.java Fri Aug 26 10:14:15 2016 -0700
@@ -25,7 +25,7 @@
/*
* @test
* @key headful
- * @bug 8054143
+ * @bug 8054143 8163583
* @summary Check if toBack method works correctly for a non-modal dialog
* having a visible Dialog constructor.
*
--- a/jdk/test/java/awt/TrayIcon/PopupMenuLeakTest/PopupMenuLeakTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/awt/TrayIcon/PopupMenuLeakTest/PopupMenuLeakTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,17 +22,25 @@
*/
/*
- @test
- @key headful
- @bug 8007220
- @summary Reference to the popup leaks after the TrayIcon is removed
- @author Petr Pchelko
+ @test
+ @key headful
+ @bug 8007220 8039081
+ @summary Reference to the popup leaks after the TrayIcon is removed.
+ @requires os.family != "windows"
@library ../../../../lib/testlibrary/
@build ExtendedRobot
@run main/othervm -Xmx50m PopupMenuLeakTest
*/
-import java.awt.*;
+import java.awt.AWTException;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.MenuItem;
+import java.awt.PopupMenu;
+import java.awt.RenderingHints;
+import java.awt.SystemTray;
+import java.awt.TrayIcon;
import javax.swing.SwingUtilities;
import java.awt.image.BufferedImage;
@@ -45,7 +53,6 @@
static final AtomicReference<WeakReference<TrayIcon>> iconWeakReference = new AtomicReference<>();
static final AtomicReference<WeakReference<PopupMenu>> popupWeakReference = new AtomicReference<>();
static ExtendedRobot robot;
-
public static void main(String[] args) throws Exception {
robot = new ExtendedRobot();
SwingUtilities.invokeAndWait(PopupMenuLeakTest::createSystemTrayIcon);
@@ -55,8 +62,8 @@
sleep();
SwingUtilities.invokeAndWait(PopupMenuLeakTest::removeIcon);
sleep();
+ assertCollected(iconWeakReference.get(), "Failed, reference to tray icon not collected");
assertCollected(popupWeakReference.get(), "Failed, reference to popup not collected");
- assertCollected(iconWeakReference.get(), "Failed, reference to tray icon not collected");
}
private static void addNotifyPopup() {
@@ -78,12 +85,17 @@
private static void assertCollected(WeakReference<?> reference, String message) {
java.util.List<byte[]> bytes = new ArrayList<>();
for (int i = 0; i < 5; i ++) {
+ if (reference.get() == null) {
+ // reference is collected, avoid OOMs.
+ break;
+ }
try {
while (true) {
- bytes.add(new byte[1024]);
+ bytes.add(new byte[4096]);
}
} catch (OutOfMemoryError err) {
- bytes = new ArrayList<>();
+ bytes.clear();
+ causeGC();
}
}
if (reference.get() != null) {
@@ -91,6 +103,13 @@
}
}
+ private static void causeGC() {
+ System.gc();
+ System.runFinalization();
+ robot.delay(1000);
+ }
+
+
private static void createSystemTrayIcon() {
final TrayIcon trayIcon = new TrayIcon(createTrayIconImage());
trayIcon.setImageAutoSize(true);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/Introspector/8159696/UnloadClassBeanInfo.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.beans.BeanInfo;
+import java.beans.Introspector;
+import java.beans.MethodDescriptor;
+import java.io.File;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.Arrays;
+
+/**
+ * @test
+ * @bug 8159696
+ * @library /javax/swing/regtesthelpers
+ * @compile ./stub/Stub.java
+ * @run main/othervm -mx32M UnloadClassBeanInfo
+ */
+public class UnloadClassBeanInfo {
+
+ private static URLClassLoader loader;
+
+ public static void main(final String[] args) throws Exception {
+ Class cl = getStub();
+ System.out.println("cl.getClassLoader() = " + cl.getClassLoader());
+ final BeanInfo beanInfo = Introspector.getBeanInfo(cl, Object.class);
+ MethodDescriptor[] mds = beanInfo.getMethodDescriptors();
+ System.out.println("mds = " + Arrays.toString(mds));
+ loader.close();
+ loader=null;
+ cl=null;
+ Util.generateOOME();
+ mds = beanInfo.getMethodDescriptors();
+ System.out.println("mds = " + Arrays.toString(mds));
+ }
+
+ /**
+ * The Stub class is compiled by jtreg, but we want to move it so it is not
+ * on the application classpath. We want to load it through a separate
+ * classloader.
+ */
+ static Class<?> getStub() throws Exception {
+ final String testclasses = System.getProperty("test.classes");
+ final File subdir = new File(testclasses, "stub");
+ subdir.mkdir();
+
+ final Path src = Paths.get(testclasses, "Stub.class");
+ final Path dest = subdir.toPath().resolve("Stub.class");
+ Files.move(src, dest, StandardCopyOption.REPLACE_EXISTING);
+
+ loader = new URLClassLoader(new URL[]{subdir.toURL()});
+ return Class.forName("Stub", true, loader);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/Introspector/8159696/stub/Stub.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+public final class Stub {
+
+ public void test() {
+
+ }
+}
--- a/jdk/test/java/lang/StackWalker/VerifyStackTrace.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/lang/StackWalker/VerifyStackTrace.java Fri Aug 26 10:14:15 2016 -0700
@@ -205,12 +205,13 @@
.replaceAll("java.base@(\\d+\\.){0,3}(\\d+)/", "java.base/")
.replaceAll("/[0-9]+\\.run", "/xxxxxxxx.run")
.replaceAll("/[0-9]+\\.invoke", "/xxxxxxxx.invoke")
- // DMHs may or may not be pre-generated, making frames differ
+ // LFs may or may not be pre-generated, making frames differ
.replaceAll("DirectMethodHandle\\$Holder", "LambdaForm\\$DMH")
- .replaceAll("DMH\\.invoke", "DMH/xxxxxxxx.invoke")
+ .replaceAll("Invokers\\$Holder", "LambdaForm\\$MH")
+ .replaceAll("MH\\.invoke", "MH/xxxxxxxx.invoke")
// invoke frames may or may not have basic method type
// information encoded for diagnostic purposes
- .replaceAll("xx\\.invoke([A-Za-z]*)_[A-Z]+_[A-Z]", "xx.invoke$1")
+ .replaceAll("xx\\.invoke([A-Za-z]*)_[A-Z_]+", "xx.invoke$1")
.replaceAll("\\$[0-9]+", "\\$??");
} else {
return produced;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/invoke/CountedLoopIterationCountsTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ * @bug 8164102
+ * @run main/othervm -ea -esa test.java.lang.invoke.CountedLoopIterationCountsTest
+ */
+
+package test.java.lang.invoke;
+
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodType;
+
+public class CountedLoopIterationCountsTest {
+
+ public static void main(String[] args) throws Throwable {
+ run(1, -10, 0);
+ run(1, 0, 0);
+ run(Integer.MAX_VALUE - 1, Integer.MIN_VALUE + 10, 0);
+ run(Integer.MIN_VALUE, Integer.MIN_VALUE + 4, 4);
+ run(Integer.MAX_VALUE - 2, Integer.MAX_VALUE - 1, 1);
+ run(Integer.MAX_VALUE - 1, 0, 0);
+ run(Integer.MAX_VALUE - 1, 10, 0);
+ run(Integer.MAX_VALUE - 1, -10, 0);
+ run(Integer.MAX_VALUE, Integer.MIN_VALUE + 10, 0);
+ run(Integer.MAX_VALUE - 1, Integer.MAX_VALUE, 1);
+ run(Integer.MAX_VALUE, Integer.MAX_VALUE, 0);
+
+ if (failed) {
+ throw new AssertionError("one or more tests failed");
+ }
+ }
+
+ static boolean failed = false;
+
+ private static void run(int start, int end, int expectedIterations) throws Throwable {
+ System.out.println("run from " + start + " to " + end);
+ MethodHandle loop = MethodHandles.countedLoop(
+ MethodHandles.constant(int.class, start), // iterate from given start (inclusive) ...
+ MethodHandles.constant(int.class, end), // ... to given end (exclusive)
+ MH_m1, // initialise loop variable to -1
+ MH_step); // increment loop counter by one in each iteration
+ // The loop variable's value, and hence the loop result, will be "number of iterations" minus one.
+ int r = (int) loop.invoke();
+ if (r + 1 != expectedIterations) {
+ System.out.println("expected " + expectedIterations + " iterations, but got " + r);
+ failed = true;
+ }
+ }
+
+ static int step(int counter, int stepCount) {
+ return stepCount + 1;
+ }
+
+ static final MethodHandle MH_m1;
+ static final MethodHandle MH_step;
+ static {
+ try {
+ MH_m1 = MethodHandles.constant(int.class, -1);
+ MH_step = MethodHandles.lookup().findStatic(CountedLoopIterationCountsTest.class, "step",
+ MethodType.methodType(int.class, int.class, int.class));
+ } catch (Throwable t) {
+ throw new ExceptionInInitializerError(t);
+ }
+ }
+
+}
--- a/jdk/test/java/lang/reflect/ClassLoaderValue/Driver.java Fri Aug 26 13:11:39 2016 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/**
- * @test
- * @bug 8152115
- * @summary functional and concurrency test for ClassLoaderValue
- * @build java.base/java.lang.reflect.ClassLoaderValueTest
- * @run main Driver
- */
-public class Driver {
- public static void main(String[] args) throws Exception {
- java.lang.reflect.ClassLoaderValueTest.main(args);
- }
-}
--- a/jdk/test/java/lang/reflect/ClassLoaderValue/java.base/java/lang/reflect/ClassLoaderValueTest.java Fri Aug 26 13:11:39 2016 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,249 +0,0 @@
-/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package java.lang.reflect;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * Functional and concurrency test for ClassLoaderValue
- *
- * @author Peter Levart
- */
-public class ClassLoaderValueTest {
-
- @SuppressWarnings("unchecked")
- public static void main(String[] args) throws Exception {
-
- ClassLoaderValue[] clvs = {new ClassLoaderValue<>(),
- new ClassLoaderValue<>()};
-
- ClassLoader[] lds = {ClassLoader.getSystemClassLoader(),
- ClassLoader.getPlatformClassLoader(),
- null /* bootstrap class loader */};
-
- Integer[] keys = new Integer[32];
- for (int i = 0; i < keys.length; i++) {
- keys[i] = i + 128;
- }
-
- try (AutoCloseable cleanup = () -> {
- for (ClassLoaderValue<Integer> clv : clvs) {
- for (ClassLoader ld : lds) {
- clv.removeAll(ld);
- }
- }
- }) {
- // 1st just one sequential pass of single-threaded validation
- // which is easier to debug if it fails...
- for (ClassLoaderValue<Integer> clv : clvs) {
- for (ClassLoader ld : lds) {
- writeValidateOps(clv, ld, keys);
- }
- }
- for (ClassLoaderValue<Integer> clv : clvs) {
- for (ClassLoader ld : lds) {
- readValidateOps(clv, ld, keys);
- }
- }
-
- // 2nd the same in concurrent setting that also validates
- // failure-isolation between threads and data-isolation between
- // regions - (ClassLoader, ClassLoaderValue) pairs - of the storage
- testConcurrentIsolation(clvs, lds, keys, TimeUnit.SECONDS.toMillis(3));
- }
- }
-
- static void writeValidateOps(ClassLoaderValue<Integer> clv,
- ClassLoader ld,
- Object[] keys) {
- for (int i = 0; i < keys.length; i++) {
- Object k = keys[i];
- Integer v1 = i;
- Integer v2 = i + 333;
- Integer pv;
- boolean success;
-
- pv = clv.sub(k).putIfAbsent(ld, v1);
- assertEquals(pv, null);
- assertEquals(clv.sub(k).get(ld), v1);
-
- pv = clv.sub(k).putIfAbsent(ld, v2);
- assertEquals(pv, v1);
- assertEquals(clv.sub(k).get(ld), v1);
-
- success = clv.sub(k).remove(ld, v2);
- assertEquals(success, false);
- assertEquals(clv.sub(k).get(ld), v1);
-
- success = clv.sub(k).remove(ld, v1);
- assertEquals(success, true);
- assertEquals(clv.sub(k).get(ld), null);
-
- pv = clv.sub(k).putIfAbsent(ld, v2);
- assertEquals(pv, null);
- assertEquals(clv.sub(k).get(ld), v2);
-
- pv = clv.sub(k).computeIfAbsent(ld, (_ld, _clv) -> v1);
- assertEquals(pv, v2);
- assertEquals(clv.sub(k).get(ld), v2);
-
- success = clv.sub(k).remove(ld, v1);
- assertEquals(success, false);
- assertEquals(clv.sub(k).get(ld), v2);
-
- success = clv.sub(k).remove(ld, v2);
- assertEquals(success, true);
- assertEquals(clv.sub(k).get(ld), null);
-
- pv = clv.sub(k).computeIfAbsent(ld, (_ld, clv_k) -> {
- try {
- // nested get for same key should throw
- clv_k.get(_ld);
- throw new AssertionError("Unexpected code path");
- } catch (IllegalStateException e) {
- // expected
- }
- try {
- // nested putIfAbsent for same key should throw
- clv_k.putIfAbsent(_ld, v1);
- throw new AssertionError("Unexpected code path");
- } catch (IllegalStateException e) {
- // expected
- }
- // nested remove for for same key and any value (even null)
- // should return false
- assertEquals(clv_k.remove(_ld, null), false);
- assertEquals(clv_k.remove(_ld, v1), false);
- assertEquals(clv_k.remove(_ld, v2), false);
- try {
- // nested computeIfAbsent for same key should throw
- clv_k.computeIfAbsent(_ld, (__ld, _clv_k) -> v1);
- throw new AssertionError("Unexpected code path");
- } catch (IllegalStateException e) {
- // expected
- }
- // if everything above has been handled, we should succeed...
- return v2;
- });
- // ... and the result should be reflected in the CLV
- assertEquals(pv, v2);
- assertEquals(clv.sub(k).get(ld), v2);
-
- success = clv.sub(k).remove(ld, v2);
- assertEquals(success, true);
- assertEquals(clv.sub(k).get(ld), null);
-
- try {
- clv.sub(k).computeIfAbsent(ld, (_ld, clv_k) -> {
- throw new UnsupportedOperationException();
- });
- throw new AssertionError("Unexpected code path");
- } catch (UnsupportedOperationException e) {
- // expected
- }
- assertEquals(clv.sub(k).get(ld), null);
- }
- }
-
- static void readValidateOps(ClassLoaderValue<Integer> clv,
- ClassLoader ld,
- Object[] keys) {
- for (int i = 0; i < keys.length; i++) {
- Object k = keys[i];
- Integer v1 = i;
- Integer v2 = i + 333;
- Integer rv = clv.sub(k).get(ld);
- if (!(rv == null || rv.equals(v1) || rv.equals(v2))) {
- throw new AssertionError("Unexpected value: " + rv +
- ", expected one of: null, " + v1 + ", " + v2);
- }
- }
- }
-
- static void testConcurrentIsolation(ClassLoaderValue<Integer>[] clvs,
- ClassLoader[] lds,
- Object[] keys,
- long millisRuntime) {
- ExecutorService exe = Executors.newCachedThreadPool();
- List<Future<?>> futures = new ArrayList<>();
- AtomicBoolean stop = new AtomicBoolean();
- for (ClassLoaderValue<Integer> clv : clvs) {
- for (ClassLoader ld : lds) {
- // submit a task that exercises a mix of modifying
- // and reading-validating operations in an isolated
- // part of the storage. If isolation is violated,
- // validation operations are expected to fail.
- futures.add(exe.submit(() -> {
- do {
- writeValidateOps(clv, ld, keys);
- } while (!stop.get());
- }));
- // submit a task that just reads from the same part of
- // the storage as above task. It should not disturb
- // above task in any way and this task should never
- // exhibit any failure although above task produces
- // regular failures during lazy computation
- futures.add(exe.submit(() -> {
- do {
- readValidateOps(clv, ld, keys);
- } while (!stop.get());
- }));
- }
- }
- // wait for some time
- try {
- Thread.sleep(millisRuntime);
- } catch (InterruptedException e) {
- throw new AssertionError(e);
- }
- // stop tasks
- stop.set(true);
- // collect results
- AssertionError error = null;
- for (Future<?> future : futures) {
- try {
- future.get();
- } catch (InterruptedException | ExecutionException e) {
- if (error == null) error = new AssertionError("Failure");
- error.addSuppressed(e);
- }
- }
- exe.shutdown();
- if (error != null) throw error;
- }
-
- static void assertEquals(Object actual, Object expected) {
- if (!Objects.equals(actual, expected)) {
- throw new AssertionError("Expected: " + expected + ", actual: " + actual);
- }
- }
-}
--- a/jdk/test/java/net/MulticastSocket/NoLoopbackPackets.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/net/MulticastSocket/NoLoopbackPackets.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -68,6 +68,7 @@
MulticastSocket msock = null;
List<SocketAddress> failedGroups = new ArrayList<SocketAddress>();
+ Sender sender = null;
try {
msock = new MulticastSocket();
int port = msock.getLocalPort();
@@ -80,9 +81,8 @@
groups.add(new InetSocketAddress(InetAddress.getByName("::ffff:224.1.1.2"), port));
groups.add(new InetSocketAddress(InetAddress.getByName("ff02::1:1"), port));
- Thread sender = new Thread(new Sender(groups));
- sender.setDaemon(true); // we want sender to stop when main thread exits
- sender.start();
+ sender = new Sender(groups);
+ new Thread(sender).start();
// Now try to receive multicast packets. we should not see any of them
// since we disable loopback mode.
@@ -107,6 +107,9 @@
}
} finally {
if (msock != null) try { msock.close(); } catch (Exception e) {}
+ if (sender != null) {
+ sender.stop();
+ }
}
if (failedGroups.size() > 0) {
@@ -119,6 +122,7 @@
static class Sender implements Runnable {
private List<SocketAddress> sendToGroups;
+ private volatile boolean stop;
public Sender(List<SocketAddress> groups) {
sendToGroups = groups;
@@ -136,7 +140,7 @@
MulticastSocket msock = new MulticastSocket();
msock.setLoopbackMode(true); // disable loopback mode
- for (;;) {
+ while (!stop) {
for (DatagramPacket packet : packets) {
msock.send(packet);
}
@@ -147,5 +151,9 @@
throw new RuntimeException(e);
}
}
+
+ void stop() {
+ stop = true;
+ }
}
}
--- a/jdk/test/java/nio/channels/AsynchronousChannelGroup/Basic.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/nio/channels/AsynchronousChannelGroup/Basic.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -119,19 +119,31 @@
ExecutorService pool = Executors.newCachedThreadPool();
AsynchronousChannelGroup group = AsynchronousChannelGroup
.withCachedThreadPool(pool, rand.nextInt(10));
- testShutdownWithChannels(pool, group);
+ try {
+ testShutdownWithChannels(pool, group);
+ } finally {
+ group.shutdown();
+ }
}
for (int i = 0; i < 100; i++) {
int nThreads = 1 + rand.nextInt(8);
AsynchronousChannelGroup group = AsynchronousChannelGroup
.withFixedThreadPool(nThreads, threadFactory);
- testShutdownWithChannels(null, group);
+ try {
+ testShutdownWithChannels(null, group);
+ } finally {
+ group.shutdown();
+ }
}
for (int i = 0; i < 100; i++) {
ExecutorService pool = Executors.newCachedThreadPool();
AsynchronousChannelGroup group = AsynchronousChannelGroup
.withThreadPool(pool);
- testShutdownWithChannels(pool, group);
+ try {
+ testShutdownWithChannels(pool, group);
+ } finally {
+ group.shutdown();
+ }
}
}
@@ -164,19 +176,31 @@
ExecutorService pool = pool = Executors.newCachedThreadPool();
AsynchronousChannelGroup group = AsynchronousChannelGroup
.withCachedThreadPool(pool, rand.nextInt(5));
- testShutdownNow(pool, group);
+ try {
+ testShutdownNow(pool, group);
+ } finally {
+ group.shutdown();
+ }
}
for (int i = 0; i < 10; i++) {
int nThreads = 1 + rand.nextInt(8);
AsynchronousChannelGroup group = AsynchronousChannelGroup
.withFixedThreadPool(nThreads, threadFactory);
- testShutdownNow(null, group);
+ try {
+ testShutdownNow(null, group);
+ } finally {
+ group.shutdown();
+ }
}
for (int i = 0; i < 10; i++) {
ExecutorService pool = Executors.newCachedThreadPool();
AsynchronousChannelGroup group = AsynchronousChannelGroup
.withThreadPool(pool);
- testShutdownNow(pool, group);
+ try {
+ testShutdownNow(pool, group);
+ } finally {
+ group.shutdown();
+ }
}
}
@@ -186,78 +210,78 @@
AsynchronousChannelGroup group =
AsynchronousChannelGroup.withFixedThreadPool(1, threadFactory);
- AsynchronousSocketChannel ch = AsynchronousSocketChannel.open(group);
- AsynchronousServerSocketChannel listener = AsynchronousServerSocketChannel.open(group);
+ try (AsynchronousSocketChannel ch = AsynchronousSocketChannel.open(group);
+ AsynchronousServerSocketChannel listener =
+ AsynchronousServerSocketChannel.open(group)) {
- // initiate accept
- listener.bind(new InetSocketAddress(0));
- Future<AsynchronousSocketChannel> result = listener.accept();
-
- // shutdown group
- group.shutdown();
- if (!group.isShutdown())
- throw new RuntimeException("Group should be shutdown");
+ // initiate accept
+ listener.bind(new InetSocketAddress(0));
+ Future<AsynchronousSocketChannel> result = listener.accept();
- // attempt to create another channel
- try {
- AsynchronousSocketChannel.open(group);
- throw new RuntimeException("ShutdownChannelGroupException expected");
- } catch (ShutdownChannelGroupException x) {
- }
- try {
- AsynchronousServerSocketChannel.open(group);
- throw new RuntimeException("ShutdownChannelGroupException expected");
- } catch (ShutdownChannelGroupException x) {
- }
+ // shutdown group
+ group.shutdown();
+ if (!group.isShutdown())
+ throw new RuntimeException("Group should be shutdown");
+
+ // attempt to create another channel
+ try {
+ AsynchronousSocketChannel.open(group);
+ throw new RuntimeException("ShutdownChannelGroupException expected");
+ } catch (ShutdownChannelGroupException x) {
+ }
+ try {
+ AsynchronousServerSocketChannel.open(group);
+ throw new RuntimeException("ShutdownChannelGroupException expected");
+ } catch (ShutdownChannelGroupException x) {
+ }
- // attempt to create another channel by connecting. This should cause
- // the accept operation to fail.
- InetAddress lh = InetAddress.getLocalHost();
- int port = ((InetSocketAddress)listener.getLocalAddress()).getPort();
- InetSocketAddress isa = new InetSocketAddress(lh, port);
- ch.connect(isa).get();
- try {
- result.get();
- throw new RuntimeException("Connection was accepted");
- } catch (ExecutionException x) {
- Throwable cause = x.getCause();
- if (!(cause instanceof IOException))
- throw new RuntimeException("Cause should be IOException");
- cause = cause.getCause();
- if (!(cause instanceof ShutdownChannelGroupException))
- throw new RuntimeException("IOException cause should be ShutdownChannelGroupException");
- }
+ // attempt to create another channel by connecting. This should cause
+ // the accept operation to fail.
+ InetAddress lh = InetAddress.getLocalHost();
+ int port = ((InetSocketAddress)listener.getLocalAddress()).getPort();
+ InetSocketAddress isa = new InetSocketAddress(lh, port);
+ ch.connect(isa).get();
+ try {
+ result.get();
+ throw new RuntimeException("Connection was accepted");
+ } catch (ExecutionException x) {
+ Throwable cause = x.getCause();
+ if (!(cause instanceof IOException))
+ throw new RuntimeException("Cause should be IOException");
+ cause = cause.getCause();
+ if (!(cause instanceof ShutdownChannelGroupException))
+ throw new RuntimeException("IOException cause should be ShutdownChannelGroupException");
+ }
- // initiate another accept even though channel group is shutdown.
- Future<AsynchronousSocketChannel> res = listener.accept();
- try {
- res.get(3, TimeUnit.SECONDS);
- throw new RuntimeException("TimeoutException expected");
- } catch (TimeoutException x) {
+ // initiate another accept even though channel group is shutdown.
+ Future<AsynchronousSocketChannel> res = listener.accept();
+ try {
+ res.get(3, TimeUnit.SECONDS);
+ throw new RuntimeException("TimeoutException expected");
+ } catch (TimeoutException x) {
+ }
+ // connect to the listener which should cause the accept to complete
+ AsynchronousSocketChannel.open().connect(isa);
+ try {
+ res.get();
+ throw new RuntimeException("Connection was accepted");
+ } catch (ExecutionException x) {
+ Throwable cause = x.getCause();
+ if (!(cause instanceof IOException))
+ throw new RuntimeException("Cause should be IOException");
+ cause = cause.getCause();
+ if (!(cause instanceof ShutdownChannelGroupException))
+ throw new RuntimeException("IOException cause should be ShutdownChannelGroupException");
+ }
+
+ // group should *not* terminate as channels are open
+ boolean terminated = group.awaitTermination(3, TimeUnit.SECONDS);
+ if (terminated) {
+ throw new RuntimeException("Group should not have terminated");
+ }
+ } finally {
+ group.shutdown();
}
- // connect to the listener which should cause the accept to complete
- AsynchronousSocketChannel.open().connect(isa);
- try {
- res.get();
- throw new RuntimeException("Connection was accepted");
- } catch (ExecutionException x) {
- Throwable cause = x.getCause();
- if (!(cause instanceof IOException))
- throw new RuntimeException("Cause should be IOException");
- cause = cause.getCause();
- if (!(cause instanceof ShutdownChannelGroupException))
- throw new RuntimeException("IOException cause should be ShutdownChannelGroupException");
- }
-
- // group should *not* terminate as channels are open
- boolean terminated = group.awaitTermination(3, TimeUnit.SECONDS);
- if (terminated)
- throw new RuntimeException("Group should not have terminated");
-
- // close channel; group should terminate quickly
- ch.close();
- listener.close();
- awaitTermination(group);
}
static void miscTests() throws Exception {
--- a/jdk/test/java/nio/channels/AsynchronousChannelGroup/GroupOfOne.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/nio/channels/AsynchronousChannelGroup/GroupOfOne.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -41,34 +41,36 @@
public class GroupOfOne {
public static void main(String[] args) throws Exception {
+ final List<AsynchronousSocketChannel> accepted = new ArrayList<>();
+
// create listener to accept connections
- final AsynchronousServerSocketChannel listener =
- AsynchronousServerSocketChannel.open()
- .bind(new InetSocketAddress(0));
- final List<AsynchronousSocketChannel> accepted = new ArrayList<AsynchronousSocketChannel>();
- listener.accept((Void)null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
- public void completed(AsynchronousSocketChannel ch, Void att) {
- synchronized (accepted) {
- accepted.add(ch);
+ try (final AsynchronousServerSocketChannel listener =
+ AsynchronousServerSocketChannel.open()) {
+
+ listener.bind(new InetSocketAddress(0));
+ listener.accept((Void)null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
+ public void completed(AsynchronousSocketChannel ch, Void att) {
+ synchronized (accepted) {
+ accepted.add(ch);
+ }
+ listener.accept((Void)null, this);
}
- listener.accept((Void)null, this);
- }
- public void failed(Throwable exc, Void att) {
- }
- });
+ public void failed(Throwable exc, Void att) {
+ }
+ });
- int port = ((InetSocketAddress)(listener.getLocalAddress())).getPort();
- SocketAddress sa = new InetSocketAddress(InetAddress.getLocalHost(), port);
+ int port = ((InetSocketAddress)(listener.getLocalAddress())).getPort();
+ SocketAddress sa = new InetSocketAddress(InetAddress.getLocalHost(), port);
- test(sa, true, false);
- test(sa, false, true);
- test(sa, true, true);
-
- // clean-up
- listener.close();
- synchronized (accepted) {
- for (AsynchronousSocketChannel ch: accepted) {
- ch.close();
+ test(sa, true, false);
+ test(sa, false, true);
+ test(sa, true, true);
+ } finally {
+ // clean-up
+ synchronized (accepted) {
+ for (AsynchronousSocketChannel ch: accepted) {
+ ch.close();
+ }
}
}
}
@@ -86,60 +88,60 @@
return new Thread(r);
}});
final AsynchronousSocketChannel ch = AsynchronousSocketChannel.open(group);
+ try {
+ // the latch counts down when:
+ // 1. The read operation fails (expected)
+ // 2. the close/shutdown completes
+ final CountDownLatch latch = new CountDownLatch(2);
- // the latch counts down when:
- // 1. The read operation fails (expected)
- // 2. the close/shutdown completes
- final CountDownLatch latch = new CountDownLatch(2);
+ ch.connect(sa, (Void)null, new CompletionHandler<Void,Void>() {
+ public void completed(Void result, Void att) {
+ System.out.println("Connected");
- ch.connect(sa, (Void)null, new CompletionHandler<Void,Void>() {
- public void completed(Void result, Void att) {
- System.out.println("Connected");
+ // initiate I/O operation that does not complete (successfully)
+ ByteBuffer buf = ByteBuffer.allocate(100);
+ ch.read(buf, (Void)null, new CompletionHandler<Integer,Void>() {
+ public void completed(Integer bytesRead, Void att) {
+ throw new RuntimeException();
+ }
+ public void failed(Throwable exc, Void att) {
+ if (!(exc instanceof AsynchronousCloseException))
+ throw new RuntimeException(exc);
+ System.out.println("Read failed (expected)");
+ latch.countDown();
+ }
+ });
- // initiate I/O operation that does not complete (successfully)
- ByteBuffer buf = ByteBuffer.allocate(100);
- ch.read(buf, (Void)null, new CompletionHandler<Integer,Void>() {
- public void completed(Integer bytesRead, Void att) {
+ // close channel or shutdown group
+ try {
+ if (closeChannel) {
+ System.out.print("Close channel ...");
+ ch.close();
+ System.out.println(" done.");
+ }
+ if (shutdownGroup) {
+ System.out.print("Shutdown group ...");
+ group.shutdownNow();
+ System.out.println(" done.");
+ }
+ latch.countDown();
+ } catch (IOException e) {
throw new RuntimeException();
}
- public void failed(Throwable exc, Void att) {
- if (!(exc instanceof AsynchronousCloseException))
- throw new RuntimeException(exc);
- System.out.println("Read failed (expected)");
- latch.countDown();
- }
- });
+ }
+ public void failed(Throwable exc, Void att) {
+ throw new RuntimeException(exc);
+ }
+ });
- // close channel or shutdown group
- try {
- if (closeChannel) {
- System.out.print("Close channel ...");
- ch.close();
- System.out.println(" done.");
- }
- if (shutdownGroup) {
- System.out.print("Shutdown group ...");
- group.shutdownNow();
- System.out.println(" done.");
- }
- latch.countDown();
- } catch (IOException e) {
- throw new RuntimeException();
- }
- }
- public void failed(Throwable exc, Void att) {
- throw new RuntimeException(exc);
- }
- });
-
- latch.await();
-
- // clean-up
- group.shutdown();
- boolean terminated = group.awaitTermination(20, TimeUnit.SECONDS);
- if (!terminated)
- throw new RuntimeException("Group did not terminate");
-
+ latch.await();
+ } finally {
+ // clean-up
+ group.shutdown();
+ boolean terminated = group.awaitTermination(20, TimeUnit.SECONDS);
+ if (!terminated)
+ throw new RuntimeException("Group did not terminate");
+ }
System.out.println("TEST OKAY");
}
}
--- a/jdk/test/java/nio/channels/AsynchronousChannelGroup/Identity.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/nio/channels/AsynchronousChannelGroup/Identity.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -76,89 +76,91 @@
}
public static void main(String[] args) throws Exception {
- // create listener to accept connections
- final AsynchronousServerSocketChannel listener =
- AsynchronousServerSocketChannel.open()
- .bind(new InetSocketAddress(0));
- listener.accept((Void)null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
- public void completed(final AsynchronousSocketChannel ch, Void att) {
- listener.accept((Void)null, this);
- final ByteBuffer buf = ByteBuffer.allocate(100);
- ch.read(buf, ch, new CompletionHandler<Integer,AsynchronousSocketChannel>() {
- public void completed(Integer bytesRead, AsynchronousSocketChannel ch) {
- if (bytesRead < 0) {
- try { ch.close(); } catch (IOException ignore) { }
- } else {
- buf.clear();
- ch.read(buf, ch, this);
- }
- }
- public void failed(Throwable exc, AsynchronousSocketChannel ch) {
- try { ch.close(); } catch (IOException ignore) { }
- }
- });
- }
- public void failed(Throwable exc, Void att) {
- }
- });
- int port = ((InetSocketAddress)(listener.getLocalAddress())).getPort();
- SocketAddress sa = new InetSocketAddress(InetAddress.getLocalHost(), port);
-
// create 3-10 channels, each in its own group
final int groupCount = 3 + rand.nextInt(8);
- AsynchronousChannelGroup[] groups = new AsynchronousChannelGroup[groupCount];
+ final AsynchronousChannelGroup[] groups = new AsynchronousChannelGroup[groupCount];
final AsynchronousSocketChannel[] channels = new AsynchronousSocketChannel[groupCount];
- for (int i=0; i<groupCount; i++) {
- ThreadFactory factory = createThreadFactory(i);
- AsynchronousChannelGroup group;
- if (rand.nextBoolean()) {
- int nThreads = 1 + rand.nextInt(10);
- group = AsynchronousChannelGroup.withFixedThreadPool(nThreads, factory);
- } else {
- ExecutorService pool = Executors.newCachedThreadPool(factory);
- group = AsynchronousChannelGroup.withCachedThreadPool(pool, rand.nextInt(5));
- }
- groups[i] = group;
+
+ // create listener to accept connections
+ try (final AsynchronousServerSocketChannel listener =
+ AsynchronousServerSocketChannel.open()) {
- // create channel in group and connect it to the server
- AsynchronousSocketChannel ch = AsynchronousSocketChannel.open(group);
- ch.connect(sa).get();
- channels[i] = ch;
- }
+ listener.bind(new InetSocketAddress(0));
+ listener.accept((Void)null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
+ public void completed(final AsynchronousSocketChannel ch, Void att) {
+ listener.accept((Void)null, this);
+ final ByteBuffer buf = ByteBuffer.allocate(100);
+ ch.read(buf, ch, new CompletionHandler<Integer,AsynchronousSocketChannel>() {
+ public void completed(Integer bytesRead, AsynchronousSocketChannel ch) {
+ if (bytesRead < 0) {
+ try { ch.close(); } catch (IOException ignore) { }
+ } else {
+ buf.clear();
+ ch.read(buf, ch, this);
+ }
+ }
+ public void failed(Throwable exc, AsynchronousSocketChannel ch) {
+ try { ch.close(); } catch (IOException ignore) { }
+ }
+ });
+ }
+ public void failed(Throwable exc, Void att) {
+ }
+ });
+ int port = ((InetSocketAddress)(listener.getLocalAddress())).getPort();
+ SocketAddress sa = new InetSocketAddress(InetAddress.getLocalHost(), port);
- // randomly write to each channel, ensuring that the completion handler
- // is always invoked by a thread with the right identity.
- final AtomicInteger writeCount = new AtomicInteger(100);
- channels[0].write(getBuffer(), 0, new CompletionHandler<Integer,Integer>() {
- public void completed(Integer bytesWritten, Integer groupId) {
- if (bytesWritten != 1)
- fail("Expected 1 byte to be written");
- if (!myGroup.get().equals(groupId))
- fail("Handler invoked by thread with the wrong identity");
- if (writeCount.decrementAndGet() > 0) {
- int id = rand.nextInt(groupCount);
- channels[id].write(getBuffer(), id, this);
+ for (int i=0; i<groupCount; i++) {
+ ThreadFactory factory = createThreadFactory(i);
+ AsynchronousChannelGroup group;
+ if (rand.nextBoolean()) {
+ int nThreads = 1 + rand.nextInt(10);
+ group = AsynchronousChannelGroup.withFixedThreadPool(nThreads, factory);
} else {
- done.countDown();
+ ExecutorService pool = Executors.newCachedThreadPool(factory);
+ group = AsynchronousChannelGroup.withCachedThreadPool(pool, rand.nextInt(5));
}
+ groups[i] = group;
+
+ // create channel in group and connect it to the server
+ AsynchronousSocketChannel ch = AsynchronousSocketChannel.open(group);
+ ch.connect(sa).get();
+ channels[i] = ch;
}
- public void failed(Throwable exc, Integer groupId) {
- fail(exc.getMessage());
- }
- });
-
- // wait until done
- done.await();
- // clean-up
- for (AsynchronousSocketChannel ch: channels)
- ch.close();
- for (AsynchronousChannelGroup group: groups)
- group.shutdownNow();
- listener.close();
+ // randomly write to each channel, ensuring that the completion handler
+ // is always invoked by a thread with the right identity.
+ final AtomicInteger writeCount = new AtomicInteger(100);
+ channels[0].write(getBuffer(), 0, new CompletionHandler<Integer,Integer>() {
+ public void completed(Integer bytesWritten, Integer groupId) {
+ if (bytesWritten != 1)
+ fail("Expected 1 byte to be written");
+ if (!myGroup.get().equals(groupId))
+ fail("Handler invoked by thread with the wrong identity");
+ if (writeCount.decrementAndGet() > 0) {
+ int id = rand.nextInt(groupCount);
+ channels[id].write(getBuffer(), id, this);
+ } else {
+ done.countDown();
+ }
+ }
+ public void failed(Throwable exc, Integer groupId) {
+ fail(exc.getMessage());
+ }
+ });
- if (failed.get())
- throw new RuntimeException("Test failed - see log for details");
+ // wait until done
+ done.await();
+ } finally {
+ // clean-up
+ for (AsynchronousSocketChannel ch: channels)
+ ch.close();
+ for (AsynchronousChannelGroup group: groups)
+ group.shutdownNow();
+
+ if (failed.get())
+ throw new RuntimeException("Test failed - see log for details");
+ }
}
static ByteBuffer getBuffer() {
--- a/jdk/test/java/nio/channels/AsynchronousChannelGroup/Restart.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/nio/channels/AsynchronousChannelGroup/Restart.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -66,21 +66,30 @@
// group with fixed thread pool
int nThreads = 1 + rand.nextInt(4);
AsynchronousChannelGroup group =
- AsynchronousChannelGroup.withFixedThreadPool(nThreads, factory);
- testRestart(group, 100);
- group.shutdown();
+ AsynchronousChannelGroup.withFixedThreadPool(nThreads, factory);
+ try {
+ testRestart(group, 100);
+ } finally {
+ group.shutdown();
+ }
// group with cached thread pool
ExecutorService pool = Executors.newCachedThreadPool(factory);
group = AsynchronousChannelGroup.withCachedThreadPool(pool, rand.nextInt(5));
- testRestart(group, 100);
- group.shutdown();
+ try {
+ testRestart(group, 100);
+ } finally {
+ group.shutdown();
+ }
// group with custom thread pool
- group = AsynchronousChannelGroup
- .withThreadPool(Executors.newFixedThreadPool(1+rand.nextInt(5), factory));
- testRestart(group, 100);
- group.shutdown();
+ group = AsynchronousChannelGroup.withThreadPool(
+ Executors.newFixedThreadPool(1+rand.nextInt(5), factory));
+ try {
+ testRestart(group, 100);
+ } finally {
+ group.shutdown();
+ }
// give time for threads to terminate
Thread.sleep(3000);
@@ -92,45 +101,43 @@
static void testRestart(AsynchronousChannelGroup group, int count)
throws Exception
{
- AsynchronousServerSocketChannel listener =
- AsynchronousServerSocketChannel.open(group)
- .bind(new InetSocketAddress(0));
+ try (AsynchronousServerSocketChannel listener =
+ AsynchronousServerSocketChannel.open(group)) {
- for (int i=0; i<count; i++) {
- final CountDownLatch latch = new CountDownLatch(1);
+ listener.bind(new InetSocketAddress(0));
+ for (int i=0; i<count; i++) {
+ final CountDownLatch latch = new CountDownLatch(1);
- listener.accept((Void)null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
- public void completed(AsynchronousSocketChannel ch, Void att) {
- try {
- ch.close();
- } catch (IOException ignore) { }
+ listener.accept((Void)null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
+ public void completed(AsynchronousSocketChannel ch, Void att) {
+ try {
+ ch.close();
+ } catch (IOException ignore) { }
- latch.countDown();
+ latch.countDown();
- // throw error or runtime exception
- if (rand.nextBoolean()) {
- throw new Error();
- } else {
- throw new RuntimeException();
+ // throw error or runtime exception
+ if (rand.nextBoolean()) {
+ throw new Error();
+ } else {
+ throw new RuntimeException();
+ }
}
- }
- public void failed(Throwable exc, Void att) {
- }
- });
+ public void failed(Throwable exc, Void att) {
+ }
+ });
- // establish loopback connection which should cause completion
- // handler to be invoked.
- int port = ((InetSocketAddress)(listener.getLocalAddress())).getPort();
- AsynchronousSocketChannel ch = AsynchronousSocketChannel.open();
- InetAddress lh = InetAddress.getLocalHost();
- ch.connect(new InetSocketAddress(lh, port)).get();
- ch.close();
+ // establish loopback connection which should cause completion
+ // handler to be invoked.
+ int port = ((InetSocketAddress)(listener.getLocalAddress())).getPort();
+ try (AsynchronousSocketChannel ch = AsynchronousSocketChannel.open()) {
+ InetAddress lh = InetAddress.getLocalHost();
+ ch.connect(new InetSocketAddress(lh, port)).get();
+ }
- // wait for handler to be invoked
- latch.await();
+ // wait for handler to be invoked
+ latch.await();
+ }
}
-
- // clean-up
- listener.close();
}
}
--- a/jdk/test/java/nio/file/Files/probeContentType/Basic.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/nio/file/Files/probeContentType/Basic.java Fri Aug 26 10:14:15 2016 -0700
@@ -95,7 +95,7 @@
return 0;
}
- static int checkContentTypes(String[] extensions, String[][] expectedTypes)
+ static int checkContentTypes(String[] extensions, String[] expectedTypes)
throws IOException {
if (extensions.length != expectedTypes.length) {
System.err.println("Parameter array lengths differ");
@@ -112,27 +112,10 @@
System.err.println("Content type of " + extension
+ " cannot be determined");
failures++;
- } else {
- boolean isTypeFound = false;
- for (String s : expectedTypes[i]) {
- if (type.equals(s)) {
- isTypeFound = true;
- break;
- }
- }
- if (!isTypeFound) {
- System.err.printf("Content type: %s; expected: ", type);
- int j = 0;
- for (String s : expectedTypes[i]) {
- if (j++ == 0) {
- System.err.printf("%s", s);
- } else {
- System.err.printf(", or %s", s);
- }
- }
- System.err.println();
- failures++;
- }
+ } else if (!type.equals(expectedTypes[i])) {
+ System.err.printf("Content type: %s; expected: %s%n",
+ type, expectedTypes);
+ failures++;
}
} finally {
Files.delete(file);
@@ -174,8 +157,6 @@
// Verify that certain media extensions are mapped to the correct type.
String[] extensions = new String[]{
- "aac",
- "flac",
"jpg",
"mp3",
"mp4",
@@ -183,15 +164,13 @@
"png",
"webm"
};
- String[][] expectedTypes = new String[][] {
- {"audio/aac", "audio/x-aac"},
- {"audio/flac", "audio/x-flac"},
- {"image/jpeg"},
- {"audio/mpeg"},
- {"video/mp4"},
- {"application/pdf"},
- {"image/png"},
- {"video/webm"}
+ String[] expectedTypes = new String[] {
+ "image/jpeg",
+ "audio/mpeg",
+ "video/mp4",
+ "application/pdf",
+ "image/png",
+ "video/webm"
};
failures += checkContentTypes(extensions, expectedTypes);
--- a/jdk/test/java/nio/file/Path/PathOps.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/nio/file/Path/PathOps.java Fri Aug 26 10:14:15 2016 -0700
@@ -197,6 +197,19 @@
return this;
}
+ PathOps relativizeFail(String other) {
+ out.format("test relativize %s\n", other);
+ checkPath();
+ Path that = FileSystems.getDefault().getPath(other);
+ try {
+ Path result = path.relativize(that);
+ out.format("\tExpected: IllegalArgumentException");
+ out.format("\tActual: %s\n", result);
+ fail();
+ } catch (IllegalArgumentException expected) { }
+ return this;
+ }
+
PathOps normalize(String expected) {
out.println("check normalized path");
checkPath();
@@ -572,29 +585,709 @@
.resolveSibling("C:\\", "C:\\");
// relativize
- test("foo")
- .relativize("foo", "")
- .relativize("bar", "..\\bar")
+ test("C:\\a")
+ .relativize("C:\\a", "")
+ .relativize("C:\\", "..")
+ .relativize("C:\\.", "..")
+ .relativize("C:\\..", "..")
+ .relativize("C:\\..\\..", "..")
+ .relativize("C:\\a\\b", "b")
+ .relativize("C:\\a\\b\\c", "b\\c")
+ .relativize("C:\\a\\.", "") // "." also valid
+ .relativize("C:\\a\\..", "..")
+ .relativize("C:\\x", "..\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("\\")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("C:\\a\\b")
+ .relativize("C:\\a\\b", "")
+ .relativize("C:\\a", "..")
+ .relativize("C:\\", "..\\..")
+ .relativize("C:\\.", "..\\..")
+ .relativize("C:\\..", "..\\..")
+ .relativize("C:\\..\\..", "..\\..")
+ .relativize("C:\\a\\b\\c", "c")
+ .relativize("C:\\a\\.", "..")
+ .relativize("C:\\a\\..", "..\\..")
+ .relativize("C:\\x", "..\\..\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("\\")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("C:\\a\\b\\c")
+ .relativize("C:\\a\\b\\c", "")
+ .relativize("C:\\a\\b", "..")
+ .relativize("C:\\a", "..\\..")
+ .relativize("C:\\", "..\\..\\..")
+ .relativize("C:\\.", "..\\..\\..")
+ .relativize("C:\\..", "..\\..\\..")
+ .relativize("C:\\..\\..", "..\\..\\..")
+ .relativize("C:\\..\\..\\..", "..\\..\\..")
+ .relativize("C:\\..\\..\\..\\..", "..\\..\\..")
+ .relativize("C:\\a\\b\\c\\d", "d")
+ .relativize("C:\\a\\b\\c\\d\\e", "d\\e")
+ .relativize("C:\\a\\b\\c\\.", "") // "." also valid
+ .relativize("C:\\a\\b\\c\\..", "..")
+ .relativize("C:\\a\\x", "..\\..\\x")
+ .relativize("C:\\x", "..\\..\\..\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("\\")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("C:\\..\\a")
+ .relativize("C:\\a", "")
+ .relativize("C:\\", "..")
+ .relativize("C:\\.", "..")
+ .relativize("C:\\..", "..")
+ .relativize("C:\\..\\..", "..")
+ .relativize("C:\\a\\b", "b")
+ .relativize("C:\\a\\b\\c", "b\\c")
+ .relativize("C:\\a\\.", "") // "." also valid
+ .relativize("C:\\a\\..", "..")
+ .relativize("C:\\x", "..\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("\\")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("C:\\..\\a\\b")
+ .relativize("C:\\a\\b", "")
+ .relativize("C:\\a", "..")
+ .relativize("C:\\", "..\\..")
+ .relativize("C:\\.", "..\\..")
+ .relativize("C:\\..", "..\\..")
+ .relativize("C:\\..\\..", "..\\..")
+ .relativize("C:\\..\\..\\..", "..\\..")
+ .relativize("C:\\..\\..\\..\\..", "..\\..")
+ .relativize("C:\\a\\b\\c", "c")
+ .relativize("C:\\a\\b\\.", "") // "." also valid
+ .relativize("C:\\a\\b\\..", "..")
+ .relativize("C:\\a\\x", "..\\x")
+ .relativize("C:\\x", "..\\..\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("\\")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("C:\\..\\..\\a\\b")
+ .relativize("C:\\a\\b", "")
+ .relativize("C:\\a", "..")
+ .relativize("C:\\", "..\\..")
+ .relativize("C:\\.", "..\\..")
+ .relativize("C:\\..", "..\\..")
+ .relativize("C:\\..\\..", "..\\..")
+ .relativize("C:\\..\\..\\..", "..\\..")
+ .relativize("C:\\..\\..\\..\\..", "..\\..")
+ .relativize("C:\\a\\b\\c", "c")
+ .relativize("C:\\a\\b\\.", "") // "." also valid
+ .relativize("C:\\a\\b\\..", "..")
+ .relativize("C:\\a\\x", "..\\x")
+ .relativize("C:\\x", "..\\..\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("\\")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("C:\\..\\a\\b\\c")
+ .relativize("C:\\a\\b\\c", "")
+ .relativize("C:\\a\\b", "..")
+ .relativize("C:\\a", "..\\..")
+ .relativize("C:\\", "..\\..\\..")
+ .relativize("C:\\.", "..\\..\\..")
+ .relativize("C:\\..", "..\\..\\..")
+ .relativize("C:\\..\\..", "..\\..\\..")
+ .relativize("C:\\..\\..\\..", "..\\..\\..")
+ .relativize("C:\\..\\..\\..\\..", "..\\..\\..")
+ .relativize("C:\\a\\b\\c\\d", "d")
+ .relativize("C:\\a\\b\\c\\d\\e", "d\\e")
+ .relativize("C:\\a\\b\\c\\.", "") // "." also valid
+ .relativize("C:\\a\\b\\c\\..", "..")
+ .relativize("C:\\a\\x", "..\\..\\x")
+ .relativize("C:\\x", "..\\..\\..\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("\\")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("C:\\..\\..\\a\\b\\c")
+ .relativize("C:\\a\\b\\c", "")
+ .relativize("C:\\a\\b", "..")
+ .relativize("C:\\a", "..\\..")
+ .relativize("C:\\", "..\\..\\..")
+ .relativize("C:\\.", "..\\..\\..")
+ .relativize("C:\\..", "..\\..\\..")
+ .relativize("C:\\..\\..", "..\\..\\..")
+ .relativize("C:\\..\\..\\..", "..\\..\\..")
+ .relativize("C:\\..\\..\\..\\..", "..\\..\\..")
+ .relativize("C:\\a\\b\\c\\d", "d")
+ .relativize("C:\\a\\b\\c\\d\\e", "d\\e")
+ .relativize("C:\\a\\b\\c\\.", "") // "." also valid
+ .relativize("C:\\a\\b\\c\\..", "..")
+ .relativize("C:\\a\\x", "..\\..\\x")
+ .relativize("C:\\x", "..\\..\\..\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("\\")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("C:\\..\\..\\..\\a\\b\\c")
+ .relativize("C:\\a\\b\\c", "")
+ .relativize("C:\\a\\b", "..")
+ .relativize("C:\\a", "..\\..")
+ .relativize("C:\\", "..\\..\\..")
+ .relativize("C:\\.", "..\\..\\..")
+ .relativize("C:\\..", "..\\..\\..")
+ .relativize("C:\\..\\..", "..\\..\\..")
+ .relativize("C:\\..\\..\\..", "..\\..\\..")
+ .relativize("C:\\..\\..\\..\\..", "..\\..\\..")
+ .relativize("C:\\a\\b\\c\\d", "d")
+ .relativize("C:\\a\\b\\c\\d\\e", "d\\e")
+ .relativize("C:\\a\\b\\c\\.", "") // "." also valid
+ .relativize("C:\\a\\b\\c\\..", "..")
+ .relativize("C:\\a\\x", "..\\..\\x")
+ .relativize("C:\\x", "..\\..\\..\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("\\")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("C:\\.\\a")
+ .relativize("C:\\a", "")
+ .relativize("C:\\", "..")
+ .relativize("C:\\.", "..")
+ .relativize("C:\\..", "..")
+ .relativize("C:\\..\\..", "..")
+ .relativize("C:\\a\\b", "b")
+ .relativize("C:\\a\\b\\c", "b\\c")
+ .relativize("C:\\a\\.", "") // "." also valid
+ .relativize("C:\\a\\..", "..")
+ .relativize("C:\\x", "..\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("\\")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("C:\\..\\a")
+ .relativize("C:\\a", "")
+ .relativize("C:\\", "..")
+ .relativize("C:\\.", "..")
+ .relativize("C:\\..", "..")
+ .relativize("C:\\..\\..", "..")
+ .relativize("C:\\a\\b", "b")
+ .relativize("C:\\a\\b\\c", "b\\c")
+ .relativize("C:\\a\\.", "") // "." also valid
+ .relativize("C:\\a\\..", "..")
+ .relativize("C:\\x", "..\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("\\")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("C:\\a\\..")
+ .relativize("C:\\a", "a")
+ .relativize("C:\\", "") // "." is also valid
+ .relativize("C:\\.", "")
+ .relativize("C:\\..", "")
+ .relativize("C:\\..\\..", "")
+ .relativize("C:\\a\\.", "a")
+ .relativize("C:\\a\\..", "")
+ .relativize("C:\\x", "x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("\\")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("C:a")
+ .relativize("C:a", "")
+ .relativize("C:", "..")
+ .relativize("C:.", "..")
+ .relativize("C:..", "..\\..")
+ .relativize("C:..\\..", "..\\..\\..")
+ .relativize("C:.\\..", "..\\..")
+ .relativize("C:a\\b", "b")
+ .relativize("C:a\\b\\c", "b\\c")
+ .relativize("C:..\\x", "..\\..\\x")
+ .relativizeFail("C:\\x")
+ .relativizeFail("x")
+ .relativizeFail("\\")
+ .relativizeFail("\\x");
+ test("C:a\\b")
+ .relativize("C:a\\b", "")
+ .relativize("C:a", "..")
+ .relativize("C:", "..\\..")
+ .relativize("C:.", "..\\..")
+ .relativize("C:..", "..\\..\\..")
+ .relativize("C:..\\..", "..\\..\\..\\..")
+ .relativize("C:.\\..", "..\\..\\..")
+ .relativize("C:a\\b\\c", "c")
+ .relativize("C:..\\x", "..\\..\\..\\x")
+ .relativizeFail("C:\\x")
+ .relativizeFail("x")
+ .relativizeFail("\\")
+ .relativizeFail("\\x");
+ test("C:a\\b\\c")
+ .relativize("C:a\\b\\c", "")
+ .relativize("C:a\\b", "..")
+ .relativize("C:a", "..\\..")
+ .relativize("C:", "..\\..\\..")
+ .relativize("C:.", "..\\..\\..")
+ .relativize("C:..", "..\\..\\..\\..")
+ .relativize("C:..\\..", "..\\..\\..\\..\\..")
+ .relativize("C:.\\..", "..\\..\\..\\..")
+ .relativize("C:a\\b\\c\\d", "d")
+ .relativize("C:a\\b\\c\\d\\e", "d\\e")
+ .relativize("C:a\\x", "..\\..\\x")
+ .relativize("C:..\\x", "..\\..\\..\\..\\x")
+ .relativizeFail("C:\\x")
+ .relativizeFail("x")
+ .relativizeFail("\\")
+ .relativizeFail("\\x");
+ test("C:")
+ .relativize("C:a", "a")
+ .relativize("C:a\\b\\c", "a\\b\\c")
+ .relativize("C:", "")
+ .relativize("C:.", "") // "" also valid
+ .relativize("C:..", "..")
+ .relativize("C:..\\..", "..\\..")
+ .relativize("C:.\\..", "..")
+ .relativizeFail("C:\\x")
+ .relativizeFail("\\")
+ .relativizeFail("\\x");
+ test("C:..")
+ .relativize("C:..\\a", "a")
+ .relativize("C:..", "")
+ .relativize("C:.\\..", "")
+ .relativizeFail("C:\\x")
+ .relativizeFail("\\")
+ .relativizeFail("\\x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("x");
+ test("C:..\\a")
+ .relativize("C:..\\a\\b", "b")
+ .relativize("C:..\\a", "")
+ .relativize("C:..", "..")
+ .relativize("C:.\\..", "..")
+ .relativizeFail("C:\\x")
+ .relativizeFail("\\")
+ .relativizeFail("\\x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("x");
+ test("C:..\\a\\b")
+ .relativize("C:..\\a\\b\\c", "c")
+ .relativize("C:..\\a\\b", "")
+ .relativize("C:..\\a", "..")
+ .relativize("C:..", "..\\..")
+ .relativize("C:.\\..", "..\\..")
+ .relativizeFail("C:\\x")
+ .relativizeFail("\\")
+ .relativizeFail("\\x")
+ .relativizeFail("")
+ .relativizeFail("x");
+ test("C:a\\..")
+ .relativize("C:b", "b")
+ .relativize("C:", "")
+ .relativize("C:.", "") // "." also valid
+ .relativize("C:..", "..")
+ .relativize("C:a\\..\\b", "b")
+ .relativize("C:a\\..", "")
+ .relativize("C:..\\b", "..\\b")
+ .relativize("C:b\\..", "")
+ .relativizeFail("C:\\x")
+ .relativizeFail("\\")
+ .relativizeFail("\\x")
+ .relativizeFail("x");
+ test("C:a\\..\\b")
+ .relativize("C:a\\..\\b", "")
+ .relativize("C:a\\..", "..")
+ .relativize("C:", "..")
+ .relativize("C:.", "..")
+ .relativize("C:..", "..\\..")
+ .relativize("C:b", "")
+ .relativize("C:c", "..\\c")
+ .relativize("C:..\\c", "..\\..\\c")
+ .relativize("C:a\\..\\b\\c", "c")
+ .relativizeFail("C:\\x")
+ .relativizeFail("\\")
+ .relativizeFail("\\x")
+ .relativizeFail("x");
+ test("\\a")
+ .relativize("\\a", "")
+ .relativize("\\", "..")
+ .relativize("\\.", "..")
+ .relativize("\\..", "..")
+ .relativize("\\..\\..", "..")
+ .relativize("\\a\\b", "b")
+ .relativize("\\a\\b\\c", "b\\c")
+ .relativize("\\a\\.", "") // "." also valid
+ .relativize("\\a\\..", "..")
+ .relativize("\\x", "..\\x")
+ .relativizeFail("C:\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("\\a\\b")
+ .relativize("\\a\\b", "")
+ .relativize("\\a", "..")
+ .relativize("\\", "..\\..")
+ .relativize("\\.", "..\\..")
+ .relativize("\\..", "..\\..")
+ .relativize("\\..\\..", "..\\..")
+ .relativize("\\a\\b\\c", "c")
+ .relativize("\\a\\.", "..")
+ .relativize("\\a\\..", "..\\..")
+ .relativize("\\x", "..\\..\\x")
+ .relativizeFail("C:\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("\\a\\b\\c")
+ .relativize("\\a\\b\\c", "")
+ .relativize("\\a\\b", "..")
+ .relativize("\\a", "..\\..")
+ .relativize("\\", "..\\..\\..")
+ .relativize("\\.", "..\\..\\..")
+ .relativize("\\..", "..\\..\\..")
+ .relativize("\\..\\..", "..\\..\\..")
+ .relativize("\\..\\..\\..", "..\\..\\..")
+ .relativize("\\..\\..\\..\\..", "..\\..\\..")
+ .relativize("\\a\\b\\c\\d", "d")
+ .relativize("\\a\\b\\c\\d\\e", "d\\e")
+ .relativize("\\a\\b\\c\\.", "") // "." also valid
+ .relativize("\\a\\b\\c\\..", "..")
+ .relativize("\\a\\x", "..\\..\\x")
+ .relativize("\\x", "..\\..\\..\\x")
+ .relativizeFail("C:\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("\\..\\a")
+ .relativize("\\a", "")
+ .relativize("\\", "..")
+ .relativize("\\.", "..")
+ .relativize("\\..", "..")
+ .relativize("\\..\\..", "..")
+ .relativize("\\a\\b", "b")
+ .relativize("\\a\\b\\c", "b\\c")
+ .relativize("\\a\\.", "") // "." also valid
+ .relativize("\\a\\..", "..")
+ .relativize("\\x", "..\\x")
+ .relativizeFail("C:\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("\\..\\a\\b")
+ .relativize("\\a\\b", "")
+ .relativize("\\a", "..")
+ .relativize("\\", "..\\..")
+ .relativize("\\.", "..\\..")
+ .relativize("\\..", "..\\..")
+ .relativize("\\..\\..", "..\\..")
+ .relativize("\\..\\..\\..", "..\\..")
+ .relativize("\\..\\..\\..\\..", "..\\..")
+ .relativize("\\a\\b\\c", "c")
+ .relativize("\\a\\b\\.", "") // "." also valid
+ .relativize("\\a\\b\\..", "..")
+ .relativize("\\a\\x", "..\\x")
+ .relativize("\\x", "..\\..\\x")
+ .relativizeFail("C:\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("\\..\\..\\a\\b")
+ .relativize("\\a\\b", "")
+ .relativize("\\a", "..")
+ .relativize("\\", "..\\..")
+ .relativize("\\.", "..\\..")
+ .relativize("\\..", "..\\..")
+ .relativize("\\..\\..", "..\\..")
+ .relativize("\\..\\..\\..", "..\\..")
+ .relativize("\\..\\..\\..\\..", "..\\..")
+ .relativize("\\a\\b\\c", "c")
+ .relativize("\\a\\b\\.", "") // "." also valid
+ .relativize("\\a\\b\\..", "..")
+ .relativize("\\a\\x", "..\\x")
+ .relativize("\\x", "..\\..\\x")
+ .relativizeFail("C:\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("\\..\\a\\b\\c")
+ .relativize("\\a\\b\\c", "")
+ .relativize("\\a\\b", "..")
+ .relativize("\\a", "..\\..")
+ .relativize("\\", "..\\..\\..")
+ .relativize("\\.", "..\\..\\..")
+ .relativize("\\..", "..\\..\\..")
+ .relativize("\\..\\..", "..\\..\\..")
+ .relativize("\\..\\..\\..", "..\\..\\..")
+ .relativize("\\..\\..\\..\\..", "..\\..\\..")
+ .relativize("\\a\\b\\c\\d", "d")
+ .relativize("\\a\\b\\c\\d\\e", "d\\e")
+ .relativize("\\a\\b\\c\\.", "") // "." also valid
+ .relativize("\\a\\b\\c\\..", "..")
+ .relativize("\\a\\x", "..\\..\\x")
+ .relativize("\\x", "..\\..\\..\\x")
+ .relativizeFail("C:\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("\\..\\..\\a\\b\\c")
+ .relativize("\\a\\b\\c", "")
+ .relativize("\\a\\b", "..")
+ .relativize("\\a", "..\\..")
+ .relativize("\\", "..\\..\\..")
+ .relativize("\\.", "..\\..\\..")
+ .relativize("\\..", "..\\..\\..")
+ .relativize("\\..\\..", "..\\..\\..")
+ .relativize("\\..\\..\\..", "..\\..\\..")
+ .relativize("\\..\\..\\..\\..", "..\\..\\..")
+ .relativize("\\a\\b\\c\\d", "d")
+ .relativize("\\a\\b\\c\\d\\e", "d\\e")
+ .relativize("\\a\\b\\c\\.", "") // "." also valid
+ .relativize("\\a\\b\\c\\..", "..")
+ .relativize("\\a\\x", "..\\..\\x")
+ .relativize("\\x", "..\\..\\..\\x")
+ .relativizeFail("C:\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("\\..\\..\\..\\a\\b\\c")
+ .relativize("\\a\\b\\c", "")
+ .relativize("\\a\\b", "..")
+ .relativize("\\a", "..\\..")
+ .relativize("\\", "..\\..\\..")
+ .relativize("\\.", "..\\..\\..")
+ .relativize("\\..", "..\\..\\..")
+ .relativize("\\..\\..", "..\\..\\..")
+ .relativize("\\..\\..\\..", "..\\..\\..")
+ .relativize("\\..\\..\\..\\..", "..\\..\\..")
+ .relativize("\\a\\b\\c\\d", "d")
+ .relativize("\\a\\b\\c\\d\\e", "d\\e")
+ .relativize("\\a\\b\\c\\.", "") // "." also valid
+ .relativize("\\a\\b\\c\\..", "..")
+ .relativize("\\a\\x", "..\\..\\x")
+ .relativize("\\x", "..\\..\\..\\x")
+ .relativizeFail("C:\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("\\.\\a")
+ .relativize("\\a", "")
+ .relativize("\\", "..")
+ .relativize("\\.", "..")
+ .relativize("\\..", "..")
+ .relativize("\\..\\..", "..")
+ .relativize("\\a\\b", "b")
+ .relativize("\\a\\b\\c", "b\\c")
+ .relativize("\\a\\.", "") // "." also valid
+ .relativize("\\a\\..", "..")
+ .relativize("\\x", "..\\x")
+ .relativizeFail("C:\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("\\..\\a")
+ .relativize("\\a", "")
+ .relativize("\\", "..")
+ .relativize("\\.", "..")
+ .relativize("\\..", "..")
+ .relativize("\\..\\..", "..")
+ .relativize("\\a\\b", "b")
+ .relativize("\\a\\b\\c", "b\\c")
+ .relativize("\\a\\.", "") // "." also valid
+ .relativize("\\a\\..", "..")
+ .relativize("\\x", "..\\x")
+ .relativizeFail("C:\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("\\a\\..")
+ .relativize("\\a", "a")
+ .relativize("\\", "") // "." is also valid
+ .relativize("\\.", "")
+ .relativize("\\..", "")
+ .relativize("\\..\\..", "")
+ .relativize("\\a\\.", "a")
+ .relativize("\\a\\..", "")
+ .relativize("\\x", "x")
+ .relativizeFail("C:\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("\\")
+ .relativize("\\a", "a")
+ .relativize("\\", "") // "." is also valid
+ .relativize("\\.", "")
+ .relativize("\\..", "")
+ .relativize("\\..\\..", "")
+ .relativize("\\a\\.", "a")
+ .relativize("\\a\\..", "")
+ .relativize("\\x", "x")
+ .relativizeFail("C:\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("a")
+ .relativize("a", "")
+ .relativize("", "..")
+ .relativize(".", "..")
.relativize("..", "..\\..")
- .relativize("", "..");
- test("foo\\bar")
- .relativize("foo\\bar", "")
- .relativize("foo", "..")
- .relativize("gus", "..\\..\\gus")
+ .relativize("..\\..", "..\\..\\..")
+ .relativize(".\\..", "..\\..")
+ .relativize("a\\b", "b")
+ .relativize("a\\b\\c", "b\\c")
+ .relativize("..\\x", "..\\..\\x")
+ .relativizeFail("C:\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("\\")
+ .relativizeFail("\\x");
+ test("a\\b")
+ .relativize("a\\b", "")
+ .relativize("a", "..")
+ .relativize("", "..\\..")
+ .relativize(".", "..\\..")
.relativize("..", "..\\..\\..")
- .relativize("", "..\\..");
- test("C:\\a\\b\\c")
- .relativize("C:\\a", "..\\..")
- .relativize("C:\\a\\b\\c", "")
- .relativize("C:\\x", "..\\..\\..\\x");
- test("\\\\server\\share\\foo")
- .relativize("\\\\server\\share\\bar", "..\\bar")
- .relativize("\\\\server\\share\\foo", "");
+ .relativize("..\\..", "..\\..\\..\\..")
+ .relativize(".\\..", "..\\..\\..")
+ .relativize("a\\b\\c", "c")
+ .relativize("..\\x", "..\\..\\..\\x")
+ .relativizeFail("C:\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("\\")
+ .relativizeFail("\\x");
+ test("a\\b\\c")
+ .relativize("a\\b\\c", "")
+ .relativize("a\\b", "..")
+ .relativize("a", "..\\..")
+ .relativize("", "..\\..\\..")
+ .relativize(".", "..\\..\\..")
+ .relativize("..", "..\\..\\..\\..")
+ .relativize("..\\..", "..\\..\\..\\..\\..")
+ .relativize(".\\..", "..\\..\\..\\..")
+ .relativize("a\\b\\c\\d", "d")
+ .relativize("a\\b\\c\\d\\e", "d\\e")
+ .relativize("a\\x", "..\\..\\x")
+ .relativize("..\\x", "..\\..\\..\\..\\x")
+ .relativizeFail("C:\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("\\")
+ .relativizeFail("\\x");
test("")
.relativize("a", "a")
.relativize("a\\b\\c", "a\\b\\c")
+ .relativize("", "")
+ .relativize(".", ".")
.relativize("..", "..")
- .relativize("", "");
+ .relativize("..\\..", "..\\..")
+ .relativize(".\\..", ".\\..") // ".." also valid
+ .relativizeFail("\\")
+ .relativizeFail("\\x");
+ test("..")
+ .relativize("..\\a", "a")
+ .relativize("..", "")
+ .relativize(".\\..", "")
+ .relativizeFail("C:\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("\\")
+ .relativizeFail("\\x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("x");
+ test("..\\a")
+ .relativize("..\\a\\b", "b")
+ .relativize("..\\a", "")
+ .relativize("..", "..")
+ .relativize(".\\..", "..")
+ .relativizeFail("C:\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("\\")
+ .relativizeFail("\\x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("x");
+ test("..\\a\\b")
+ .relativize("..\\a\\b\\c", "c")
+ .relativize("..\\a\\b", "")
+ .relativize("..\\a", "..")
+ .relativize("..", "..\\..")
+ .relativize(".\\..", "..\\..")
+ .relativizeFail("C:\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("\\")
+ .relativizeFail("\\x")
+ .relativizeFail("")
+ .relativizeFail("x");
+ test("a\\..")
+ .relativize("b", "b")
+ .relativize("", "")
+ .relativize(".", "") // "." also valid
+ .relativize("..", "..")
+ .relativize("a\\..\\b", "b")
+ .relativize("a\\..", "")
+ .relativize("..\\b", "..\\b")
+ .relativize("b\\..", "")
+ .relativizeFail("C:\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("\\")
+ .relativizeFail("\\x");
+ test("a\\..\\b")
+ .relativize("a\\..\\b", "")
+ .relativize("a\\..", "..")
+ .relativize("", "..")
+ .relativize(".", "..")
+ .relativize("..", "..\\..")
+ .relativize("b", "")
+ .relativize("c", "..\\c")
+ .relativize("..\\c", "..\\..\\c")
+ .relativize("a\\..\\b\\c", "c")
+ .relativizeFail("C:\\x")
+ .relativizeFail("C:x")
+ .relativizeFail("\\")
+ .relativizeFail("\\x");
// normalize
test("C:\\")
@@ -971,20 +1664,324 @@
.resolve("", "");
// relativize
+ test("/a")
+ .relativize("/a", "")
+ .relativize("/", "..")
+ .relativize("/.", "..")
+ .relativize("/..", "..")
+ .relativize("/../..", "..")
+ .relativize("/a/b", "b")
+ .relativize("/a/b/c", "b/c")
+ .relativize("/a/.", "") // "." also valid
+ .relativize("/a/..", "..")
+ .relativize("/x", "../x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("/a/b")
+ .relativize("/a/b", "")
+ .relativize("/a", "..")
+ .relativize("/", "../..")
+ .relativize("/.", "../..")
+ .relativize("/..", "../..")
+ .relativize("/../..", "../..")
+ .relativize("/a/b/c", "c")
+ .relativize("/a/.", "..")
+ .relativize("/a/..", "../..")
+ .relativize("/x", "../../x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
test("/a/b/c")
.relativize("/a/b/c", "")
+ .relativize("/a/b", "..")
+ .relativize("/a", "../..")
+ .relativize("/", "../../..")
+ .relativize("/.", "../../..")
+ .relativize("/..", "../../..")
+ .relativize("/../..", "../../..")
+ .relativize("/../../..", "../../..")
+ .relativize("/../../../..", "../../..")
+ .relativize("/a/b/c/d", "d")
.relativize("/a/b/c/d/e", "d/e")
+ .relativize("/a/b/c/.", "") // "." also valid
+ .relativize("/a/b/c/..", "..")
+ .relativize("/a/x", "../../x")
+ .relativize("/x", "../../../x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("/../a")
+ .relativize("/a", "")
+ .relativize("/", "..")
+ .relativize("/.", "..")
+ .relativize("/..", "..")
+ .relativize("/../..", "..")
+ .relativize("/a/b", "b")
+ .relativize("/a/b/c", "b/c")
+ .relativize("/a/.", "") // "." also valid
+ .relativize("/a/..", "..")
+ .relativize("/x", "../x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("/../a/b")
+ .relativize("/a/b", "")
+ .relativize("/a", "..")
+ .relativize("/", "../..")
+ .relativize("/.", "../..")
+ .relativize("/..", "../..")
+ .relativize("/../..", "../..")
+ .relativize("/../../..", "../..")
+ .relativize("/../../../..", "../..")
+ .relativize("/a/b/c", "c")
+ .relativize("/a/b/.", "") // "." also valid
+ .relativize("/a/b/..", "..")
+ .relativize("/a/x", "../x")
+ .relativize("/x", "../../x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("/../../a/b")
+ .relativize("/a/b", "")
+ .relativize("/a", "..")
+ .relativize("/", "../..")
+ .relativize("/.", "../..")
+ .relativize("/..", "../..")
+ .relativize("/../..", "../..")
+ .relativize("/../../..", "../..")
+ .relativize("/../../../..", "../..")
+ .relativize("/a/b/c", "c")
+ .relativize("/a/b/.", "") // "." also valid
+ .relativize("/a/b/..", "..")
+ .relativize("/a/x", "../x")
+ .relativize("/x", "../../x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("/../a/b/c")
+ .relativize("/a/b/c", "")
+ .relativize("/a/b", "..")
+ .relativize("/a", "../..")
+ .relativize("/", "../../..")
+ .relativize("/.", "../../..")
+ .relativize("/..", "../../..")
+ .relativize("/../..", "../../..")
+ .relativize("/../../..", "../../..")
+ .relativize("/../../../..", "../../..")
+ .relativize("/a/b/c/d", "d")
+ .relativize("/a/b/c/d/e", "d/e")
+ .relativize("/a/b/c/.", "") // "." also valid
+ .relativize("/a/b/c/..", "..")
+ .relativize("/a/x", "../../x")
+ .relativize("/x", "../../../x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("/../../a/b/c")
+ .relativize("/a/b/c", "")
+ .relativize("/a/b", "..")
+ .relativize("/a", "../..")
+ .relativize("/", "../../..")
+ .relativize("/.", "../../..")
+ .relativize("/..", "../../..")
+ .relativize("/../..", "../../..")
+ .relativize("/../../..", "../../..")
+ .relativize("/../../../..", "../../..")
+ .relativize("/a/b/c/d", "d")
+ .relativize("/a/b/c/d/e", "d/e")
+ .relativize("/a/b/c/.", "") // "." also valid
+ .relativize("/a/b/c/..", "..")
.relativize("/a/x", "../../x")
- .relativize("/x", "../../../x");
+ .relativize("/x", "../../../x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("/../../../a/b/c")
+ .relativize("/a/b/c", "")
+ .relativize("/a/b", "..")
+ .relativize("/a", "../..")
+ .relativize("/", "../../..")
+ .relativize("/.", "../../..")
+ .relativize("/..", "../../..")
+ .relativize("/../..", "../../..")
+ .relativize("/../../..", "../../..")
+ .relativize("/../../../..", "../../..")
+ .relativize("/a/b/c/d", "d")
+ .relativize("/a/b/c/d/e", "d/e")
+ .relativize("/a/b/c/.", "") // "." also valid
+ .relativize("/a/b/c/..", "..")
+ .relativize("/a/x", "../../x")
+ .relativize("/x", "../../../x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("/./a")
+ .relativize("/a", "")
+ .relativize("/", "..")
+ .relativize("/.", "..")
+ .relativize("/..", "..")
+ .relativize("/../..", "..")
+ .relativize("/a/b", "b")
+ .relativize("/a/b/c", "b/c")
+ .relativize("/a/.", "") // "." also valid
+ .relativize("/a/..", "..")
+ .relativize("/x", "../x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("/../a")
+ .relativize("/a", "")
+ .relativize("/", "..")
+ .relativize("/.", "..")
+ .relativize("/..", "..")
+ .relativize("/../..", "..")
+ .relativize("/a/b", "b")
+ .relativize("/a/b/c", "b/c")
+ .relativize("/a/.", "") // "." also valid
+ .relativize("/a/..", "..")
+ .relativize("/x", "../x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("/a/..")
+ .relativize("/a", "a")
+ .relativize("/", "") // "." is also valid
+ .relativize("/.", "")
+ .relativize("/..", "")
+ .relativize("/../..", "")
+ .relativize("/a/.", "a")
+ .relativize("/a/..", "")
+ .relativize("/x", "x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("/")
+ .relativize("/a", "a")
+ .relativize("/", "") // "." is also valid
+ .relativize("/.", "")
+ .relativize("/..", "")
+ .relativize("/../..", "")
+ .relativize("/a/.", "a")
+ .relativize("/a/..", "")
+ .relativize("/x", "x")
+ .relativizeFail("x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("..");
+ test("a")
+ .relativize("a", "")
+ .relativize("", "..")
+ .relativize(".", "..")
+ .relativize("..", "../..")
+ .relativize("../..", "../../..")
+ .relativize("./..", "../..")
+ .relativize("a/b", "b")
+ .relativize("a/b/c", "b/c")
+ .relativize("../x", "../../x")
+ .relativizeFail("/")
+ .relativizeFail("/x");
+ test("a/b")
+ .relativize("a/b", "")
+ .relativize("a", "..")
+ .relativize("", "../..")
+ .relativize(".", "../..")
+ .relativize("..", "../../..")
+ .relativize("../..", "../../../..")
+ .relativize("./..", "../../..")
+ .relativize("a/b/c", "c")
+ .relativize("../x", "../../../x")
+ .relativizeFail("/")
+ .relativizeFail("/x");
test("a/b/c")
+ .relativize("a/b/c", "")
+ .relativize("a/b", "..")
+ .relativize("a", "../..")
+ .relativize("", "../../..")
+ .relativize(".", "../../..")
+ .relativize("..", "../../../..")
+ .relativize("../..", "../../../../..")
+ .relativize("./..", "../../../..")
.relativize("a/b/c/d", "d")
+ .relativize("a/b/c/d/e", "d/e")
.relativize("a/x", "../../x")
- .relativize("x", "../../../x")
- .relativize("", "../../..");
+ .relativize("../x", "../../../../x")
+ .relativizeFail("/")
+ .relativizeFail("/x");
test("")
.relativize("a", "a")
.relativize("a/b/c", "a/b/c")
- .relativize("", "");
+ .relativize("", "")
+ .relativize(".", ".")
+ .relativize("..", "..")
+ .relativize("../..", "../..")
+ .relativize("./..", "./..") // ".." also valid
+ .relativizeFail("/")
+ .relativizeFail("/x");
+ test("..")
+ .relativize("../a", "a")
+ .relativize("..", "")
+ .relativize("./..", "")
+ .relativizeFail("/")
+ .relativizeFail("/x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("x");
+ test("../a")
+ .relativize("../a/b", "b")
+ .relativize("../a", "")
+ .relativize("..", "..")
+ .relativize("./..", "..")
+ .relativizeFail("/")
+ .relativizeFail("/x")
+ .relativizeFail("")
+ .relativizeFail(".")
+ .relativizeFail("x");
+ test("../a/b")
+ .relativize("../a/b/c", "c")
+ .relativize("../a/b", "")
+ .relativize("../a", "..")
+ .relativize("..", "../..")
+ .relativize("./..", "../..")
+ .relativizeFail("/")
+ .relativizeFail("/x")
+ .relativizeFail("")
+ .relativizeFail("x");
+ test("a/..")
+ .relativize("b", "b")
+ .relativize("", "")
+ .relativize(".", "") // "." also valid
+ .relativize("..", "..")
+ .relativize("a/../b", "b")
+ .relativize("a/..", "")
+ .relativize("../b", "../b")
+ .relativize("b/..", "")
+ .relativizeFail("/")
+ .relativizeFail("/x");
+ test("a/../b")
+ .relativize("a/../b", "")
+ .relativize("a/..", "..")
+ .relativize("", "..")
+ .relativize(".", "..")
+ .relativize("..", "../..")
+ .relativize("b", "")
+ .relativize("c", "../c")
+ .relativize("../c", "../../c")
+ .relativize("a/../b/c", "c")
+ .relativizeFail("/")
+ .relativizeFail("/x");
// normalize
test("/")
--- a/jdk/test/java/nio/file/WatchService/LotsOfCancels.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/nio/file/WatchService/LotsOfCancels.java Fri Aug 26 10:14:15 2016 -0700
@@ -53,10 +53,11 @@
Path testDir = Paths.get(System.getProperty("test.dir", "."));
Path top = Files.createTempDirectory(testDir, "LotsOfCancels");
for (int i=1; i<=16; i++) {
+ int id = i;
Path dir = Files.createDirectory(top.resolve("dir-" + i));
WatchService watcher = FileSystems.getDefault().newWatchService();
- pool.submit(() -> handle(dir, watcher));
- pool.submit(() -> poll(watcher));
+ pool.submit(() -> handle(id, dir, watcher));
+ pool.submit(() -> poll(id, watcher));
}
} finally {
pool.shutdown();
@@ -74,7 +75,8 @@
* Stress the given WatchService, specifically the cancel method, in
* the given directory. Closes the WatchService when done.
*/
- static void handle(Path dir, WatchService watcher) {
+ static void handle(int id, Path dir, WatchService watcher) {
+ System.out.printf("begin handle %d%n", id);
try {
try {
Path file = dir.resolve("anyfile");
@@ -85,12 +87,15 @@
key.cancel();
}
} finally {
+ System.out.printf("WatchService %d closing ...%n", id);
watcher.close();
+ System.out.printf("WatchService %d closed %n", id);
}
} catch (Exception e) {
e.printStackTrace();
failed = true;
}
+ System.out.printf("end handle %d%n", id);
}
/**
@@ -98,7 +103,8 @@
* queue drained, it also hogs a CPU core which seems necessary to
* tickle the original bug.
*/
- static void poll(WatchService watcher) {
+ static void poll(int id, WatchService watcher) {
+ System.out.printf("begin poll %d%n", id);
try {
for (;;) {
WatchKey key = watcher.take();
@@ -108,10 +114,12 @@
}
}
} catch (ClosedWatchServiceException expected) {
- // nothing to do
+ // nothing to do but print
+ System.out.printf("poll %d expected exception %s%n", id, expected);
} catch (Exception e) {
e.printStackTrace();
failed = true;
}
+ System.out.printf("end poll %d%n", id);
}
}
--- a/jdk/test/java/nio/file/WatchService/UpdateInterference.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/nio/file/WatchService/UpdateInterference.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -33,6 +33,9 @@
import static java.nio.file.StandardWatchEventKinds.*;
public class UpdateInterference {
+
+ private static volatile boolean stop;
+
public static void main(String[] args) throws IOException, InterruptedException {
final Path root = Files.createTempDirectory("test");
final Path foo = root.resolve("foo");
@@ -43,64 +46,89 @@
Files.createDirectory(bar);
Files.createDirectory(baz);
- final WatchService watcher = root.getFileSystem().newWatchService();
- final WatchKey fooKey = foo.register(watcher, ENTRY_CREATE);
- final WatchKey barKey = bar.register(watcher, ENTRY_CREATE);
+ try (final WatchService watcher = root.getFileSystem().newWatchService()) {
+ final WatchKey fooKey = foo.register(watcher, ENTRY_CREATE);
+ final WatchKey barKey = bar.register(watcher, ENTRY_CREATE);
+
+ Thread t1 = null;
+ Thread t2 = null;
+ try {
+ t1 = new Thread() {
- new Thread() {
- { setDaemon(true); }
+ @Override
+ public void run() {
+ while (!stop) {
+ try {
+ final Path temp = Files.createTempFile(foo, "temp", ".tmp");
+ Files.delete(temp);
+ Thread.sleep(10);
+ } catch (IOException | InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+ };
+
+ t2 = new Thread() {
- @Override
- public void run() {
- while (true) {
- try {
- final Path temp = Files.createTempFile(foo, "temp", ".tmp");
- Files.delete(temp);
- Thread.sleep(10);
- } catch (IOException | InterruptedException e) {
- throw new RuntimeException(e);
+ @Override
+ public void run() {
+ WatchKey bazKeys[] = new WatchKey[32];
+ while (!stop) {
+ try {
+ for( int i = 0; i < bazKeys.length; i++) {
+ bazKeys[i] = baz.register(watcher, ENTRY_CREATE);
+ }
+ for( int i = 0; i < bazKeys.length; i++) {
+ bazKeys[i].cancel();
+ }
+ Thread.sleep(1);
+ } catch (IOException | InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
}
+ };
+
+ t1.start();
+ t2.start();
+
+ long time = System.currentTimeMillis();
+ while ((System.currentTimeMillis() - time) < 15000) {
+ final WatchKey key = watcher.poll(60, TimeUnit.SECONDS);
+ if (key == null) continue;
+
+ if (key != fooKey) {
+ List<WatchEvent<?>> pollEvents = key.pollEvents();
+ for (WatchEvent<?> watchEvent : pollEvents) {
+ System.out.println(watchEvent.count() + " " +
+ watchEvent.kind() + " " +
+ watchEvent.context());
+ }
+ throw new RuntimeException("Event received for unexpected key");
+ }
+ key.reset();
+ }
+ } finally {
+ // the threads should stop before WatchService is closed
+ // to avoid ClosedWatchServiceException
+ stop = true;
+
+ // wait for threads to finish
+ if (t1 != null) {
+ t1.join();
+ }
+
+ if (t2 != null) {
+ t2.join();
}
}
- }.start();
-
- new Thread() {
- { setDaemon(true); }
-
- @Override
- public void run() {
- WatchKey bazKeys[] = new WatchKey[32];
- while (true) {
- try {
- for( int i = 0; i < bazKeys.length; i++) {
- bazKeys[i] = baz.register(watcher, ENTRY_CREATE);
- }
- for( int i = 0; i < bazKeys.length; i++) {
- bazKeys[i].cancel();
- }
- Thread.sleep(1);
- } catch (IOException | InterruptedException e) {
- throw new RuntimeException(e);
- }
- }
- }
- }.start();
-
- long time = System.currentTimeMillis();
- while ((System.currentTimeMillis() - time) < 15000) {
- final WatchKey key = watcher.poll(60, TimeUnit.SECONDS);
- if (key == null) continue;
-
- if (key != fooKey) {
- List<WatchEvent<?>> pollEvents = key.pollEvents();
- for (WatchEvent<?> watchEvent : pollEvents) {
- System.out.println(watchEvent.count() + " " +
- watchEvent.kind() + " " +
- watchEvent.context());
- }
- throw new RuntimeException("Event received for unexpected key");
- }
- key.reset();
+ } finally {
+ // clean up
+ Files.delete(foo);
+ Files.delete(bar);
+ Files.delete(baz);
+ Files.delete(root);
}
}
}
--- a/jdk/test/java/security/KeyFactory/Failover.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/security/KeyFactory/Failover.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/**
* @test
- * @bug 4894125 7054918
+ * @bug 4894125 7054918 8130181
* @library ../testlibrary
* @summary test that failover for KeyFactory works
* @author Andreas Sterbenz
@@ -96,14 +96,14 @@
private static class ProviderPass extends Provider {
ProviderPass() {
- super("Pass", 1.0d, "Pass");
+ super("Pass", "1.0", "Pass");
put("KeyFactory.FOO" , "Failover$KeyFactoryPass");
}
}
private static class ProviderFail extends Provider {
ProviderFail() {
- super("Fail", 1.0d, "Fail");
+ super("Fail", "1.0", "Fail");
put("KeyFactory.FOO" , "Failover$KeyFactoryFail");
put("KeyFactory.DSA" , "Failover$KeyFactoryFail");
}
--- a/jdk/test/java/security/KeyPairGenerator/Failover.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/security/KeyPairGenerator/Failover.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/**
* @test
- * @bug 4894125 7054918
+ * @bug 4894125 7054918 8130181
* @library ../testlibrary
* @summary test that failover for KeyPairGenerator works
* @author Andreas Sterbenz
@@ -110,14 +110,14 @@
private static class ProviderPass extends Provider {
ProviderPass() {
- super("Pass", 1.0d, "Pass");
+ super("Pass", "1.0", "Pass");
put("KeyPairGenerator.FOO" , "Failover$KeyPairGeneratorPass");
}
}
private static class ProviderFail extends Provider {
ProviderFail() {
- super("Fail", 1.0d, "Fail");
+ super("Fail", "1.0", "Fail");
put("KeyPairGenerator.FOO" , "Failover$KeyPairGeneratorFail");
put("KeyPairGenerator.DSA" , "Failover$KeyPairGeneratorFail");
put("KeyPairGenerator.RSA" , "Failover$KeyPairGeneratorFail");
--- a/jdk/test/java/security/KeyStore/EntryMethods.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/security/KeyStore/EntryMethods.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test 1.5, 03/06/24
- * @bug 4850376 8130850
+ * @bug 4850376 8130850 8130181
* @summary Provide generic storage KeyStore storage facilities
*/
@@ -65,7 +65,7 @@
public static class FooEntry implements KeyStore.Entry { }
public EntryMethods() throws Exception {
- super("EntryMethods", 0.0, "EntryMethods");
+ super("EntryMethods", "0.0", "EntryMethods");
pre15fis = new FileInputStream
(System.getProperty("test.src") + "/EntryMethods.pre15.keystore");
--- a/jdk/test/java/security/KeyStore/KeyStoreBuilder.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/security/KeyStore/KeyStoreBuilder.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/**
* @test
- * @bug 4938922 4961104 5071293 6236533
+ * @bug 4938922 4961104 5071293 6236533 8130181
* @summary verify that the KeyStore.Builder API works
* @author Andreas Sterbenz
*/
@@ -219,7 +219,7 @@
private static class MyProvider extends Provider {
MyProvider() {
- super("My", 1.0d, null);
+ super("My", "1.0", null);
put("KeyStore.My", "KeyStoreBuilder$MyKeyStoreSpi");
}
}
--- a/jdk/test/java/security/Policy/GetInstance/GetInstanceProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/security/Policy/GetInstance/GetInstanceProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,7 +27,7 @@
public GetInstanceProvider() {
super("GetInstanceProvider",
- 1,
+ "1",
"GetInstanceProvider: Policy.GetInstancePolicySpi");
AccessController.doPrivileged(new PrivilegedAction() {
--- a/jdk/test/java/security/Provider/CaseSensitiveServices.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/security/Provider/CaseSensitiveServices.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 5097015
+ * @bug 5097015 8130181
* @summary make sure we correctly treat Provider string entries as case insensitive
* @author Andreas Sterbenz
*/
@@ -33,7 +33,7 @@
public class CaseSensitiveServices extends Provider {
CaseSensitiveServices() {
- super("Foo", 1.0d, null);
+ super("Foo", "1.0", null);
put("MessageDigest.Foo", "com.Foo");
put("mESSAGEdIGEST.fOO xYz", "aBc");
put("ALg.aliaS.MESSAGEdigest.Fu", "FoO");
--- a/jdk/test/java/security/Provider/ChangeProviders.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/security/Provider/ChangeProviders.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4856968 7054918
+ * @bug 4856968 7054918 8130181
* @library ../testlibrary
* @summary make sure add/insert/removeProvider() work correctly
* @author Andreas Sterbenz
@@ -36,7 +36,7 @@
public class ChangeProviders extends Provider {
private ChangeProviders() {
- super("Foo", 47.23d, "none");
+ super("Foo", "47.23", "none");
}
private static int plen() {
--- a/jdk/test/java/security/Provider/Equals.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/security/Provider/Equals.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/**
* @test
- * @bug 4918769
+ * @bug 4918769 8130181
* @summary make sure Provider.equals() behaves as expected with the id attributes
* @author Andreas Sterbenz
*/
@@ -33,9 +33,9 @@
public class Equals {
public static void main(String[] args) throws Exception {
- Provider p1 = new P1("foo", 1.0d, "foo");
- Provider p1b = new P1("foo", 1.0d, "foo");
- Provider p2 = new P2("foo", 1.0d, "foo");
+ Provider p1 = new P1("foo", "1.0", "foo");
+ Provider p1b = new P1("foo", "1.0", "foo");
+ Provider p2 = new P2("foo", "1.0", "foo");
System.out.println(p1.entrySet());
if (p1.equals(p2)) {
throw new Exception("Objects are equal");
@@ -55,13 +55,13 @@
}
private static class P1 extends Provider {
- P1(String name, double version, String info) {
+ P1(String name, String version, String info) {
super(name, version, info);
}
}
private static class P2 extends Provider {
- P2(String name, double version, String info) {
+ P2(String name, String version, String info) {
super(name, version, info);
}
}
--- a/jdk/test/java/security/Provider/GetInstance.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/security/Provider/GetInstance.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4856968 7054918
+ * @bug 4856968 7054918 8130181
* @library ../testlibrary
* @summary make sure getInstance() works correctly, including failover
* and delayed provider selection for Signatures
@@ -137,7 +137,7 @@
public static class FooProvider extends Provider {
FooProvider() {
- super("foo", 1.0d, "none");
+ super("foo", "1.0", "none");
put("MessageDigest.foo", "GetInstance$FooDigest");
put("CertStore.foo", "GetInstance$FooStore");
put("Signature.foo", "GetInstance$FooSignatureSpi");
@@ -151,7 +151,7 @@
public static class BarProvider extends Provider {
BarProvider() {
- super("bar", 1.0d, "none");
+ super("bar", "1.0", "none");
// all entries invalid for failover
put("MessageDigest.bar", "GetInstance$FooKey");
put("Signature.bar", "GetInstance$FooKey");
@@ -164,7 +164,7 @@
public static class BazProvider extends Provider {
BazProvider() {
- super("baz", 1.0d, "none");
+ super("baz", "1.0", "none");
put("MessageDigest.bar", "GetInstance$FooDigest");
put("CertStore.bar", "GetInstance$FooStore");
put("Signature.bar", "GetInstance$FooSignatureSpi");
--- a/jdk/test/java/security/Provider/ProviderInfoCheck.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/security/Provider/ProviderInfoCheck.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 6455351
+ * @bug 6455351 8130181
* @summary Make sure the Provider.info entries have the correct values
* after going through serialization/deserialization.
* @author Valerie Peng
@@ -68,18 +68,17 @@
if (!p.getClass().getName().equalsIgnoreCase(value)) {
throw new Exception("Test Failed: incorrect className!");
}
- double dvalue =
- Double.parseDouble((String) p.get("Provider.id version"));
- if ((SampleProvider.VERSION != dvalue) ||
- p.getVersion() != dvalue) {
- throw new Exception("Test Failed: incorrect version!");
+ value = (String) p.get("Provider.id version");
+ if (!SampleProvider.VERSION.equalsIgnoreCase(value) ||
+ p.getVersionStr() != value) {
+ throw new Exception("Test Failed: incorrect versionStr!");
}
System.out.println("Test Passed");
}
private static class SampleProvider extends Provider {
static String NAME = "Sample";
- static double VERSION = 1.1d;
+ static String VERSION = "1.1";
static String INFO = "Good for nothing";
SampleProvider() {
super(NAME, VERSION, INFO);
--- a/jdk/test/java/security/Provider/RemoveProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/security/Provider/RemoveProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4190873 7054918
+ * @bug 4190873 7054918 8130181
* @library ../testlibrary
* @summary Make sure provider instance can be removed from list of registered
* providers, and "entrySet", "keySet", and "values" methods don't loop
@@ -46,11 +46,11 @@
public static void main0(String[] args) throws Exception {
// Add provider 1
- Provider p1 = new MyProvider("name1",1,"");
+ Provider p1 = new MyProvider("name1","1","");
Security.addProvider(p1);
// Add provider 2
- Provider p2 = new MyProvider("name2",1,"");
+ Provider p2 = new MyProvider("name2","1","");
Security.addProvider(p2);
// List all providers
@@ -183,7 +183,7 @@
}
class MyProvider extends Provider {
- public MyProvider(String name, double version, String info) {
+ public MyProvider(String name, String version, String info) {
super(name, version, info);
put("Signature", name+".signature");
put("Digest", name+".digest");
--- a/jdk/test/java/security/Provider/SupportsParameter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/security/Provider/SupportsParameter.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/**
* @test
- * @bug 4911081
+ * @bug 4911081 8130181
* @summary verify that Provider.Service.supportsParameter() works
* @author Andreas Sterbenz
*/
@@ -104,7 +104,7 @@
private static class MyProvider extends Provider {
MyProvider() {
- super("MyProvider", 1.0d, "MyProvider");
+ super("MyProvider", "1.0", "MyProvider");
put("Signature.DSA0", "foo.DSA0");
--- a/jdk/test/java/security/Provider/TestSecurityProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/security/Provider/TestSecurityProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -30,7 +30,7 @@
public final class TestSecurityProvider extends Provider {
public TestSecurityProvider() {
- super("TEST", 1.0d, "Test Security provider");
+ super("TEST", "1.0", "Test Security provider");
System.out.println(String.format("TEST Security provider loaded"
+ " successfully : %s", this.toString()));
}
@@ -38,7 +38,7 @@
@Override
public String toString() {
return "TestSecurityProvider [getName()=" + getName()
- + ", getVersion()=" + getVersion() + ", getInfo()="
+ + ", getVersion()=" + getVersionStr() + ", getInfo()="
+ getInfo() + ", toString()=" + super.toString() + "]";
}
--- a/jdk/test/java/security/Provider/Turkish.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/security/Provider/Turkish.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/**
* @test
- * @bug 6220064 7054918
+ * @bug 6220064 7054918 8130181
* @summary make sure everything works ok in the Turkish local (dotted/dotless i problem)
* @author Andreas Sterbenz
*/
@@ -107,7 +107,7 @@
private static class TProvider extends Provider {
TProvider(String name) {
- super(name, 1.0d, null);
+ super(name, "1.0", null);
put("Signature.MD5withRSA", "com.foo.Sig");
put("Alg.Alias.Signature.MD5RSA", "MD5withRSA");
put("sIGNATURE.shaWITHrsa", "com.foo.Sig");
--- a/jdk/test/java/security/SecureClassLoader/DefineClass.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/security/SecureClassLoader/DefineClass.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -54,7 +54,7 @@
/*
* @test
- * @bug 6826789 8131486
+ * @bug 6826789 8131486 8130181
* @summary Make sure equivalent ProtectionDomains are granted the same
* permissions when the CodeSource URLs are different but resolve
* to the same ip address after name service resolution.
@@ -194,7 +194,7 @@
private static class TestProvider extends Provider {
TestProvider() {
- super("Test8131486", 0.0, "For testing only");
+ super("Test8131486", "0.0", "For testing only");
putService(new Provider.Service(this, "KeyStore", "Test8131486",
"DefineClass$TestKeyStore", null, null));
}
--- a/jdk/test/java/security/Security/AddProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/security/Security/AddProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8001319
+ * @bug 8001319 8130181
* @summary check that SecurityPermission insertProvider permission is enforced
* correctly
* @run main/othervm/policy=AddProvider.policy.1 AddProvider 1
@@ -53,7 +53,7 @@
private static class TestProvider extends Provider {
TestProvider(String name) {
- super(name, 0.0, "Not for use in production systems!");
+ super(name, "0.0", "Not for use in production systems!");
}
}
}
--- a/jdk/test/java/security/Security/ClassLoaderDeadlock/provider/HashProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/security/Security/ClassLoaderDeadlock/provider/HashProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,7 +27,7 @@
public final class HashProvider extends Provider {
public HashProvider() {
- super("HashProvider", 1.0d, "");
+ super("HashProvider", "1.0", "");
// register all algorithms from the following providers into this provider
// the security framework will try to load them via the classloader of this provider
addAlgorithms("SunRsaSign");
--- a/jdk/test/java/security/Security/SynchronizedAccess.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/security/Security/SynchronizedAccess.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4162583 7054918
+ * @bug 4162583 7054918 8130181
* @library ../testlibrary
* @summary Make sure Provider api implementations are synchronized properly
*/
@@ -61,7 +61,7 @@
public void run() {
Provider[] provs = new Provider[10];
for (int i=0; i < provs.length; i++)
- provs[i] = new MyProvider("name"+i, 1, "test");
+ provs[i] = new MyProvider("name"+i, "1", "test");
int rounds = 20;
while (rounds-- > 0) {
@@ -86,7 +86,7 @@
}
class MyProvider extends Provider {
- public MyProvider(String name, double version, String info) {
+ public MyProvider(String name, String version, String info) {
super(name, version, info);
put("Signature.sigalg", "sigimpl");
}
--- a/jdk/test/java/security/Security/removing/RemoveProviderByIdentity.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/security/Security/removing/RemoveProviderByIdentity.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4208414
+ * @bug 4208414 8130181
* @summary Providers should be removed "by-identity" - not "by-value"
*/
@@ -34,7 +34,7 @@
public static void main(String[] args) throws Exception {
String PROVIDER_NAME = "myprovider";
- Security.addProvider(new MyProvider(PROVIDER_NAME, 1, "test"));
+ Security.addProvider(new MyProvider(PROVIDER_NAME, "1", "test"));
if (Security.getProvider(PROVIDER_NAME) == null)
throw new Exception("provider not registered");
@@ -45,7 +45,7 @@
}
class MyProvider extends Provider {
- public MyProvider(String name, double version, String info) {
+ public MyProvider(String name, String version, String info) {
super(name, version, info);
put("Signature.sigalg", "sigimpl");
}
--- a/jdk/test/java/security/Signature/SignatureGetAlgorithm.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/security/Signature/SignatureGetAlgorithm.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,7 +27,7 @@
/*
* @test
- * @bug 8014620
+ * @bug 8014620 8130181
* @summary Signature.getAlgorithm return null in special case
* @run main/othervm SignatureGetAlgorithm
* @author youdwei
@@ -49,7 +49,7 @@
public static class TestProvider extends Provider {
TestProvider() {
- super("testSignatureGetAlgorithm", 1.0, "test Signatures");
+ super("testSignatureGetAlgorithm", "1.0", "test Signatures");
put("Signature.MySignatureAlg",
"SignatureGetAlgorithm$MySignatureAlg");
}
--- a/jdk/test/java/security/cert/CertPathBuilder/StubProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/security/cert/CertPathBuilder/StubProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,14 +23,14 @@
/*
*
- * @bug 4408997
+ * @bug 4408997 8130181
* Used by GetInstance test.
*/
import java.security.Provider;
public class StubProvider extends Provider {
public StubProvider() {
- super( "StubProvider", 1.1, "No Info");
+ super( "StubProvider", "1.1", "No Info");
put("CertPathBuilder.PKIX", "StubProviderImpl");
}
}
--- a/jdk/test/java/text/Format/DateFormat/Bug4322313.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/text/Format/DateFormat/Bug4322313.java Fri Aug 26 10:14:15 2016 -0700
@@ -158,7 +158,8 @@
try {
for (int i=0; i < locs.length; i++) {
- Locale.setDefault(locs[i]);
+ Locale locale = locs[i];
+ Locale.setDefault(locale);
for (int j=0; j < formats.length; j++) {
TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
@@ -174,7 +175,7 @@
catch (Exception e) {
err = true;
System.err.println("\tParse Error [Locale=" +
- Locale.getDefault() + ", " + formats[j] +
+ locale + ", " + formats[j] +
"/\"" + valids[k][0] +
"\"] Unexpected Exception occurred: " + e);
continue;
@@ -184,7 +185,7 @@
if (offset != ((Integer)valids[k][4]).intValue()) {
err = true;
System.err.println("\tParse Error [Locale=" +
- Locale.getDefault() + ", " + formats[j] +
+ locale + ", " + formats[j] +
"/\"" + valids[k][0] +
"\"] invalid index: expected:" + valids[k][4] +
", got:" + offset);
@@ -193,14 +194,14 @@
if (date.getTime() != ((Long)valids[k][1]).longValue()) {
err = true;
System.err.println("\tParse Error [Locale=" +
- Locale.getDefault() + ", " + formats[j] +
+ locale + ", " + formats[j] +
"/\"" + valids[k][0] +
"\"] expected:" + valids[k][1] +
", got:" + date.getTime() + ", " + date);
} else {
/*
logln("\tParse Okay [Locale=" +
- Locale.getDefault() + ", " + formats[j] +
+ locale) + ", " + formats[j] +
"/\"" + valids[k][0] +
"\"] expected:" + valids[k][1] +
", got:" + date.getTime() + ", " + date);
@@ -212,7 +213,7 @@
catch (Exception e) {
err = true;
System.err.println("\tParse Error [Locale=" +
- Locale.getDefault() + ", " + formats[j] +
+ locale + ", " + formats[j] +
"/\"" + valids[k][0] +
"\"] Unexpected Exception occurred: " + e);
continue;
@@ -245,14 +246,14 @@
expected.equals("GMT+00:00"))) {
err = true;
System.err.println("\tFormat Error [Locale=" +
- Locale.getDefault() + ", " +
+ locale + ", " +
formats[j] + "/\"" + valids[k][0] +
"\"] expected:" + valids[k][2+j] +
", got:" + s + ", " + date);
} else {
/*
logln("\tFormat Okay [Locale=" +
- Locale.getDefault() + ", " +
+ locale + ", " +
formats[j] + "/\"" + valids[k][0] +
"\"] expected:" + valids[k][2+j] +
", got:" + s + ", " + date);
@@ -271,7 +272,7 @@
if (date != null) {
err = true;
System.err.println("\tParse Error [Locale=" +
- Locale.getDefault() + ", " + formats[j] +
+ locale + ", " + formats[j] +
"/\"" + invalids[k][0] +
"\"] expected:null , got:" + date);
}
@@ -279,14 +280,14 @@
if (offset != ((Integer)invalids[k][1]).intValue()) {
err = true;
System.err.println("\tParse Error [Locale=" +
- Locale.getDefault() + ", " + formats[j] +
+ locale + ", " + formats[j] +
"/\"" + invalids[k][0] +
"\"] incorrect offset. expected:" +
invalids[k][1] + ", got: " + offset);
} else {
/*
logln("\tParse Okay [Locale=" +
- Locale.getDefault() + ", " + formats[j] +
+ locale + ", " + formats[j] +
"/\"" + invalids[k][0] +
"\"] correct offset: " + offset);
*/
@@ -295,7 +296,7 @@
catch (Exception e) {
err = true;
System.err.println("\tParse Error [Locale=" +
- Locale.getDefault() + ", " + formats[j] +
+ locale + ", " + formats[j] +
"/\"" + invalids[k][0] +
"\"] Unexpected Exception occurred: " + e);
}
@@ -315,14 +316,14 @@
if (offset != ((Integer)invalids[k][1]).intValue()) {
err = true;
System.err.println("\tParse Error [Locale=" +
- Locale.getDefault() + ", " + formats[j] +
+ locale + ", " + formats[j] +
"/\"" + invalids[k][0] +
"\"] Expected exception occurred with an incorrect offset. expected:" +
invalids[k][1] + ", got: " + offset);
} else {
/*
logln("\tParse Okay [Locale=" +
- Locale.getDefault() + ", " + formats[j] +
+ locale + ", " + formats[j] +
"/\"" + invalids[k][0] +
"\"] Expected exception occurred with an correct offset: "
+ offset);
@@ -332,7 +333,7 @@
catch (Exception e) {
err = true;
System.err.println("\tParse Error [Locale=" +
- Locale.getDefault() + ", " + formats[j] +
+ locale + ", " + formats[j] +
"/\"" + invalids[k][0] +
"\"] Invalid exception occurred: " + e);
}
@@ -340,7 +341,7 @@
if (!correctParseException) {
err = true;
System.err.println("\tParse Error: [Locale=" +
- Locale.getDefault() + ", " + formats[j] +
+ locale + ", " + formats[j] +
"/\"" + invalids[k][0] +
"\"] Expected exception didn't occur.");
}
--- a/jdk/test/java/text/Format/DateFormat/Bug4407042.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/text/Format/DateFormat/Bug4407042.java Fri Aug 26 10:14:15 2016 -0700
@@ -26,6 +26,7 @@
* @bug 4407042
* @summary Make sure that cloned SimpleDateFormat objects work
* independently in multiple threads.
+ * @library /java/text/testlib
* @run main Bug4407042 10
*/
@@ -44,8 +45,9 @@
void test() {
Locale locale = Locale.getDefault();
- if (locale.equals(new Locale("th", "TH")) ||
- locale.equals(new Locale("hi", "IN"))) {
+ if (!TestUtils.usesAsciiDigits(locale)
+ || !TestUtils.usesGregorianCalendar(locale)) {
+ System.out.println("Skipping this test because locale is " + locale);
return;
}
--- a/jdk/test/java/text/Format/DateFormat/Bug4845901.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/text/Format/DateFormat/Bug4845901.java Fri Aug 26 10:14:15 2016 -0700
@@ -27,6 +27,8 @@
* @summary Make sure that SimpleDateFormat.parse() can distinguish
* the same time zone abbreviation for standard and daylight saving
* time.
+ * @library /java/text/testlib
+ * @run main Bug4845901
*/
import java.util.*;
@@ -34,6 +36,12 @@
public class Bug4845901 {
public static void main (String args[]) {
+ Locale locale = Locale.getDefault();
+ if (!TestUtils.usesGregorianCalendar(locale)) {
+ System.out.println("Skipping this test because locale is " + locale);
+ return;
+ }
+
TimeZone savedTZ = TimeZone.getDefault();
TimeZone.setDefault(TimeZone.getTimeZone("Australia/Sydney"));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss.SSS z");
--- a/jdk/test/java/text/Format/DateFormat/Bug6530336.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/text/Format/DateFormat/Bug6530336.java Fri Aug 26 10:14:15 2016 -0700
@@ -24,6 +24,7 @@
/*
* @test
* @bug 6530336 6537997 8008577
+ * @library /java/text/testlib
* @run main/othervm -Djava.locale.providers=COMPAT,SPI Bug6530336
*/
@@ -43,7 +44,6 @@
try {
Locale locales[] = Locale.getAvailableLocales();
- Locale locale_Japan = new Locale("ja", "JP", "JP");
TimeZone timezone_LA = TimeZone.getTimeZone("America/Los_Angeles");
TimeZone.setDefault(timezone_LA);
@@ -60,12 +60,12 @@
Date[] dates = new Date[2];
for (int i = 0; i < locales.length; i++) {
- if (locales[i].getLanguage().equals("th") ||
- locales[i].equals(locale_Japan)) {
+ Locale locale = locales[i];
+ if (!TestUtils.usesGregorianCalendar(locale)) {
continue;
}
- Locale.setDefault(locales[i]);
+ Locale.setDefault(locale);
for (int j = 0; j < timezones.length; j++) {
Calendar cal = Calendar.getInstance(timezones[j]);
@@ -83,7 +83,7 @@
if (!expected[j].equals(date_LA)) {
System.err.println("Got wrong Pacific time (" +
- date_LA + ") for (" + date + ") in " + locales[i] +
+ date_LA + ") for (" + date + ") in " + locale +
" in " + timezones[j] +
".\nExpected=" + expected[j]);
err = true;
--- a/jdk/test/java/text/Format/DateFormat/DateFormatRegression.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/text/Format/DateFormat/DateFormatRegression.java Fri Aug 26 10:14:15 2016 -0700
@@ -72,7 +72,6 @@
}
public void Test4052408() {
-
DateFormat fmt = DateFormat.getDateTimeInstance(DateFormat.SHORT,
DateFormat.SHORT, Locale.US);
Date date = new Date(97, Calendar.MAY, 3, 8, 55);
@@ -164,7 +163,9 @@
}
public void Test4059917() {
- if (Locale.getDefault().equals(new Locale("hi", "IN"))) {
+ Locale locale = Locale.getDefault();
+ if (!TestUtils.usesAsciiDigits(locale)) {
+ logln("Skipping this test because locale is " + locale);
return;
}
@@ -621,25 +622,6 @@
}
}
- /*
- Synopsis: Chinese time zone CTT is not recogonized correctly.
- Description: Platform Chinese Windows 95 - ** Time zone set to CST **
- */
- public void Test4108407() {
-
- long l = System.currentTimeMillis();
- logln("user.timezone = " + System.getProperty("user.timezone", "?"));
- logln("Time Zone :" +
- DateFormat.getDateInstance().getTimeZone().getID());
- logln("Default format :" +
- DateFormat.getDateInstance().format(new Date(l)));
- logln("Full format :" +
- DateFormat.getDateInstance(DateFormat.FULL).format(new
- Date(l)));
- logln("*** Set host TZ to CST ***");
- logln("*** THE RESULTS OF THIS TEST MUST BE VERIFIED MANUALLY ***");
- }
-
/**
* SimpleDateFormat won't parse "GMT"
*/
--- a/jdk/test/java/text/Format/DateFormat/bug4358730.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/text/Format/DateFormat/bug4358730.java Fri Aug 26 10:14:15 2016 -0700
@@ -47,23 +47,17 @@
};
int[] year = {2, 20, 200, 2000};
- SimpleDateFormat sdf = new SimpleDateFormat();
int datasize = data.length;
int nPatterns = data[0].length;
public void Test4358730() {
- Locale locale = Locale.getDefault();
- if (locale.equals(new Locale("th", "TH")) ||
- locale.equals(new Locale("hi", "IN"))) {
- return;
- }
-
TimeZone saveZone = TimeZone.getDefault();
Locale saveLocale = Locale.getDefault();
try {
TimeZone.setDefault(TimeZone.getTimeZone("PST"));
Locale.setDefault(new Locale("en", "US"));
+ SimpleDateFormat sdf = new SimpleDateFormat();
for (int i = 0; i < datasize; i++) {
Date d = new Date(year[i]-1900, 10, 15);
--- a/jdk/test/java/text/Format/MessageFormat/MessageRegression.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/text/Format/MessageFormat/MessageRegression.java Fri Aug 26 10:14:15 2016 -0700
@@ -28,6 +28,7 @@
* 4142938 4169959 4232154 4293229
* @summary Regression tests for MessageFormat and associated classes
* @library /java/text/testlib
+ * @run main MessageRegression
*/
/*
(C) Copyright Taligent, Inc. 1996 - All Rights Reserved
@@ -121,14 +122,15 @@
* More robust message formats.
*/
public void Test4031438() {
+ Locale locale = Locale.getDefault();
+ if (!TestUtils.usesAsciiDigits(locale)) {
+ logln("Skipping this test because locale is " + locale);
+ return;
+ }
+
String pattern1 = "Impossible {1} has occurred -- status code is {0} and message is {2}.";
String pattern2 = "Double '' Quotes {0} test and quoted '{1}' test plus 'other {2} stuff'.";
- // If the current locale is hi_IN, skip this test case.
- if (Locale.getDefault().equals(new Locale("hi", "IN"))) {
- return;
- }
-
MessageFormat messageFormatter = new MessageFormat("");
try {
--- a/jdk/test/java/text/Format/NumberFormat/NumberRegression.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/text/Format/NumberFormat/NumberRegression.java Fri Aug 26 10:14:15 2016 -0700
@@ -32,7 +32,7 @@
* 4217661 4243011 4243108 4330377 4233840 4241880 4833877 8008577
* @summary Regression tests for NumberFormat and associated classes
* @library /java/text/testlib
- * @build IntlTest HexDumpReader
+ * @build IntlTest HexDumpReader TestUtils
* @modules java.base/sun.util.resources
* @compile -XDignore.symbol.file NumberRegression.java
* @run main/othervm -Djava.locale.providers=COMPAT,SPI NumberRegression
@@ -100,6 +100,12 @@
*/
public void Test4088161 (){
+ Locale locale = Locale.getDefault();
+ if (!TestUtils.usesAsciiDigits(locale)) {
+ logln("Skipping this test because locale is " + locale);
+ return;
+ }
+
DecimalFormat df = new DecimalFormat();
double d = 100;
df.setMinimumFractionDigits(0);
@@ -114,8 +120,7 @@
FieldPosition fp2 = new FieldPosition(0);
logln("maxFractionDigits = " + df.getMaximumFractionDigits());
df.format(d, sBuf2, fp2);
- String expected = Locale.getDefault().equals(new Locale("hi", "IN")) ?
- "\u0967\u0966\u0966" : "100";
+ String expected = "100";
if (!sBuf2.toString().equals(expected))
errln(" format(d) = '" + sBuf2 + "'");
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/text/testlib/TestUtils.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.text.DecimalFormatSymbols;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.Locale;
+
+import java.util.Locale.Builder;
+
+/**
+ * TestUtils provides utility methods to get a locale-dependent attribute.
+ * For example,
+ * - whether or not a non-Gregorian calendar is used
+ * - whether or not non-ASCII digits are used
+ *
+ * This class was developed to help testing for internationalization &
+ * localization and is not versatile.
+ */
+public class TestUtils {
+
+ /**
+ * Returns true if the give locale uses Gregorian calendar.
+ */
+ public static boolean usesGregorianCalendar(Locale locale) {
+ return Calendar.getInstance(locale).getClass() == GregorianCalendar.class;
+ }
+
+ /**
+ * Returns true if the given locale uses ASCII digits.
+ */
+ public static boolean usesAsciiDigits(Locale locale) {
+ return DecimalFormatSymbols.getInstance(locale).getZeroDigit() == '0';
+ }
+
+ /**
+ * Returns true if the given locale has a special variant which is treated
+ * as ill-formed in BCP 47.
+ *
+ * BCP 47 requires a variant subtag to be 5 to 8 alphanumerics or a
+ * single numeric followed by 3 alphanumerics.
+ * However, note that this methods doesn't check a variant so rigorously
+ * because this is a utility method for testing. Intended special variants
+ * are: JP, NY, and TH, which can be commonly provided by
+ * Locale.getAvailableLocales().
+ *
+ */
+ public static boolean hasSpecialVariant(Locale locale) {
+ String variant = locale.getVariant();
+ return !variant.isEmpty()
+ && "JP".equals(variant) || "NY".equals(variant) || "TH".equals(variant);
+ }
+
+}
--- a/jdk/test/java/time/tck/java/time/TCKZoneOffset.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/time/tck/java/time/TCKZoneOffset.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -419,6 +419,21 @@
ZoneOffset.ofHoursMinutesSeconds(-19, 0, 0);
}
+ @Test(expectedExceptions=DateTimeException.class)
+ public void test_factory_int_hours_minutes_seconds_minutesMinValue() {
+ ZoneOffset.ofHoursMinutesSeconds(0, Integer.MIN_VALUE, -1);
+ }
+
+ @Test(expectedExceptions=DateTimeException.class)
+ public void test_factory_int_hours_minutes_seconds_secondsMinValue() {
+ ZoneOffset.ofHoursMinutesSeconds(0, 0, Integer.MIN_VALUE);
+ }
+
+ @Test(expectedExceptions=DateTimeException.class)
+ public void test_factory_int_hours_minutes_seconds_minutesAndSecondsMinValue() {
+ ZoneOffset.ofHoursMinutesSeconds(0, Integer.MIN_VALUE, Integer.MIN_VALUE);
+ }
+
//-----------------------------------------------------------------------
@Test
public void test_factory_ofTotalSeconds() {
@@ -437,6 +452,11 @@
ZoneOffset.ofTotalSeconds(-18 * 60 * 60 - 1);
}
+ @Test(expectedExceptions=DateTimeException.class)
+ public void test_factory_ofTotalSeconds_minValue() {
+ ZoneOffset.ofTotalSeconds(Integer.MIN_VALUE);
+ }
+
//-----------------------------------------------------------------------
// from()
//-----------------------------------------------------------------------
--- a/jdk/test/java/util/Calendar/CalendarLimitTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/util/Calendar/CalendarLimitTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -24,8 +24,8 @@
/**
* @test
* @bug 4033662
+ * @summary test for limit on Calendar
* @library /java/text/testlib
- * @summary test for limit on Calendar
* @run main CalendarLimitTest -verbose
*/
@@ -62,6 +62,12 @@
static long ORIGIN; // This is the *approximate* point at which BC switches to AD
public static void main(String argv[]) throws Exception {
+ Locale locale = Locale.getDefault();
+ if (!TestUtils.usesGregorianCalendar(locale)) {
+ System.out.println("Skipping this test because locale is " + locale);
+ return;
+ }
+
new CalendarLimitTest().run(argv);
}
--- a/jdk/test/java/util/Calendar/CalendarRegression.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/util/Calendar/CalendarRegression.java Fri Aug 26 10:14:15 2016 -0700
@@ -32,6 +32,7 @@
* 4652815 4652830 4740554 4936355 4738710 4633646 4846659 4822110 4960642
* 4973919 4980088 4965624 5013094 5006864 8152077
* @library /java/text/testlib
+ * @run main CalendarRegression
*/
import java.lang.reflect.*;
@@ -531,6 +532,12 @@
}
public void Test4100311() {
+ Locale locale = Locale.getDefault();
+ if (!TestUtils.usesGregorianCalendar(locale)) {
+ logln("Skipping this test because locale is " + locale);
+ return;
+ }
+
GregorianCalendar cal = (GregorianCalendar)Calendar.getInstance();
cal.set(Calendar.YEAR, 1997);
cal.set(Calendar.DAY_OF_YEAR, 1);
@@ -541,7 +548,9 @@
}
public void Test4103271() {
- if (Locale.getDefault().equals(new Locale("th", "TH"))) {
+ Locale locale = Locale.getDefault();
+ if (!TestUtils.usesGregorianCalendar(locale)) {
+ logln("Skipping this test because locale is " + locale);
return;
}
@@ -768,6 +777,12 @@
}
public void Test4114578() {
+ Locale locale = Locale.getDefault();
+ if (!TestUtils.usesGregorianCalendar(locale)) {
+ logln("Skipping this test because locale is " + locale);
+ return;
+ }
+
int ONE_HOUR = 60*60*1000;
TimeZone saveZone = TimeZone.getDefault();
boolean fail = false;
@@ -847,6 +862,12 @@
* Check isLeapYear for BC years.
*/
public void Test4125881() {
+ Locale locale = Locale.getDefault();
+ if (!TestUtils.usesGregorianCalendar(locale)) {
+ logln("Skipping this test because locale is " + locale);
+ return;
+ }
+
GregorianCalendar cal = (GregorianCalendar) Calendar.getInstance();
DateFormat fmt = new SimpleDateFormat("MMMM d, yyyy G");
cal.clear();
@@ -865,7 +886,9 @@
* at 45 BC, and not have leap years before then).
*/
public void Test4125892() {
- if (Locale.getDefault().equals(new Locale("th", "TH"))) {
+ Locale locale = Locale.getDefault();
+ if (!TestUtils.usesGregorianCalendar(locale)) {
+ logln("Skipping this test because locale is " + locale);
return;
}
@@ -1276,7 +1299,9 @@
* This bug relies on the TimeZone bug 4173604 to also be fixed.
*/
public void Test4173516() {
- if (Locale.getDefault().equals(new Locale("th", "TH"))) {
+ Locale locale = Locale.getDefault();
+ if (!TestUtils.usesGregorianCalendar(locale)) {
+ logln("Skipping this test because locale is " + locale);
return;
}
@@ -1755,7 +1780,10 @@
* get(int) changes internal states of a Calendar.
*/
public void Test4685354() {
- if (Locale.getDefault().equals(new Locale("hi", "IN"))) {
+ Locale locale = Locale.getDefault();
+ if (!TestUtils.usesAsciiDigits(locale)
+ || !TestUtils.usesGregorianCalendar(locale)) {
+ logln("Skipping this test because locale is " + locale);
return;
}
@@ -1860,8 +1888,9 @@
* get(int) changes internal states of a Calendar.
*/
public void Test4655637() {
- // Skip this test case if it's Thai locale
- if (Locale.getDefault().equals(new Locale("th", "TH"))) {
+ Locale locale = Locale.getDefault();
+ if (!TestUtils.usesGregorianCalendar(locale)) {
+ logln("Skipping this test because locale is " + locale);
return;
}
--- a/jdk/test/java/util/Calendar/CalendarTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/util/Calendar/CalendarTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -24,8 +24,9 @@
/**
* @test
* @bug 4064654 4374886 4984320 4984574 4944795
+ * @summary test for Calendar
* @library /java/text/testlib
- * @summary test for Calendar
+ * @run main CalendarTest
* @key randomness
*/
@@ -203,7 +204,9 @@
}
public void TestGenericAPI() {
- if (Locale.getDefault().equals(new Locale("th", "TH"))) {
+ Locale locale = Locale.getDefault();
+ if (!TestUtils.usesGregorianCalendar(locale)) {
+ logln("Skipping this test because locale is " + locale);
return;
}
@@ -559,7 +562,9 @@
// Test the behavior of GMT vs. local time
public void TestGMTvsLocal4064654() {
- if (Locale.getDefault().equals(new Locale("th", "TH"))) {
+ Locale locale = Locale.getDefault();
+ if (!TestUtils.usesGregorianCalendar(locale)) {
+ logln("Skipping this test because locale is " + locale);
return;
}
@@ -875,10 +880,6 @@
// Verify that the fields are as expected (mostly zero) at the epoch start.
// Note that we adjust for the default timezone to get most things to zero.
public void TestEpochStartFields() {
- if (Locale.getDefault().equals(new Locale("th", "TH"))) {
- return;
- }
-
String[][] lt = {
{"en", "US", "US/Pacific"}, /* First day = 1, Minimum day = 1 */
{"en", "US", "America/Anchorage"}, /* First day = 1, Minimum day = 1 */
--- a/jdk/test/java/util/Calendar/bug4409072.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/util/Calendar/bug4409072.java Fri Aug 26 10:14:15 2016 -0700
@@ -26,6 +26,7 @@
* @bug 4409072
* @summary tests for set(), add(), and roll() with various week parameters.
* @library /java/text/testlib
+ * @run main bug4409072
*/
import java.util.*;
@@ -41,7 +42,9 @@
* (e.g. add(), roll(), set())
*/
public void Test4409072() {
- if (Locale.getDefault().equals(new Locale("th", "TH"))) {
+ Locale locale = Locale.getDefault();
+ if (!TestUtils.usesGregorianCalendar(locale)) {
+ logln("Skipping this test because locale is " + locale);
return;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Date/Bug8135055.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8135055
+ * @summary Test java.sql.TimeStamp instance should come after java.util.Date
+ * if Nanos component of TimeStamp is not equal to 0 milliseconds.
+*/
+import java.sql.Timestamp;
+import java.util.Date;
+
+public class Bug8135055 {
+
+ public static void main(String[] args) throws InterruptedException {
+ for (int i = 0; i < 1000; i++) {
+ Date d = new Date();
+ Timestamp ts = new Timestamp(d.getTime());
+ if (d.after(ts)) {
+ throw new RuntimeException("date with time " + d.getTime()
+ + " should not be after TimeStamp , Nanos component of "
+ + "TimeStamp is " +ts.getNanos());
+ }
+ Thread.sleep(1);
+ }
+ }
+}
--- a/jdk/test/java/util/Locale/LocaleCategory.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/util/Locale/LocaleCategory.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -30,6 +30,11 @@
public static void main(String[] args) {
Locale reservedLocale = Locale.getDefault();
+ if (TestUtils.hasSpecialVariant(reservedLocale)) {
+ System.out.println("Skipping this test because locale is " + reservedLocale);
+ return;
+ }
+
try {
Locale.Builder builder = new Locale.Builder();
--- a/jdk/test/java/util/Locale/LocaleCategory.sh Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/util/Locale/LocaleCategory.sh Fri Aug 26 10:14:15 2016 -0700
@@ -26,7 +26,8 @@
# @bug 4700857 6997928 7079486
# @summary tests for Locale.getDefault(Locale.Category) and
# Locale.setDefault(Locale.Category, Locale)
-# @build LocaleCategory
+# @library /java/text/testlib
+# @build LocaleCategory TestUtils
# @run shell/timeout=600 LocaleCategory.sh
if [ "${TESTSRC}" = "" ]
@@ -46,7 +47,9 @@
echo "TESTCLASSES not set. Test cannot execute. Failed."
exit 1
fi
+
echo "TESTCLASSES=${TESTCLASSES}"
+echo "TESTCLASSPATH=${TESTCLASSPATH}"
echo "CLASSPATH=${CLASSPATH}"
# set platform-dependent variables
@@ -69,7 +72,7 @@
# test user.xxx.display user.xxx.format properties
# run
-RUNCMD="${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -classpath ${TESTCLASSES} -Duser.language.display=ja -Duser.language.format=zh LocaleCategory"
+RUNCMD="${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -classpath ${TESTCLASSPATH} -Duser.language.display=ja -Duser.language.format=zh LocaleCategory"
echo ${RUNCMD}
${RUNCMD}
@@ -85,7 +88,7 @@
# test user.xxx properties overriding user.xxx.display/format
# run
-RUNCMD="${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -classpath ${TESTCLASSES} -Duser.language=en -Duser.language.display=ja -Duser.language.format=zh LocaleCategory"
+RUNCMD="${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -classpath ${TESTCLASSPATH} -Duser.language=en -Duser.language.display=ja -Duser.language.format=zh LocaleCategory"
echo ${RUNCMD}
${RUNCMD}
--- a/jdk/test/java/util/TimeZone/Bug4322313.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/util/TimeZone/Bug4322313.java Fri Aug 26 10:14:15 2016 -0700
@@ -90,7 +90,9 @@
TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
for (int i = 0; i < locs.length; i++) {
- Locale.setDefault(locs[i]);
+ Locale locale = locs[i];
+ Locale.setDefault(locale);
+
/* Okay case */
for (int k = 0; k < VALIDS.length; k++) {
@@ -100,12 +102,12 @@
if (!tz.getID().equals(VALIDS[k][2])) {
err = true;
System.err.println("\tFailed [Locale=" +
- Locale.getDefault() + ", \"" + VALIDS[k][0] +
+ locale + ", \"" + VALIDS[k][0] +
"\"] Invalid TimeZone ID, expected:" +
VALIDS[k][2] + ", got:" + tz.getID() + ", " + tz);
} else {
logln("\tPassed [Locale=" +
- Locale.getDefault() + ", \"" + VALIDS[k][0] +
+ locale + ", \"" + VALIDS[k][0] +
"\"] Valid TimeZone ID, got:" + VALIDS[k][2]);
}
@@ -113,12 +115,12 @@
if (offset != (int)VALIDS[k][1]) {
err = true;
System.err.println("\tFailed [Locale=" +
- Locale.getDefault() + ", \"" + VALIDS[k][0] +
+ locale + ", \"" + VALIDS[k][0] +
"\"] Invalid RawOffset, expected:" + VALIDS[k][1] +
", got:" + offset + ", " + tz);
} else {
logln("\tPassed [Locale=" +
- Locale.getDefault() + ", \"" + VALIDS[k][0] +
+ locale + ", \"" + VALIDS[k][0] +
"\"] Vaild RawOffset, got:" + offset);
}
@@ -126,12 +128,12 @@
if (offset != 0) {
err = true;
System.err.println("\tFailed [Locale=" +
- Locale.getDefault() + ", \"" + VALIDS[k][0] +
+ locale + ", \"" + VALIDS[k][0] +
"\"] DSTSavings should be zero, got:" + offset +
", " + tz);
} else {
logln("\tPassed [Locale=" +
- Locale.getDefault() + ", \"" + VALIDS[k][0] +
+ locale + ", \"" + VALIDS[k][0] +
"\"] DSTSavings is zero.");
}
}
@@ -144,12 +146,12 @@
if (!tz.getID().equals("GMT")) {
err = true;
System.err.println("\tFailed [Locale=" +
- Locale.getDefault() + ", \"" + INVALIDS[k] +
+ locale + ", \"" + INVALIDS[k] +
"\"] Invalid TimeZone ID, expected:GMT, got:" +
tz.getID() + ", " + tz);
} else {
logln("\tPassed [Locale=" +
- Locale.getDefault() + ", \"" + INVALIDS[k] +
+ locale + ", \"" + INVALIDS[k] +
"\"] Valid TimeZone ID, got:" + tz.getID());
}
@@ -157,12 +159,12 @@
if (offset != 0) {
err = true;
System.err.println("\tFailed [Locale=" +
- Locale.getDefault() + ", \"" + INVALIDS[k] +
+ locale + ", \"" + INVALIDS[k] +
"\"] RawOffset should be zero, got:" + offset +
", " + tz);
} else {
logln("\tPassed [Locale=" +
- Locale.getDefault() + ", \"" + INVALIDS[k] +
+ locale + ", \"" + INVALIDS[k] +
"\"] RawOffset is zero.");
}
@@ -170,12 +172,12 @@
if (offset != 0) {
err = true;
System.err.println("\tFailed [Locale=" +
- Locale.getDefault() + ", \"" + INVALIDS[k] +
+ locale + ", \"" + INVALIDS[k] +
"\"] DSTSavings should be zero, got:" + offset +
", " + tz);
} else {
logln("\tPassed [Locale=" +
- Locale.getDefault() + ", \"" + INVALIDS[k] +
+ locale + ", \"" + INVALIDS[k] +
"\"] DSTSavings is zero.");
}
}
@@ -189,25 +191,25 @@
if (!normalizedID.equals(s)) {
err = true;
System.err.println("getDisplayName returned unexpected name: " + s +
- " in " + Locale.getDefault());
+ " in " + locale);
}
s = tz.getDisplayName(true, tz.SHORT);
if (!normalizedID.equals(s)) {
err = true;
System.err.println("getDisplayName returned unexpected name: " + s +
- " in " + Locale.getDefault());
+ " in " + locale);
}
s = tz.getDisplayName(false, tz.LONG);
if (!normalizedID.equals(s)) {
err = true;
System.err.println("getDisplayName returned unexpected name: " + s +
- " in " + Locale.getDefault());
+ " in " + locale);
}
s = tz.getDisplayName(false, tz.SHORT);
if (!normalizedID.equals(s)) {
err = true;
System.err.println("getDisplayName returned unexpected name: " + s +
- " in " + Locale.getDefault());
+ " in " + locale);
}
}
}
--- a/jdk/test/java/util/TimeZone/TimeZoneRegression.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/util/TimeZone/TimeZoneRegression.java Fri Aug 26 10:14:15 2016 -0700
@@ -40,15 +40,6 @@
new TimeZoneRegression().run(args);
}
- public void Test4052967() {
- logln("*** CHECK TIMEZONE AGAINST HOST OS SETTING ***");
- String id = TimeZone.getDefault().getID();
- logln("user.timezone: " + System.getProperty("user.timezone", "<not set>"));
- logln("TimeZone.getDefault().getID(): " + id);
- logln(new Date().toString());
- logln("*** THE RESULTS OF THIS TEST MUST BE VERIFIED MANUALLY ***");
- }
-
public void Test4073209() {
TimeZone z1 = TimeZone.getTimeZone("PST");
TimeZone z2 = TimeZone.getTimeZone("PST");
@@ -167,11 +158,14 @@
}
public void Test4109314() {
+ Locale locale = Locale.getDefault();
+ if (!TestUtils.usesGregorianCalendar(locale)) {
+ logln("Skipping this test because locale is " + locale);
+ return;
+ }
+
// test both SimpleTimeZone and ZoneInfo objects.
// @since 1.4
- if (Locale.getDefault().equals(new Locale("th", "TH"))) {
- return;
- }
sub4109314(getPST());
sub4109314(TimeZone.getTimeZone("PST"));
}
@@ -291,6 +285,12 @@
* When you fix these two problems, the test passes, as expected.
*/
public void Test4126678() {
+ Locale locale = Locale.getDefault();
+ if (!TestUtils.usesGregorianCalendar(locale)) {
+ logln("Skipping this test because locale is " + locale);
+ return;
+ }
+
// Note: this test depends on the PST time zone.
TimeZone initialZone = TimeZone.getDefault();
--- a/jdk/test/java/util/concurrent/tck/ConcurrentHashMapTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/util/concurrent/tck/ConcurrentHashMapTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -360,6 +360,21 @@
}
/**
+ * Test keySet().removeAll on empty map
+ */
+ public void testKeySet_empty_removeAll() {
+ ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap<>();
+ Set<Integer> set = map.keySet();
+ set.removeAll(Collections.emptyList());
+ assertTrue(map.isEmpty());
+ assertTrue(set.isEmpty());
+ // following is test for JDK-8163353
+ set.removeAll(Collections.emptySet());
+ assertTrue(map.isEmpty());
+ assertTrue(set.isEmpty());
+ }
+
+ /**
* keySet.toArray returns contains all keys
*/
public void testKeySetToArray() {
--- a/jdk/test/java/util/jar/JarFile/mrjar/MultiReleaseJarAPI.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/java/util/jar/JarFile/mrjar/MultiReleaseJarAPI.java Fri Aug 26 10:14:15 2016 -0700
@@ -80,7 +80,7 @@
}
try (JarFile jf = new JarFile(multirelease)) {
- Assert.assertFalse(jf.isMultiRelease());
+ Assert.assertTrue(jf.isMultiRelease());
}
try (JarFile jf = new JarFile(multirelease, true, ZipFile.OPEN_READ, Runtime.version())) {
--- a/jdk/test/javax/crypto/JceSecurity/MyProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/javax/crypto/JceSecurity/MyProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* test
- * @bug 6377058
+ * @bug 6377058 8130181
* @summary SunJCE depends on sun.security.provider.SignatureImpl
* behaviour, BC can't load into 1st slot.
* @author Brad R. Wetmore
@@ -34,7 +34,7 @@
public class MyProvider extends Provider {
public MyProvider() {
- super("MyProvider", 1.0, "CertImpl");
+ super("MyProvider", "1.0", "CertImpl");
put("CertificateFactory.X.509", "MyCertificateFactory");
}
}
--- a/jdk/test/javax/crypto/SecretKeyFactory/Provider1.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/javax/crypto/SecretKeyFactory/Provider1.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* test
- * @bug 6370923
+ * @bug 6370923 8130181
* @summary SecretKeyFactory failover does not work
* @author Brad R. Wetmore
*/
@@ -35,7 +35,7 @@
public class Provider1 extends Provider {
public Provider1() {
- super("Provider1", 1.0, "SecretKeyFactory");
+ super("Provider1", "1.0", "SecretKeyFactory");
System.out.println("Creating Provider1");
put("SecretKeyFactory.DUMMY", "com.p1.P1SecretKeyFactory");
}
--- a/jdk/test/javax/crypto/SecretKeyFactory/Provider2.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/javax/crypto/SecretKeyFactory/Provider2.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* test
- * @bug 6370923
+ * @bug 6370923 8130181
* @summary SecretKeyFactory failover does not work
* @author Brad R. Wetmore
*/
@@ -35,7 +35,7 @@
public class Provider2 extends Provider {
public Provider2() {
- super("Provider2", 1.0, "SecretKeyFactory");
+ super("Provider2", "1.0", "SecretKeyFactory");
System.out.println("Creating Provider2");
put("SecretKeyFactory.DUMMY", "com.p2.P2SecretKeyFactory");
}
--- a/jdk/test/javax/imageio/plugins/shared/RepeatingWriteTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/javax/imageio/plugins/shared/RepeatingWriteTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -25,7 +25,6 @@
* @test
*
* @bug 8144991 8150154
- * @ignore 8150154
* @author a.stepanov
* @summary Check if repeating image writing doesn't fail
* (particularly, no AIOOB occurs)
@@ -103,17 +102,18 @@
reader.setInput(iis);
BufferedImage img = reader.read(0);
Color c = new Color(img.getRGB(szRef / 2, szRef / 2));
-
int w = img.getWidth(), h = img.getHeight();
if (w != szRef || h != szRef) {
throw new ImageCheckException(fileName +
- ": invalid image size " + w + " x " + h);
+ ": invalid image size " + w + " x " + h +
+ " expected " + szRef + " x " + szRef);
}
if (!c.equals(cRef)) {
throw new ImageCheckException(fileName +
- ": invalid image color " + c);
+ ": invalid image color " + c +
+ " expected " + cRef);
}
}
@@ -128,6 +128,14 @@
return;
}
+ // If JDK-8163323 is fixed this if block should be removed.
+ if (format.equals("tiff")
+ && (NAMES[i].equals("TYPE_USHORT_555_RGB")
+ || NAMES[i].equals("TYPE_USHORT_565_RGB"))
+ && (NAMES[j].equals("TYPE_USHORT_555_RGB")
+ || NAMES[j].equals("TYPE_USHORT_565_RGB"))) {
+ return;
+ }
String f1 = "test-1-" + NAMES[i] + "." + format;
String f2 = "test-2-" + NAMES[j] + "." + format;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/imageio/plugins/tiff/BogusSecondImageTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,196 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8145014
+ * @summary Verify reader correctly fails for zero-entry IFDs and EOFs
+ * encountered in locateImage().
+ */
+
+import java.awt.Image;
+import java.awt.image.*;
+import java.io.*;
+import java.util.Iterator;
+import javax.imageio.*;
+import javax.imageio.stream.*;
+
+public class BogusSecondImageTest {
+ public static void main(String[] args) throws Throwable {
+ int failures = 0;
+
+ try {
+ testZeroEntryIFD();
+ } catch (Exception e) {
+ System.out.printf("Failed testZeroEntryIFD: %s%n", e);
+ failures++;
+ }
+
+ try {
+ testOutOfStreamIFD();
+ } catch (Exception e) {
+ System.out.printf("Failed testOutOfStreamIFD: %s%n", e);
+ failures++;
+ }
+
+ if (failures == 0) {
+ System.out.println("Test succeeded");
+ } else {
+ throw new RuntimeException
+ ("Test failed with " + failures + " errors");
+ }
+ }
+
+ private static void testZeroEntryIFD() throws Exception {
+ // Create an image.
+ File f = createImageFile();
+
+ ImageOutputStream s = new FileImageOutputStream(f);
+ long length = s.length();
+
+ // Skip the endianness and magic number
+ s.skipBytes(4);
+
+ // Read and seek to offset of 0th IFD
+ long ifd0 = s.readUnsignedInt();
+ s.seek(ifd0);
+
+ // Read number of 0th IFD entries and skip over them
+ int entries0 = s.readUnsignedShort();
+ s.skipBytes(12*entries0);
+
+ // Write the offset of the 1st IFD as the current file length
+ s.write((int)length);
+
+ // Seek to the 1st IFD and write a zero entry count to it
+ s.seek(length);
+ s.writeShort(0);
+ s.close();
+
+ try {
+ Load(f);
+ } catch (Exception e) {
+ throw e;
+ } finally {
+ f.delete();
+ }
+ }
+
+ private static void testOutOfStreamIFD() throws Exception {
+ // Create an image.
+ File f = createImageFile();
+ ImageOutputStream s = new FileImageOutputStream(f);
+ long length = s.length();
+
+ // Skip the endianness and magic number
+ s.skipBytes(4);
+
+ // Read and seek to offset of 0th IFD
+ long ifd0 = s.readUnsignedInt();
+ s.seek(ifd0);
+
+ // Read number of 0th IFD entries and skip over them
+ int entries0 = s.readUnsignedShort();
+ s.skipBytes(12*entries0);
+
+ // Write the offset of the 1st IFD as the current file length + 7
+ s.write((int)length + 7);
+ s.close();
+
+ try {
+ Load(f);
+ } catch (Exception e) {
+ throw e;
+ } finally {
+ f.delete();
+ }
+ }
+
+ private static File createImageFile() throws Exception {
+ BufferedImage im =
+ new BufferedImage(100, 100, BufferedImage.TYPE_BYTE_GRAY);
+ File f = File.createTempFile("BogusSecondImage", "tif", new File("."));
+ f.deleteOnExit();
+ if (!ImageIO.write(im, "TIFF", f)) {
+ throw new RuntimeException("Failed to write " + f);
+ }
+ return f;
+ }
+
+ private final static boolean printTrace = false;
+
+ public static void Load(File file) {
+ if (!file.exists()) {
+ throw new IllegalArgumentException(file + " does not exist");
+ } else if (!file.isFile()) {
+ throw new IllegalArgumentException(file + " is not a regular file");
+ } else if (!file.canRead()) {
+ throw new IllegalArgumentException(file + " cannot be read");
+ }
+
+ ImageInputStream input = null;
+ try {
+ input = ImageIO.createImageInputStream(file);
+ } catch (Throwable e) {
+ System.err.println("NOK: createImageInputStream()\t" + e.getMessage());
+ if (printTrace) { e.printStackTrace(); }
+ return;
+ }
+
+ Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("TIFF");
+ if (!readers.hasNext()) { throw new RuntimeException("No readers available for TIFF"); }
+ ImageReader reader = readers.next();
+ reader.setInput(input);
+
+ Image images[] = null;
+ int numImages = 0;
+
+ int failures = 0;
+ try {
+ numImages = reader.getNumImages(true);
+ images = new Image[numImages];
+ } catch (Throwable e) {
+ failures++;
+ System.err.println("NOK: getNumImages()\t" + e.getMessage());
+ if (printTrace) { e.printStackTrace(); }
+ }
+ System.out.printf("numImages %d%n", numImages);
+
+ for (int i = 0; i < numImages; i++) {
+ System.out.printf("reading image %d%n", i);
+ try {
+ images[i] = reader.read(i);
+ } catch (Throwable e) {
+ failures++;
+ System.err.println("NOK: read()\t" + e.getMessage());
+ if (printTrace) { e.printStackTrace(); }
+ }
+ }
+
+ if (failures == 0) {
+ System.err.println("OK");
+ } else {
+ throw new RuntimeException("NOK");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/imageio/plugins/tiff/IFDTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8152966
+ * @summary Verify that casting of TIFFDirectory to TIFFIFD has been fixed.
+ */
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import javax.imageio.*;
+import javax.imageio.metadata.*;
+import javax.imageio.stream.*;
+
+
+import javax.imageio.plugins.tiff.*;
+
+
+public class IFDTest {
+
+ private ImageWriter getTIFFWriter() {
+
+ java.util.Iterator<ImageWriter> writers =
+ ImageIO.getImageWritersByFormatName("TIFF");
+ if (!writers.hasNext()) {
+ throw new RuntimeException("No readers available for TIFF format");
+ }
+ return writers.next();
+ }
+
+ private void writeImage() throws Exception {
+
+ File file = File.createTempFile("IFDTest", "tif", new File("."));
+ file.deleteOnExit();
+
+ OutputStream s = new BufferedOutputStream(
+ new FileOutputStream("test.tiff"));
+ try (ImageOutputStream ios = ImageIO.createImageOutputStream(s)) {
+
+ ImageWriter writer = getTIFFWriter();
+ writer.setOutput(ios);
+
+ BufferedImage img = new BufferedImage(20, 20, BufferedImage.TYPE_INT_RGB);
+ Graphics g = img.getGraphics();
+ g.setColor(Color.GRAY);
+ g.fillRect(0, 0, 20, 20);
+ g.dispose();
+
+ IIOMetadata metadata = writer.getDefaultImageMetadata(
+ new ImageTypeSpecifier(img), writer.getDefaultWriteParam());
+
+ TIFFDirectory dir = TIFFDirectory.createFromMetadata(metadata);
+
+ int type = TIFFTag.TIFF_IFD_POINTER;
+ int nTag = ExifParentTIFFTagSet.TAG_EXIF_IFD_POINTER;
+ TIFFTag tag = new TIFFTag("Exif IFD", nTag, 1 << type);
+ TIFFTagSet sets[] = {ExifTIFFTagSet.getInstance()};
+
+ TIFFField f = new TIFFField(tag, type, 42L, new TIFFDirectory(sets, tag));
+ dir.addTIFFField(f);
+
+ writer.write(new IIOImage(img, null, dir.getAsMetadata()));
+
+ ios.flush();
+ writer.dispose();
+ } finally {
+ s.close();
+ file.delete();
+ }
+ }
+
+
+ public static void main(String[] args) throws Exception {
+ (new IFDTest()).writeImage();
+ }
+}
--- a/jdk/test/javax/net/ssl/sanity/pluggability/CheckSSLContextExport.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/javax/net/ssl/sanity/pluggability/CheckSSLContextExport.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4635454 6208022
+ * @bug 4635454 6208022 8130181
* @summary Check pluggability of SSLContext class.
*/
import java.security.*;
@@ -34,7 +34,7 @@
private static String info = "test provider for JSSE pluggability";
public CheckSSLContextExport(String protocols[]) {
- super("TestJSSEPluggability", 1.0, info);
+ super("TestJSSEPluggability", "1.0", info);
for (int i=0; i<protocols.length; i++) {
put("SSLContext." + protocols[i], "MySSLContextImpl");
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/print/attribute/ServiceDlgPageRangeTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,170 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/*
+ * @test
+ * @bug 5080098
+ * @summary Verify if PageRanges option is disabled for Non service-formatted
+ * flavors.
+ * @run main/manual ServiceDlgPageRangeTest
+ */
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+import javax.print.DocFlavor;
+import javax.print.PrintService;
+import javax.print.PrintServiceLookup;
+import javax.print.ServiceUI;
+import javax.print.attribute.Attribute;
+import javax.print.attribute.HashPrintRequestAttributeSet;
+import javax.print.attribute.standard.PageRanges;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+
+public class ServiceDlgPageRangeTest {
+
+ private static Thread mainThread;
+ private static boolean testPassed;
+ private static boolean testGeneratedInterrupt;
+ private static DocFlavor flavor = DocFlavor.INPUT_STREAM.JPEG;
+ private static PrintService services[];
+
+ /**
+ * Starts the application.
+ */
+ public static void printTest() {
+
+ System.out.println("\nDefault print service: " +
+ PrintServiceLookup.lookupDefaultPrintService());
+ System.out.println("is flavor: "+flavor+" supported? "+
+ services[0].isDocFlavorSupported(flavor));
+ System.out.println("is Page Ranges category supported? "+
+ services[0].isAttributeCategorySupported(PageRanges.class));
+ System.out.println("is PageRanges[2] value supported ? "+
+ services[0].isAttributeValueSupported(
+ new PageRanges(2), flavor, null));
+
+ HashPrintRequestAttributeSet prSet = new HashPrintRequestAttributeSet();
+ //prSet.add(new PageRanges(2));
+ PrintService selService = ServiceUI.printDialog(null, 200, 200,
+ services, services[0], flavor, prSet);
+
+ System.out.println("\nSelected Values\n");
+ Attribute attr[] = prSet.toArray();
+ for (int x = 0; x < attr.length; x ++) {
+ System.out.println("Attribute: " + attr[x].getName() +
+ " Value: " + attr[x]);
+ }
+ }
+
+ /**
+ * Starts the application.
+ */
+ public static void main(java.lang.String[] args) throws Exception {
+ services = PrintServiceLookup.lookupPrintServices(flavor, null);
+
+ if (services.length == 0) {
+ System.out.println("No print service found!!");
+ return;
+ }
+ SwingUtilities.invokeAndWait(() -> {
+ doTest(ServiceDlgPageRangeTest::printTest);
+ });
+ mainThread = Thread.currentThread();
+ try {
+ Thread.sleep(600000);
+ } catch (InterruptedException e) {
+ if (!testPassed && testGeneratedInterrupt) {
+ throw new RuntimeException("PageRanges option is not disabled "
+ + "for for Non serv-formatted flvrs");
+ }
+ }
+ if (!testGeneratedInterrupt) {
+ throw new RuntimeException("user has not executed the test");
+ }
+ }
+
+ public static synchronized void pass() {
+ testPassed = true;
+ testGeneratedInterrupt = true;
+ mainThread.interrupt();
+ }
+
+ public static synchronized void fail() {
+ testPassed = false;
+ testGeneratedInterrupt = true;
+ mainThread.interrupt();
+ }
+
+ private static void doTest(Runnable action) {
+ String description
+ = " Visual inspection of print dialog is required.\n"
+ + " A print dialog will be shown.\n "
+ + " Please verify Pages(From/To) option is disabled.\n"
+ + " Press Cancel to close the print dialog.\n"
+ + " If Pages(From/To) option is disabled, press PASS else press FAIL";
+
+ final JDialog dialog = new JDialog();
+ dialog.setTitle("printSelectionTest");
+ JTextArea textArea = new JTextArea(description);
+ textArea.setEditable(false);
+ final JButton testButton = new JButton("Start Test");
+ final JButton passButton = new JButton("PASS");
+ passButton.setEnabled(false);
+ passButton.addActionListener((e) -> {
+ dialog.dispose();
+ pass();
+ });
+ final JButton failButton = new JButton("FAIL");
+ failButton.setEnabled(false);
+ failButton.addActionListener((e) -> {
+ dialog.dispose();
+ fail();
+ });
+ testButton.addActionListener((e) -> {
+ testButton.setEnabled(false);
+ action.run();
+ passButton.setEnabled(true);
+ failButton.setEnabled(true);
+ });
+ JPanel mainPanel = new JPanel(new BorderLayout());
+ mainPanel.add(textArea, BorderLayout.CENTER);
+ JPanel buttonPanel = new JPanel(new FlowLayout());
+ buttonPanel.add(testButton);
+ buttonPanel.add(passButton);
+ buttonPanel.add(failButton);
+ mainPanel.add(buttonPanel, BorderLayout.SOUTH);
+ dialog.add(mainPanel);
+ dialog.pack();
+ dialog.setVisible(true);
+ dialog.addWindowListener(new WindowAdapter() {
+ @Override
+ public void windowClosing(WindowEvent e) {
+ System.out.println("main dialog closing");
+ testGeneratedInterrupt = false;
+ mainThread.interrupt();
+ }
+ });
+ }
+}
--- a/jdk/test/javax/security/auth/login/Configuration/GetInstanceProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/javax/security/auth/login/Configuration/GetInstanceProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,7 +27,7 @@
public GetInstanceProvider() {
super("GetInstanceProvider",
- 1,
+ "1",
"GetInstanceProvider: Configuration.GetInstanceConfigSpi");
AccessController.doPrivileged(new PrivilegedAction() {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JList/8161483/Bug8161483.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8161483
+ * @summary Implement AccessibleAction in JList.AccessibleJList.AccessibleJListChild
+ * @run main Bug8161483
+ */
+
+import javax.accessibility.Accessible;
+import javax.accessibility.AccessibleAction;
+import javax.accessibility.AccessibleContext;
+import javax.accessibility.AccessibleSelection;
+import javax.swing.DefaultListModel;
+import javax.swing.JFrame;
+import javax.swing.JList;
+import javax.swing.SwingUtilities;
+
+public class Bug8161483 extends JFrame {
+
+ private static JFrame frame;
+ private static volatile Exception exception = null;
+ private JList<String> countryList;
+
+ public static void main(String args[]) throws Exception {
+ try {
+ SwingUtilities.invokeAndWait(() -> {
+ DefaultListModel<String> listModel = new DefaultListModel<>();
+ listModel.addElement("one");
+ listModel.addElement("two");
+ listModel.addElement("three");
+ JList<String> list = new JList<>(listModel);
+ frame = new JFrame();
+ frame.add(list);
+ frame.pack();
+ try {
+ AccessibleContext acList = list.getAccessibleContext();
+ Accessible accChild = acList.getAccessibleChild(1);
+ AccessibleContext acChild = accChild.getAccessibleContext();
+ AccessibleAction aa = acChild.getAccessibleAction();
+ int c = aa.getAccessibleActionCount();
+ if (c != 1) {
+ throw new RuntimeException("getAccessibleActionCount is not 1");
+ }
+ String s = aa.getAccessibleActionDescription(0);
+ if (!s.equals("click")) {
+ throw new RuntimeException("getAccessibleActionDescription is not click");
+ }
+ boolean b = aa.doAccessibleAction(0);
+ if (!b) {
+ throw new RuntimeException("doAccessibleAction did not return true");
+ }
+ AccessibleSelection as = acList.getAccessibleSelection();
+ int asc = as.getAccessibleSelectionCount();
+ if (asc != 1) {
+ throw new RuntimeException("getAccessibleSelectionCount is not 1");
+ }
+ boolean isSelected = as.isAccessibleChildSelected(0);
+ if (isSelected) {
+ throw new RuntimeException("isAccessibleChildSelected(0) did not return false");
+ }
+ isSelected = as.isAccessibleChildSelected(1);
+ if (!isSelected) {
+ throw new RuntimeException("isAccessibleChildSelected(1) did not return true");
+ }
+ } catch (Exception e) {
+ exception = e;
+ }
+ });
+ if (exception != null) {
+ System.out.println("Test failed: " + exception.getMessage());
+ throw exception;
+ } else {
+ System.out.println("Test passed.");
+ }
+ } finally {
+ SwingUtilities.invokeAndWait(() -> {
+ frame.dispose();
+ });
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JProgressBar/8161664/ProgressBarMemoryLeakTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/*
+ * @test
+ * @bug 8161664
+ * @summary Memory leak in com.apple.laf.AquaProgressBarUI: removed progress bar still referenced
+ * @library ../../regtesthelpers
+ * @build Util
+ * @key headful
+ * @run main/timeout=300/othervm -Xmx16m ProgressBarMemoryLeakTest
+ */
+import java.awt.EventQueue;
+import java.lang.ref.WeakReference;
+
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JProgressBar;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+
+public class ProgressBarMemoryLeakTest {
+
+ private static JFrame sFrame;
+ private static WeakReference<JProgressBar> sProgressBar;
+
+ public static void main(String[] args) throws Exception {
+ UIManager.LookAndFeelInfo[] installedLookAndFeels = UIManager.getInstalledLookAndFeels();
+ for ( UIManager.LookAndFeelInfo installedLookAndFeel : installedLookAndFeels ) {
+ executeTestCase(installedLookAndFeel.getClassName());
+ }
+ }
+
+ private static void executeTestCase(String lookAndFeelString) throws Exception{
+ if (tryLookAndFeel(lookAndFeelString)) {
+ EventQueue.invokeAndWait( new Runnable() {
+ @Override
+ public void run() {
+ showUI();
+ }
+ } );
+ EventQueue.invokeAndWait( new Runnable() {
+ @Override
+ public void run() {
+ disposeUI();
+ }
+ } );
+ Util.generateOOME();
+ JProgressBar progressBar = sProgressBar.get();
+ if ( progressBar != null ) {
+ throw new RuntimeException( "Progress bar (using L&F: " + lookAndFeelString + ") should have been GC-ed" );
+ }
+ }
+ }
+
+ private static void showUI(){
+ sFrame = new JFrame();
+
+ JProgressBar progressBar = new JProgressBar();
+ progressBar.setVisible(false);
+ progressBar.setIndeterminate(false);
+ progressBar.setIndeterminate(true);
+ progressBar.setIndeterminate(false);
+ progressBar.setValue(10);
+ progressBar.setString("Progress");
+
+ sFrame.add(progressBar);
+
+ sProgressBar = new WeakReference<>(progressBar);
+
+ sFrame.setSize(200,200);
+ sFrame.setVisible(true);
+ }
+
+ private static void disposeUI(){
+ sFrame.setContentPane(new JPanel());
+ sFrame.dispose();
+ sFrame = null;
+ }
+
+ private static boolean tryLookAndFeel(String lookAndFeelString) throws Exception {
+ try {
+ UIManager.setLookAndFeel(lookAndFeelString);
+ } catch (UnsupportedLookAndFeelException | ClassNotFoundException | InstantiationException | IllegalAccessException e) {
+ return false;
+ }
+ return true;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JSlider/8162856/MetalHiDPISliderThumbTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+import javax.swing.JSlider;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.plaf.metal.MetalLookAndFeel;
+
+/*
+ * @test
+ * @bug 8162856
+ * @summary Bad rendering of Swing UI controls with Metal L&F on HiDPI display
+ * @run main MetalHiDPISliderThumbTest
+ */
+public class MetalHiDPISliderThumbTest {
+
+ public static void main(String[] args) throws Exception {
+
+ SwingUtilities.invokeAndWait(() -> {
+
+ try {
+ UIManager.setLookAndFeel(new MetalLookAndFeel());
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ if (!testSliderThumb(true)) {
+ throw new RuntimeException("Horizontal Slider Thumb is not scaled!");
+ }
+
+ if (!testSliderThumb(false)) {
+ throw new RuntimeException("Vertical Slider Thumb is not scaled!");
+ }
+ });
+ }
+
+ private static boolean testSliderThumb(boolean horizontal) {
+ int scale = 3;
+
+ int w = horizontal ? 100 : 20;
+ int h = horizontal ? 20 : 100;
+
+ JSlider testSlider = new JSlider();
+ testSlider.setSize(w, h);
+ Dimension size = new Dimension(w, h);
+ testSlider.setPreferredSize(size);
+ testSlider.setMinimumSize(size);
+ testSlider.setMaximumSize(size);
+ testSlider.setOrientation(horizontal ? JSlider.HORIZONTAL : JSlider.VERTICAL);
+
+ int sw = scale * w;
+ int sh = scale * h;
+
+ final BufferedImage img = new BufferedImage(sw, sh, BufferedImage.TYPE_INT_RGB);
+
+ Graphics2D g = img.createGraphics();
+ g.scale(scale, scale);
+ testSlider.paint(g);
+ g.dispose();
+
+ if (horizontal) {
+ int y = sh / 2;
+
+ int xMin = 0;
+ int rgb = img.getRGB(xMin, y);
+ for (int i = 0; i < sw; i++) {
+ if (img.getRGB(i, y) != rgb) {
+ xMin = i;
+ break;
+ }
+ }
+
+ int xMax = sw - 1;
+ rgb = img.getRGB(xMax, y);
+ for (int i = sw - 1; i > 0; i--) {
+ if (img.getRGB(i, y) != rgb) {
+ xMax = i;
+ break;
+ }
+ }
+
+ int d = 3 * scale;
+ int xc = (xMin + xMax) / 2 - d;
+ rgb = img.getRGB(xc, y);
+
+ for (int x = xMin + d; x < xc; x++) {
+ if (img.getRGB(x, y) != rgb) {
+ return true;
+ }
+ }
+ } else {
+ int x = sw / 2;
+
+ int yMin = 0;
+ int rgb = img.getRGB(x, yMin);
+ for (int i = 0; i < sh; i++) {
+ if (img.getRGB(x, i) != rgb) {
+ yMin = i;
+ break;
+ }
+ }
+
+ int yMax = sh - 1;
+ rgb = img.getRGB(x, yMax);
+ for (int i = sh - 1; i > 0; i--) {
+ if (img.getRGB(x, i) != rgb) {
+ yMax = i;
+ break;
+ }
+ }
+
+ int d = 3 * scale;
+ int yc = (yMin + yMax) / 2 - d;
+ rgb = img.getRGB(x, yc);
+
+ for (int y = yMin + d; y < yc; y++) {
+ if (img.getRGB(x, y) != rgb) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/plaf/metal/MetalIcons/MetalHiDPIIconsTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8160986
+ * @summary Bad rendering of Swing UI controls with Metal L&F on HiDPI display
+ * @run main/manual MetalHiDPIIconsTest
+ */
+import java.awt.Color;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+
+public class MetalHiDPIIconsTest {
+
+ private static volatile boolean testResult = false;
+ private static volatile CountDownLatch countDownLatch;
+ private static final String INSTRUCTIONS = "INSTRUCTIONS:\n"
+ + "Verify that icons are painted smoothly for standard Swing UI controls.\n\n"
+ + "If the display does not support HiDPI mode press PASS.\n\n"
+ + "1. Run the SwingSet2 demo on HiDPI Display.\n"
+ + "2. Select Metal Look and Feel\n"
+ + "3. Check that the icons are painted smoothly on Swing UI controls like:\n"
+ + " - JRadioButton\n"
+ + " - JCheckBox\n"
+ + " - JComboBox\n"
+ + " - JScrollPane (vertical and horizontal scroll bars)\n"
+ + "and others...\n\n"
+ + "If so, press PASS, else press FAIL.\n";
+
+ public static void main(String args[]) throws Exception {
+ countDownLatch = new CountDownLatch(1);
+
+ SwingUtilities.invokeLater(MetalHiDPIIconsTest::createUI);
+ countDownLatch.await(15, TimeUnit.MINUTES);
+
+ if (!testResult) {
+ throw new RuntimeException("Test fails!");
+ }
+ }
+
+ private static void createUI() {
+
+ final JFrame mainFrame = new JFrame("Metal L&F icons test");
+ GridBagLayout layout = new GridBagLayout();
+ JPanel mainControlPanel = new JPanel(layout);
+ JPanel resultButtonPanel = new JPanel(layout);
+
+ GridBagConstraints gbc = new GridBagConstraints();
+
+ JTextArea instructionTextArea = new JTextArea();
+ instructionTextArea.setText(INSTRUCTIONS);
+ instructionTextArea.setEditable(false);
+ instructionTextArea.setBackground(Color.white);
+
+ gbc.gridx = 0;
+ gbc.gridy = 0;
+ gbc.fill = GridBagConstraints.HORIZONTAL;
+ mainControlPanel.add(instructionTextArea, gbc);
+
+ JButton passButton = new JButton("Pass");
+ passButton.setActionCommand("Pass");
+ passButton.addActionListener((ActionEvent e) -> {
+ testResult = true;
+ mainFrame.dispose();
+ countDownLatch.countDown();
+
+ });
+
+ JButton failButton = new JButton("Fail");
+ failButton.setActionCommand("Fail");
+ failButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ mainFrame.dispose();
+ countDownLatch.countDown();
+ }
+ });
+
+ gbc.gridx = 0;
+ gbc.gridy = 0;
+ resultButtonPanel.add(passButton, gbc);
+
+ gbc.gridx = 1;
+ gbc.gridy = 0;
+ resultButtonPanel.add(failButton, gbc);
+
+ gbc.gridx = 0;
+ gbc.gridy = 1;
+ mainControlPanel.add(resultButtonPanel, gbc);
+
+ mainFrame.add(mainControlPanel);
+ mainFrame.pack();
+
+ mainFrame.addWindowListener(new WindowAdapter() {
+
+ @Override
+ public void windowClosing(WindowEvent e) {
+ mainFrame.dispose();
+ countDownLatch.countDown();
+ }
+ });
+ mainFrame.setVisible(true);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/SecureValidationPolicy.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8151893
+ * @summary Tests for the jdk.xml.dsig.secureValidationPolicy security property
+ * @modules java.xml.crypto/org.jcp.xml.dsig.internal.dom
+ */
+
+import java.security.Security;
+import java.util.List;
+import org.jcp.xml.dsig.internal.dom.Policy;
+
+public class SecureValidationPolicy {
+
+ public static void main(String[] args) throws Exception {
+
+ List<String> restrictedSchemes = List.of("file:/tmp/foo",
+ "http://java.com", "https://java.com");
+ List<String> restrictedAlgs = List.of(
+ "http://www.w3.org/TR/1999/REC-xslt-19991116",
+ "http://www.w3.org/2001/04/xmldsig-more#rsa-md5",
+ "http://www.w3.org/2001/04/xmldsig-more#hmac-md5",
+ "http://www.w3.org/2001/04/xmldsig-more#md5");
+
+ // Test expected defaults
+ System.out.println("Testing defaults");
+ if (!Policy.restrictNumTransforms(6)) {
+ throw new Exception("maxTransforms not enforced");
+ }
+ if (!Policy.restrictNumReferences(31)) {
+ throw new Exception("maxReferences not enforced");
+ }
+ for (String scheme : restrictedSchemes) {
+ if (!Policy.restrictReferenceUriScheme(scheme)) {
+ throw new Exception(scheme + " scheme not restricted");
+ }
+ }
+ for (String alg : restrictedAlgs) {
+ if (!Policy.restrictAlg(alg)) {
+ throw new Exception(alg + " alg not restricted");
+ }
+ }
+ if (!Policy.restrictDuplicateIds()) {
+ throw new Exception("noDuplicateIds not enforced");
+ }
+ if (!Policy.restrictRetrievalMethodLoops()) {
+ throw new Exception("noRetrievalMethodLoops not enforced");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/jdk/internal/loader/ClassLoaderValue/ClassLoaderValueTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,251 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import jdk.internal.loader.ClassLoaderValue;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * @test
+ * @bug 8152115
+ * @summary functional and concurrency test for ClassLoaderValue
+ * @modules java.base/jdk.internal.loader
+ * @author Peter Levart
+ */
+public class ClassLoaderValueTest {
+
+ @SuppressWarnings("unchecked")
+ public static void main(String[] args) throws Exception {
+
+ ClassLoaderValue[] clvs = {new ClassLoaderValue<>(),
+ new ClassLoaderValue<>()};
+
+ ClassLoader[] lds = {ClassLoader.getSystemClassLoader(),
+ ClassLoader.getPlatformClassLoader(),
+ null /* bootstrap class loader */};
+
+ Integer[] keys = new Integer[32];
+ for (int i = 0; i < keys.length; i++) {
+ keys[i] = i + 128;
+ }
+
+ try (AutoCloseable cleanup = () -> {
+ for (ClassLoaderValue<Integer> clv : clvs) {
+ for (ClassLoader ld : lds) {
+ clv.removeAll(ld);
+ }
+ }
+ }) {
+ // 1st just one sequential pass of single-threaded validation
+ // which is easier to debug if it fails...
+ for (ClassLoaderValue<Integer> clv : clvs) {
+ for (ClassLoader ld : lds) {
+ writeValidateOps(clv, ld, keys);
+ }
+ }
+ for (ClassLoaderValue<Integer> clv : clvs) {
+ for (ClassLoader ld : lds) {
+ readValidateOps(clv, ld, keys);
+ }
+ }
+
+ // 2nd the same in concurrent setting that also validates
+ // failure-isolation between threads and data-isolation between
+ // regions - (ClassLoader, ClassLoaderValue) pairs - of the storage
+ testConcurrentIsolation(clvs, lds, keys, TimeUnit.SECONDS.toMillis(3));
+ }
+ }
+
+ static void writeValidateOps(ClassLoaderValue<Integer> clv,
+ ClassLoader ld,
+ Object[] keys) {
+ for (int i = 0; i < keys.length; i++) {
+ Object k = keys[i];
+ Integer v1 = i;
+ Integer v2 = i + 333;
+ Integer pv;
+ boolean success;
+
+ pv = clv.sub(k).putIfAbsent(ld, v1);
+ assertEquals(pv, null);
+ assertEquals(clv.sub(k).get(ld), v1);
+
+ pv = clv.sub(k).putIfAbsent(ld, v2);
+ assertEquals(pv, v1);
+ assertEquals(clv.sub(k).get(ld), v1);
+
+ success = clv.sub(k).remove(ld, v2);
+ assertEquals(success, false);
+ assertEquals(clv.sub(k).get(ld), v1);
+
+ success = clv.sub(k).remove(ld, v1);
+ assertEquals(success, true);
+ assertEquals(clv.sub(k).get(ld), null);
+
+ pv = clv.sub(k).putIfAbsent(ld, v2);
+ assertEquals(pv, null);
+ assertEquals(clv.sub(k).get(ld), v2);
+
+ pv = clv.sub(k).computeIfAbsent(ld, (_ld, _clv) -> v1);
+ assertEquals(pv, v2);
+ assertEquals(clv.sub(k).get(ld), v2);
+
+ success = clv.sub(k).remove(ld, v1);
+ assertEquals(success, false);
+ assertEquals(clv.sub(k).get(ld), v2);
+
+ success = clv.sub(k).remove(ld, v2);
+ assertEquals(success, true);
+ assertEquals(clv.sub(k).get(ld), null);
+
+ pv = clv.sub(k).computeIfAbsent(ld, (_ld, clv_k) -> {
+ try {
+ // nested get for same key should throw
+ clv_k.get(_ld);
+ throw new AssertionError("Unexpected code path");
+ } catch (IllegalStateException e) {
+ // expected
+ }
+ try {
+ // nested putIfAbsent for same key should throw
+ clv_k.putIfAbsent(_ld, v1);
+ throw new AssertionError("Unexpected code path");
+ } catch (IllegalStateException e) {
+ // expected
+ }
+ // nested remove for for same key and any value (even null)
+ // should return false
+ assertEquals(clv_k.remove(_ld, null), false);
+ assertEquals(clv_k.remove(_ld, v1), false);
+ assertEquals(clv_k.remove(_ld, v2), false);
+ try {
+ // nested computeIfAbsent for same key should throw
+ clv_k.computeIfAbsent(_ld, (__ld, _clv_k) -> v1);
+ throw new AssertionError("Unexpected code path");
+ } catch (IllegalStateException e) {
+ // expected
+ }
+ // if everything above has been handled, we should succeed...
+ return v2;
+ });
+ // ... and the result should be reflected in the CLV
+ assertEquals(pv, v2);
+ assertEquals(clv.sub(k).get(ld), v2);
+
+ success = clv.sub(k).remove(ld, v2);
+ assertEquals(success, true);
+ assertEquals(clv.sub(k).get(ld), null);
+
+ try {
+ clv.sub(k).computeIfAbsent(ld, (_ld, clv_k) -> {
+ throw new UnsupportedOperationException();
+ });
+ throw new AssertionError("Unexpected code path");
+ } catch (UnsupportedOperationException e) {
+ // expected
+ }
+ assertEquals(clv.sub(k).get(ld), null);
+ }
+ }
+
+ static void readValidateOps(ClassLoaderValue<Integer> clv,
+ ClassLoader ld,
+ Object[] keys) {
+ for (int i = 0; i < keys.length; i++) {
+ Object k = keys[i];
+ Integer v1 = i;
+ Integer v2 = i + 333;
+ Integer rv = clv.sub(k).get(ld);
+ if (!(rv == null || rv.equals(v1) || rv.equals(v2))) {
+ throw new AssertionError("Unexpected value: " + rv +
+ ", expected one of: null, " + v1 + ", " + v2);
+ }
+ }
+ }
+
+ static void testConcurrentIsolation(ClassLoaderValue<Integer>[] clvs,
+ ClassLoader[] lds,
+ Object[] keys,
+ long millisRuntime) {
+ ExecutorService exe = Executors.newCachedThreadPool();
+ List<Future<?>> futures = new ArrayList<>();
+ AtomicBoolean stop = new AtomicBoolean();
+ for (ClassLoaderValue<Integer> clv : clvs) {
+ for (ClassLoader ld : lds) {
+ // submit a task that exercises a mix of modifying
+ // and reading-validating operations in an isolated
+ // part of the storage. If isolation is violated,
+ // validation operations are expected to fail.
+ futures.add(exe.submit(() -> {
+ do {
+ writeValidateOps(clv, ld, keys);
+ } while (!stop.get());
+ }));
+ // submit a task that just reads from the same part of
+ // the storage as above task. It should not disturb
+ // above task in any way and this task should never
+ // exhibit any failure although above task produces
+ // regular failures during lazy computation
+ futures.add(exe.submit(() -> {
+ do {
+ readValidateOps(clv, ld, keys);
+ } while (!stop.get());
+ }));
+ }
+ }
+ // wait for some time
+ try {
+ Thread.sleep(millisRuntime);
+ } catch (InterruptedException e) {
+ throw new AssertionError(e);
+ }
+ // stop tasks
+ stop.set(true);
+ // collect results
+ AssertionError error = null;
+ for (Future<?> future : futures) {
+ try {
+ future.get();
+ } catch (InterruptedException | ExecutionException e) {
+ if (error == null) error = new AssertionError("Failure");
+ error.addSuppressed(e);
+ }
+ }
+ exe.shutdown();
+ if (error != null) throw error;
+ }
+
+ static void assertEquals(Object actual, Object expected) {
+ if (!Objects.equals(actual, expected)) {
+ throw new AssertionError("Expected: " + expected + ", actual: " + actual);
+ }
+ }
+}
--- a/jdk/test/jdk/lambda/TEST.properties Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/jdk/lambda/TEST.properties Fri Aug 26 10:14:15 2016 -0700
@@ -3,4 +3,4 @@
TestNG.dirs = .
javatest.maxOutputSize = 250000
-modules = jdk.compiler
+modules = jdk.compiler jdk.zipfs
--- a/jdk/test/jdk/modules/etc/VerifyModuleDelegation.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/jdk/modules/etc/VerifyModuleDelegation.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
* @summary Verify the defining class loader of each module never delegates
* to its child class loader. Also sanity check java.compact2
* requires.
+ * @modules java.compact2
* @run testng/othervm --add-modules=ALL-SYSTEM VerifyModuleDelegation
*/
@@ -33,7 +34,9 @@
import java.lang.module.ModuleFinder;
import java.lang.module.ModuleReference;
import java.lang.reflect.Layer;
+import java.lang.reflect.Module;
import java.util.Set;
+import static java.util.stream.Collectors.toSet;
import static java.lang.module.ModuleDescriptor.Requires.Modifier.*;
@@ -58,8 +61,9 @@
.requires(Set.of(PUBLIC), "java.xml")
.build();
- private static final Set<ModuleReference> MREFS
- = ModuleFinder.ofSystem().findAll();
+ private static final Set<ModuleDescriptor> MREFS
+ = Layer.boot().modules().stream().map(Module::getDescriptor)
+ .collect(toSet());
private void check(ModuleDescriptor md, ModuleDescriptor ref) {
assertTrue(md.requires().size() == ref.requires().size());
@@ -69,7 +73,7 @@
@Test
public void checkJavaBase() {
ModuleDescriptor md =
- MREFS.stream().map(ModuleReference::descriptor)
+ MREFS.stream()
.filter(d -> d.name().equals(JAVA_BASE))
.findFirst().orElseThrow(Error::new);
@@ -78,7 +82,7 @@
@Test
public void checkCompact2() {
ModuleDescriptor md =
- MREFS.stream().map(ModuleReference::descriptor)
+ MREFS.stream()
.filter(d -> d.name().equals(JAVA_COMPACT2))
.findFirst().orElseThrow(Error::new);
check(md, COMPACT2);
@@ -87,7 +91,7 @@
@Test
public void checkLoaderDelegation() {
Layer boot = Layer.boot();
- MREFS.stream().map(ModuleReference::descriptor)
+ MREFS.stream()
.forEach(md -> md.requires().stream().forEach(req ->
{
// check if M requires D and D's loader must be either the
--- a/jdk/test/jdk/modules/scenarios/container/ContainerTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/jdk/modules/scenarios/container/ContainerTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -26,6 +26,8 @@
* @library /lib/testlibrary
* @modules jdk.jartool/sun.tools.jar
* jdk.compiler
+ * jdk.zipfs
+ * java.se
* @build ContainerTest CompilerUtils jdk.testlibrary.*
* @run testng ContainerTest
* @summary Starts a simple container that uses dynamic configurations
--- a/jdk/test/jdk/nio/zipfs/MultiReleaseJarTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/jdk/nio/zipfs/MultiReleaseJarTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -28,7 +28,7 @@
* @library /lib/testlibrary/java/util/jar
* @build Compiler JarBuilder CreateMultiReleaseTestJars
* @run testng MultiReleaseJarTest
- * @modules java.compiler
+ * @modules jdk.compiler
* jdk.jartool
* jdk.zipfs
*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/jdk/nio/zipfs/jarfs/JFSTester.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8164389
+ * @summary walk entries in a jdk.nio.zipfs.JarFileSystem
+ * @modules jdk.jartool/sun.tools.jar
+ * @run testng JFSTester
+ */
+
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.net.URI;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+public class JFSTester {
+ private URI jarURI;
+ private Path jarfile;
+
+ @BeforeClass
+ public void initialize() throws Exception {
+ String userdir = System.getProperty("user.dir",".");
+ jarfile = Paths.get(userdir, "test.jar");
+ String srcdir = System.getProperty("test.src");
+ String[] args = (
+ "-cf "
+ + jarfile.toString()
+ + " -C "
+ + srcdir
+ + " root --release 9 -C "
+ + srcdir
+ + System.getProperty("file.separator")
+ + "v9 root"
+ ).split(" +");
+ new sun.tools.jar.Main(System.out, System.err, "jar").run(args);
+ String ssp = jarfile.toUri().toString();
+ jarURI = new URI("jar", ssp, null);
+ }
+
+ @AfterClass
+ public void close() throws IOException {
+ Files.deleteIfExists(jarfile);
+ }
+
+ @Test
+ public void testWalk() throws IOException {
+
+ // no configuration, treat multi-release jar as unversioned
+ Map<String,String> env = new HashMap<>();
+ Set<String> contents = doTest(env);
+ Set<String> baseContents = Set.of(
+ "This is leaf 1.\n",
+ "This is leaf 2.\n",
+ "This is leaf 3.\n",
+ "This is leaf 4.\n"
+ );
+ Assert.assertEquals(contents, baseContents);
+
+ // a configuration and jar file is multi-release
+ env.put("multi-release", "9");
+ contents = doTest(env);
+ Set<String> versionedContents = Set.of(
+ "This is versioned leaf 1.\n",
+ "This is versioned leaf 2.\n",
+ "This is versioned leaf 3.\n",
+ "This is versioned leaf 4.\n"
+ );
+ Assert.assertEquals(contents, versionedContents);
+ }
+
+ private Set<String> doTest(Map<String,String> env) throws IOException {
+ Set<String> contents;
+ try (FileSystem fs = FileSystems.newFileSystem(jarURI, env)) {
+ Path root = fs.getPath("root");
+ contents = Files.walk(root)
+ .filter(p -> !Files.isDirectory(p))
+ .map(this::pathToContents)
+ .collect(Collectors.toSet());
+ }
+ return contents;
+ }
+
+ private String pathToContents(Path path) {
+ try {
+ return new String(Files.readAllBytes(path));
+ } catch (IOException x) {
+ throw new UncheckedIOException(x);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/jdk/nio/zipfs/jarfs/root/dir1/leaf1.txt Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,1 @@
+This is leaf 1.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/jdk/nio/zipfs/jarfs/root/dir1/leaf2.txt Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,1 @@
+This is leaf 2.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/jdk/nio/zipfs/jarfs/root/dir2/leaf3.txt Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,1 @@
+This is leaf 3.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/jdk/nio/zipfs/jarfs/root/dir2/leaf4.txt Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,1 @@
+This is leaf 4.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/jdk/nio/zipfs/jarfs/v9/root/dir1/leaf1.txt Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,1 @@
+This is versioned leaf 1.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/jdk/nio/zipfs/jarfs/v9/root/dir1/leaf2.txt Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,1 @@
+This is versioned leaf 2.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/jdk/nio/zipfs/jarfs/v9/root/dir2/leaf3.txt Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,1 @@
+This is versioned leaf 3.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/jdk/nio/zipfs/jarfs/v9/root/dir2/leaf4.txt Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,1 @@
+This is versioned leaf 4.
--- a/jdk/test/jdk/security/jarsigner/Function.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/jdk/security/jarsigner/Function.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8056174
+ * @bug 8056174 8130181
* @summary test the functions of JarSigner API
* @modules java.base/sun.security.tools.keytool
* jdk.jartool
@@ -145,7 +145,7 @@
public static class MyProvider extends Provider {
MyProvider() {
- super("MY", 1.0d, null);
+ super("MY", "1.0", null);
put("MessageDigest.Five", Five.class.getName());
put("Signature.SHA1WithRSA", SHA1WithRSA.class.getName());
}
--- a/jdk/test/jdk/security/jarsigner/Spec.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/jdk/security/jarsigner/Spec.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -29,6 +29,7 @@
* @modules java.base/sun.security.tools.keytool
* java.base/sun.security.provider.certpath
* jdk.jartool
+ * jdk.crypto.ec
*/
import com.sun.jarsigner.ContentSigner;
--- a/jdk/test/sun/java2d/marlin/ArrayCacheSizeTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/sun/java2d/marlin/ArrayCacheSizeTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -21,7 +21,7 @@
* questions.
*/
-import sun.java2d.marlin.ArrayCache;
+import sun.java2d.marlin.ArrayCacheConst;
/*
* @test
@@ -72,7 +72,7 @@
private static void testNewSize(final int curSize,
final int needSize) {
- int size = ArrayCache.getNewSize(curSize, needSize);
+ int size = ArrayCacheConst.getNewSize(curSize, needSize);
System.out.println("getNewSize(" + curSize + ", " + needSize
+ ") = " + size);
@@ -118,7 +118,7 @@
private static void testNewLargeSize(final long curSize,
final long needSize) {
- long size = ArrayCache.getNewLargeSize(curSize, needSize);
+ long size = ArrayCacheConst.getNewLargeSize(curSize, needSize);
System.out.println("getNewLargeSize(" + curSize + ", " + needSize
+ ") = " + size);
--- a/jdk/test/sun/security/krb5/auto/BadKdc1.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/sun/security/krb5/auto/BadKdc1.java Fri Aug 26 10:14:15 2016 -0700
@@ -44,16 +44,16 @@
}
BadKdc.go(
- "121212222222(32){1,2}1222(32){1,2}", // 1 2
+ "121212222222(32){1,3}1222(32){1,3}", // 1 2
// The above line means try kdc1 for 2 seconds then kdc1
// for 2 seconds... finally kdc3 for 2 seconds.
- "1222(32){1,2}1222(32){1,2}", // 1 2
+ "1222(32){1,3}1222(32){1,3}", // 1 2
// refresh
- "121212222222(32){1,2}1222(32){1,2}", // 1 2
+ "121212222222(32){1,3}1222(32){1,3}", // 1 2
// k3 off k2 on
- "(122212(22){1,2}|1222323232-)", // 1
+ "(122212(22){1,3}|1222323232-)", // 1
// k1 on
- "(12(12){1,2}|122212|122232-)" // empty
+ "(12(12){1,3}|122212|122232-)" // empty
);
}
}
--- a/jdk/test/sun/security/krb5/auto/BadKdc2.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/sun/security/krb5/auto/BadKdc2.java Fri Aug 26 10:14:15 2016 -0700
@@ -42,14 +42,14 @@
Security.setProperty(
"krb5.kdc.bad.policy", "tryLess:2," + BadKdc.toReal(1000));
BadKdc.go(
- "121212222222(32){1,2}11112121(32){1,2}", // 1 2
- "11112121(32){1,2}11112121(32){1,2}", // 1 2
+ "121212222222(32){1,3}11112121(32){1,3}", // 1 2
+ "11112121(32){1,3}11112121(32){1,3}", // 1 2
// refresh
- "121212222222(32){1,2}11112121(32){1,2}", // 1 2
+ "121212222222(32){1,3}11112121(32){1,3}", // 1 2
// k3 off k2 on
- "1111(21){1,2}1111(22){1,2}", // 1
+ "1111(21){1,3}1111(22){1,3}", // 1
// k1 on
- "(11){1,2}(12){1,2}" // empty
+ "(11){1,3}(12){1,3}" // empty
);
}
}
--- a/jdk/test/sun/security/krb5/auto/BadKdc4.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/sun/security/krb5/auto/BadKdc4.java Fri Aug 26 10:14:15 2016 -0700
@@ -37,12 +37,12 @@
throws Exception {
Security.setProperty("krb5.kdc.bad.policy", "");
BadKdc.go(
- "121212222222(32){1,2}121212222222(32){1,2}",
- "121212222222(32){1,2}121212222222(32){1,2}",
+ "121212222222(32){1,3}121212222222(32){1,3}",
+ "121212222222(32){1,3}121212222222(32){1,3}",
// refresh
- "121212222222(32){1,2}121212222222(32){1,2}",
+ "121212222222(32){1,3}121212222222(32){1,3}",
// k3 off k2 on
- "121212(22){1,2}121212(22){1,2}",
+ "121212(22){1,3}121212(22){1,3}",
// k1 on
"(12){2,4}"
);
--- a/jdk/test/sun/security/krb5/auto/Basic.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/sun/security/krb5/auto/Basic.java Fri Aug 26 10:14:15 2016 -0700
@@ -23,10 +23,13 @@
/*
* @test
- * @bug 7152176
+ * @bug 7152176 8164437
* @summary More krb5 tests
* @compile -XDignore.symbol.file Basic.java
- * @run main/othervm Basic
+ * @run main/othervm
+ * Basic jdk.security.jgss
+ * @run main/othervm --limit-modules java.security.jgss,jdk.security.auth
+ * Basic java.security.jgss
*/
import sun.security.jgss.GSSUtil;
@@ -60,5 +63,12 @@
b.startAsServer(GSSUtil.GSS_KRB5_MECH_OID);
Context.handshake(s2, b);
+
+ // Bonus test for 8164437.
+ String moduleName = c.x().getClass().getModule().getName();
+ if (!moduleName.equals(args[0])) {
+ throw new Exception("Expected: " + args[0]
+ + ". Actual: " + moduleName);
+ }
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/krb5/auto/KdcPolicy.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,366 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.*;
+import java.net.DatagramSocket;
+import java.net.ServerSocket;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.security.Security;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.security.auth.login.LoginException;
+import sun.security.krb5.Asn1Exception;
+import sun.security.krb5.Config;
+
+/*
+ * @test
+ * @bug 8164656
+ * @run main/othervm KdcPolicy udp
+ * @run main/othervm KdcPolicy tcp
+ * @summary krb5.kdc.bad.policy test
+ */
+public class KdcPolicy {
+
+ // Is this test on UDP?
+ static boolean udp;
+
+ public static void main(String[] args) throws Exception {
+
+ udp = args[0].equals("udp");
+
+ try {
+ main0();
+ } catch (LoginException le) {
+ Throwable cause = le.getCause();
+ if (cause instanceof Asn1Exception) {
+ System.out.println("Another process sends a packet to " +
+ "this server. Ignored.");
+ return;
+ }
+ throw le;
+ }
+ }
+
+ static DebugMatcher cm = new DebugMatcher();
+
+ static void main0() throws Exception {
+
+ System.setProperty("sun.security.krb5.debug", "true");
+
+ // One real KDC. Must be created before fake KDCs
+ // to read the TestHosts file.
+ OneKDC kdc = new OneKDC(null);
+
+ // Two fake KDCs, d1 and d2 only listen but do not respond.
+
+ if (udp) {
+ try (DatagramSocket d1 = new DatagramSocket();
+ DatagramSocket d2 = new DatagramSocket()) {
+ run(d1.getLocalPort(), d2.getLocalPort(), kdc.getPort());
+ }
+ } else {
+ try (ServerSocket d1 = new ServerSocket(0);
+ ServerSocket d2 = new ServerSocket(0)) {
+ run(d1.getLocalPort(), d2.getLocalPort(), kdc.getPort());
+ }
+ }
+ }
+
+ static void run(int p1, int p2, int p3) throws Exception {
+
+ // cm.kdc() will return a and b for fake KDCs, and c for real KDC.
+ cm.addPort(-1).addPort(p1).addPort(p2).addPort(p3);
+
+ System.setProperty("java.security.krb5.conf", "alternative-krb5.conf");
+
+ // Check default timeout is 30s. Use real KDC only, otherwise too
+ // slow to wait for timeout.
+ writeConf(-1, -1, p3);
+ test("c30000c30000");
+
+ // 1. Default policy is tryLast
+ //Security.setProperty("krb5.kdc.bad.policy", "tryLast");
+
+ // Need a real KDC, otherwise there is no last good.
+ // This test waste 3 seconds waiting for d1 to timeout.
+ // It is possible the real KDC cannot fulfil the request
+ // in 3s, so it might fail (either 1st time or 2nd time).
+ writeConf(1, 3000, p1, p3);
+ test("a3000c3000c3000|a3000c3000-|a3000c3000c3000-");
+
+ // If a test case won't use a real KDC, it can be sped up.
+ writeConf(3, 5, p1, p2);
+ test("a5a5a5b5b5b5-"); // default max_retries == 3
+ test("a5a5a5b5b5b5-"); // all bad means no bad
+
+ // 2. No policy.
+ Security.setProperty("krb5.kdc.bad.policy", "");
+ Config.refresh();
+
+ // This case needs a real KDC, otherwise, all bad means no
+ // bad and we cannot tell the difference. This case waste 3
+ // seconds on d1 to timeout twice. It is possible the real KDC
+ // cannot fulfil the request within 3s, so it might fail
+ // (either 1st time or 2nd time).
+ writeConf(1, 3000, p1, p3);
+ test("a3000c3000a3000c3000|a3000c3000-|a3000c3000a3000c3000-");
+
+ // 3. tryLess with no argument means tryLess:1,5000
+ Security.setProperty("krb5.kdc.bad.policy", "tryLess");
+
+ // This case will waste 11s. We are checking that the default
+ // value of 5000 in tryLess is only used if it's less than timeout
+ // in krb5.conf
+ writeConf(1, 6000, p1);
+ test("a6000-"); // timeout in krb5.conf is 6s
+ test("a5000-"); // tryLess to 5s. This line can be made faster if
+ // d1 is a read KDC, but we have no existing method
+ // to start KDC on an existing ServerSocket (port).
+
+ writeConf(-1, 4, p1, p2);
+ test("a4a4a4b4b4b4-"); // default max_retries == 3
+ test("a4b4-"); // tryLess to 1. And since 4 < 5000, use 4.
+ Config.refresh();
+ test("a4a4a4b4b4b4-");
+
+ writeConf(5, 4, p1, p2);
+ test("a4a4a4a4a4b4b4b4b4b4-"); // user-provided max_retries == 5
+ test("a4b4-");
+ Config.refresh();
+ test("a4a4a4a4a4b4b4b4b4b4-");
+
+ // 3. tryLess with arguments
+ Security.setProperty("krb5.kdc.bad.policy",
+ "tryLess:2,5");
+
+ writeConf(-1, 6, p1, p2);
+ test("a6a6a6b6b6b6-"); // default max_retries == 3
+ test("a5a5b5b5-"); // tryLess to 2
+ Config.refresh();
+ test("a6a6a6b6b6b6-");
+
+ writeConf(5, 4, p1, p2);
+ test("a4a4a4a4a4b4b4b4b4b4-"); // user-provided max_retries == 5
+ test("a4a4b4b4-"); // tryLess to 2
+ Config.refresh();
+ test("a4a4a4a4a4b4b4b4b4b4-");
+ }
+
+ /**
+ * Writes a krb5.conf file.
+ * @param max max_retries, -1 if not set
+ * @param to kdc_timeout, -1 if not set
+ * @param ports where KDCs listen on
+ */
+ static void writeConf(int max, int to, int... ports) throws Exception {
+
+ // content of krb5.conf
+ String conf = "";
+
+ // Extra settings in [libdefaults]
+ String inDefaults = "";
+
+ // Extra settings in [realms]
+ String inRealm = "";
+
+ // We will randomly put extra settings only in [libdefaults],
+ // or in [realms] but with different values in [libdefaults],
+ // to prove that settings in [realms] override those in [libdefaults].
+ Random r = new Random();
+
+ if (max > 0) {
+ if (r.nextBoolean()) {
+ inDefaults += "max_retries = " + max + "\n";
+ } else {
+ inRealm += " max_retries = " + max + "\n";
+ inDefaults += "max_retries = " + (max + 1) + "\n";
+ }
+ }
+
+ if (to > 0) {
+ if (r.nextBoolean()) {
+ inDefaults += "kdc_timeout = " + to + "\n";
+ } else {
+ inRealm += " kdc_timeout = " + to + "\n";
+ inDefaults += "kdc_timeout = " + (to + 1) + "\n";
+ }
+ }
+
+ if (udp) {
+ if (r.nextBoolean()) {
+ inDefaults += "udp_preference_limit = 10000\n";
+ } else if (r.nextBoolean()) {
+ inRealm += " udp_preference_limit = 10000\n";
+ inDefaults += "udp_preference_limit = 1\n";
+ } // else no settings means UDP
+ } else {
+ if (r.nextBoolean()) {
+ inDefaults += "udp_preference_limit = 1\n";
+ } else {
+ inRealm += " udp_preference_limit = 1\n";
+ inDefaults += "udp_preference_limit = 10000\n";
+ }
+ }
+
+ conf = "[libdefaults]\n" +
+ "default_realm = " + OneKDC.REALM + "\n" +
+ inDefaults +
+ "\n" +
+ "[realms]\n" +
+ OneKDC.REALM + " = {\n";
+
+ for (int port : ports) {
+ conf += " kdc = " + OneKDC.KDCHOST + ":" + port + "\n" +
+ inRealm;
+ }
+
+ conf += "}\n";
+
+ Files.write(Paths.get("alternative-krb5.conf"), conf.getBytes());
+ Config.refresh();
+ }
+
+ /**
+ * One call of krb5 login. As long as the result matches one of expected,
+ * the test is considered as success. The grammar of expected is
+ *
+ * kdc#, timeout, kdc#, timeout, ..., optional "-" for failure
+ */
+ static void test(String... expected) throws Exception {
+
+ System.out.println("------------------TEST----------------------");
+ PrintStream oldOut = System.out;
+ boolean failed = false;
+ ByteArrayOutputStream bo = new ByteArrayOutputStream();
+ System.setOut(new PrintStream(bo));
+ try {
+ Context.fromUserPass(OneKDC.USER, OneKDC.PASS, false);
+ } catch (Exception e) {
+ failed = true;
+ } finally {
+ System.setOut(oldOut);
+ }
+
+ String[] lines = new String(bo.toByteArray()).split("\n");
+ StringBuilder sb = new StringBuilder();
+ for (String line: lines) {
+ if (cm.match(line)) {
+ if (udp != cm.isUDP()) {
+ sb.append("x");
+ }
+ sb.append(cm.kdc()).append(cm.timeout());
+ }
+ }
+ if (failed) sb.append('-');
+
+ String output = sb.toString();
+
+ boolean found = false;
+ for (String ex : expected) {
+ if (output.matches(ex)) {
+ System.out.println("Expected: " + ex + ", actual " + output);
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) {
+ System.out.println("--------------- ERROR START -------------");
+ System.out.println(new String(bo.toByteArray()));
+ System.out.println("--------------- ERROR END ---------------");
+ throw new Exception("Does not match. Output is " + output);
+ }
+ }
+
+ /**
+ * A helper class to match the krb5 debug output:
+ * >>> KDCCommunication: kdc=host UDP:11555, timeout=200,Attempt =1, #bytes=138
+ *
+ * Example:
+ * DebugMatcher cm = new DebugMatcher();
+ * cm.addPort(12345).addPort(11555);
+ * for (String line : debugOutput) {
+ * if (cm.match(line)) {
+ * System.out.printf("%c%d\n", cm.kdc(), cm.timeout());
+ * // shows b200 for the example above
+ * }
+ * }
+ */
+ static class DebugMatcher {
+
+ static final Pattern re = Pattern.compile(
+ ">>> KDCCommunication: kdc=\\S+ (TCP|UDP):(\\d+), " +
+ "timeout=(\\d+),Attempt\\s*=(\\d+)");
+
+ List<Integer> kdcPorts = new ArrayList<>();
+ Matcher matcher;
+
+ /**
+ * Add KDC ports one by one. See {@link #kdc()}.
+ */
+ DebugMatcher addPort(int port) {
+ if (port > 0) {
+ kdcPorts.add(port);
+ } else {
+ kdcPorts.clear();
+ }
+ return this;
+ }
+
+ /**
+ * When a line matches the ">>> KDCCommunication:" pattern. After a
+ * match, the getters below can be called on this match.
+ */
+ boolean match(String line) {
+ matcher = re.matcher(line);
+ return matcher.find();
+ }
+
+ /**
+ * Protocol of this match, "UDP" or "TCP".
+ */
+ boolean isUDP() {
+ return matcher.group(1).equals("UDP");
+ }
+
+ /**
+ * KDC for this match, "a" for the one 1st added bt addPort(), "b"
+ * for second, etc. Undefined for not added.
+ */
+ char kdc() {
+ int port = Integer.parseInt(matcher.group(2));
+ return (char) (kdcPorts.indexOf(port) + 'a');
+ }
+
+ /**
+ * Timeout value for this match.
+ */
+ int timeout() {
+ return Integer.parseInt(matcher.group(3));
+ }
+ }
+}
--- a/jdk/test/sun/security/provider/SecureRandom/AbstractDrbg/SpecTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/sun/security/provider/SecureRandom/AbstractDrbg/SpecTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,7 +22,7 @@
*/
/* @test
- * @bug 8051408 8157308
+ * @bug 8051408 8157308 8130181
* @modules java.base/sun.security.provider
* @build java.base/sun.security.provider.S
* @run main SpecTest
@@ -46,7 +46,7 @@
// getInstance from a provider.
- Provider p = new All("A", 0, "");
+ Provider p = new All("A", "0", "");
byte[] bytes = new byte[100];
// A non-DRBG
@@ -123,9 +123,9 @@
// getInstance from competitive providers.
- Provider l = new Legacy("L", 0, "");
- Provider w = new Weak("W", 0, "");
- Provider s = new Strong("S", 0, "");
+ Provider l = new Legacy("L", "0", "");
+ Provider w = new Weak("W", "0", "");
+ Provider s = new Strong("S", "0", "");
Security.addProvider(l);
Security.addProvider(w);
@@ -173,7 +173,7 @@
}
public static class All extends Provider {
- protected All(String name, double version, String info) {
+ protected All(String name, String version, String info) {
super(name, version, info);
put("SecureRandom.S1", S.S1.class.getName());
put("SecureRandom.S2", S.S2.class.getName());
@@ -183,21 +183,21 @@
// Providing S with no params support
public static class Legacy extends Provider {
- protected Legacy(String name, double version, String info) {
+ protected Legacy(String name, String version, String info) {
super(name, version, info);
put("SecureRandom.S", S.S1.class.getName());
}
}
public static class Weak extends Provider {
- protected Weak(String name, double version, String info) {
+ protected Weak(String name, String version, String info) {
super(name, version, info);
put("SecureRandom.S", S.S2.class.getName());
}
}
public static class Strong extends Provider {
- protected Strong(String name, double version, String info) {
+ protected Strong(String name, String version, String info) {
super(name, version, info);
put("SecureRandom.S", S.S3.class.getName());
}
--- a/jdk/test/sun/security/tools/jarsigner/alt/test.dummy/org/test/dummy/DummyProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/sun/security/tools/jarsigner/alt/test.dummy/org/test/dummy/DummyProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,7 +27,7 @@
public class DummyProvider extends Provider {
public DummyProvider() {
- super("Dummy", 0.1, "Dummy Provider with nothing");
+ super("Dummy", "0.1", "Dummy Provider with nothing");
}
@Override
@@ -36,7 +36,7 @@
}
private DummyProvider(String arg) {
- super("Dummy", 0.2, "Dummy Provider with " + arg);
+ super("Dummy", "0.2", "Dummy Provider with " + arg);
//
// KeyStore
//
--- a/jdk/test/sun/security/x509/AlgorithmId/ExtensibleAlgorithmId.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/sun/security/x509/AlgorithmId/ExtensibleAlgorithmId.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4162868
+ * @bug 4162868 8130181
* @modules java.base/sun.security.x509
* @run main/othervm ExtensibleAlgorithmId
* @summary Algorithm Name-to-OID mapping needs to be made extensible.
@@ -51,7 +51,7 @@
class TestProvider extends Provider {
public TestProvider() {
- super("Dummy", 1.0, "XYZ algorithm");
+ super("Dummy", "1.0", "XYZ algorithm");
AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/util/locale/provider/Bug8163350.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+ /*
+ * @test
+ * @bug 8163350
+ * @modules java.base/sun.util.locale.provider
+ * @summary Test FALLBACK provider is not in adapter preference list when
+ * COMPAT is specified with System Property java.locale.providers.
+ * @run main/othervm -Djava.locale.providers=COMPAT Bug8163350
+ */
+import java.util.List;
+import sun.util.locale.provider.LocaleProviderAdapter;
+import sun.util.locale.provider.LocaleProviderAdapter.Type;
+
+public class Bug8163350 {
+
+ public static void main(String[] args) {
+ List<Type> preferenceList = LocaleProviderAdapter.getAdapterPreference();
+ if (preferenceList.contains(Type.FALLBACK)) {
+ throw new RuntimeException("FALLBACK Provider should not be returned in "
+ + "adapter list " + preferenceList);
+ }
+ }
+}
--- a/jdk/test/tools/jlink/CustomPluginTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/tools/jlink/CustomPluginTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -67,6 +67,7 @@
testHelloProvider(helper, pluginModulePath);
testCustomPlugins(helper, pluginModulePath);
+ testModuleVerification(helper, pluginModulePath);
}
private void testCustomPlugins(Helper helper, Path pluginModulePath) {
@@ -93,8 +94,7 @@
String name = "customplugin";
Path src = Paths.get(System.getProperty("test.src")).resolve(name);
Path classes = helper.getJmodClassesDir().resolve(name);
- JImageGenerator.compile(src, classes,
- "--add-exports", "jdk.jlink/jdk.tools.jlink.internal=customplugin");
+ JImageGenerator.compile(src, classes);
return JImageGenerator.getJModTask()
.addClassPath(classes)
.jmod(helper.getJmodDir().resolve(name + ".jmod"))
@@ -136,4 +136,44 @@
throw new AssertionError("Custom plugin not called");
}
}
+
+ private void testModuleVerification(Helper helper, Path pluginModulePath) throws IOException {
+ {
+ // dependent module missing check
+ String moduleName = "bar"; // 8147491
+ Path jmodFoo = helper.generateDefaultJModule("foo").assertSuccess();
+ Path jmodBar = helper.generateDefaultJModule(moduleName, "foo").assertSuccess();
+ // rogue filter removes "foo" module resources which are
+ // required by "bar" module. Module checks after plugin
+ // application should detect and report error.
+ JImageGenerator.getJLinkTask()
+ .modulePath(helper.defaultModulePath())
+ .pluginModulePath(pluginModulePath)
+ .output(helper.createNewImageDir(moduleName))
+ .addMods(moduleName)
+ .option("--rogue-filter")
+ .option("/foo/")
+ .call()
+ .assertFailure("java.lang.module.ResolutionException");
+ }
+
+ {
+ // package exported by one module used as concealed package
+ // in another module. But, module-info.class is not updated!
+ String moduleName = "jdk.scripting.nashorn";
+ JImageGenerator.getJLinkTask()
+ .modulePath(helper.defaultModulePath())
+ .pluginModulePath(pluginModulePath)
+ .output(helper.createNewImageDir(moduleName))
+ .addMods(moduleName)
+ // "java.logging" includes a package 'javax.script'
+ // which is an exported package from "java.scripting" module!
+ // module-info.class of java.logging left "as is".
+ .option("--rogue-adder")
+ .option("/java.logging/javax/script/Foo.class")
+ .call()
+ .assertFailure(
+ "Module java.logging's descriptor returns inconsistent package set");
+ }
+ }
}
--- a/jdk/test/tools/jlink/ImageFileCreatorTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/tools/jlink/ImageFileCreatorTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -220,7 +220,7 @@
};
ImagePluginStack stack = new ImagePluginStack(noopBuilder, Collections.emptyList(),
- null);
+ null, false);
ImageFileCreator.create(archives, ByteOrder.nativeOrder(), stack);
}
--- a/jdk/test/tools/jlink/customplugin/module-info.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/tools/jlink/customplugin/module-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -25,4 +25,6 @@
requires jdk.jlink;
provides jdk.tools.jlink.plugin.Plugin with plugin.HelloPlugin;
provides jdk.tools.jlink.plugin.Plugin with plugin.CustomPlugin;
+ provides jdk.tools.jlink.plugin.Plugin with plugin.RogueAdderPlugin;
+ provides jdk.tools.jlink.plugin.Plugin with plugin.RogueFilterPlugin;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/jlink/customplugin/plugin/RogueAdderPlugin.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package plugin;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.lang.module.ModuleDescriptor;
+import java.util.Collections;
+import java.util.Map;
+import java.util.function.Function;
+import jdk.tools.jlink.plugin.ResourcePool;
+import jdk.tools.jlink.plugin.ResourcePoolBuilder;
+import jdk.tools.jlink.plugin.ResourcePoolEntry;
+import jdk.tools.jlink.plugin.ResourcePoolModule;
+import jdk.tools.jlink.plugin.Plugin;
+
+/**
+ * Rogue adder plugin
+ */
+public final class RogueAdderPlugin implements Plugin {
+ public static final String NAME = "rogue-adder";
+ private String resName;
+
+ @Override
+ public String getName() {
+ return NAME;
+ }
+
+ @Override
+ public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) {
+ in.transformAndCopy(Function.identity(), out);
+ out.add(ResourcePoolEntry.create(resName, new byte[1]));
+ return out.build();
+ }
+
+ @Override
+ public String getDescription() {
+ return NAME + "-description";
+ }
+
+ @Override
+ public Category getType() {
+ return Category.FILTER;
+ }
+
+ @Override
+ public boolean hasArguments() {
+ return true;
+ }
+
+ @Override
+ public void configure(Map<String, String> config) {
+ resName = config.get(NAME);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/jlink/customplugin/plugin/RogueFilterPlugin.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package plugin;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.util.Collections;
+import java.util.Map;
+import jdk.tools.jlink.plugin.ResourcePoolEntry;
+import jdk.tools.jlink.plugin.ResourcePool;
+import jdk.tools.jlink.plugin.ResourcePoolBuilder;
+import jdk.tools.jlink.plugin.Plugin;
+
+/**
+ * Rogue filter plugin
+ */
+public final class RogueFilterPlugin implements Plugin {
+ public static final String NAME = "rogue-filter";
+ private String prefix;
+
+ @Override
+ public String getName() {
+ return NAME;
+ }
+
+ @Override
+ public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) {
+ in.transformAndCopy((file) -> {
+ return file.path().startsWith(prefix)? null : file;
+ }, out);
+ return out.build();
+ }
+
+ @Override
+ public String getDescription() {
+ return NAME + "-description";
+ }
+
+ @Override
+ public Category getType() {
+ return Category.FILTER;
+ }
+
+ @Override
+ public boolean hasArguments() {
+ return true;
+ }
+
+ @Override
+ public void configure(Map<String, String> config) {
+ prefix = config.get(NAME);
+ }
+}
--- a/jdk/test/tools/launcher/VersionCheck.java Fri Aug 26 13:11:39 2016 +0300
+++ b/jdk/test/tools/launcher/VersionCheck.java Fri Aug 26 10:14:15 2016 -0700
@@ -82,6 +82,7 @@
"jcmd",
"jconsole",
"jcontrol",
+ "jdeprscan",
"jdeps",
"jimage",
"jinfo",
--- a/langtools/.hgtags Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/.hgtags Fri Aug 26 10:14:15 2016 -0700
@@ -374,3 +374,4 @@
e181909291981038b041ed4d22714c4760e049cd jdk-9+129
3665ebc22a42c8f33777ee025ba0e300e6086a8c jdk-9+130
aebfafc43714d5a27d5064d8a0011eaccde633cf jdk-9+131
+2c17b65a37a8d7afdb9f96d5f11b28a3f21c78f2 jdk-9+132
--- a/langtools/make/build.xml Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/make/build.xml Fri Aug 26 10:14:15 2016 -0700
@@ -246,10 +246,12 @@
<condition property="idea.target.jdk" value="${langtools.jdk.home}" else = "$JDKPath$">
<isset property="langtools.jdk.home"/>
</condition>
- <replace file=".idea/ant.xml" token="@IDEA_JTREG_HOME@" value="${idea.jtreg.home}"/>
<replace file=".idea/ant.xml" token="@IDEA_TARGET_JDK@" value="${idea.target.jdk}"/>
<replace dir=".idea/runConfigurations" token="@IDEA_TARGET_JDK@" value="${idea.target.jdk}"/>
<replace dir=".idea/runConfigurations" token="@XPATCH@" value="${xpatch.cmd}"/>
+ <replace file=".idea/misc.xml" token="@IDEA_JTREG_HOME@" value="${idea.jtreg.home}"/>
+ <replace file=".idea/misc.xml" token="@IDEA_TARGET_JDK@" value="${idea.target.jdk}"/>
+ <replace file=".idea/misc.xml" token="@XPATCH@" value="${xpatch.cmd}"/>
<mkdir dir=".idea/classes"/>
<javac source="${javac.build.source}"
target="${javac.build.target}"
--- a/langtools/make/intellij/ant.xml Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/make/intellij/ant.xml Fri Aug 26 10:14:15 2016 -0700
@@ -3,10 +3,7 @@
<component name="AntConfiguration">
<buildFile url="file://$PROJECT_DIR$/.idea/build.xml">
<properties>
- <property name="jtreg.tests" value="$FilePath$" />
- <property name="langtools.jdk.home" value="@IDEA_TARGET_JDK@" />
- <property name="jtreg.home" value="@IDEA_JTREG_HOME@" />
- <property name="jtreg.jpda.jvmargs" value="-agentlib:jdwp=transport=dt_socket,server=n,suspend=y,address=5900" />
+ <property name="langtools.jdk.home" value="@IDEA_TARGET_JDK@" />
</properties>
<executeOn event="afterCompilation" target="post-make" />
</buildFile>
--- a/langtools/make/intellij/build.xml Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/make/intellij/build.xml Fri Aug 26 10:14:15 2016 -0700
@@ -8,32 +8,5 @@
<import file="../make/build.xml"/>
- <macrodef name="exec-target">
- <attribute name="antfile" default="${ant.file}" />
- <attribute name="target" />
- <sequential>
- <java classname="org.apache.tools.ant.Main" fork="true" spawn="true">
- <arg value="-f"/>
- <arg value="@{antfile}"/>
- <arg value="-Dlangtools.jdk.home=${langtools.jdk.home}"/>
- <arg value="-Djtreg.home=${jtreg.home}"/>
- <arg value="-Djtreg.tests=${jtreg.tests}"/>
- <arg value="-Djtreg.jpda.jvmargs=${jtreg.jpda.jvmargs}"/>
- <arg value="@{target}"/>
- <classpath>
- <pathelement path="${java.class.path}"/>
- </classpath>
- </java>
- </sequential>
- </macrodef>
-
<target name="post-make" depends="clean, build-all-tools"/>
-
- <target name="jtreg-debug" depends="build-all-tools, -def-jtreg">
- <exec-target target="jtreg-debug-internal"/>
- </target>
-
- <target name="jtreg-debug-internal" depends="-def-jtreg">
- <jtreg-tool name="all" tests="${jtreg.tests}" options="-conc:1" jpda.jvmargs="${jtreg.jpda.jvmargs}"/>
- </target>
</project>
--- a/langtools/make/intellij/langtools.iml Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/make/intellij/langtools.iml Fri Aug 26 10:14:15 2016 -0700
@@ -7,7 +7,6 @@
<sourceFolder url="file://$MODULE_DIR$/src/jdk.javadoc/share/classes" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/jdk.jdeps/share/classes" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/jdk.jshell/share/classes" isTestSource="false" />
- <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/build/gensrc/jdk.compiler" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/build/gensrc/jdk.javadoc" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/build/gensrc/jdk.jdeps" isTestSource="false" />
--- a/langtools/make/intellij/misc.xml Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/make/intellij/misc.xml Fri Aug 26 10:14:15 2016 -0700
@@ -3,6 +3,13 @@
<component name="EntryPointsManager">
<entry_points version="2.0" />
</component>
+ <component name="JTRegService">
+ <option name="JTRegDir" value="@IDEA_JTREG_HOME@" />
+ <option name="JTRegOptions" value='@XPATCH@' />
+ <option name="alternativeJrePath" value="@IDEA_TARGET_JDK@" />
+ <option name="alternativeJrePathEnabled" value="true" />
+ <option name="workDir" value="build" />
+ </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/.idea/out" />
</component>
--- a/langtools/make/intellij/runConfigurations/jtreg__debug_.xml Fri Aug 26 13:11:39 2016 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-<component name="ProjectRunConfigurationManager">
- <configuration default="false" name="jtreg (debug)" type="Remote" factoryName="Remote" singleton="true">
- <option name="USE_SOCKET_TRANSPORT" value="true" />
- <option name="SERVER_MODE" value="true" />
- <option name="SHMEM_ADDRESS" />
- <option name="HOST" value="localhost" />
- <option name="PORT" value="5900" />
- <RunnerSettings RunnerId="Debug">
- <option name="DEBUG_PORT" value="5900" />
- <option name="TRANSPORT" value="0" />
- <option name="LOCAL" value="false" />
- </RunnerSettings>
- <ConfigurationWrapper RunnerId="Debug" />
- <method>
- <option name="AntTarget" enabled="true" antfile="file://$PROJECT_DIR$/.idea/build.xml" target="jtreg-debug" />
- </method>
- </configuration>
-</component>
--- a/langtools/make/intellij/runConfigurations/jtreg__run_.xml Fri Aug 26 13:11:39 2016 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-<component name="ProjectRunConfigurationManager">
- <configuration default="false" name="jtreg (run)" type="AntRunConfiguration" factoryName="Ant Target">
- <antsettings antfile="file://$PROJECT_DIR$/.idea/build.xml" target="jtreg" />
- <method>
- <option name="Make" enabled="false" />
- </method>
- </configuration>
-</component>
--- a/langtools/make/intellij/utils/jtreg-live-templates.xml Fri Aug 26 13:11:39 2016 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-<!--
-The following live template declarations allow for automatic generation of jtreg test headers.
-Unfortunately, live templates cannot be shared on a per project base, but they can be easily imported
-by cutting and paste the following lines inside IntelliJ LiveTemplate settings (this will need to be done only once).
--->
-
-<template name="@test" value="@test * @bug $BUG_ID$ * @summary $BUG_SUMMARY$ * $JTREG_ACTION$ $FILE_NAME$" description="jtreg header (positive test)" toReformat="false" toShortenFQNames="true">
- <variable name="BUG_ID" expression="groovyScript("_1 ==~ /T\\d{7}/ ? _1.substring(1).take(7) : 'NNNNNNN'", fileNameWithoutExtension())" defaultValue="" alwaysStopAt="true" />
- <variable name="BUG_SUMMARY" expression=""Bug summary"" defaultValue="" alwaysStopAt="true" />
- <variable name="JTREG_ACTION" expression=""@compile"" defaultValue="" alwaysStopAt="true" />
- <variable name="FILE_NAME" expression="fileName()" defaultValue="" alwaysStopAt="true" />
- <context>
- <option name="JAVA_COMMENT" value="true" />
- </context>
-</template>
-<template name="@test /nodynamiccopyright/" value="@test * @bug $BUG_ID$ * @summary $BUG_SUMMARY$ * $JTREG_ACTION$/fail/ref=$GOLDEN_NAME$ -XDrawDiagnostics $FILE_NAME$" description="jtreg header (negative test)" toReformat="false" toShortenFQNames="true">
- <variable name="BUG_ID" expression="groovyScript("_1 ==~ /T\\d{7}/ ? _1.substring(1).take(7) : 'NNNNNNN'", fileNameWithoutExtension())" defaultValue="NNNNNNN" alwaysStopAt="true" />
- <variable name="BUG_SUMMARY" expression=""Bug summary"" defaultValue="" alwaysStopAt="true" />
- <variable name="JTREG_ACTION" expression=""@compile"" defaultValue="" alwaysStopAt="true" />
- <variable name="GOLDEN_NAME" expression="groovyScript("_1 + '.out'", fileNameWithoutExtension())" defaultValue="out.txt" alwaysStopAt="true" />
- <variable name="FILE_NAME" expression="fileName()" defaultValue="" alwaysStopAt="true" />
- <context>
- <option name="JAVA_COMMENT" value="true" />
- </context>
-</template>
--- a/langtools/make/intellij/workspace.xml Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/make/intellij/workspace.xml Fri Aug 26 10:14:15 2016 -0700
@@ -12,8 +12,6 @@
<filter targetName="build-all-tools" isVisible="true" />
<filter targetName="build-all-classes" isVisible="true" />
<filter targetName="clean" isVisible="true" />
- <filter targetName="jtreg" isVisible="true" />
- <filter targetName="jtreg-debug" isVisible="true" />
<filter targetName="crules" isVisible="true" />
</targetFilters>
<viewClosedWhenNoErrors value="true" />
--- a/langtools/src/java.compiler/share/classes/javax/tools/JavaCompiler.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/java.compiler/share/classes/javax/tools/JavaCompiler.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -160,7 +160,7 @@
* log all calls to {@linkplain JavaFileManager#flush}:
*
* <pre>
- * final {@linkplain java.util.logging.Logger Logger} logger = ...;
+ * final Logger logger = ...;
* {@code Iterable<? extends JavaFileObject>} compilationUnits = ...;
* JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
* StandardJavaFileManager stdFileManager = compiler.getStandardFileManager(null, null, null);
--- a/langtools/src/java.compiler/share/classes/module-info.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/java.compiler/share/classes/module-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -23,6 +23,13 @@
* questions.
*/
+ /**
+ * Defines the Language Model, Annotation Processing, and Java Compiler APIs.
+ * <P>
+ * These APIs model declarations and types of the Java programming language,
+ * and define interfaces for tools such as compilers which can be invoked
+ * from a program.
+ */
module java.compiler {
exports javax.annotation.processing;
exports javax.lang.model;
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/doclint/DocLint.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/doclint/DocLint.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -40,6 +40,7 @@
import com.sun.source.doctree.DocCommentTree;
import com.sun.source.tree.ClassTree;
import com.sun.source.tree.CompilationUnitTree;
+import com.sun.source.tree.ModuleTree;
import com.sun.source.tree.PackageTree;
import com.sun.source.tree.MethodTree;
import com.sun.source.tree.Tree;
@@ -406,6 +407,12 @@
}
@Override @DefinedBy(Api.COMPILER_TREE)
+ public Void visitModule(ModuleTree tree, Void ignore) {
+ visitDecl(tree, null);
+ return super.visitModule(tree, ignore);
+ }
+
+ @Override @DefinedBy(Api.COMPILER_TREE)
public Void visitVariable(VariableTree tree, Void ignore) {
visitDecl(tree, tree.getName());
return super.visitVariable(tree, ignore);
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/doclint/Env.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/doclint/Env.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -210,7 +210,7 @@
AccessKind ak = AccessKind.PUBLIC;
for (TreePath p = path; p != null; p = p.getParentPath()) {
Element e = trees.getElement(p);
- if (e != null && e.getKind() != ElementKind.PACKAGE) {
+ if (e != null && e.getKind() != ElementKind.PACKAGE && e.getKind() != ElementKind.MODULE) {
ak = min(ak, AccessKind.of(e.getModifiers()));
}
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Annotate.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Annotate.java Fri Aug 26 10:14:15 2016 -0700
@@ -54,6 +54,7 @@
import static com.sun.tools.javac.tree.JCTree.Tag.ASSIGN;
import static com.sun.tools.javac.tree.JCTree.Tag.IDENT;
import static com.sun.tools.javac.tree.JCTree.Tag.NEWARRAY;
+import com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag;
/** Enter annotations onto symbols and types (and trees).
*
@@ -302,7 +303,6 @@
{
Map<TypeSymbol, ListBuffer<T>> annotated = new LinkedHashMap<>();
Map<T, DiagnosticPosition> pos = new HashMap<>();
- boolean allowRepeatedAnnos = this.allowRepeatedAnnos;
for (List<JCAnnotation> al = withAnnotations; !al.isEmpty(); al = al.tail) {
JCAnnotation a = al.head;
@@ -322,8 +322,7 @@
if (annotated.containsKey(a.type.tsym)) {
if (!allowRepeatedAnnos) {
- log.error(a.pos(), "repeatable.annotations.not.supported.in.source");
- allowRepeatedAnnos = true;
+ log.error(DiagnosticFlag.SOURCE_LEVEL, a.pos(), "repeatable.annotations.not.supported.in.source");
}
ListBuffer<T> l = annotated.get(a.type.tsym);
l = l.append(c);
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Fri Aug 26 10:14:15 2016 -0700
@@ -70,6 +70,7 @@
import static com.sun.tools.javac.code.TypeTag.*;
import static com.sun.tools.javac.code.TypeTag.WILDCARD;
import static com.sun.tools.javac.tree.JCTree.Tag.*;
+import com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag;
/** This is the main context-dependent analysis phase in GJC. It
* encompasses name resolution, type checking and constant folding as
@@ -1282,13 +1283,9 @@
try {
boolean enumSwitch = (seltype.tsym.flags() & Flags.ENUM) != 0;
- boolean stringSwitch = false;
- if (types.isSameType(seltype, syms.stringType)) {
- if (allowStringsInSwitch) {
- stringSwitch = true;
- } else {
- log.error(tree.selector.pos(), "string.switch.not.supported.in.source", sourceName);
- }
+ boolean stringSwitch = types.isSameType(seltype, syms.stringType);
+ if (stringSwitch && !allowStringsInSwitch) {
+ log.error(DiagnosticFlag.SOURCE_LEVEL, tree.selector.pos(), "string.switch.not.supported.in.source", sourceName);
}
if (!enumSwitch && !stringSwitch)
seltype = chk.checkType(tree.selector.pos(), seltype, syms.intType);
@@ -3484,7 +3481,7 @@
}
if (!allowStaticInterfaceMethods && sitesym.isInterface() &&
sym.isStatic() && sym.kind == MTH) {
- log.error(tree.pos(), "static.intf.method.invoke.not.supported.in.source", sourceName);
+ log.error(DiagnosticFlag.SOURCE_LEVEL, tree.pos(), "static.intf.method.invoke.not.supported.in.source", sourceName);
}
} else if (sym.kind != ERR &&
(sym.flags() & STATIC) != 0 &&
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java Fri Aug 26 10:14:15 2016 -0700
@@ -789,23 +789,25 @@
if (!TreeInfo.isDiamond(tree) ||
t.isErroneous()) {
return checkClassType(tree.clazz.pos(), t, true);
- } else if (tree.def != null && !allowDiamondWithAnonymousClassCreation) {
- log.error(tree.clazz.pos(),
- Errors.CantApplyDiamond1(t, Fragments.DiamondAndAnonClassNotSupportedInSource(source.name)));
- return types.createErrorType(t);
- } else if (t.tsym.type.getTypeArguments().isEmpty()) {
- log.error(tree.clazz.pos(),
- "cant.apply.diamond.1",
- t, diags.fragment("diamond.non.generic", t));
- return types.createErrorType(t);
- } else if (tree.typeargs != null &&
- tree.typeargs.nonEmpty()) {
- log.error(tree.clazz.pos(),
- "cant.apply.diamond.1",
- t, diags.fragment("diamond.and.explicit.params", t));
- return types.createErrorType(t);
} else {
- return t;
+ if (tree.def != null && !allowDiamondWithAnonymousClassCreation) {
+ log.error(DiagnosticFlag.SOURCE_LEVEL, tree.clazz.pos(),
+ Errors.CantApplyDiamond1(t, Fragments.DiamondAndAnonClassNotSupportedInSource(source.name)));
+ }
+ if (t.tsym.type.getTypeArguments().isEmpty()) {
+ log.error(tree.clazz.pos(),
+ "cant.apply.diamond.1",
+ t, diags.fragment("diamond.non.generic", t));
+ return types.createErrorType(t);
+ } else if (tree.typeargs != null &&
+ tree.typeargs.nonEmpty()) {
+ log.error(tree.clazz.pos(),
+ "cant.apply.diamond.1",
+ t, diags.fragment("diamond.and.explicit.params", t));
+ return types.createErrorType(t);
+ } else {
+ return t;
+ }
}
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/FSInfo.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/FSInfo.java Fri Aug 26 10:14:15 2016 -0700
@@ -29,7 +29,7 @@
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
-import java.nio.file.Paths;
+import java.nio.file.spi.FileSystemProvider;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -118,4 +118,19 @@
return list;
}
}
+
+ private FileSystemProvider jarFSProvider;
+
+ public synchronized FileSystemProvider getJarFSProvider() {
+ if (jarFSProvider != null) {
+ return jarFSProvider;
+ }
+ for (FileSystemProvider provider: FileSystemProvider.installedProviders()) {
+ if (provider.getScheme().equals("jar")) {
+ return (jarFSProvider = provider);
+ }
+ }
+ return null;
+ }
+
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/JavacFileManager.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/JavacFileManager.java Fri Aug 26 10:14:15 2016 -0700
@@ -69,6 +69,7 @@
import com.sun.tools.javac.file.RelativePath.RelativeDirectory;
import com.sun.tools.javac.file.RelativePath.RelativeFile;
+import com.sun.tools.javac.util.Assert;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.DefinedBy;
import com.sun.tools.javac.util.DefinedBy.Api;
@@ -509,7 +510,9 @@
this.archivePath = archivePath;
if (multiReleaseValue != null && archivePath.toString().endsWith(".jar")) {
Map<String,String> env = Collections.singletonMap("multi-release", multiReleaseValue);
- this.fileSystem = getJarFSProvider().newFileSystem(archivePath, env);
+ FileSystemProvider jarFSProvider = fsInfo.getJarFSProvider();
+ Assert.checkNonNull(jarFSProvider, "should have been caught before!");
+ this.fileSystem = jarFSProvider.newFileSystem(archivePath, env);
} else {
this.fileSystem = FileSystems.newFileSystem(archivePath, null);
}
@@ -597,20 +600,6 @@
}
}
- private FileSystemProvider jarFSProvider;
-
- private FileSystemProvider getJarFSProvider() throws IOException {
- if (jarFSProvider != null) {
- return jarFSProvider;
- }
- for (FileSystemProvider provider: FileSystemProvider.installedProviders()) {
- if (provider.getScheme().equals("jar")) {
- return (jarFSProvider = provider);
- }
- }
- throw new ProviderNotFoundException("no provider found for .jar files");
- }
-
/**
* container is a directory, a zip file, or a non-existent path.
*/
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java Fri Aug 26 10:14:15 2016 -0700
@@ -42,6 +42,7 @@
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.ProviderNotFoundException;
+import java.nio.file.spi.FileSystemProvider;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -315,26 +316,30 @@
if (fsInfo.isFile(file)) {
/* File is an ordinary file. */
- if (!isArchive(file)
- && !file.getFileName().toString().endsWith(".jmod")
- && !file.endsWith("modules")) {
- /* Not a recognized extension; open it to see if
- it looks like a valid zip file. */
- try {
- // TODO: use of ZipFile should be updated
- ZipFile z = new ZipFile(file.toFile());
- z.close();
- if (warn) {
- log.warning(Lint.LintCategory.PATH,
- "unexpected.archive.file", file);
+ if ( !file.getFileName().toString().endsWith(".jmod")
+ && !file.endsWith("modules")) {
+ if (!isArchive(file)) {
+ /* Not a recognized extension; open it to see if
+ it looks like a valid zip file. */
+ try {
+ FileSystems.newFileSystem(file, null).close();
+ if (warn) {
+ log.warning(Lint.LintCategory.PATH,
+ "unexpected.archive.file", file);
+ }
+ } catch (IOException | ProviderNotFoundException e) {
+ // FIXME: include e.getLocalizedMessage in warning
+ if (warn) {
+ log.warning(Lint.LintCategory.PATH,
+ "invalid.archive.file", file);
+ }
+ return;
}
- } catch (IOException e) {
- // FIXME: include e.getLocalizedMessage in warning
- if (warn) {
- log.warning(Lint.LintCategory.PATH,
- "invalid.archive.file", file);
+ } else {
+ if (fsInfo.getJarFSProvider() == null) {
+ log.error(Errors.NoZipfsForArchive(file));
+ return ;
}
- return;
}
}
}
@@ -1054,6 +1059,9 @@
} catch (IOException e) {
log.error(Errors.LocnCantReadFile(p));
return null;
+ } catch (ProviderNotFoundException e) {
+ log.error(Errors.NoZipfsForArchive(p));
+ return null;
}
//automatic module:
@@ -1105,13 +1113,9 @@
fs.close();
}
}
- } catch (ProviderNotFoundException e) {
- // will be thrown if the file is not a valid zip file
- log.error(Errors.LocnCantReadFile(p));
- return null;
} catch (ModuleNameReader.BadClassFile e) {
log.error(Errors.LocnBadModuleInfo(p));
- } catch (IOException e) {
+ } catch (IOException | ProviderNotFoundException e) {
log.error(Errors.LocnCantReadFile(p));
return null;
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java Fri Aug 26 10:14:15 2016 -0700
@@ -566,6 +566,11 @@
* class name is of the form module-name.module-info.
*/
Name readModuleInfoName(int i) {
+ if (majorVersion < Version.V53.major) {
+ throw badClassFile("anachronistic.module.info",
+ Integer.toString(majorVersion),
+ Integer.toString(minorVersion));
+ }
int classIndex = poolIdx[i];
if (buf[classIndex] == CONSTANT_Class) {
int utf8Index = poolIdx[getChar(classIndex + 1)];
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java Fri Aug 26 10:14:15 2016 -0700
@@ -51,6 +51,7 @@
import static com.sun.tools.javac.parser.Tokens.TokenKind.IMPORT;
import static com.sun.tools.javac.parser.Tokens.TokenKind.LT;
import static com.sun.tools.javac.tree.JCTree.Tag.*;
+import com.sun.tools.javac.util.JCDiagnostic.SimpleDiagnosticPosition;
/** The parser maps a token sequence into an abstract syntax
* tree. It operates by recursive descent, with code derived
@@ -2536,11 +2537,13 @@
finalizer = block();
}
} else {
- if (allowTWR) {
- if (resources.isEmpty())
+ if (resources.isEmpty()) {
+ if (allowTWR) {
error(pos, "try.without.catch.finally.or.resource.decls");
- } else
- error(pos, "try.without.catch.or.finally");
+ } else {
+ error(pos, "try.without.catch.or.finally");
+ }
+ }
}
return F.at(pos).Try(resources, body, catchers.toList(), finalizer);
}
@@ -3238,6 +3241,8 @@
accept(SEMI);
defs.append(toP(F.at(pos).Uses(service)));
} else {
+ setErrorEndPos(pos);
+ reportSyntaxError(pos, "invalid.module.directive");
break;
}
}
@@ -4080,74 +4085,62 @@
void checkDiamond() {
if (!allowDiamond) {
- error(token.pos, "diamond.not.supported.in.source", source.name);
- allowDiamond = true;
+ log.error(DiagnosticFlag.SOURCE_LEVEL, token.pos, "diamond.not.supported.in.source", source.name);
}
}
void checkMulticatch() {
if (!allowMulticatch) {
- error(token.pos, "multicatch.not.supported.in.source", source.name);
- allowMulticatch = true;
+ log.error(DiagnosticFlag.SOURCE_LEVEL, token.pos, "multicatch.not.supported.in.source", source.name);
}
}
void checkTryWithResources() {
if (!allowTWR) {
- error(token.pos, "try.with.resources.not.supported.in.source", source.name);
- allowTWR = true;
+ log.error(DiagnosticFlag.SOURCE_LEVEL, token.pos, "try.with.resources.not.supported.in.source", source.name);
}
}
void checkVariableInTryWithResources(int startPos) {
if (!allowEffectivelyFinalVariablesInTWR) {
- error(startPos, "var.in.try.with.resources.not.supported.in.source", source.name);
- allowEffectivelyFinalVariablesInTWR = true;
+ log.error(DiagnosticFlag.SOURCE_LEVEL, startPos, "var.in.try.with.resources.not.supported.in.source", source.name);
}
}
void checkLambda() {
if (!allowLambda) {
- log.error(token.pos, "lambda.not.supported.in.source", source.name);
- allowLambda = true;
+ log.error(DiagnosticFlag.SOURCE_LEVEL, token.pos, "lambda.not.supported.in.source", source.name);
}
}
void checkMethodReferences() {
if (!allowMethodReferences) {
- log.error(token.pos, "method.references.not.supported.in.source", source.name);
- allowMethodReferences = true;
+ log.error(DiagnosticFlag.SOURCE_LEVEL, token.pos, "method.references.not.supported.in.source", source.name);
}
}
void checkDefaultMethods() {
if (!allowDefaultMethods) {
- log.error(token.pos, "default.methods.not.supported.in.source", source.name);
- allowDefaultMethods = true;
+ log.error(DiagnosticFlag.SOURCE_LEVEL, token.pos, "default.methods.not.supported.in.source", source.name);
}
}
void checkIntersectionTypesInCast() {
if (!allowIntersectionTypesInCast) {
- log.error(token.pos, "intersection.types.in.cast.not.supported.in.source", source.name);
- allowIntersectionTypesInCast = true;
+ log.error(DiagnosticFlag.SOURCE_LEVEL, token.pos, "intersection.types.in.cast.not.supported.in.source", source.name);
}
}
void checkStaticInterfaceMethods() {
if (!allowStaticInterfaceMethods) {
- log.error(token.pos, "static.intf.methods.not.supported.in.source", source.name);
- allowStaticInterfaceMethods = true;
+ log.error(DiagnosticFlag.SOURCE_LEVEL, token.pos, "static.intf.methods.not.supported.in.source", source.name);
}
}
void checkTypeAnnotations() {
if (!allowTypeAnnotations) {
- log.error(token.pos, "type.annotations.not.supported.in.source", source.name);
- allowTypeAnnotations = true;
+ log.error(DiagnosticFlag.SOURCE_LEVEL, token.pos, "type.annotations.not.supported.in.source", source.name);
}
}
void checkPrivateInterfaceMethods() {
if (!allowPrivateInterfaceMethods) {
- log.error(token.pos, CompilerProperties.Errors.PrivateIntfMethodsNotSupportedInSource(source.name));
- allowPrivateInterfaceMethods = true;
+ log.error(DiagnosticFlag.SOURCE_LEVEL, token.pos, CompilerProperties.Errors.PrivateIntfMethodsNotSupportedInSource(source.name));
}
}
protected void checkAnnotationsAfterTypeParams(int pos) {
if (!allowAnnotationsAfterTypeParams) {
- log.error(pos, "annotations.after.type.params.not.supported.in.source", source.name);
- allowAnnotationsAfterTypeParams = true;
+ log.error(DiagnosticFlag.SOURCE_LEVEL, pos, "annotations.after.type.params.not.supported.in.source", source.name);
}
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/platform/JDKPlatformProvider.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/platform/JDKPlatformProvider.java Fri Aug 26 10:14:15 2016 -0700
@@ -32,6 +32,7 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.nio.file.ProviderNotFoundException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -86,7 +87,7 @@
}
}
}
- } catch (IOException ex) {
+ } catch (IOException | ProviderNotFoundException ex) {
}
}
SUPPORTED_JAVA_PLATFORM_VERSIONS.add(targetNumericVersion(Target.DEFAULT));
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties Fri Aug 26 10:14:15 2016 -0700
@@ -672,6 +672,9 @@
compiler.err.cannot.create.array.with.diamond=\
cannot create array with ''<>''
+compiler.err.invalid.module.directive=\
+ module directive keyword or ''}'' expected
+
#
# limits. We don't give the limits in the diagnostic because we expect
# them to change, yet we want to use the same diagnostic. These are all
@@ -1664,6 +1667,10 @@
compiler.warn.unexpected.archive.file=\
Unexpected extension for archive file: {0}
+# 0: path
+compiler.err.no.zipfs.for.archive=\
+ No file system provider is available to handle this file: {0}
+
compiler.warn.div.zero=\
division by zero
@@ -1868,6 +1875,10 @@
compiler.misc.invalid.static.interface=\
static method found in version {0}.{1} classfile
+# 0: string (classfile major version), 1: string (classfile minor version)
+compiler.misc.anachronistic.module.info=\
+ module declaration found in version {0}.{1} classfile
+
# 0: name
compiler.misc.file.doesnt.contain.class=\
file does not contain class {0}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/util/JCDiagnostic.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/util/JCDiagnostic.java Fri Aug 26 10:14:15 2016 -0700
@@ -435,7 +435,10 @@
COMPRESSED,
/** Print multiple errors for same source locations.
*/
- MULTIPLE;
+ MULTIPLE,
+ /** Flag for not-supported-in-source-X errors.
+ */
+ SOURCE_LEVEL;
}
private final DiagnosticSource source;
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Log.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Log.java Fri Aug 26 10:14:15 2016 -0700
@@ -428,6 +428,11 @@
*/
protected Set<Pair<JavaFileObject, Integer>> recorded = new HashSet<>();
+ /** A set of "not-supported-in-source-X" errors produced so far. This is used to only generate
+ * one such error per file.
+ */
+ protected Set<Pair<JavaFileObject, String>> recordedSourceLevelErrors = new HashSet<>();
+
public boolean hasDiagnosticListener() {
return diagListener != null;
}
@@ -507,6 +512,27 @@
return shouldReport;
}
+ /** Returns true if a diagnostics needs to be reported.
+ */
+ private boolean shouldReport(JCDiagnostic d) {
+ JavaFileObject file = d.getSource();
+
+ if (file == null)
+ return true;
+
+ if (!shouldReport(file, d.getIntPosition()))
+ return false;
+
+ if (!d.isFlagSet(DiagnosticFlag.SOURCE_LEVEL))
+ return true;
+
+ Pair<JavaFileObject, String> coords = new Pair<>(file, d.getCode());
+ boolean shouldReport = !recordedSourceLevelErrors.contains(coords);
+ if (shouldReport)
+ recordedSourceLevelErrors.add(coords);
+ return shouldReport;
+ }
+
/** Prompt user after an error.
*/
public void prompt() {
@@ -671,7 +697,7 @@
case ERROR:
if (nerrors < MaxErrors &&
(diagnostic.isFlagSet(DiagnosticFlag.MULTIPLE) ||
- shouldReport(diagnostic.getSource(), diagnostic.getIntPosition()))) {
+ shouldReport(diagnostic))) {
writeDiagnostic(diagnostic);
nerrors++;
}
--- a/langtools/src/jdk.compiler/share/classes/module-info.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.compiler/share/classes/module-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -23,6 +23,10 @@
* questions.
*/
+/** Defines the implementation of the
+ * {@link javax.tools.ToolProvider#getSystemJavaCompiler system Java compiler}
+ * and its command line equivalent, <em>javac</em>, as well as <em>javah</em>.
+ */
module jdk.compiler {
requires public java.compiler;
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/doclet/Doclet.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/doclet/Doclet.java Fri Aug 26 10:14:15 2016 -0700
@@ -63,8 +63,7 @@
/**
* Initializes this doclet with the given locale and error reporter.
* This locale will be used by the reporter and the doclet components.
- * It is recommended to call this as early as possible, for a
- * uniform localized user experience,
+ *
* @param locale the locale to be used
* @param reporter the reporter to be used
*/
@@ -74,6 +73,7 @@
* Returns a name identifying the doclet. A name is a simple identifier
* without white spaces, as defined in <cite>The Java™ Language Specification</cite>,
* section 6.2 "Names and Identifiers".
+ *
* @return name of the Doclet
*/
public abstract String getName();
@@ -81,7 +81,7 @@
/**
* Returns all the supported options.
*
- * @return a Set containing all the supported options, an empty set if none.
+ * @return a set containing all the supported options, an empty set if none
*/
public Set<Option> getSupportedOptions();
@@ -90,7 +90,7 @@
* by this doclet.
*
* @return the language version supported by this doclet, usually
- * the latest version.
+ * the latest version
*/
public SourceVersion getSupportedSourceVersion();
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/doclet/DocletEnvironment.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/doclet/DocletEnvironment.java Fri Aug 26 10:14:15 2016 -0700
@@ -30,6 +30,8 @@
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
+import javax.lang.model.element.ModuleElement;
+import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
@@ -48,17 +50,34 @@
public interface DocletEnvironment {
/**
* Returns the <a href="package-summary.html#included">included</a>
- * classes, interfaces and enums in all packages.
+ * modules.
+ *
+ * @return a set of included module elements
+ */
+ Set<ModuleElement> getIncludedModuleElements();
+
+ /**
+ * Returns the <a href="package-summary.html#included">included</a>
+ * annotation types, classes, interfaces and enums in all packages.
*
- * @return a Set containing {@link javax.lang.model.element.TypeElement TypeElements}.
+ * @return a set of included type elements
*/
- Set<TypeElement> getIncludedClasses();
+ Set<TypeElement> getIncludedTypeElements();
+
+ /**
+ * Returns the <a href="package-summary.html#included">included</a>
+ * packages.
+ *
+ * @return a set of included package elements
+ */
+ Set<PackageElement> getIncludedPackageElements();
/**
* Returns an instance of the {@code DocTrees} utility class.
* This class provides methods to access {@code TreePath}s, {@code DocCommentTree}s
* and so on.
- * @return a utility class to operate on doc trees.
+ *
+ * @return a utility class to operate on doc trees
*/
DocTrees getDocTrees();
@@ -66,21 +85,23 @@
* Returns an instance of the {@code Elements} utility class.
* This class provides methods for operating on
* {@link javax.lang.model.element.Element elements}.
+ *
* @return a utility class to operate on elements
*/
Elements getElementUtils();
/**
- * Returns the selected elements that can be documented.
+ * Returns the <a href="package-summary.html#included">selected</a>
+ * elements that can be documented.
*
* @param elements those that need to be checked
- * @return elements selected, an empty list if none.
+ * @return elements selected, an empty list if none
*/
List<Element> getSelectedElements(List<? extends Element> elements);
/**
- * Returns the elements <a href="package-summary.html#included">specified</a>
- * on the command line, usually PackageElements and TypeElements.
+ * Returns the elements <a href="package-summary.html#specified">specified</a>
+ * on the command line, usually module elements, package elements and type elements.
* If {@code -subpackages} and {@code -exclude} options
* are used, return all the non-excluded packages.
*
@@ -92,6 +113,7 @@
* Returns an instance of the {@code Types} utility class.
* This class provides methods for operating on
* {@link javax.lang.model.type.TypeMirror type mirrors}.
+ *
* @return a utility class to operate on type mirrors
*/
Types getTypeUtils();
@@ -117,4 +139,18 @@
* @return the source version
*/
SourceVersion getSourceVersion();
+
+ /**
+ * Returns the required level of module documentation.
+ *
+ * @return the required level of module documentation
+ */
+ public ModuleMode getModuleMode();
+
+ enum ModuleMode {
+ /** Indicate API level documentation is required */
+ API,
+ /** Indicate Detailed documentation is required */
+ ALL
+ }
}
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/doclet/package-info.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/doclet/package-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -27,7 +27,7 @@
* The Doclet API provides an environment which, in conjunction with
* the Language Model API and Compiler Tree API, allows clients
* to inspect the source-level structures of programs and
- * libraries, including javadoc comments embedded in the source.
+ * libraries, including API comments embedded in the source.
*
* <p style="font-style: italic">
* <b>Note:</b> The declarations in this package supersede those
@@ -57,15 +57,58 @@
* <a name="terminology"></a>
* <h3>Terminology</h3>
*
+ * <a name="specified"></a>
+ * Module, package and source file names can be provided as parameters to the
+ * javadoc tool -- these are called the <em>specified</em> set containing
+ * module elements, package elements and type elements.
+ * <p>
+ * Javadoc <em>selection control</em> can be specified with
+ * {@code --show-members:value}, {@code --showtypes:value}, where value can be one of
+ * the following:
+ * <ul>
+ * <li> public -- considers only public elements
+ * <li> protected -- considers public and protected elements
+ * <li> package -- considers public, protected and package private elements
+ * <li> private -- considers all elements
+ * </ul>
+ *
+ * The {@code --show-package:value} where a value of "exported" or "all" can be used to
+ * consider only exported packages or all packages within a module.
+ * <p>
+ * The {@code --expand-requires:value}, expands the "requires" directives of a
+ * module declaration, to create a module set to considered for documentation
+ * as follows:
+ * <ul>
+ * <li> public -- follows and expands all "requires public" edges in the module graph
+ * <li> all -- follows and expands all "requires" edges in the module graph.
+ * By default, only the specified modules will be considered, without expansion
+ * of the module dependencies.
+ * </ul>
* <a name="included"></a>
- * When calling javadoc, one can pass in package names and source file names --
- * these are called the <em>specified</em> PackageElements and TypeElements.
- * Javadoc options are also passed in; the <em>access control</em> Javadoc options
- * ({@code -public}, {@code -protected}, {@code -package},
- * and {@code -private}) are used to filter program elements, producing a
- * result set, called the <em>included</em> set, or "selected" set.
+ * All of the above are used to select the elements, to produce the
+ * <em>included</em> or the <em>selected</em> set.
+ * <p>
+ * {@code --show-module-contents:value} can be used to specify the level at
+ * module declarations could be documented, a value of "api" indicates API
+ * level documentation, and "all" indicates detailed documentation.
* <p>
-
+ * <a name="legacy-interactions"></a>
+ * <h4>Interactions with older options.</h4>
+ *
+ * The new --show-* options provide a more detailed replacement for the older
+ * options -public, -protected, -package, -private. Alternatively, the older
+ * options can continue to be used as shorter forms for combinations of the
+ * new options, as described below:
+ <table style="font-family: monospace" border=1>
+ <caption>Short form options mapping</caption>
+ <tr><th>Older option<th colspan="5">Equivalent to these values with the new option
+ <tr><th><th>--show-members<th>--show-types<th>--show-packages<th>--show-module-contents
+ <tr><td>-public<td>public<td>public<td>exported<td>api
+ <tr><td>-protected<td>protected<td>protected<td>exported<td>api
+ <tr><td>-package<td>package<td>package<td>all<td>all
+ <tr><td>-private<td>private<td>private<td>all<td>all
+ </table>
+ * <p>
* <a name="qualified"></a>
* A <em>qualified</em> element name is one that has its package
* name prepended to it, such as {@code java.lang.String}. A non-qualified
@@ -96,14 +139,14 @@
* }
*
* @Override
- * public boolean run(RootDoc root) {
+ * public boolean run(DocletEnvironment docEnv) {
* // cache the DocTrees utility class to access DocComments
- * DocTrees docTrees = root.getDocTrees();
+ * DocTrees docTrees = docEnv.getDocTrees();
*
* // location of an element in the same directory as overview.html
* try {
* Element barElement = null;
- * for (Element e : root.getIncludedClasses()) {
+ * for (Element e : docEnv.getIncludedClasses()) {
* if (e.getSimpleName().toString().equals("FooBar")) {
* barElement = e;
* }
@@ -118,7 +161,7 @@
* System.err.println("No overview.html found.");
* }
*
- * for (TypeElement t : root.getIncludedClasses()) {
+ * for (TypeElement t : docEnv.getIncludedClasses()) {
* System.out.println(t.getKind() + ":" + t);
* for (Element e : t.getEnclosedElements()) {
* DocCommentTree docCommentTree = docTrees.getDocCommentTree(e);
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java Fri Aug 26 10:14:15 2016 -0700
@@ -115,7 +115,7 @@
* Add the summary link for the member.
*
* @param context the id of the context where the link will be printed
- * @param te the classDoc that we should link to
+ * @param te the type element being linked to
* @param member the member being linked to
* @param tdSummary the content tree to which the link will be added
*/
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractIndexWriter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractIndexWriter.java Fri Aug 26 10:14:15 2016 -0700
@@ -32,6 +32,7 @@
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.SimpleElementVisitor9;
@@ -183,6 +184,15 @@
new SimpleElementVisitor9<Void, Void>() {
@Override @DefinedBy(DefinedBy.Api.LANGUAGE_MODEL)
+ public Void visitModule(ModuleElement e, Void p) {
+ if (configuration.showModules) {
+ addDescription(e, dl, si);
+ configuration.moduleSearchIndex.add(si);
+ }
+ return null;
+ }
+
+ @Override @DefinedBy(DefinedBy.Api.LANGUAGE_MODEL)
public Void visitPackage(PackageElement e, Void p) {
addDescription(e, dl, si);
configuration.packageSearchIndex.add(si);
@@ -207,6 +217,27 @@
}
/**
+ * Add one line summary comment for the module.
+ *
+ * @param mdle the module to be documented
+ * @param dlTree the content tree to which the description will be added
+ */
+ protected void addDescription(ModuleElement mdle, Content dlTree, SearchIndexItem si) {
+ String moduleName = utils.getSimpleName(mdle);
+ Content link = getModuleLink(mdle, new StringContent(moduleName));
+ si.setLabel(moduleName);
+ si.setCategory(resources.getText("doclet.Modules"));
+ Content dt = HtmlTree.DT(link);
+ dt.addContent(" - ");
+ dt.addContent(contents.module_);
+ dt.addContent(" " + moduleName);
+ dlTree.addContent(dt);
+ Content dd = new HtmlTree(HtmlTag.DD);
+ addSummaryComment(mdle, dd);
+ dlTree.addContent(dd);
+ }
+
+ /**
* Add one line summary comment for the package.
*
* @param pkg the package to be documented
@@ -214,6 +245,9 @@
*/
protected void addDescription(PackageElement pkg, Content dlTree, SearchIndexItem si) {
Content link = getPackageLink(pkg, new StringContent(utils.getPackageName(pkg)));
+ if (configuration.showModules) {
+ si.setContainingModule(utils.getSimpleName(utils.containingModule(pkg)));
+ }
si.setLabel(utils.getPackageName(pkg));
si.setCategory(resources.getText("doclet.Packages"));
Content dt = HtmlTree.DT(link);
@@ -397,6 +431,10 @@
}
protected void createSearchIndexFiles() {
+ if (configuration.showModules) {
+ createSearchIndexFile(DocPaths.MODULE_SEARCH_INDEX_JSON, DocPaths.MODULE_SEARCH_INDEX_ZIP,
+ configuration.moduleSearchIndex);
+ }
createSearchIndexFile(DocPaths.PACKAGE_SEARCH_INDEX_JSON, DocPaths.PACKAGE_SEARCH_INDEX_ZIP,
configuration.packageSearchIndex);
createSearchIndexFile(DocPaths.TYPE_SEARCH_INDEX_JSON, DocPaths.TYPE_SEARCH_INDEX_ZIP,
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractModuleIndexWriter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractModuleIndexWriter.java Fri Aug 26 10:14:15 2016 -0700
@@ -28,6 +28,7 @@
import java.io.*;
import java.util.Map;
import java.util.Set;
+import java.util.SortedMap;
import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.PackageElement;
@@ -57,7 +58,7 @@
/**
* Modules to be documented.
*/
- protected Map<ModuleElement, Set<PackageElement>> modules;
+ protected SortedMap<ModuleElement, Set<PackageElement>> modules;
/**
* Constructor. Also initializes the modules variable.
@@ -142,7 +143,7 @@
*
* @param title the title of the window.
* @param includeScript boolean set true if windowtitle script is to be included
- * @param moduleName the name of the module being documented
+ * @param mdle the name of the module being documented
*/
protected void buildModulePackagesIndexFile(String title,
boolean includeScript, ModuleElement mdle) throws IOException {
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AllClassesFrameWriter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AllClassesFrameWriter.java Fri Aug 26 10:14:15 2016 -0700
@@ -25,7 +25,7 @@
package jdk.javadoc.internal.doclets.formats.html;
-import java.io.*;
+import java.io.IOException;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
@@ -89,25 +89,32 @@
* "allclasses-frame.html" file. Generate the file in the current or the
* destination directory.
*
- * @param indexbuilder IndexBuilder object for all classes index.
+ * @param indexBuilder IndexBuilder object for all classes index.
* @throws DocletAbortException
*/
public static void generate(ConfigurationImpl configuration,
- IndexBuilder indexbuilder) {
- AllClassesFrameWriter allclassgen;
- DocPath filename = DocPaths.ALLCLASSES_FRAME;
+ IndexBuilder indexBuilder) {
+ if (configuration.frames) {
+ generate(configuration, indexBuilder, DocPaths.ALLCLASSES_FRAME, true);
+ generate(configuration, indexBuilder, DocPaths.ALLCLASSES_NOFRAME, false);
+ } else {
+ generate(configuration, indexBuilder, DocPaths.ALLCLASSES, false);
+ }
+ }
+
+ private static void generate(ConfigurationImpl configuration, IndexBuilder indexBuilder,
+ DocPath fileName, boolean wantFrames) {
try {
+ AllClassesFrameWriter allclassgen = new AllClassesFrameWriter(configuration,
+ fileName, indexBuilder);
+ allclassgen.buildAllClassesFile(wantFrames);
allclassgen = new AllClassesFrameWriter(configuration,
- filename, indexbuilder);
- allclassgen.buildAllClassesFile(true);
- filename = DocPaths.ALLCLASSES_NOFRAME;
- allclassgen = new AllClassesFrameWriter(configuration,
- filename, indexbuilder);
+ fileName, indexBuilder);
allclassgen.buildAllClassesFile(false);
} catch (IOException exc) {
Messages messages = configuration.getMessages();
messages.error("doclet.exception_encountered",
- exc.toString(), filename);
+ exc.toString(), fileName);
throw new DocletAbortException(exc);
}
}
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java Fri Aug 26 10:14:15 2016 -0700
@@ -105,7 +105,7 @@
/**
* {@inheritDoc}
*/
- public void addAnnotationDetailsTreeHeader(TypeElement classDoc,
+ public void addAnnotationDetailsTreeHeader(TypeElement te,
Content memberDetailsTree) {
if (!writer.printedAnnotationHeading) {
memberDetailsTree.addContent(writer.getMarkerAnchor(
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java Fri Aug 26 10:14:15 2016 -0700
@@ -179,7 +179,7 @@
*/
public static void generate(ConfigurationImpl configuration, ClassTree classtree) {
ClassUseMapper mapper = new ClassUseMapper(configuration, classtree);
- for (TypeElement aClass : configuration.docEnv.getIncludedClasses()) {
+ for (TypeElement aClass : configuration.docEnv.getIncludedTypeElements()) {
// If -nodeprecated option is set and the containing package is marked
// as deprecated, do not generate the class-use page. We will still generate
// the class-use page if the class is marked as deprecated but the containing
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java Fri Aug 26 10:14:15 2016 -0700
@@ -209,7 +209,7 @@
HtmlTree div = new HtmlTree(HtmlTag.DIV);
div.addStyle(HtmlStyle.header);
ModuleElement mdle = configuration.docEnv.getElementUtils().getModuleOf(typeElement);
- if (mdle != null && !mdle.isUnnamed()) {
+ if (configuration.showModules) {
Content classModuleLabel = HtmlTree.SPAN(HtmlStyle.moduleLabelInClass, contents.moduleLabel);
Content moduleNameDiv = HtmlTree.DIV(HtmlStyle.subTitle, classModuleLabel);
moduleNameDiv.addContent(Contents.SPACE);
@@ -651,11 +651,11 @@
if (type instanceof TypeElement) {
Content link = getLink(
new LinkInfoImpl(configuration, context, (TypeElement)(type)));
- dd.addContent(link);
+ dd.addContent(HtmlTree.CODE(link));
} else {
Content link = getLink(
new LinkInfoImpl(configuration, context, ((TypeMirror)type)));
- dd.addContent(link);
+ dd.addContent(HtmlTree.CODE(link));
}
}
return dd;
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConfigurationImpl.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConfigurationImpl.java Fri Aug 26 10:14:15 2016 -0700
@@ -25,7 +25,6 @@
package jdk.javadoc.internal.doclets.formats.html;
-import java.io.IOException;
import java.net.*;
import java.util.*;
@@ -34,14 +33,10 @@
import javax.lang.model.element.TypeElement;
import javax.tools.JavaFileManager;
import javax.tools.JavaFileObject;
-import javax.tools.JavaFileManager.Location;
import javax.tools.StandardJavaFileManager;
-import javax.tools.StandardLocation;
import com.sun.source.util.DocTreePath;
import com.sun.tools.doclint.DocLint;
-import com.sun.tools.javac.code.Symbol.ModuleSymbol;
-import com.sun.tools.javac.code.Symbol.PackageSymbol;
import jdk.javadoc.doclet.Doclet;
import jdk.javadoc.doclet.DocletEnvironment;
@@ -198,6 +193,12 @@
public boolean createoverview = false;
/**
+ * Specifies whether or not frames should be generated.
+ * Defaults to true; can be set by --frames; can be set to false by --no-frames; last one wins.
+ */
+ public boolean frames = true;
+
+ /**
* This is the HTML version of the generated pages. HTML 4.01 is the default output version.
*/
public HtmlVersion htmlVersion = HtmlVersion.HTML4;
@@ -222,6 +223,8 @@
protected List<SearchIndexItem> memberSearchIndex = new ArrayList<>();
+ protected List<SearchIndexItem> moduleSearchIndex = new ArrayList<>();
+
protected List<SearchIndexItem> packageSearchIndex = new ArrayList<>();
protected List<SearchIndexItem> tagSearchIndex = new ArrayList<>();
@@ -377,7 +380,7 @@
if (!docEnv.getSpecifiedElements().isEmpty()) {
Map<String, PackageElement> map = new HashMap<>();
PackageElement pkg;
- List<TypeElement> classes = new ArrayList<>(docEnv.getIncludedClasses());
+ List<TypeElement> classes = new ArrayList<>(docEnv.getIncludedTypeElements());
for (TypeElement aClass : classes) {
pkg = utils.containingPackage(aClass);
if (!map.containsKey(utils.getPackageName(pkg))) {
@@ -414,18 +417,20 @@
* package to document. It will be a class page(first in the sorted order),
* if only classes are provided on the command line.
*
- * @param root Root of the program structure.
+ * @param docEnv the doclet environment
*/
- protected void setTopFile(DocletEnvironment root) {
- if (!checkForDeprecation(root)) {
+ protected void setTopFile(DocletEnvironment docEnv) {
+ if (!checkForDeprecation(docEnv)) {
return;
}
if (createoverview) {
- topFile = DocPaths.OVERVIEW_SUMMARY;
+ topFile = DocPaths.overviewSummary(frames);
} else {
- if (packages.size() == 1 && packages.first().isUnnamed()) {
- if (!root.getIncludedClasses().isEmpty()) {
- List<TypeElement> classes = new ArrayList<>(root.getIncludedClasses());
+ if (showModules) {
+ topFile = DocPath.empty.resolve(DocPaths.moduleSummary(modules.first()));
+ } else if (packages.size() == 1 && packages.first().isUnnamed()) {
+ List<TypeElement> classes = new ArrayList<>(docEnv.getIncludedTypeElements());
+ if (!classes.isEmpty()) {
TypeElement te = getValidClass(classes);
topFile = DocPath.forClass(utils, te);
}
@@ -448,7 +453,7 @@
}
protected boolean checkForDeprecation(DocletEnvironment docEnv) {
- for (TypeElement te : docEnv.getIncludedClasses()) {
+ for (TypeElement te : docEnv.getIncludedTypeElements()) {
if (isGeneratedDoc(te)) {
return true;
}
@@ -573,21 +578,6 @@
return contents.getContent(key, o0, o1, o2);
}
-
- @Override
- public Location getLocationForPackage(PackageElement pd) {
- JavaFileManager fm = getFileManager();
- if (fm.hasLocation(StandardLocation.MODULE_SOURCE_PATH) && (pd instanceof PackageSymbol)) {
- try {
- ModuleSymbol msym = ((PackageSymbol) pd).modle;
- return fm.getModuleLocation(StandardLocation.MODULE_SOURCE_PATH, msym.name.toString());
- } catch (IOException e) {
- throw new DocletAbortException(e);
- }
- }
- return StandardLocation.SOURCE_PATH;
- }
-
protected void buildSearchTagIndex() {
for (SearchIndexItem sii : tagSearchIndex) {
String tagLabel = sii.getLabel();
@@ -719,7 +709,7 @@
return true;
}
},
- new Hidden(this, "-overview", 1) {
+ new Option(this, "-overview", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -727,6 +717,22 @@
return true;
}
},
+ new Option(this, "--frames") {
+ @Override
+ public boolean process(String opt, ListIterator<String> args) {
+ optionsProcessed.add(this);
+ frames = true;
+ return true;
+ }
+ },
+ new Option(this, "--no-frames") {
+ @Override
+ public boolean process(String opt, ListIterator<String> args) {
+ optionsProcessed.add(this);
+ frames = false;
+ return true;
+ }
+ },
new Hidden(this, "-packagesheader", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java Fri Aug 26 10:14:15 2016 -0700
@@ -104,6 +104,7 @@
public final Content methodSummary;
public final Content methods;
public final Content moduleLabel;
+ public final Content module_;
public final Content moduleSubNavLabel;
public final Content modulesLabel;
public final Content navAnnotationTypeMember;
@@ -216,6 +217,7 @@
methodSummary = getContent("doclet.Method_Summary");
methods = getContent("doclet.Methods");
moduleLabel = getContent("doclet.Module");
+ module_ = getContent("doclet.module");
moduleSubNavLabel = getContent("doclet.Module_Sub_Nav");
modulesLabel = getContent("doclet.Modules");
navAnnotationTypeMember = getContent("doclet.navAnnotationTypeMember");
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java Fri Aug 26 10:14:15 2016 -0700
@@ -141,7 +141,7 @@
? HtmlTree.SECTION(overviewHeading)
: HtmlTree.LI(HtmlStyle.blockList, overviewHeading);
Content line3 = contents.getContent("doclet.Help_line_3",
- getHyperLink(DocPaths.OVERVIEW_SUMMARY,
+ getHyperLink(DocPaths.overviewSummary(configuration.frames),
configuration.getText("doclet.Overview")));
Content overviewPara = HtmlTree.P(line3);
htmlTree.addContent(overviewPara);
@@ -362,26 +362,31 @@
} else {
ul.addContent(htmlTree);
}
- Content frameHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING,
- contents.getContent("doclet.Help_line_25"));
- htmlTree = (configuration.allowTag(HtmlTag.SECTION))
- ? HtmlTree.SECTION(frameHead)
- : HtmlTree.LI(HtmlStyle.blockList, frameHead);
- Content line26 = contents.getContent("doclet.Help_line_26");
- Content framePara = HtmlTree.P(line26);
- htmlTree.addContent(framePara);
+
+ if (configuration.frames) {
+ Content frameHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING,
+ contents.getContent("doclet.Help_line_25"));
+ htmlTree = (configuration.allowTag(HtmlTag.SECTION))
+ ? HtmlTree.SECTION(frameHead)
+ : HtmlTree.LI(HtmlStyle.blockList, frameHead);
+ Content line26 = contents.getContent("doclet.Help_line_26");
+ Content framePara = HtmlTree.P(line26);
+ htmlTree.addContent(framePara);
+ }
+
if (configuration.allowTag(HtmlTag.SECTION)) {
ul.addContent(HtmlTree.LI(HtmlStyle.blockList, htmlTree));
} else {
ul.addContent(htmlTree);
}
+
Content allclassesHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING,
contents.allClassesLabel);
htmlTree = (configuration.allowTag(HtmlTag.SECTION))
? HtmlTree.SECTION(allclassesHead)
: HtmlTree.LI(HtmlStyle.blockList, allclassesHead);
Content line27 = contents.getContent("doclet.Help_line_27",
- getHyperLink(DocPaths.ALLCLASSES_NOFRAME,
+ getHyperLink(DocPaths.AllClasses(configuration.frames),
resources.getText("doclet.All_Classes")));
Content allclassesPara = HtmlTree.P(line27);
htmlTree.addContent(allclassesPara);
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java Fri Aug 26 10:14:15 2016 -0700
@@ -106,7 +106,7 @@
*
* For new format.
*
- * @see jdk.doclet.RootDoc
+ * @see jdk.doclet.DocletEnvironment
*/
@Override // defined by AbstractDoclet
protected void generateOtherFiles(DocletEnvironment docEnv, ClassTree classtree)
@@ -149,7 +149,9 @@
AllClassesFrameWriter.generate(configuration,
new IndexBuilder(configuration, nodeprecated, true));
- FrameOutputWriter.generate(configuration);
+ if (configuration.frames) {
+ FrameOutputWriter.generate(configuration);
+ }
if (configuration.createoverview) {
if (configuration.showModules) {
@@ -158,6 +160,11 @@
PackageIndexWriter.generate(configuration);
}
}
+
+ if (!configuration.frames && !configuration.createoverview) {
+ IndexRedirectWriter.generate(configuration);
+ }
+
if (configuration.helpfile.length() == 0 &&
!configuration.nohelp) {
HelpWriter.generate(configuration);
@@ -270,13 +277,17 @@
@Override // defined by AbstractDoclet
protected void generateModuleFiles() throws Exception {
if (configuration.showModules) {
- ModuleIndexFrameWriter.generate(configuration);
+ if (configuration.frames) {
+ ModuleIndexFrameWriter.generate(configuration);
+ }
ModuleElement prevModule = null, nextModule;
List<ModuleElement> mdles = new ArrayList<>(configuration.modulePackages.keySet());
int i = 0;
for (ModuleElement mdle : mdles) {
- ModulePackageIndexFrameWriter.generate(configuration, mdle);
- ModuleFrameWriter.generate(configuration, mdle);
+ if (configuration.frames) {
+ ModulePackageIndexFrameWriter.generate(configuration, mdle);
+ ModuleFrameWriter.generate(configuration, mdle);
+ }
nextModule = (i + 1 < mdles.size()) ? mdles.get(i + 1) : null;
AbstractBuilder moduleSummaryBuilder =
configuration.getBuilderFactory().getModuleSummaryBuilder(
@@ -304,7 +315,7 @@
@Override // defined by AbstractDoclet
protected void generatePackageFiles(ClassTree classtree) throws Exception {
Set<PackageElement> packages = configuration.packages;
- if (packages.size() > 1) {
+ if (packages.size() > 1 && configuration.frames) {
PackageIndexFrameWriter.generate(configuration);
}
List<PackageElement> pList = new ArrayList<>(packages);
@@ -315,7 +326,9 @@
// and package-tree.html pages for that package.
PackageElement pkg = pList.get(i);
if (!(configuration.nodeprecated && utils.isDeprecated(pkg))) {
- PackageFrameWriter.generate(configuration, pkg);
+ if (configuration.frames) {
+ PackageFrameWriter.generate(configuration, pkg);
+ }
int nexti = i + 1;
PackageElement next = null;
if (nexti < pList.size()) {
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java Fri Aug 26 10:14:15 2016 -0700
@@ -580,10 +580,12 @@
if (configuration.createoverview) {
navList.addContent(getNavLinkContents());
}
- if (configuration.modules.size() == 1) {
- navList.addContent(getNavLinkModule(configuration.modules.first()));
- } else if (!configuration.modules.isEmpty()) {
- navList.addContent(getNavLinkModule());
+ if (configuration.showModules) {
+ if (configuration.modules.size() == 1) {
+ navList.addContent(getNavLinkModule(configuration.modules.first()));
+ } else if (!configuration.modules.isEmpty()) {
+ navList.addContent(getNavLinkModule());
+ }
}
if (configuration.packages.size() == 1) {
navList.addContent(getNavLinkPackage(configuration.packages.first()));
@@ -615,12 +617,13 @@
} else {
tree.addContent(navDiv);
}
- Content ulNav = HtmlTree.UL(HtmlStyle.navList, getNavLinkPrevious());
- ulNav.addContent(getNavLinkNext());
+ Content ulNav = HtmlTree.UL(HtmlStyle.navList, getNavLinkPrevious(), getNavLinkNext());
Content subDiv = HtmlTree.DIV(HtmlStyle.subNav, ulNav);
- Content ulFrames = HtmlTree.UL(HtmlStyle.navList, getNavShowLists());
- ulFrames.addContent(getNavHideLists(filename));
- subDiv.addContent(ulFrames);
+ if (configuration.frames) {
+ Content ulFrames = HtmlTree.UL(HtmlStyle.navList,
+ getNavShowLists(), getNavHideLists(filename));
+ subDiv.addContent(ulFrames);
+ }
HtmlTree ulAllClasses = HtmlTree.UL(HtmlStyle.navList, getNavLinkClassIndex());
ulAllClasses.addAttr(HtmlAttr.ID, allClassesId);
subDiv.addContent(ulAllClasses);
@@ -688,7 +691,7 @@
* @return a content tree for the link
*/
protected Content getNavLinkContents() {
- Content linkContent = getHyperLink(pathToRoot.resolve(DocPaths.OVERVIEW_SUMMARY),
+ Content linkContent = getHyperLink(pathToRoot.resolve(DocPaths.overviewSummary(configuration.frames)),
contents.overviewLabel, "", "");
Content li = HtmlTree.LI(linkContent);
return li;
@@ -824,8 +827,8 @@
* @return a content tree for the link
*/
protected Content getNavLinkTree() {
- List<PackageElement> packages = new ArrayList<>(utils.getSpecifiedPackages());
- DocPath docPath = packages.size() == 1 && utils.getSpecifiedClasses().isEmpty()
+ List<PackageElement> packages = new ArrayList<>(configuration.getSpecifiedPackages());
+ DocPath docPath = packages.size() == 1 && configuration.getSpecifiedClasses().isEmpty()
? pathString(packages.get(0), DocPaths.PACKAGE_TREE)
: pathToRoot.resolve(DocPaths.OVERVIEW_TREE);
return HtmlTree.LI(getHyperLink(docPath, contents.treeLabel, "", ""));
@@ -875,7 +878,7 @@
*/
protected Content getNavLinkClassIndex() {
Content allClassesContent = getHyperLink(pathToRoot.resolve(
- DocPaths.ALLCLASSES_NOFRAME),
+ DocPaths.AllClasses(configuration.frames)),
contents.allClassesLabel, "", "");
Content li = HtmlTree.LI(allClassesContent);
return li;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/IndexRedirectWriter.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,133 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.javadoc.internal.doclets.formats.html;
+
+import java.io.IOException;
+
+import jdk.javadoc.internal.doclets.formats.html.markup.Comment;
+import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
+import jdk.javadoc.internal.doclets.formats.html.markup.DocType;
+import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr;
+import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
+import jdk.javadoc.internal.doclets.formats.html.markup.HtmlDocument;
+import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
+import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
+import jdk.javadoc.internal.doclets.formats.html.markup.StringContent;
+import jdk.javadoc.internal.doclets.toolkit.Content;
+import jdk.javadoc.internal.doclets.toolkit.Messages;
+import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
+import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;
+import jdk.javadoc.internal.doclets.toolkit.util.DocletAbortException;
+
+import static jdk.javadoc.internal.doclets.formats.html.markup.HtmlDocWriter.CONTENT_TYPE;
+
+/**
+ * Writes an index.html file that tries to redirect to an alternate page.
+ * The redirect uses JavaSCript, if enabled, falling back on
+ * {@code <meta http-eqiv=refresh content="0,<uri>">}.
+ * If neither are supported/enabled in a browser, the page displays the
+ * standard "JavaScipt not enabled" message, and a link to the alternate page.
+ */
+public class IndexRedirectWriter extends HtmlDocletWriter {
+
+ public static void generate(ConfigurationImpl configuration) {
+ IndexRedirectWriter indexRedirect;
+ DocPath filename = DocPath.empty;
+ try {
+ filename = DocPaths.INDEX;
+ indexRedirect = new IndexRedirectWriter(configuration, filename);
+ indexRedirect.generateIndexFile();
+ } catch (IOException exc) {
+ Messages messages = configuration.getMessages();
+ messages.error(
+ "doclet.exception_encountered",
+ exc.toString(), filename);
+ throw new DocletAbortException(exc);
+ }
+ }
+
+ IndexRedirectWriter(ConfigurationImpl configuration, DocPath filename)
+ throws IOException {
+ super(configuration, filename);
+ }
+
+ void generateIndexFile() throws IOException {
+ Content htmlDocType = configuration.isOutputHtml5()
+ ? DocType.HTML5
+ : DocType.TRANSITIONAL;
+ Content htmlComment = new Comment(configuration.getText("doclet.New_Page"));
+ Content head = new HtmlTree(HtmlTag.HEAD);
+ head.addContent(getGeneratedBy(!configuration.notimestamp));
+
+ String title = (configuration.windowtitle.length() > 0)
+ ? configuration.windowtitle
+ : configuration.getText("doclet.Generated_Docs_Untitled");
+
+ Content windowTitle = HtmlTree.TITLE(new StringContent(title));
+ head.addContent(windowTitle);
+ Content metaContentType = HtmlTree.META("Content", CONTENT_TYPE,
+ (configuration.charset.length() > 0) ?
+ configuration.charset : HtmlConstants.HTML_DEFAULT_CHARSET);
+ head.addContent(metaContentType);
+
+ String topFilePath = configuration.topFile.getPath();
+ String javaScriptRefresh = "window.location.replace('" + topFilePath + "')";
+ HtmlTree scriptTree = HtmlTree.SCRIPT();
+ scriptTree.addContent(javaScriptRefresh);
+ head.addContent(scriptTree);
+ HtmlTree metaRefresh = new HtmlTree(HtmlTag.META);
+ metaRefresh.addAttr(HtmlAttr.HTTP_EQUIV, "Refresh");
+ metaRefresh.addAttr(HtmlAttr.CONTENT, "0;" + topFilePath);
+ if (configuration.isOutputHtml5()) {
+ head.addContent(HtmlTree.NOSCRIPT(metaRefresh));
+ } else {
+ head.addContent(metaRefresh);
+ }
+
+ head.addContent(getStyleSheetProperties(configuration));
+
+ ContentBuilder bodyContent = new ContentBuilder();
+ bodyContent.addContent(HtmlTree.NOSCRIPT(
+ HtmlTree.P(configuration.getContent("doclet.No_Script_Message"))));
+
+ bodyContent.addContent(HtmlTree.P(HtmlTree.A(topFilePath, new StringContent(topFilePath))));
+
+ Content body = new HtmlTree(HtmlTag.BODY);
+ if (configuration.allowTag(HtmlTag.MAIN)) {
+ HtmlTree main = HtmlTree.MAIN(bodyContent);
+ body.addContent(main);
+ } else {
+ body.addContent(bodyContent);
+ }
+
+ Content htmlTree = HtmlTree.HTML(configuration.getLocale().getLanguage(),
+ head, body);
+ Content htmlDocument = new HtmlDocument(htmlDocType,
+ htmlComment, htmlTree);
+ write(htmlDocument);
+
+ }
+}
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleFrameWriter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleFrameWriter.java Fri Aug 26 10:14:15 2016 -0700
@@ -80,9 +80,9 @@
throws IOException {
super(configuration, DocPaths.moduleTypeFrame(moduleElement));
this.mdle = moduleElement;
- if (utils.getSpecifiedPackages().isEmpty()) {
+ if (configuration.getSpecifiedPackages().isEmpty()) {
documentedClasses = new TreeSet<>(utils.makeGeneralPurposeComparator());
- documentedClasses.addAll(configuration.docEnv.getIncludedClasses());
+ documentedClasses.addAll(configuration.docEnv.getIncludedTypeElements());
}
}
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java Fri Aug 26 10:14:15 2016 -0700
@@ -88,7 +88,7 @@
*/
public static void generate(ConfigurationImpl configuration) {
ModuleIndexWriter mdlgen;
- DocPath filename = DocPaths.OVERVIEW_SUMMARY;
+ DocPath filename = DocPaths.overviewSummary(configuration.frames);
try {
mdlgen = new ModuleIndexWriter(configuration, filename);
mdlgen.buildModuleIndexFile("doclet.Window_Overview_Summary", true);
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageFrameWriter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageFrameWriter.java Fri Aug 26 10:14:15 2016 -0700
@@ -84,9 +84,9 @@
public PackageFrameWriter(ConfigurationImpl configuration, PackageElement packageElement) {
super(configuration, DocPath.forPackage(packageElement).resolve(DocPaths.PACKAGE_FRAME));
this.packageElement = packageElement;
- if (utils.getSpecifiedPackages().isEmpty()) {
+ if (configuration.getSpecifiedPackages().isEmpty()) {
documentedClasses = new TreeSet<>(utils.makeGeneralPurposeComparator());
- documentedClasses.addAll(configuration.docEnv.getIncludedClasses());
+ documentedClasses.addAll(configuration.docEnv.getIncludedTypeElements());
}
}
@@ -136,7 +136,7 @@
*/
protected void addClassListing(HtmlTree contentTree) {
Configuration config = configuration;
- if (utils.isIncluded(packageElement)) {
+ if (utils.isSpecified(packageElement)) {
addClassKindListing(utils.getInterfaces(packageElement),
contents.interfaces, contentTree);
addClassKindListing(utils.getOrdinaryClasses(packageElement),
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageIndexWriter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageIndexWriter.java Fri Aug 26 10:14:15 2016 -0700
@@ -101,7 +101,7 @@
*/
public static void generate(ConfigurationImpl configuration) {
PackageIndexWriter packgen;
- DocPath filename = DocPaths.OVERVIEW_SUMMARY;
+ DocPath filename = DocPaths.overviewSummary(configuration.frames);
try {
packgen = new PackageIndexWriter(configuration, filename);
packgen.buildPackageIndexFile("doclet.Window_Overview_Summary", true);
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java Fri Aug 26 10:14:15 2016 -0700
@@ -125,7 +125,7 @@
HtmlTree div = new HtmlTree(HtmlTag.DIV);
div.addStyle(HtmlStyle.header);
ModuleElement mdle = configuration.docEnv.getElementUtils().getModuleOf(packageElement);
- if (mdle != null && !mdle.isUnnamed()) {
+ if (configuration.showModules) {
Content classModuleLabel = HtmlTree.SPAN(HtmlStyle.moduleLabelInClass, contents.moduleLabel);
Content moduleNameDiv = HtmlTree.DIV(HtmlStyle.subTitle, classModuleLabel);
moduleNameDiv.addContent(Contents.SPACE);
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SearchIndexItem.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SearchIndexItem.java Fri Aug 26 10:14:15 2016 -0700
@@ -38,6 +38,7 @@
private String label = "";
private String url = "";
private String category = "";
+ private String containingModule = "";
private String containingPackage = "";
private String containingClass = "";
private String holder = "";
@@ -59,6 +60,10 @@
return url;
}
+ public void setContainingModule(String m) {
+ containingModule = m;
+ }
+
public void setContainingPackage(String p) {
containingPackage = p;
}
@@ -89,10 +94,17 @@
public String toString() {
StringBuilder item = new StringBuilder("");
- if (category.equals("Packages")) {
+ if (category.equals("Modules")) {
item.append("{")
.append("\"l\":\"").append(label).append("\"")
.append("}");
+ } else if (category.equals("Packages")) {
+ item.append("{");
+ if (!containingModule.isEmpty()) {
+ item.append("\"m\":\"").append(containingModule).append("\",");
+ }
+ item.append("\"l\":\"").append(label).append("\"")
+ .append("}");
} else if (category.equals("Types")) {
item.append("{")
.append("\"p\":\"").append(containingPackage).append("\",")
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SerializedFormWriterImpl.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SerializedFormWriterImpl.java Fri Aug 26 10:14:15 2016 -0700
@@ -70,7 +70,7 @@
public SerializedFormWriterImpl(ConfigurationImpl configuration)
throws IOException {
super(configuration, DocPaths.SERIALIZED_FORM);
- visibleClasses = configuration.docEnv.getIncludedClasses();
+ visibleClasses = configuration.docEnv.getIncludedTypeElements();
}
/**
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SourceToHTMLConverter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SourceToHTMLConverter.java Fri Aug 26 10:14:15 2016 -0700
@@ -112,13 +112,13 @@
if (docEnv == null || outputdir == null) {
return;
}
- for (PackageElement pkg : utils.getSpecifiedPackages()) {
+ for (PackageElement pkg : configuration.getSpecifiedPackages()) {
// If -nodeprecated option is set and the package is marked as deprecated,
// do not convert the package files to HTML.
if (!(configuration.nodeprecated && utils.isDeprecated(pkg)))
convertPackage(pkg, outputdir);
}
- for (TypeElement te : utils.getSpecifiedClasses()) {
+ for (TypeElement te : configuration.getSpecifiedClasses()) {
// If -nodeprecated option is set and the class is marked as deprecated
// or the containing package is deprecated, do not convert the
// package files to HTML.
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TagletWriterImpl.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TagletWriterImpl.java Fri Aug 26 10:14:15 2016 -0700
@@ -28,6 +28,7 @@
import java.util.List;
import javax.lang.model.element.Element;
+import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
@@ -37,7 +38,6 @@
import com.sun.source.doctree.DocTree;
import com.sun.source.doctree.IndexTree;
import com.sun.tools.javac.util.DefinedBy;
-
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
@@ -114,6 +114,13 @@
si.setDescription(desc);
new SimpleElementVisitor9<Void, Void>() {
@Override @DefinedBy(DefinedBy.Api.LANGUAGE_MODEL)
+ public Void visitModule(ModuleElement e, Void p) {
+ si.setUrl(DocPaths.moduleSummary(e).getPath() + "#" + anchorName);
+ si.setHolder(utils.getSimpleName(element));
+ return null;
+ }
+
+ @Override @DefinedBy(DefinedBy.Api.LANGUAGE_MODEL)
public Void visitPackage(PackageElement e, Void p) {
si.setUrl(DocPath.forPackage(e).getPath()
+ "/" + DocPaths.PACKAGE_SUMMARY.getPath() + "#" + anchorName);
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java Fri Aug 26 10:14:15 2016 -0700
@@ -833,13 +833,18 @@
* Generates a UL tag with the style class attribute and some content.
*
* @param styleClass style for the tag
- * @param body content for the tag
+ * @param first initial content to be added
+ * @param more a series of additional content nodes to be added
* @return an HtmlTree object for the UL tag
*/
- public static HtmlTree UL(HtmlStyle styleClass, Content body) {
- HtmlTree htmltree = new HtmlTree(HtmlTag.UL, nullCheck(body));
- htmltree.addStyle(nullCheck(styleClass));
- return htmltree;
+ public static HtmlTree UL(HtmlStyle styleClass, Content first, Content... more) {
+ HtmlTree htmlTree = new HtmlTree(HtmlTag.UL);
+ htmlTree.addContent(nullCheck(first));
+ for (Content c : more) {
+ htmlTree.addContent(nullCheck(c));
+ }
+ htmlTree.addStyle(nullCheck(styleClass));
+ return htmlTree;
}
/**
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/search.js Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/search.js Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,7 @@
var noResult = {l: "No results found"};
var category = "category";
+var catModules = "Modules";
var catPackages = "Packages";
var catTypes = "Types";
var catMembers = "Members";
@@ -115,8 +116,12 @@
var regexp = new RegExp($.ui.autocomplete.escapeRegex(result), "i");
highlight = "<span class=\"resultHighlight\">$&</span>";
var label = "";
- if (item.category === catPackages) {
+ if (item.category === catModules) {
label = item.l.replace(regexp, highlight);
+ } else if (item.category === catPackages) {
+ label = (item.m)
+ ? (item.m + "/" + item.l).replace(regexp, highlight)
+ : item.l.replace(regexp, highlight);
} else if (item.category === catTypes) {
label += (item.p + "." + item.l).replace(regexp, highlight);
} else if (item.category === catMembers) {
@@ -152,24 +157,43 @@
delay: 100,
source: function(request, response) {
var result = new Array();
+ var presult = new Array();
var tresult = new Array();
var mresult = new Array();
var tgresult = new Array();
var displayCount = 0;
var exactMatcher = new RegExp("^" + $.ui.autocomplete.escapeRegex(request.term) + "$", "i");
var secondaryMatcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
- if (packageSearchIndex) {
- var pCount = 0;
- $.each(packageSearchIndex, function(index, item) {
- item[category] = catPackages;
+ if (moduleSearchIndex) {
+ var mdleCount = 0;
+ $.each(moduleSearchIndex, function(index, item) {
+ item[category] = catModules;
if (exactMatcher.test(item.l)) {
result.unshift(item);
- pCount++;
+ mdleCount++;
} else if (secondaryMatcher.test(item.l)) {
result.push(item);
}
});
- displayCount = pCount;
+ displayCount = mdleCount;
+ }
+ if (packageSearchIndex) {
+ var pCount = 0;
+ var pkg = "";
+ $.each(packageSearchIndex, function(index, item) {
+ item[category] = catPackages;
+ pkg = (item.m)
+ ? (item.m + "/" + item.l)
+ : item.l;
+ if (exactMatcher.test(item.l)) {
+ presult.unshift(item);
+ pCount++;
+ } else if (secondaryMatcher.test(pkg)) {
+ presult.push(item);
+ }
+ });
+ result = result.concat(presult);
+ displayCount = (pCount > displayCount) ? pCount : displayCount;
}
if (typeSearchIndex) {
var tCount = 0;
@@ -215,7 +239,7 @@
}
displayCount = (displayCount > 500) ? displayCount : 500;
var counter = function() {
- var count = {Packages: 0, Types: 0, Members: 0, SearchTags: 0};
+ var count = {Modules: 0, Packages: 0, Types: 0, Members: 0, SearchTags: 0};
var f = function(item) {
count[item.category] += 1;
return (count[item.category] <= displayCount);
@@ -238,7 +262,9 @@
select: function(event, ui) {
if (ui.item.l !== noResult.l) {
var url = "";
- if (ui.item.category === catPackages) {
+ if (ui.item.category === catModules) {
+ url = "/" + ui.item.l + "-summary.html";
+ } else if (ui.item.category === catPackages) {
url = ui.item.l.replace(/\./g, '/') + "/package-summary.html";
} else if (ui.item.category === catTypes) {
if (ui.item.p === "<Unnamed>") {
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties Fri Aug 26 10:14:15 2016 -0700
@@ -62,6 +62,7 @@
doclet.Static_method_in=Static method in {0}
doclet.Search_tag_in=Search tag in {0}
doclet.Method_in=Method in {0}
+doclet.module=module
doclet.package=package
doclet.MalformedURL=Malformed URL: {0}
doclet.File_error=Error reading file: {0}
@@ -204,6 +205,10 @@
doclet.usage.splitindex.description=Split index into one file per letter
+doclet.usage.overview.parameters=<file>
+doclet.usage.overview.description=Read overview documentation from HTML file
+
+
doclet.usage.windowtitle.parameters=<text>
doclet.usage.windowtitle.description=Browser window title for the documentation
@@ -299,6 +304,10 @@
doclet.usage.docencoding.parameters=<name>
doclet.usage.docencoding.description=Specify the character encoding for the output
+doclet.usage.frames.description=Enable the use of frames in the generated output (default)
+
+doclet.usage.no-frames.description=Disable the use of frames in the generated output
+
doclet.xusage.xdocrootparent.parameters=<url>
doclet.xusage.xdocrootparent.description=Replaces all @docRoot followed by /..\n\
\ in doc comments with <url>
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/AbstractDoclet.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/AbstractDoclet.java Fri Aug 26 10:14:15 2016 -0700
@@ -90,13 +90,13 @@
/**
* The method that starts the execution of the doclet.
*
- * @param root the {@link DocletEnvironment} that points to the source to document.
+ * @param docEnv the {@link DocletEnvironment}.
* @return true if the doclet executed without error. False otherwise.
*/
@Override
- public boolean run(DocletEnvironment root) {
+ public boolean run(DocletEnvironment docEnv) {
configuration = configuration();
- configuration.docEnv = root;
+ configuration.docEnv = docEnv;
configuration.cmtUtils = new CommentUtils(configuration);
configuration.utils = new Utils(configuration);
utils = configuration.utils;
@@ -108,7 +108,7 @@
}
try {
- startGeneration(root);
+ startGeneration(docEnv);
} catch (Configuration.Fault f) {
configuration.reporter.print(ERROR, f.getMessage());
return false;
@@ -153,8 +153,8 @@
*
* @see jdk.doclet.DocletEnvironment
*/
- private void startGeneration(DocletEnvironment root) throws Configuration.Fault, Exception {
- if (root.getIncludedClasses().isEmpty()) {
+ private void startGeneration(DocletEnvironment docEnv) throws Configuration.Fault, Exception {
+ if (docEnv.getIncludedTypeElements().isEmpty()) {
messages.error("doclet.No_Public_Classes_To_Document");
return;
}
@@ -165,24 +165,24 @@
configuration.getDocletSpecificBuildDate());
ClassTree classtree = new ClassTree(configuration, configuration.nodeprecated);
- generateClassFiles(root, classtree);
+ generateClassFiles(docEnv, classtree);
configuration.utils.copyDocFiles(DocPaths.DOC_FILES);
PackageListWriter.generate(configuration);
generatePackageFiles(classtree);
generateModuleFiles();
- generateOtherFiles(root, classtree);
+ generateOtherFiles(docEnv, classtree);
configuration.tagletManager.printReport();
}
/**
* Generate additional documentation that is added to the API documentation.
*
- * @param root the DocletEnvironment of source to document.
+ * @param docEnv the DocletEnvironment.
* @param classtree the data structure representing the class tree.
*/
- protected void generateOtherFiles(DocletEnvironment root, ClassTree classtree) throws Exception {
+ protected void generateOtherFiles(DocletEnvironment docEnv, ClassTree classtree) throws Exception {
BuilderFactory builderFactory = configuration.getBuilderFactory();
AbstractBuilder constantsSummaryBuilder = builderFactory.getConstantsSummaryBuilder();
constantsSummaryBuilder.build();
@@ -213,13 +213,16 @@
/**
* Iterate through all classes and construct documentation for them.
*
- * @param root the DocletEnvironment of source to document.
+ * @param docEnv the DocletEnvironment.
* @param classtree the data structure representing the class tree.
*/
- protected void generateClassFiles(DocletEnvironment root, ClassTree classtree) {
+ protected void generateClassFiles(DocletEnvironment docEnv, ClassTree classtree) {
generateClassFiles(classtree);
SortedSet<PackageElement> packages = new TreeSet<>(utils.makePackageComparator());
- packages.addAll(utils.getSpecifiedPackages());
+ packages.addAll(configuration.getSpecifiedPackages());
+ configuration.modulePackages.values().stream().forEach(pset -> {
+ packages.addAll(pset);
+ });
packages.stream().forEach((pkg) -> {
generateClassFiles(utils.getAllClasses(pkg), classtree);
});
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/Configuration.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/Configuration.java Fri Aug 26 10:14:15 2016 -0700
@@ -32,8 +32,8 @@
import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
+import javax.lang.model.util.ElementFilter;
import javax.tools.JavaFileManager;
-import javax.tools.JavaFileManager.Location;
import javax.tools.JavaFileObject;
import com.sun.source.util.DocTreePath;
@@ -164,17 +164,17 @@
public final MetaKeywords metakeywords;
/**
- * The list of doc-file subdirectories to exclude
+ * The set of doc-file subdirectories to exclude
*/
protected Set<String> excludedDocFileDirs;
/**
- * The list of qualifiers to exclude
+ * The set of qualifiers to exclude
*/
protected Set<String> excludedQualifiers;
/**
- * The Root of the generated Program Structure from the Doclet API.
+ * The doclet environment.
*/
public DocletEnvironment docEnv;
@@ -314,14 +314,13 @@
public abstract boolean finishOptionSettings();
public CommentUtils cmtUtils;
- public SortedSet<ModuleElement> modules;
/**
* A sorted set of packages specified on the command-line merged with a
* collection of packages that contain the classes specified on the
* command-line.
*/
- public SortedSet<PackageElement> packages;
+ public SortedSet<PackageElement> packages = null;
protected final List<Doclet.Option> optionsProcessed;
@@ -335,9 +334,14 @@
public DocFileFactory docFileFactory;
/**
- * A sorted set of modules containing the packages.
+ * A sorted map, giving the (specified|included|other) packages for each module.
*/
- public Map<ModuleElement, Set<PackageElement>> modulePackages;
+ public SortedMap<ModuleElement, Set<PackageElement>> modulePackages;
+
+ /**
+ * The list of known modules, that should be documented.
+ */
+ public SortedSet<ModuleElement> modules;
protected static final String sharedResourceBundleName =
"jdk.javadoc.internal.doclets.toolkit.resources.doclets";
@@ -372,25 +376,39 @@
private void initModules() {
// Build the modules structure used by the doclet
+ modules = new TreeSet<>(utils.makeModuleComparator());
+ modules.addAll(getSpecifiedModules());
+
modulePackages = new TreeMap<>(utils.makeModuleComparator());
for (PackageElement p: packages) {
ModuleElement mdle = docEnv.getElementUtils().getModuleOf(p);
if (mdle != null && !mdle.isUnnamed()) {
- Set<PackageElement> s = modulePackages.get(mdle);
- if (s == null)
- modulePackages.put(mdle, s = new TreeSet<>(utils.makePackageComparator()));
+ Set<PackageElement> s = modulePackages
+ .computeIfAbsent(mdle, m -> new TreeSet<>(utils.makePackageComparator()));
s.add(p);
}
}
- modules = new TreeSet<>(utils.makeModuleComparator());
+
+ for (PackageElement p: docEnv.getIncludedPackageElements()) {
+ ModuleElement mdle = docEnv.getElementUtils().getModuleOf(p);
+ if (mdle != null && !mdle.isUnnamed()) {
+ Set<PackageElement> s = modulePackages
+ .computeIfAbsent(mdle, m -> new TreeSet<>(utils.makePackageComparator()));
+ s.add(p);
+ }
+ }
+
modules.addAll(modulePackages.keySet());
- showModules = (modulePackages.size() > 1);
+ showModules = !modules.isEmpty();
+ for (Set<PackageElement> pkgs : modulePackages.values()) {
+ packages.addAll(pkgs);
+ }
}
private void initPackages() {
packages = new TreeSet<>(utils.makePackageComparator());
- packages.addAll(utils.getSpecifiedPackages());
- for (TypeElement aClass : utils.getSpecifiedClasses()) {
+ packages.addAll(getSpecifiedPackages());
+ for (TypeElement aClass : getSpecifiedClasses()) {
packages.add(utils.containingPackage(aClass));
}
}
@@ -629,7 +647,7 @@
if (docencoding == null) {
docencoding = encoding;
}
- typeElementCatalog = new TypeElementCatalog(utils.getSpecifiedClasses(), this);
+ typeElementCatalog = new TypeElementCatalog(getSpecifiedClasses(), this);
initTagletManager(customTagStrs);
groups.stream().forEach((grp) -> {
group.checkPackageGroups(grp.value1, grp.value2);
@@ -880,6 +898,35 @@
: utils.getFullyQualifiedName(te);
}
+ // cache these, as they are repeatedly called.
+ private Set<TypeElement> specifiedClasses = null;
+ private Set<PackageElement> specifiedPackages = null;
+ private Set<ModuleElement> specifiedModules = null;
+
+ public Set<TypeElement> getSpecifiedClasses() {
+ if (specifiedClasses == null) {
+ specifiedClasses = new LinkedHashSet<>(
+ ElementFilter.typesIn(docEnv.getSpecifiedElements()));
+ }
+ return specifiedClasses;
+ }
+
+ public Set<PackageElement> getSpecifiedPackages() {
+ if (specifiedPackages == null) {
+ specifiedPackages = new LinkedHashSet<>(
+ ElementFilter.packagesIn(docEnv.getSpecifiedElements()));
+ }
+ return specifiedPackages;
+ }
+
+ public Set<ModuleElement> getSpecifiedModules() {
+ if (specifiedModules == null) {
+ specifiedModules = new LinkedHashSet<>(
+ ElementFilter.modulesIn(docEnv.getSpecifiedElements()));
+ }
+ return specifiedModules;
+ }
+
/**
* Convenience method to obtain a resource from the doclet's
* {@link Resources resources}.
@@ -1146,6 +1193,4 @@
this.value2 = value2;
}
}
-
- public abstract Location getLocationForPackage(PackageElement pd);
}
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/OverviewElement.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/OverviewElement.java Fri Aug 26 10:14:15 2016 -0700
@@ -40,8 +40,8 @@
import jdk.javadoc.doclet.DocletEnvironment;
/**
- * This is a pseudo element wrapper for the root element, essentially to
- * associate overview documentation's DocCommentTree to this Element.
+ * This is a pseudo element wrapper for the overview element, essentially to
+ * associate overview documentation's DocCommentTree to this element.
*
* <p><b>This is NOT part of any supported API.
* If you write code that depends on this, you do so at your own risk.
@@ -50,10 +50,10 @@
*/
public class OverviewElement implements Element {
- public final DocletEnvironment root;
+ public final DocletEnvironment docEnv;
- OverviewElement(DocletEnvironment root) {
- this.root = root;
+ OverviewElement(DocletEnvironment docEnv) {
+ this.docEnv = docEnv;
}
@Override @DefinedBy(Api.LANGUAGE_MODEL)
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java Fri Aug 26 10:14:15 2016 -0700
@@ -187,7 +187,7 @@
// TODO: implement using jx.l.model
public boolean isVisible(TypeElement te) {
- return toolEnv.isVisible((ClassSymbol)te);
+ return ((DocEnvImpl)(configuration.docEnv)).etable.isVisible(te);
}
// TODO: fix the caller
@@ -286,7 +286,7 @@
// TODO: investigate and reimplement without javac dependencies.
public boolean shouldDocument(Element e) {
- return toolEnv.shouldDocument(e);
+ return ((DocEnvImpl)(configuration.docEnv)).etable.shouldDocument(e);
}
//------------------Start of Serializable Implementation---------------------//
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/PackageSummaryBuilder.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/PackageSummaryBuilder.java Fri Aug 26 10:14:15 2016 -0700
@@ -175,7 +175,7 @@
List<String> interfaceTableHeader = Arrays.asList(configuration.getText("doclet.Interface"),
configuration.getText("doclet.Description"));
- SortedSet<TypeElement> ilist = utils.isIncluded(packageElement)
+ SortedSet<TypeElement> ilist = utils.isSpecified(packageElement)
? utils.getTypeElementsAsSortedSet(utils.getInterfaces(packageElement))
: configuration.typeElementCatalog.interfaces(packageElement);
SortedSet<TypeElement> interfaces = utils.filterOutPrivateClasses(ilist, configuration.javafx);
@@ -200,7 +200,7 @@
configuration.getText("doclet.classes"));
List<String> classTableHeader = Arrays.asList(configuration.getText("doclet.Class"),
configuration.getText("doclet.Description"));
- SortedSet<TypeElement> clist = utils.isIncluded(packageElement)
+ SortedSet<TypeElement> clist = utils.isSpecified(packageElement)
? utils.getTypeElementsAsSortedSet(utils.getOrdinaryClasses(packageElement))
: configuration.typeElementCatalog.ordinaryClasses(packageElement);
SortedSet<TypeElement> classes = utils.filterOutPrivateClasses(clist, configuration.javafx);
@@ -225,7 +225,7 @@
configuration.getText("doclet.enums"));
List<String> enumTableHeader = Arrays.asList(configuration.getText("doclet.Enum"),
configuration.getText("doclet.Description"));
- SortedSet<TypeElement> elist = utils.isIncluded(packageElement)
+ SortedSet<TypeElement> elist = utils.isSpecified(packageElement)
? utils.getTypeElementsAsSortedSet(utils.getEnums(packageElement))
: configuration.typeElementCatalog.enums(packageElement);
SortedSet<TypeElement> enums = utils.filterOutPrivateClasses(elist, configuration.javafx);
@@ -251,7 +251,7 @@
List<String> exceptionTableHeader = Arrays.asList(configuration.getText("doclet.Exception"),
configuration.getText("doclet.Description"));
Set<TypeElement> iexceptions =
- utils.isIncluded(packageElement)
+ utils.isSpecified(packageElement)
? utils.getTypeElementsAsSortedSet(utils.getExceptions(packageElement))
: configuration.typeElementCatalog.exceptions(packageElement);
SortedSet<TypeElement> exceptions = utils.filterOutPrivateClasses(iexceptions,
@@ -278,7 +278,7 @@
List<String> errorTableHeader = Arrays.asList(configuration.getText("doclet.Error"),
configuration.getText("doclet.Description"));
Set<TypeElement> ierrors =
- utils.isIncluded(packageElement)
+ utils.isSpecified(packageElement)
? utils.getTypeElementsAsSortedSet(utils.getErrors(packageElement))
: configuration.typeElementCatalog.errors(packageElement);
SortedSet<TypeElement> errors = utils.filterOutPrivateClasses(ierrors, configuration.javafx);
@@ -305,7 +305,7 @@
configuration.getText("doclet.AnnotationType"),
configuration.getText("doclet.Description"));
SortedSet<TypeElement> iannotationTypes =
- utils.isIncluded(packageElement)
+ utils.isSpecified(packageElement)
? utils.getTypeElementsAsSortedSet(utils.getAnnotationTypes(packageElement))
: configuration.typeElementCatalog.annotationTypes(packageElement);
SortedSet<TypeElement> annotationTypes = utils.filterOutPrivateClasses(iannotationTypes,
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/SerializedFormBuilder.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/SerializedFormBuilder.java Fri Aug 26 10:14:15 2016 -0700
@@ -125,7 +125,7 @@
*/
public void build() throws IOException {
SortedSet<TypeElement> rootclasses = new TreeSet<>(utils.makeGeneralPurposeComparator());
- rootclasses.addAll(configuration.docEnv.getIncludedClasses());
+ rootclasses.addAll(configuration.docEnv.getIncludedTypeElements());
if (!serialClassFoundToDocument(rootclasses)) {
//Nothing to document.
return;
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/script.js Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/script.js Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,6 +23,7 @@
* questions.
*/
+var moduleSearchIndex;
var packageSearchIndex;
var typeSearchIndex;
var memberSearchIndex;
@@ -36,6 +37,14 @@
}
createElem(doc, tag, 'search.js');
+ $.get(pathtoroot + "module-search-index.zip")
+ .done(function() {
+ JSZipUtils.getBinaryContent(pathtoroot + "module-search-index.zip", function(e, data) {
+ var zip = new JSZip(data);
+ zip.load(data);
+ moduleSearchIndex = JSON.parse(zip.file("module-search-index.json").asText());
+ });
+ });
$.get(pathtoroot + "package-search-index.zip")
.done(function() {
JSZipUtils.getBinaryContent(pathtoroot + "package-search-index.zip", function(e, data) {
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css Fri Aug 26 10:14:15 2016 -0700
@@ -339,7 +339,7 @@
.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd {
margin:5px 0 10px 0px;
font-size:14px;
- font-family:'DejaVu Sans Mono',monospace;
+ font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif;
}
.serializedFormContainer dl.nameValue dt {
margin-left:1px;
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/ClassTree.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/ClassTree.java Fri Aug 26 10:14:15 2016 -0700
@@ -117,16 +117,16 @@
baseEnums = new TreeSet<>(comparator);
baseClasses = new TreeSet<>(comparator);
baseInterfaces = new TreeSet<>(comparator);
- buildTree(configuration.docEnv.getIncludedClasses());
+ buildTree(configuration.docEnv.getIncludedTypeElements());
}
/**
* Constructor. Build the Tree using the Root of this Javadoc run.
*
- * @param root Root of the Document.
+ * @param docEnv the DocletEnvironment.
* @param configuration The current configuration of the doclet.
*/
- public ClassTree(DocletEnvironment root, Configuration configuration) {
+ public ClassTree(DocletEnvironment docEnv, Configuration configuration) {
this.configuration = configuration;
this.utils = configuration.utils;
comparator = utils.makeClassUseComparator();
@@ -134,7 +134,7 @@
baseEnums = new TreeSet<>(comparator);
baseClasses = new TreeSet<>(comparator);
baseInterfaces = new TreeSet<>(comparator);
- buildTree(configuration.docEnv.getIncludedClasses());
+ buildTree(configuration.docEnv.getIncludedTypeElements());
}
/**
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/ClassUseMapper.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/ClassUseMapper.java Fri Aug 26 10:14:15 2016 -0700
@@ -208,7 +208,7 @@
implementingClasses(intfc);
}
// Map methods, fields, constructors using a class.
- Set<TypeElement> classes = docEnv.getIncludedClasses();
+ Set<TypeElement> classes = docEnv.getIncludedTypeElements();
for (TypeElement aClass : classes) {
PackageElement pkg = elementUtils.getPackageOf(aClass);
mapAnnotations(classToPackageAnnotations, pkg, pkg);
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DeprecatedAPIListBuilder.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DeprecatedAPIListBuilder.java Fri Aug 26 10:14:15 2016 -0700
@@ -96,7 +96,7 @@
}
}
deprecatedMap.put(DeprElementKind.PACKAGE, pset);
- for (Element e : configuration.docEnv.getIncludedClasses()) {
+ for (Element e : configuration.docEnv.getIncludedTypeElements()) {
TypeElement te = (TypeElement)e;
SortedSet<Element> eset;
if (utils.isDeprecated(e)) {
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocPaths.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocPaths.java Fri Aug 26 10:14:15 2016 -0700
@@ -37,6 +37,8 @@
*
*/
public class DocPaths {
+ /** The name of the file for all classes, without using frames, when --no-frames is specified. */
+ public static final DocPath ALLCLASSES = DocPath.create("allclasses.html");
/** The name of the file for all classes, using frames. */
public static final DocPath ALLCLASSES_FRAME = DocPath.create("allclasses-frame.html");
@@ -44,6 +46,10 @@
/** The name of the file for all classes, without using frames. */
public static final DocPath ALLCLASSES_NOFRAME = DocPath.create("allclasses-noframe.html");
+ public static DocPath AllClasses(boolean frames) {
+ return frames ? ALLCLASSES_NOFRAME : ALLCLASSES;
+ }
+
/** The name of the sub-directory for storing class usage info. */
public static final DocPath CLASS_USE = DocPath.create("class-use");
@@ -115,12 +121,22 @@
/** The name of the member search index zip file. */
public static final DocPath MEMBER_SEARCH_INDEX_ZIP = DocPath.create("member-search-index.zip");
+ /** The name of the module search index file. */
+ public static final DocPath MODULE_SEARCH_INDEX_JSON = DocPath.create("module-search-index.json");
+
+ /** The name of the module search index zipfile. */
+ public static final DocPath MODULE_SEARCH_INDEX_ZIP = DocPath.create("module-search-index.zip");
+
/** The name of the file for the overview frame. */
public static final DocPath OVERVIEW_FRAME = DocPath.create("overview-frame.html");
/** The name of the file for the overview summary. */
public static final DocPath OVERVIEW_SUMMARY = DocPath.create("overview-summary.html");
+ public static DocPath overviewSummary(boolean frames) {
+ return frames ? OVERVIEW_SUMMARY : INDEX;
+ }
+
/** The name of the file for the overview tree. */
public static final DocPath OVERVIEW_TREE = DocPath.create("overview-tree.html");
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/IndexBuilder.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/IndexBuilder.java Fri Aug 26 10:14:15 2016 -0700
@@ -28,6 +28,7 @@
import java.util.*;
import javax.lang.model.element.Element;
+import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
@@ -122,11 +123,11 @@
* given on the command line. Form separate list of those members depending
* upon their names.
*
- * @param root Root of the documemt.
+ * @param docEnv the doclet environment
*/
- protected void buildIndexMap(DocletEnvironment root) {
- Set<PackageElement> packages = utils.getSpecifiedPackages();
- Set<TypeElement> classes = root.getIncludedClasses();
+ protected void buildIndexMap(DocletEnvironment docEnv) {
+ Set<PackageElement> packages = configuration.getSpecifiedPackages();
+ Set<TypeElement> classes = docEnv.getIncludedTypeElements();
if (!classesOnly) {
if (packages.isEmpty()) {
Set<PackageElement> set = new HashSet<>();
@@ -148,6 +149,9 @@
putMembersInIndexMap(aClass);
}
}
+ if (configuration.showModules) {
+ addModulesToIndexMap();
+ }
}
}
@@ -190,6 +194,22 @@
}
/**
+ * Add all the modules to index map.
+ */
+ protected void addModulesToIndexMap() {
+ for (ModuleElement mdle : configuration.modules) {
+ String mdleName = mdle.getSimpleName().toString();
+ char ch = (mdleName.length() == 0)
+ ? '*'
+ : Character.toUpperCase(mdleName.charAt(0));
+ Character unicode = ch;
+ SortedSet<Element> list = indexmap.computeIfAbsent(unicode,
+ c -> new TreeSet<>(comparator));
+ list.add(mdle);
+ }
+ }
+
+ /**
* Should this element be added to the index map?
*/
protected boolean shouldAddToIndexMap(Element element) {
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PackageListWriter.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PackageListWriter.java Fri Aug 26 10:14:15 2016 -0700
@@ -81,7 +81,7 @@
}
}
- protected void generatePackageListFile(DocletEnvironment root) {
+ protected void generatePackageListFile(DocletEnvironment docEnv) {
ArrayList<PackageElement> names = new ArrayList<>();
for (PackageElement pkg : configuration.packages) {
// if the -nodeprecated option is set and the package is marked as
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/TypeElementCatalog.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/TypeElementCatalog.java Fri Aug 26 10:14:15 2016 -0700
@@ -100,7 +100,7 @@
public TypeElementCatalog(Iterable<TypeElement> typeElements, Configuration config) {
this(config);
for (TypeElement typeElement : typeElements) {
- addClassDoc(typeElement);
+ addTypeElement(typeElement);
}
}
@@ -127,39 +127,38 @@
*
* @param typeElement the TypeElement to add to the catalog.
*/
- public final void addClassDoc(TypeElement typeElement) {
+ public final void addTypeElement(TypeElement typeElement) {
if (typeElement == null) {
return;
}
- addClass(typeElement, allClasses);
+ addTypeElement(typeElement, allClasses);
if (utils.isOrdinaryClass(typeElement)) {
- addClass(typeElement, ordinaryClasses);
+ addTypeElement(typeElement, ordinaryClasses);
} else if (utils.isException(typeElement)) {
- addClass(typeElement, exceptions);
+ addTypeElement(typeElement, exceptions);
} else if (utils.isEnum(typeElement)) {
- addClass(typeElement, enums);
+ addTypeElement(typeElement, enums);
} else if (utils.isAnnotationType(typeElement)) {
- addClass(typeElement, annotationTypes);
+ addTypeElement(typeElement, annotationTypes);
} else if (utils.isError(typeElement)) {
- addClass(typeElement, errors);
+ addTypeElement(typeElement, errors);
} else if (utils.isInterface(typeElement)) {
- addClass(typeElement, interfaces);
+ addTypeElement(typeElement, interfaces);
}
}
/**
* Add the given class to the given map.
*
- * @param typeElement the ClassDoc to add to the catalog.
+ * @param typeElement the class to add to the catalog.
* @param map the Map to add the TypeElement to.
*/
- private void addClass(TypeElement typeElement, Map<PackageElement, SortedSet<TypeElement>> map) {
+ private void addTypeElement(TypeElement typeElement, Map<PackageElement, SortedSet<TypeElement>> map) {
PackageElement pkg = utils.containingPackage(typeElement);
- if (utils.isIncluded(pkg) || (configuration.nodeprecated && utils.isDeprecated(pkg))) {
+ if (utils.isSpecified(pkg) || configuration.nodeprecated && utils.isDeprecated(pkg)) {
// No need to catalog this class if it's package is
- // included on the command line or if -nodeprecated option is set
- // and the containing package is marked as deprecated.
+ // specified on the command line or if -nodeprecated option is set
return;
}
@@ -186,7 +185,7 @@
* @param packageElement the package to return the classes for.
*/
public SortedSet<TypeElement> allClasses(PackageElement packageElement) {
- return utils.isIncluded(packageElement)
+ return utils.isSpecified(packageElement)
? utils.getTypeElementsAsSortedSet(utils.getEnclosedTypeElements(packageElement))
: getSet(allClasses, packageElement);
}
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java Fri Aug 26 10:14:15 2016 -0700
@@ -86,7 +86,6 @@
import static com.sun.source.doctree.DocTree.Kind.*;
-import com.sun.source.util.SimpleDocTreeVisitor;
import jdk.javadoc.internal.doclets.toolkit.Messages;
import static jdk.javadoc.internal.doclets.toolkit.builders.ConstantsSummaryBuilder.MAX_CONSTANT_VALUE_INDEX_LENGTH;
@@ -381,6 +380,10 @@
return e.getKind() == METHOD;
}
+ public boolean isModule(Element e) {
+ return e.getKind() == ElementKind.MODULE;
+ }
+
public boolean isPackage(Element e) {
return e.getKind() == ElementKind.PACKAGE;
}
@@ -1727,9 +1730,10 @@
/**
* Returns a Comparator for index file presentations, and are sorted as follows.
- * If comparing packages then simply compare the qualified names, otherwise
- * 1. sort on simple names of entities
- * 2. if equal, then compare the ElementKind ex: Package, Interface etc.
+ * If comparing modules then simply compare the simple names,
+ * comparing packages then simply compare the qualified names, otherwise
+ * 1. if equal, then compare the ElementKind ex: Module, Package, Interface etc.
+ * 2. sort on simple names of entities
* 3a. if equal and if the type is of ExecutableElement(Constructor, Methods),
* a case insensitive comparison of parameter the type signatures
* 3b. if equal, case sensitive comparison of the type signatures
@@ -1740,9 +1744,10 @@
public Comparator<Element> makeIndexUseComparator() {
return new Utils.ElementComparator<Element>() {
/**
- * Compare two given elements, if comparing two packages, return the
- * comparison of FullyQualifiedName, first sort on names, then on the
- * kinds, then on the parameters only if the type is an ExecutableElement,
+ * Compare two given elements, if comparing two modules, return the
+ * comparison of SimpleName, if comparing two packages, return the
+ * comparison of FullyQualifiedName, first sort on kinds, then on the
+ * names, then on the parameters only if the type is an ExecutableElement,
* the parameters are compared and finally the qualified names.
*
* @param e1 - an element.
@@ -1753,14 +1758,17 @@
@Override
public int compare(Element e1, Element e2) {
int result = 0;
+ if (isModule(e1) && isModule(e2)) {
+ return compareNames(e1, e2);
+ }
if (isPackage(e1) && isPackage(e2)) {
return compareFullyQualifiedNames(e1, e2);
}
- result = compareNames(e1, e2);
+ result = compareElementTypeKinds(e1, e2);
if (result != 0) {
return result;
}
- result = compareElementTypeKinds(e1, e2);
+ result = compareNames(e1, e2);
if (result != 0) {
return result;
}
@@ -1946,15 +1954,16 @@
final EnumMap<ElementKind, Integer> elementKindOrder;
public ElementComparator() {
elementKindOrder = new EnumMap<>(ElementKind.class);
- elementKindOrder.put(ElementKind.PACKAGE, 0);
- elementKindOrder.put(ElementKind.CLASS, 1);
- elementKindOrder.put(ElementKind.ENUM, 2);
- elementKindOrder.put(ElementKind.ENUM_CONSTANT, 3);
- elementKindOrder.put(ElementKind.INTERFACE, 4);
- elementKindOrder.put(ElementKind.ANNOTATION_TYPE, 5);
- elementKindOrder.put(ElementKind.FIELD, 6);
- elementKindOrder.put(ElementKind.CONSTRUCTOR, 7);
- elementKindOrder.put(ElementKind.METHOD, 8);
+ elementKindOrder.put(ElementKind.MODULE, 0);
+ elementKindOrder.put(ElementKind.PACKAGE, 1);
+ elementKindOrder.put(ElementKind.CLASS, 2);
+ elementKindOrder.put(ElementKind.ENUM, 3);
+ elementKindOrder.put(ElementKind.ENUM_CONSTANT, 4);
+ elementKindOrder.put(ElementKind.INTERFACE, 5);
+ elementKindOrder.put(ElementKind.ANNOTATION_TYPE, 6);
+ elementKindOrder.put(ElementKind.FIELD, 7);
+ elementKindOrder.put(ElementKind.CONSTRUCTOR, 8);
+ elementKindOrder.put(ElementKind.METHOD, 9);
}
protected int compareParameters(boolean caseSensitive, List<? extends VariableElement> params1,
@@ -2220,31 +2229,6 @@
return oset;
}
- // cache these two as they are repeatedly called.
- private Set<TypeElement> specifiedClasses = null;
- private Set<PackageElement> specifiedPackages = null;
-
- private void initSpecifiedElements() {
- specifiedClasses = new LinkedHashSet<>(
- ElementFilter.typesIn(configuration.docEnv.getSpecifiedElements()));
- specifiedPackages = new LinkedHashSet<>(
- ElementFilter.packagesIn(configuration.docEnv.getSpecifiedElements()));
- }
-
- public Set<TypeElement> getSpecifiedClasses() {
- if (specifiedClasses == null || specifiedPackages == null) {
- initSpecifiedElements();
- }
- return specifiedClasses;
- }
-
- public Set<PackageElement> getSpecifiedPackages() {
- if (specifiedClasses == null || specifiedPackages == null) {
- initSpecifiedElements();
- }
- return specifiedPackages;
- }
-
private final HashMap<Element, SortedSet<TypeElement>> cachedClasses = new HashMap<>();
/**
* Returns a list containing classes and interfaces,
@@ -2404,6 +2388,11 @@
if (snvisitor == null) {
snvisitor = new SimpleElementVisitor9<String, Void>() {
@Override @DefinedBy(Api.LANGUAGE_MODEL)
+ public String visitModule(ModuleElement e, Void p) {
+ return e.getSimpleName().toString();
+ }
+
+ @Override @DefinedBy(Api.LANGUAGE_MODEL)
public String visitType(TypeElement e, Void p) {
StringBuilder sb = new StringBuilder(e.getSimpleName());
Element enclosed = e.getEnclosingElement();
@@ -2577,6 +2566,34 @@
return configuration.docEnv.isIncluded(e);
}
+ private SimpleElementVisitor9<Boolean, Void> specifiedVisitor = null;
+ public boolean isSpecified(Element e) {
+ if (specifiedVisitor == null) {
+ specifiedVisitor = new SimpleElementVisitor9<Boolean, Void>() {
+ @Override @DefinedBy(Api.LANGUAGE_MODEL)
+ public Boolean visitModule(ModuleElement e, Void p) {
+ return configuration.getSpecifiedModules().contains(e);
+ }
+
+ @Override @DefinedBy(Api.LANGUAGE_MODEL)
+ public Boolean visitPackage(PackageElement e, Void p) {
+ return configuration.getSpecifiedPackages().contains(e);
+ }
+
+ @Override @DefinedBy(Api.LANGUAGE_MODEL)
+ public Boolean visitType(TypeElement e, Void p) {
+ return configuration.getSpecifiedClasses().contains(e);
+ }
+
+ @Override @DefinedBy(Api.LANGUAGE_MODEL)
+ protected Boolean defaultAction(Element e, Void p) {
+ return false;
+ }
+ };
+ }
+ return specifiedVisitor.visit(e);
+ }
+
/**
* package name, an unnamed package is returned as <Unnamed>
* @param pkg
@@ -2979,6 +2996,10 @@
return out;
}
+ public ModuleElement containingModule(Element e) {
+ return elementUtils.getModuleOf(e);
+ }
+
public PackageElement containingPackage(Element e) {
return elementUtils.getPackageOf(e);
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/AccessKind.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.javadoc.internal.tool;
+
+/**
+ * The access value kinds.
+ */
+
+public enum AccessKind {
+ /** Limits access to public entities */
+ PUBLIC,
+ /** Limits access to public and protected entities */
+ PROTECTED,
+ /** Limits access to public, protected and package private entities */
+ PACKAGE,
+ /** No limits */
+ PRIVATE;
+}
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/DocEnvImpl.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/DocEnvImpl.java Fri Aug 26 10:14:15 2016 -0700
@@ -25,7 +25,6 @@
package jdk.javadoc.internal.tool;
-import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
@@ -33,6 +32,7 @@
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
+import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.Elements;
@@ -41,7 +41,6 @@
import com.sun.source.util.DocTrees;
import com.sun.tools.javac.code.Source;
-import com.sun.tools.javac.tree.JCTree.JCClassDecl;
import jdk.javadoc.doclet.DocletEnvironment;
/**
@@ -60,202 +59,44 @@
*/
public class DocEnvImpl implements DocletEnvironment {
- /**
- * list of classes specified on the command line.
- */
- private Set<TypeElement> cmdLineClasses;
-
- /**
- * list of packages specified on the command line.
- */
- private Set<PackageElement> cmdLinePackages;
+ public final ElementsTable etable;
public final ToolEnvironment toolEnv;
/**
- * Constructor used when reading source files.
- *
- * @param toolEnv the documentation environment, state for this javadoc run
- * @param classes list of classes specified on the commandline
- * @param packages list of package names specified on the commandline
- */
- public DocEnvImpl(ToolEnvironment toolEnv, List<JCClassDecl> classes, List<String> packages) {
- this.toolEnv = toolEnv;
- setPackages(toolEnv, packages);
- setClasses(toolEnv, classes);
- }
-
- /**
- * Constructor used when reading class files.
+ * Construct a doclet environment.
*
- * @param toolEnv the documentation environment, state for this javadoc run
- * @param classes list of class names specified on the commandline
+ * @param toolEnv the tool environment
+ * @param etable the includes table, providing all the information
+ * with respect to specified, included/selected elements.
*/
- public DocEnvImpl(ToolEnvironment toolEnv, List<String> classes) {
- //super(env, null);
+ public DocEnvImpl(ToolEnvironment toolEnv, ElementsTable etable) {
this.toolEnv = toolEnv;
-
- Set<TypeElement> classList = new LinkedHashSet<>();
- for (String className : classes) {
- TypeElement c = toolEnv.loadClass(className);
- if (c == null)
- toolEnv.error(null, "javadoc.class_not_found", className);
- else
- classList.add(c);
- }
- cmdLineClasses = classList;
+ this.etable = etable;
}
- /**
- * Initialize classes information. Those classes are input from
- * command line.
- *
- * @param toolEnv the compilation environment
- * @param classes a list of ClassDeclaration
- */
- private void setClasses(ToolEnvironment toolEnv, List<JCClassDecl> classes) {
- Set<TypeElement> result = new LinkedHashSet<>();
- classes.stream().filter((def) -> (toolEnv.shouldDocument(def.sym))).forEach((def) -> {
- TypeElement te = (TypeElement)def.sym;
- if (te != null) {
- toolEnv.setIncluded((Element)def.sym);
- result.add(te);
- }
- });
- cmdLineClasses = Collections.unmodifiableSet(result);
+ @Override
+ public Set<ModuleElement> getIncludedModuleElements() {
+ return etable.getIncludedModuleElements();
}
- /**
- * Initialize packages information.
- *
- * @param toolEnv the compilation environment
- * @param packages a list of package names (String)
- */
- private void setPackages(ToolEnvironment toolEnv, List<String> packages) {
- Set<PackageElement> packlist = new LinkedHashSet<>();
- packages.stream().forEach((name) -> {
- PackageElement pkg = getElementUtils().getPackageElement(name);
- if (pkg != null) {
- toolEnv.setIncluded(pkg);
- packlist.add(pkg);
- } else {
- toolEnv.warning("main.no_source_files_for_package", name);
- }
- });
- cmdLinePackages = Collections.unmodifiableSet(packlist);
- }
-
- /**
- * Packages specified on the command line.
- */
- public Set<PackageElement> specifiedPackages() {
- return cmdLinePackages;
+ @Override
+ public Set<PackageElement> getIncludedPackageElements() {
+ return etable.getIncludedPackageElements();
}
/**
- * Classes and interfaces specified on the command line,
- * including their inner classes
- */
- public Set<TypeElement> specifiedClasses() {
- Set<TypeElement> out = new LinkedHashSet<>();
- cmdLineClasses.stream().forEach((te) -> {
- toolEnv.addAllClasses(out, te, true);
- });
- return out;
- }
-
- private Set<TypeElement> classesToDocument = null;
- /**
- * Return all classes and interfaces (including those inside
+ * Return all TypeElements (including those inside
* packages) to be documented.
*/
- public Set<TypeElement> getIncludedClasses() {
- if (classesToDocument == null) {
- Set<TypeElement> classes = new LinkedHashSet<>();
-
- cmdLineClasses.stream().forEach((te) -> {
- toolEnv.addAllClasses(classes, te, true);
- });
- cmdLinePackages.stream().forEach((pkg) -> {
- toolEnv.addAllClasses(classes, pkg);
- });
- classesToDocument = Collections.unmodifiableSet(classes);
- }
- return classesToDocument;
- }
-
- /**
- * Return the name of this item.
- *
- * @return the string <code>"*RootDocImpl*"</code>.
- */
- public String name() {
- return "*RootDocImpl*";
- }
-
- /**
- * Return the name of this Doc item.
- *
- * @return the string <code>"*RootDocImpl*"</code>.
- */
- public String qualifiedName() {
- return "*RootDocImpl*";
+ @Override
+ public Set<TypeElement> getIncludedTypeElements() {
+ return etable.getIncludedTypeElements();
}
- /**
- * Return true if this Element is included in the active set.
- * RootDocImpl isn't even a program entity so it is always false.
- */
@Override
public boolean isIncluded(Element e) {
- return toolEnv.isIncluded(e);
- }
-
-// Note: these reporting methods are no longer used.
-// /**
-// * Print error message, increment error count.
-// *
-// * @param msg message to print
-// */
-// public void printError(String msg) {
-// env.printError(msg);
-// }
-//
-// /**
-// * Print error message, increment error count.
-// *
-// * @param msg message to print
-// */
-// public void printError(DocTreePath path, String msg) {
-// env.printError(path, msg);
-// }
-//
-// public void printError(Element e, String msg) {
-// env.printError(e, msg);
-// }
-//
-// public void printWarning(Element e, String msg) {
-// env.printWarning(e, msg);
-// }
-//
-// public void printNotice(Element e, String msg) {
-// env.printNotice(e, msg);
-// }
-//
-// /**
-// * Print warning message, increment warning count.
-// *
-// * @param msg message to print
-// */
-// public void printWarning(String msg) {
-// env.printWarning(msg);
-// }
-
- /**
- * Return the current file manager.
- */
- public JavaFileManager getFileManager() {
- return toolEnv.fileManager;
+ return etable.isIncluded(e);
}
@Override
@@ -278,12 +119,9 @@
@Override
public Set<Element> getSpecifiedElements() {
Set<Element> out = new LinkedHashSet<>();
- specifiedPackages().stream().forEach((pe) -> {
- out.add(pe);
- });
- specifiedClasses().stream().forEach((e) -> {
- out.add(e);
- });
+ out.addAll(etable.getSpecifiedModuleElements());
+ out.addAll(etable.getSpecifiedPackageElements());
+ out.addAll(etable.getSpecifiedTypeElements());
return out;
}
@@ -301,4 +139,9 @@
public SourceVersion getSourceVersion() {
return Source.toSourceVersion(toolEnv.source);
}
+
+ @Override
+ public ModuleMode getModuleMode() {
+ return etable.getModuleMode();
+ }
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ElementsTable.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,1204 @@
+/*
+ * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jdk.javadoc.internal.tool;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.lang.model.element.Element;
+import javax.lang.model.element.ElementKind;
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.Modifier;
+import javax.lang.model.element.ModuleElement;
+import javax.lang.model.element.ModuleElement.ExportsDirective;
+import javax.lang.model.element.ModuleElement.RequiresDirective;
+import javax.lang.model.element.PackageElement;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.element.VariableElement;
+import javax.lang.model.util.ElementFilter;
+import javax.lang.model.util.SimpleElementVisitor9;
+import javax.tools.JavaFileManager;
+import javax.tools.JavaFileManager.Location;
+import javax.tools.JavaFileObject;
+import javax.tools.StandardLocation;
+
+import com.sun.tools.javac.code.Flags;
+import com.sun.tools.javac.code.Kinds.Kind;
+import com.sun.tools.javac.code.Symbol;
+import com.sun.tools.javac.code.Symbol.ClassSymbol;
+import com.sun.tools.javac.code.Symbol.CompletionFailure;
+import com.sun.tools.javac.code.Symbol.MethodSymbol;
+import com.sun.tools.javac.code.Symbol.ModuleSymbol;
+import com.sun.tools.javac.code.Symbol.PackageSymbol;
+import com.sun.tools.javac.code.Symbol.VarSymbol;
+import com.sun.tools.javac.code.Symtab;
+import com.sun.tools.javac.comp.Modules;
+import com.sun.tools.javac.tree.JCTree.JCClassDecl;
+import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
+import com.sun.tools.javac.util.Context;
+import com.sun.tools.javac.util.DefinedBy;
+import com.sun.tools.javac.util.DefinedBy.Api;
+import com.sun.tools.javac.util.ListBuffer;
+import com.sun.tools.javac.util.Name;
+import com.sun.tools.javac.util.Names;
+import jdk.javadoc.doclet.DocletEnvironment;
+import jdk.javadoc.doclet.DocletEnvironment.ModuleMode;
+
+import static com.sun.tools.javac.code.Scope.LookupKind.NON_RECURSIVE;
+import static jdk.javadoc.internal.tool.JavadocTool.isValidClassName;
+
+/**
+ * This class manages elements specified on the command line, and
+ * produces "specified" and "included" data sets, needed by the
+ * doclet environment, as well as querying an elements' visibility
+ * or inclusion.
+ *
+ * A. Initialization phase: the class is initialized with the
+ * options table by the caller. Some program elements may not
+ * be specified via specific options, such as packages, classes,
+ * these are set with the use of setter methods, such setClassArgList
+ * and setClassDeclList.
+ *
+ * B. Scan and decode phase: this is performed by scanSpecifiedItems,
+ * to identify the modules specified on the command line, modules
+ * specified with qualified packages and qualified subpackages, the
+ * modules so identified are used to initialize the module system.
+ *
+ * C. Intermediate phase: before the final analysis can be done,
+ * intermediate methods can be used to get specified elements from
+ * the initialization phase, typically used to parse sources or packages
+ * specified on the command line.
+ *
+ * D. Analysis phase: the final analysis is performed to determine
+ * the packages that ought to be included, as follows:
+ *
+ * 1. computes the specified modules, by considering the option
+ * "expand-requires", this must be done exhaustively, as the package
+ * computation phase expects a completed module graph, in order to
+ * check the target of a qualified export is in the included set.
+ *
+ * 2. computes the packages that must be documented, by considering
+ * the option "show-packages", also if only exported packages are
+ * to be considered, then also check for qualified packages, and
+ * include only those packages whose target is in the included set.
+ *
+ * 3. compute the specified packages, as part of this, first compute
+ * the subpackages and exclude any packages, if required.
+ *
+ * 4. Finally, compute the types found by previous parsing steps,
+ * noting that, all enclosed types (nested types) must also be
+ * considered.
+ *
+ * E. Finally, this class provides methods to obtain the specified sets,
+ * which are frozen and cached in the analysis phase, the included
+ * sets, are computed lazily and cached for future use. An element
+ * can be checked if it should be documented, in which case, the
+ * element is checked against the included set and the result is
+ * cached, for performance reasons.
+ *
+ * Definitions:
+ * Fully included: an element is included and some or parts
+ * of it components are included implicitly, subject to a
+ * selection criteria of its enclosed children.
+ *
+ * Included: if the item should be documented.
+ *
+ * Rules for processing:
+ *
+ * 1. A specified element, meaning an element given on the
+ * command-line, and exposed via getSpecifiedElements()
+ * 2. Expand-contents, an internal pseudo term, meaning
+ * it is part of the recursive expansion of specified
+ * elements, meaning, the modules are expanded first, then
+ * the packages contained in the expanded modules, and then
+ * the types contained within the packages, to produce the
+ * collections returned by the methods
+ * getInclude{Module|Package|Type}Elements(), this is a
+ * downward expansion.
+ * 3. An included element, meaning it should be documented, and
+ * exposed via isIncluded, this enclosing element (module, package)
+ * is recursively included.
+ */
+public class ElementsTable {
+
+ private final ToolEnvironment toolEnv;
+ private final Symtab syms;
+ private final Names names;
+ private final JavaFileManager fm;
+ private final Location location;
+ private final Modules modules;
+ private final Map<ToolOption, Object> opts;
+
+ private final Map<String, Entry> entries = new LinkedHashMap<>();
+
+ // specified elements
+ private Set<ModuleElement> specifiedModuleElements = new LinkedHashSet<>();
+ private Set<PackageElement> specifiedPackageElements = new LinkedHashSet<>();
+ private Set<TypeElement> specifiedTypeElements =new LinkedHashSet<>();
+
+ // included elements
+ private Set<ModuleElement> includedModuleElements = null;
+ private Set<PackageElement> includedPackageElements = null;
+ private Set<TypeElement> includedTypeElements = null;
+
+ // cmdline specifiers
+ private Set<ModulePackage> cmdLinePackages = new LinkedHashSet<>();
+ private Set<ModulePackage> excludePackages = new LinkedHashSet<>();
+ private Set<ModulePackage> subPackages = new LinkedHashSet<>();
+
+ private List<JCClassDecl> classDecList = Collections.emptyList();
+ private List<String> classArgList = Collections.emptyList();
+ private com.sun.tools.javac.util.List<JCCompilationUnit> classTreeList = null;
+
+ private final Set<JavaFileObject.Kind> sourceKinds = EnumSet.of(JavaFileObject.Kind.SOURCE);
+
+ private final ModifierFilter accessFilter;
+
+ private final AccessKind expandRequires;
+
+ final boolean xclasses;
+
+ /**
+ * Creates the table to manage included and excluded elements.
+ *
+ * @param context the context to locate commonly used objects
+ * @param location the location used to locate source files
+ */
+ ElementsTable(Context context, Map<ToolOption, Object> opts) {
+ this.toolEnv = ToolEnvironment.instance(context);
+ this.syms = Symtab.instance(context);
+ this.names = Names.instance(context);
+ this.fm = toolEnv.fileManager;
+ this.modules = Modules.instance(context);
+ this.opts = opts;
+ this.location = modules.multiModuleMode
+ ? StandardLocation.MODULE_SOURCE_PATH
+ : toolEnv.fileManager.hasLocation(StandardLocation.SOURCE_PATH)
+ ? StandardLocation.SOURCE_PATH
+ : StandardLocation.CLASS_PATH;
+ getEntry("").excluded = false;
+
+ accessFilter = new ModifierFilter(opts);
+ xclasses = (boolean)opts.getOrDefault(ToolOption.XCLASSES, false);
+ expandRequires = (AccessKind)opts.get(ToolOption.EXPAND_REQUIRES);
+ }
+
+ /**
+ * Returns the module documentation level mode.
+ * @return the module documentation level mode
+ */
+ public ModuleMode getModuleMode() {
+ switch(accessFilter.getAccessValue(ElementKind.MODULE)) {
+ case PACKAGE: case PRIVATE:
+ return DocletEnvironment.ModuleMode.ALL;
+ default:
+ return DocletEnvironment.ModuleMode.API;
+ }
+ }
+
+ /**
+ * Returns the selected/included module elements.
+ * A module is fully included,
+ * - is specified on the command line --module
+ * - is derived from the module graph, that is, by expanding the
+ * requires directive, based on --expand-requires
+ *
+ * A module is included if an enclosed package or type is
+ * specified on the command line.
+ * @return the included module elements
+ */
+ public Set<ModuleElement> getIncludedModuleElements() {
+ return includedModuleElements;
+ }
+
+ /**
+ * Returns the selected/included package elements.
+ * A package is fully included,
+ * - is specified on the command line
+ * - is derived from expanding -subpackages
+ * - can be documented in a fully included module based on --show-packages
+ *
+ * A package is included, if an enclosed package or a type is specified on
+ * the command line.
+ *
+ * @return the included package elements
+ */
+ public Set<PackageElement> getIncludedPackageElements() {
+ return includedPackageElements;
+ }
+
+ /**
+ * Returns the selected/included type elements (including those
+ * within specified or included packages) to be documented.
+ * A type is fully included if
+ * - is specified on the command line with -sourcepath
+ * - is visible with --show-types filter
+ * A nested type is fully included if
+ * - is visible with --show-types filter
+ * - is enclosed in a fully included type
+ *
+ * @return the included type elements
+ * to be documented
+ */
+ public Set<TypeElement> getIncludedTypeElements() {
+ return includedTypeElements;
+ }
+
+ /**
+ * Returns a set of module elements specified on the
+ * command line.
+ * @return the set of module elements specified on the
+ * command line
+ */
+ public Set<ModuleElement> getSpecifiedModuleElements() {
+ return specifiedModuleElements;
+ }
+
+ /**
+ * Returns a set of package elements specified on the
+ * command line. These may also contain children packages
+ * if specified with -subpackage.
+ *
+ * @return the set of package elements specified on the
+ * command line
+ */
+ public Set<PackageElement> getSpecifiedPackageElements() {
+ return specifiedPackageElements;
+ }
+
+ /**
+ * Returns a set of type elements specified on the
+ * command line, including any inner classes.
+ *
+ * @return the set of type elements specified on the command line
+ */
+ public Set<TypeElement> getSpecifiedTypeElements() {
+ return specifiedTypeElements;
+ }
+
+ private IncludedVisitor includedVisitor = null;
+
+ /**
+ * Returns true if the given element is included or selected for
+ * consideration.
+ * This method accumulates elements in the cache as enclosed elements of
+ * fully included elements are tested.
+ * A member (constructor, method, field) is included if
+ * - it is visible in a fully included type (--show-members)
+ *
+ * @param e the element in question
+ *
+ * @see getIncludedModuleElements
+ * @see getIncludedPackageElements
+ * @see getIncludedTypeElements
+ *
+ * @return true if included
+ */
+ public boolean isIncluded(Element e) {
+ if (e == null) {
+ return false;
+ }
+ if (includedVisitor == null) {
+ includedVisitor = new IncludedVisitor();
+ }
+ return includedVisitor.visit(e);
+ }
+
+ /**
+ * Performs the final computation and freezes the collections.
+ * This is a terminal operation, thus no further modifications
+ * are allowed to the specified data sets.
+ *
+ * @throws IOException if an error occurs
+ */
+ void analyze() throws IOException {
+ // compute the specified element, by expanding module dependencies
+ computeSpecifiedModules();
+
+ // compute all specified packages and subpackages
+ computeSpecifiedPackages();
+
+ // compute the specified types
+ computeSpecifiedTypes();
+
+ // compute the packages belonging to all the specified modules
+ Set<PackageElement> expandedModulePackages = computeModulePackages();
+ initializeIncludedSets(expandedModulePackages);
+
+ }
+
+ ElementsTable classTrees(com.sun.tools.javac.util.List<JCCompilationUnit> classTrees) {
+ this.classTreeList = classTrees;
+ return this;
+ }
+
+ @SuppressWarnings("unchecked")
+ ElementsTable scanSpecifiedItems() throws IOException {
+
+ // scan modules specified on the command line
+ List<String> moduleNames = (List<String>) opts.computeIfAbsent(ToolOption.MODULE,
+ s -> Collections.EMPTY_LIST);
+ List<String> mlist = new ArrayList<>();
+ for (String m : moduleNames) {
+ Location moduleLoc = fm.getModuleLocation(location, m);
+ if (moduleLoc == null) {
+ toolEnv.error("main.module_not_found", m);
+ } else {
+ mlist.add(m);
+ ModuleSymbol msym = syms.enterModule(names.fromString(m));
+ specifiedModuleElements.add((ModuleElement) msym);
+ }
+ }
+
+ // scan for modules with qualified packages
+ cmdLinePackages.stream()
+ .filter((mpkg) -> (mpkg.hasModule()))
+ .forEachOrdered((mpkg) -> {
+ mlist.add(mpkg.moduleName);
+ });
+
+ // scan for modules with qualified subpackages
+ ((List<String>)opts.computeIfAbsent(ToolOption.SUBPACKAGES, v -> Collections.EMPTY_LIST))
+ .stream()
+ .map((packageName) -> new ModulePackage(packageName))
+ .forEachOrdered((mpkg) -> {
+ subPackages.add(mpkg);
+ if (mpkg.hasModule()) {
+ mlist.add(mpkg.moduleName);
+ }
+ });
+
+ // all the modules specified on the command line have been scraped
+ // init the module systems
+ modules.addExtraAddModules(mlist.toArray(new String[mlist.size()]));
+ modules.initModules(this.classTreeList);
+
+ return this;
+ }
+
+ /**
+ * Returns the includes table after setting a class names specified on the command line.
+ *
+ * @param classList
+ * @return the include table
+ */
+ ElementsTable setClassArgList(List<String> classList) {
+ classArgList = classList;
+ return this;
+ }
+
+ /**
+ * Returns the includes table after setting the parsed class names.
+ *
+ * @param classesDecList
+ * @return the include table
+ */
+ ElementsTable setClassDeclList(List<JCClassDecl> classesDecList) {
+ this.classDecList = classesDecList;
+ return this;
+ }
+
+ /**
+ * Returns an includes table after setting the specified package
+ * names.
+ * @param packageNames packages on the command line
+ * @return the includes table after setting the specified package
+ * names
+ */
+ ElementsTable packages(Collection<String> packageNames) {
+ packageNames.stream()
+ .map((packageName) -> new ModulePackage(packageName))
+ .forEachOrdered((mpkg) -> cmdLinePackages.add(mpkg));
+ return this;
+ }
+
+ /**
+ * Returns the aggregate set of included packages and specified
+ * sub packages.
+ *
+ * @return the aggregate set of included packages and specified
+ * sub packages
+ */
+ Iterable<ModulePackage> getPackagesToParse() throws IOException {
+ List<ModulePackage> result = new ArrayList<>();
+ result.addAll(cmdLinePackages);
+ result.addAll(subPackages);
+ return result;
+ }
+
+ @SuppressWarnings("unchecked")
+ private void computeSubpackages() throws IOException {
+ ((List<String>) opts.computeIfAbsent(ToolOption.EXCLUDE, v -> Collections.EMPTY_LIST))
+ .stream()
+ .map((packageName) -> new ModulePackage(packageName))
+ .forEachOrdered((mpkg) -> excludePackages.add(mpkg));
+
+ excludePackages.forEach((p) -> {
+ getEntry(p).excluded = true;
+ });
+
+ for (ModulePackage modpkg : subPackages) {
+ Location packageLocn = getLocation(modpkg);
+ for (JavaFileObject fo : fm.list(packageLocn, modpkg.packageName, sourceKinds, true)) {
+ String binaryName = fm.inferBinaryName(packageLocn, fo);
+ String pn = getPackageName(binaryName);
+ String simpleName = getSimpleName(binaryName);
+ Entry e = getEntry(pn);
+ if (!e.isExcluded() && isValidClassName(simpleName)) {
+ ModuleSymbol msym = (modpkg.hasModule())
+ ? syms.getModule(names.fromString(modpkg.moduleName))
+ : findModuleOfPackageName(modpkg.packageName);
+
+ if (msym != null && !msym.isUnnamed()) {
+ syms.enterPackage(msym, names.fromString(pn));
+ ModulePackage npkg = new ModulePackage(msym.toString(), pn);
+ cmdLinePackages.add(npkg);
+ } else {
+ cmdLinePackages.add(e.modpkg);
+ }
+ e.files = (e.files == null
+ ? com.sun.tools.javac.util.List.of(fo)
+ : e.files.prepend(fo));
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns the "requires" modules for the target module.
+ * @param mdle the target module element
+ * @param isPublic true gets all the public requires, otherwise
+ * gets all the non-public requires
+ *
+ * @return a set of modules
+ */
+ private Set<ModuleElement> getModuleRequires(ModuleElement mdle, boolean isPublic) {
+ Set<ModuleElement> result = new HashSet<>();
+ for (RequiresDirective rd : ElementFilter.requiresIn(mdle.getDirectives())) {
+ if (isPublic && rd.isPublic()) {
+ result.add(rd.getDependency());
+ }
+ if (!isPublic && !rd.isPublic()) {
+ result.add(rd.getDependency());
+ }
+ }
+ return result;
+ }
+
+ private void computeSpecifiedModules() {
+ if (expandRequires == null) { // no expansion requested
+ specifiedModuleElements = Collections.unmodifiableSet(specifiedModuleElements);
+ return;
+ }
+
+ final boolean expandAll = expandRequires.equals(AccessKind.PRIVATE)
+ || expandRequires.equals(AccessKind.PACKAGE);
+
+ Set<ModuleElement> result = new LinkedHashSet<>();
+ ListBuffer<ModuleElement> queue = new ListBuffer<>();
+
+ // expand each specified module
+ for (ModuleElement mdle : getSpecifiedModuleElements()) {
+ result.add(mdle); // a specified module is included
+ queue.append(mdle);
+ Set<ModuleElement> publicRequires = getModuleRequires(mdle, true);
+ result.addAll(publicRequires);
+ // add all requires public
+ queue.addAll(publicRequires);
+
+ if (expandAll) {
+ // add non-public requires if needed
+ result.addAll(getModuleRequires(mdle, !expandAll));
+ }
+ }
+
+ // compute the transitive closure of all the requires public
+ for (ModuleElement m = queue.poll() ; m != null ; m = queue.poll()) {
+ for (ModuleElement mdle : getModuleRequires(m, true)) {
+ if (!result.contains(mdle)) {
+ result.add(mdle);
+ queue.append(mdle);
+ }
+ }
+ }
+ specifiedModuleElements = Collections.unmodifiableSet(result);
+ }
+
+ private Set<PackageElement> getAllModulePackages(ModuleElement mdle) throws IOException {
+ Set<PackageElement> result = new HashSet<>();
+ ModuleSymbol msym = (ModuleSymbol)mdle;
+ Location msymloc = fm.getModuleLocation(location, msym.name.toString());
+ for (JavaFileObject fo : fm.list(msymloc, "", sourceKinds, true)) {
+ if (fo.getName().endsWith("module-info.java"))
+ continue;
+ String binaryName = fm.inferBinaryName(msymloc, fo);
+ String pn = getPackageName(binaryName);
+ PackageSymbol psym = syms.enterPackage(msym, names.fromString(pn));
+ result.add((PackageElement)psym);
+ }
+ return result;
+ }
+
+ private Set<PackageElement> computeModulePackages() throws IOException {
+ final AccessKind accessValue = accessFilter.getAccessValue(ElementKind.PACKAGE);
+ final boolean documentAllModulePackages = (accessValue == AccessKind.PACKAGE ||
+ accessValue == AccessKind.PRIVATE);
+
+ Set<PackageElement> expandedModulePackages = new LinkedHashSet<>();
+
+ for (ModuleElement mdle : specifiedModuleElements) {
+ // add all exported packages belonging to a specified module
+ if (specifiedModuleElements.contains(mdle)) {
+ List<ExportsDirective> exports = ElementFilter.exportsIn(mdle.getDirectives());
+ for (ExportsDirective export : exports) {
+ expandedModulePackages.add(export.getPackage());
+ }
+ }
+
+ // add all packages specified on the command line
+ // belonging to this module
+ if (!cmdLinePackages.isEmpty()) {
+ for (ModulePackage modpkg : cmdLinePackages) {
+ PackageElement pkg = toolEnv.elements.getPackageElement(mdle,
+ modpkg.packageName);
+ if (pkg != null) {
+ expandedModulePackages.add(pkg);
+ }
+ }
+ }
+
+ if (!documentAllModulePackages) {
+ List<ExportsDirective> exports = ElementFilter.exportsIn(mdle.getDirectives());
+ // check exported packages
+ for (ExportsDirective export : exports) {
+ List<? extends ModuleElement> targetModules = export.getTargetModules();
+ if (targetModules == null) { // no qualified exports, add 'em all
+ expandedModulePackages.add(export.getPackage());
+ } else { // qualified export, add only if target module is being considered
+ for (ModuleElement target : targetModules) {
+ if (specifiedModuleElements.contains(target)) {
+ expandedModulePackages.add(export.getPackage());
+ }
+ }
+ }
+ }
+ } else { // add all exported and module private packages
+ List<PackageElement> packages = ElementFilter.packagesIn(mdle.getEnclosedElements());
+ expandedModulePackages.addAll(packages);
+ expandedModulePackages.addAll(getAllModulePackages(mdle));
+ }
+ }
+ return expandedModulePackages;
+ }
+
+ private void initializeIncludedSets(Set<PackageElement> expandedModulePackages) {
+
+ // process modules
+ Set<ModuleElement> imodules = new LinkedHashSet<>();
+ // add all the expanded modules
+ imodules.addAll(specifiedModuleElements);
+
+ // process packages
+ Set<PackageElement> ipackages = new LinkedHashSet<>();
+ // add all packages belonging to expanded modules
+ ipackages.addAll(expandedModulePackages);
+ // add all specified packages
+ specifiedPackageElements.forEach(pkg -> {
+ ModuleElement mdle = toolEnv.elements.getModuleOf(pkg);
+ imodules.add(mdle);
+ ipackages.add(pkg);
+ });
+
+ // process types
+ Set<TypeElement> iclasses = new LinkedHashSet<>();
+ // add all types enclosed in expanded modules and packages
+ ipackages.forEach((pkg) -> {
+ addAllClasses(iclasses, pkg);
+ });
+ // add all types and its nested types
+ specifiedTypeElements.forEach((klass) -> {
+ ModuleElement mdle = toolEnv.elements.getModuleOf(klass);
+ if (!mdle.isUnnamed())
+ imodules.add(mdle);
+ PackageElement pkg = toolEnv.elements.getPackageOf(klass);
+ if (!pkg.isUnnamed())
+ ipackages.add(pkg);
+ addAllClasses(iclasses, klass, true);
+ });
+
+ // all done, freeze the collections
+ includedModuleElements = Collections.unmodifiableSet(imodules);
+ includedPackageElements = Collections.unmodifiableSet(ipackages);
+ includedTypeElements = Collections.unmodifiableSet(iclasses);
+ }
+
+ /**
+ * Computes the included packages and freezes the specified packages list.
+ */
+ private void computeSpecifiedPackages() throws IOException {
+
+ computeSubpackages();
+
+ Set<PackageElement> packlist = new LinkedHashSet<>();
+ cmdLinePackages.forEach((modpkg) -> {
+ ModuleElement mdle = null;
+ PackageElement pkg;
+ if (modpkg.hasModule()) {
+ mdle = toolEnv.elements.getModuleElement(modpkg.moduleName);
+ pkg = toolEnv.elements.getPackageElement(mdle, modpkg.packageName);
+ } else {
+ pkg = toolEnv.elements.getPackageElement(modpkg.toString());
+ }
+
+ if (pkg != null) {
+ packlist.add(pkg);
+ } else {
+ toolEnv.warning("main.package_not_found", modpkg.toString());
+ }
+ });
+ specifiedPackageElements = Collections.unmodifiableSet(packlist);
+ }
+
+ /**
+ * Adds all classes as well as inner classes, to the specified
+ * list.
+ */
+ private void computeSpecifiedTypes() {
+ Set<TypeElement> classes = new LinkedHashSet<>();
+ classDecList.stream().filter((def) -> (shouldDocument(def.sym))).forEach((def) -> {
+ TypeElement te = (TypeElement) def.sym;
+ if (te != null) {
+ addAllClasses(classes, te, true);
+ }
+ });
+ classArgList.forEach((className) -> {
+ TypeElement te = toolEnv.loadClass(className);
+ if (te == null) {
+ toolEnv.error("javadoc.class_not_found", className);
+ } else {
+ addAllClasses(classes, te, true);
+ }
+ });
+ specifiedTypeElements = Collections.unmodifiableSet(classes);
+ }
+
+ private void addFilesForParser(Collection<JavaFileObject> result,
+ Collection<ModulePackage> collection, boolean recurse) throws IOException {
+ for (ModulePackage modpkg : collection) {
+ toolEnv.notice("main.Loading_source_files_for_package", modpkg.toString());
+ List<JavaFileObject> files = getFiles(modpkg, recurse);
+ if (files.isEmpty()) {
+ toolEnv.error("main.no_source_files_for_package", modpkg.toString());
+ } else {
+ result.addAll(files);
+ }
+ }
+ }
+
+ /**
+ * Returns an aggregated list of java file objects from the items
+ * specified on the command line. The packages specified should not
+ * recurse, however sub-packages should recurse into the sub directories.
+ * @return a list of java file objects
+ * @throws IOException if an error occurs
+ */
+ List<JavaFileObject> getFilesToParse() throws IOException {
+ List<JavaFileObject> result = new ArrayList<>();
+ addFilesForParser(result, cmdLinePackages, false);
+ addFilesForParser(result, subPackages, true);
+ return result;
+ }
+
+ /**
+ * Returns the set of source files for a package.
+ *
+ * @param packageName the specified package
+ * @return the set of file objects for the specified package
+ * @throws IOException if an error occurs while accessing the files
+ */
+ private List<JavaFileObject> getFiles(ModulePackage modpkg, boolean recurse) throws IOException {
+ Entry e = getEntry(modpkg);
+ // The files may have been found as a side effect of searching for subpackages
+ if (e.files != null) {
+ return e.files;
+ }
+
+ ListBuffer<JavaFileObject> lb = new ListBuffer<>();
+ Location packageLocn = getLocation(modpkg);
+ if (packageLocn == null) {
+ return Collections.emptyList();
+ }
+ String pname = modpkg.packageName;
+ for (JavaFileObject fo : fm.list(packageLocn, pname, sourceKinds, recurse)) {
+ String binaryName = fm.inferBinaryName(packageLocn, fo);
+ String simpleName = getSimpleName(binaryName);
+ if (isValidClassName(simpleName)) {
+ lb.append(fo);
+ }
+ }
+
+ return lb.toList();
+ }
+
+ private ModuleSymbol findModuleOfPackageName(String packageName) {
+ Name pack = names.fromString(packageName);
+ for (ModuleSymbol msym : modules.allModules()) {
+ PackageSymbol p = syms.getPackage(msym, pack);
+ if (p != null && !p.members().isEmpty()) {
+ return msym;
+ }
+ }
+ return null;
+ }
+
+ private Location getLocation(ModulePackage modpkg) throws IOException {
+ if (location != StandardLocation.MODULE_SOURCE_PATH) {
+ return location;
+ }
+
+ if (modpkg.hasModule()) {
+ return fm.getModuleLocation(location, modpkg.moduleName);
+ }
+ // TODO: handle invalid results better.
+ ModuleSymbol msym = findModuleOfPackageName(modpkg.packageName);
+ if (msym == null) {
+ return null;
+ }
+ return fm.getModuleLocation(location, msym.name.toString());
+ }
+
+ private Entry getEntry(String name) {
+ return getEntry(new ModulePackage(name));
+ }
+
+ private Entry getEntry(ModulePackage modpkg) {
+ Entry e = entries.get(modpkg.packageName);
+ if (e == null) {
+ entries.put(modpkg.packageName, e = new Entry(modpkg));
+ }
+ return e;
+ }
+
+ private String getPackageName(String name) {
+ int lastDot = name.lastIndexOf(".");
+ return (lastDot == -1 ? "" : name.substring(0, lastDot));
+ }
+
+ private String getSimpleName(String name) {
+ int lastDot = name.lastIndexOf(".");
+ return (lastDot == -1 ? name : name.substring(lastDot + 1));
+ }
+
+ /**
+ * Adds all inner classes of this class, and their inner classes recursively, to the list
+ */
+ private void addAllClasses(Collection<TypeElement> list, TypeElement typeElement, boolean filtered) {
+ ClassSymbol klass = (ClassSymbol)typeElement;
+ try {
+ // eliminate needless checking, do this first.
+ if (list.contains(klass)) return;
+ if (toolEnv.isSynthetic(klass)) return;
+ // ignore classes with invalid Java class names
+ if (!JavadocTool.isValidClassName(klass.name.toString())) return;
+ if (filtered && !shouldDocument(klass)) return;
+ list.add(klass);
+ for (Symbol sym : klass.members().getSymbols(NON_RECURSIVE)) {
+ if (sym != null && sym.kind == Kind.TYP) {
+ ClassSymbol s = (ClassSymbol)sym;
+ if (!toolEnv.isSynthetic(s)) {
+ addAllClasses(list, s, filtered);
+ }
+ }
+ }
+ } catch (CompletionFailure e) {
+ // quietly ignore completion failures
+ }
+ }
+
+ /**
+ * Returns a list of all classes contained in this package, including
+ * member classes of those classes, and their member classes, etc.
+ */
+ private void addAllClasses(Collection<TypeElement> list, PackageElement pkg) {
+ boolean filtered = true;
+ PackageSymbol sym = (PackageSymbol)pkg;
+ for (Symbol isym : sym.members().getSymbols(NON_RECURSIVE)) {
+ if (isym != null) {
+ ClassSymbol s = (ClassSymbol)isym;
+ if (!toolEnv.isSynthetic(sym)) {
+ addAllClasses(list, s, filtered);
+ }
+ }
+ }
+ }
+
+ SimpleElementVisitor9<Boolean, Void> shouldDocumentVisitor = null;
+ /**
+ * Returns whether an element ought to be documented.
+ * @param e the element in question
+ * @return true if the element should be documented
+ */
+ public boolean shouldDocument(Element e) {
+ if (shouldDocumentVisitor == null) {
+ shouldDocumentVisitor = new SimpleElementVisitor9<Boolean, Void>() {
+
+ @Override @DefinedBy(Api.LANGUAGE_MODEL)
+ public Boolean visitType(TypeElement e, Void p) {
+ return shouldDocument((ClassSymbol) e);
+ }
+
+ @Override @DefinedBy(Api.LANGUAGE_MODEL)
+ public Boolean visitVariable(VariableElement e, Void p) {
+ return shouldDocument((VarSymbol) e);
+ }
+
+ @Override @DefinedBy(Api.LANGUAGE_MODEL)
+ public Boolean visitExecutable(ExecutableElement e, Void p) {
+ return shouldDocument((MethodSymbol) e);
+ }
+
+ @Override @DefinedBy(Api.LANGUAGE_MODEL)
+ public Boolean visitPackage(PackageElement e, Void p) {
+ return accessFilter.checkModifier(e);
+ }
+ };
+ }
+ return shouldDocumentVisitor.visit(e);
+ }
+
+ /** Check whether this member should be documented. */
+ private boolean shouldDocument(VarSymbol sym) {
+ if (toolEnv.isSynthetic(sym)) {
+ return false;
+ }
+ return accessFilter.checkModifier(sym);
+ }
+
+ /** Check whether this member should be documented. */
+ private boolean shouldDocument(MethodSymbol sym) {
+ if (toolEnv.isSynthetic(sym)) {
+ return false;
+ }
+ return accessFilter.checkModifier(sym);
+ }
+
+ /** Check whether this class should be documented. */
+ private boolean shouldDocument(ClassSymbol sym) {
+ return
+ !toolEnv.isSynthetic(sym) && // no synthetics
+ (xclasses || toolEnv.hasPath(sym)) &&
+ isVisible(sym);
+ }
+
+ /**
+ * Returns the visibility of a type element.
+ * If the type element is a nested type, then check if the
+ * enclosing is static or the enclosed is visible.
+ *
+ * @param te the type element to be checked
+ * @return true if the element is visible
+ */
+ public boolean isVisible(TypeElement te) {
+ ClassSymbol sym = (ClassSymbol)te;
+ if (!accessFilter.checkModifier(sym)) {
+ return false;
+ }
+ ClassSymbol encl = sym.owner.enclClass();
+ return (encl == null || (sym.flags_field & Flags.STATIC) != 0 || isVisible(encl));
+ }
+
+ private class IncludedVisitor extends SimpleElementVisitor9<Boolean, Void> {
+
+ final private Set<Element> includedCache;
+
+ public IncludedVisitor() {
+ includedCache = new LinkedHashSet<>();
+ }
+
+ @Override @DefinedBy(Api.LANGUAGE_MODEL)
+ public Boolean visitModule(ModuleElement e, Void p) {
+ // deduced by specified and/or requires expansion
+ return includedModuleElements.contains(e);
+ }
+
+ @Override @DefinedBy(Api.LANGUAGE_MODEL)
+ public Boolean visitPackage(PackageElement e, Void p) {
+ // deduced by specified or downward expansions
+ return includedPackageElements.contains(e);
+ }
+
+ @Override @DefinedBy(Api.LANGUAGE_MODEL)
+ public Boolean visitType(TypeElement e, Void p) {
+ if (includedTypeElements.contains(e)) {
+ return true;
+ }
+ if (shouldDocument(e)) {
+ // Class is nameable from top-level and
+ // the class and all enclosing classes
+ // pass the modifier filter.
+ PackageElement pkg = toolEnv.elements.getPackageOf(e);
+ if (specifiedPackageElements.contains(pkg)) {
+ return true;
+ }
+ Element enclosing = e.getEnclosingElement();
+ if (enclosing != null) {
+ switch(enclosing.getKind()) {
+ case PACKAGE:
+ return specifiedPackageElements.contains((PackageElement)enclosing);
+ case CLASS: case INTERFACE: case ENUM: case ANNOTATION_TYPE:
+ return visit((TypeElement) enclosing);
+ default:
+ throw new AssertionError("unknown element: " + enclosing);
+ }
+ }
+ }
+ return false;
+ }
+
+ // members
+ @Override @DefinedBy(Api.LANGUAGE_MODEL)
+ public Boolean defaultAction(Element e, Void p) {
+ if (includedCache.contains(e))
+ return true;
+ if (visit(e.getEnclosingElement()) && shouldDocument(e)) {
+ switch(e.getKind()) {
+ case ANNOTATION_TYPE: case CLASS: case ENUM: case INTERFACE:
+ case MODULE: case OTHER: case PACKAGE:
+ throw new AssertionError("invalid element for this operation: " + e);
+ default:
+ // the only allowed kinds in the cache are "members"
+ includedCache.add(e);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override @DefinedBy(Api.LANGUAGE_MODEL)
+ public Boolean visitUnknown(Element e, Void p) {
+ throw new AssertionError("unknown element: " + e);
+ }
+
+ }
+
+ class Entry {
+ final ModulePackage modpkg;
+ Boolean excluded = false;
+ com.sun.tools.javac.util.List<JavaFileObject> files;
+
+ Entry(ModulePackage modpkg) {
+ this.modpkg = modpkg;
+ }
+
+ Entry(String name) {
+ modpkg = new ModulePackage(name);
+ }
+
+ boolean isExcluded() {
+ return excluded;
+ }
+
+ @Override
+ public String toString() {
+ return "Entry{" + "modpkg=" + modpkg + ", excluded=" + excluded + ", files=" + files + '}';
+ }
+ }
+
+ /**
+ * A container class to retrieve the module and package pair
+ * from a parsed qualified package name.
+ */
+ static class ModulePackage {
+
+ public final String moduleName;
+ public final String packageName;
+
+ ModulePackage(String modulename, String packagename) {
+ this.moduleName = modulename;
+ this.packageName = packagename;
+ }
+
+ ModulePackage(ModuleElement msym, String packagename) {
+ this.moduleName = msym.toString();
+ this.packageName = packagename;
+ }
+
+ ModulePackage(String name) {
+ String a[] = name.split("/");
+ if (a.length == 2) {
+ this.moduleName = a[0];
+ this.packageName = a[1];
+ } else {
+ moduleName = null;
+ packageName = name;
+ }
+ }
+
+ boolean hasModule() {
+ return this.moduleName != null;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof ModulePackage) {
+ ModulePackage that = (ModulePackage)obj;
+ return this.toString().equals(that.toString());
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return toString().hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return moduleName == null ? packageName : moduleName + "/" + packageName;
+ }
+ }
+
+ /**
+ * A class which filters the access flags on classes, fields, methods, etc.
+ *
+ * @see javax.lang.model.element.Modifier
+ */
+
+ static class ModifierFilter {
+ /**
+ * The allowed ElementKind that can be stored.
+ */
+ static final EnumSet<ElementKind> ALLOWED_KINDS = EnumSet.of(ElementKind.METHOD,
+ ElementKind.CLASS,
+ ElementKind.PACKAGE,
+ ElementKind.MODULE);
+
+ // all possible accesss levels allowed for each element
+ private final EnumMap<ElementKind, EnumSet<AccessKind>> filterMap =
+ new EnumMap<>(ElementKind.class);
+
+ // the specified access level for each element
+ private final EnumMap<ElementKind, AccessKind> accessMap =
+ new EnumMap<>(ElementKind.class);
+
+ /**
+ * Constructor - Specify a filter.
+ *
+ * @param accessSet an Access filter.
+ */
+ ModifierFilter(Map<ToolOption, Object> opts) {
+
+ AccessKind accessValue = null;
+ for (ElementKind kind : ALLOWED_KINDS) {
+ switch (kind) {
+ case METHOD:
+ accessValue = (AccessKind)opts.get(ToolOption.SHOW_MEMBERS);
+ break;
+ case CLASS:
+ accessValue = (AccessKind)opts.get(ToolOption.SHOW_TYPES);
+ break;
+ case PACKAGE:
+ accessValue = (AccessKind)opts.get(ToolOption.SHOW_PACKAGES);
+ break;
+ case MODULE:
+ accessValue = (AccessKind)opts.get(ToolOption.SHOW_MODULE_CONTENTS);
+ break;
+ default:
+ throw new AssertionError("unknown element: " + kind);
+
+ }
+ accessMap.put(kind, accessValue);
+ filterMap.put(kind, getFilterSet(accessValue));
+ }
+ }
+
+ static EnumSet<AccessKind> getFilterSet(AccessKind acccessValue) {
+ switch (acccessValue) {
+ case PUBLIC:
+ return EnumSet.of(AccessKind.PUBLIC);
+ case PROTECTED:
+ default:
+ return EnumSet.of(AccessKind.PUBLIC, AccessKind.PROTECTED);
+ case PACKAGE:
+ return EnumSet.of(AccessKind.PUBLIC, AccessKind.PROTECTED, AccessKind.PACKAGE);
+ case PRIVATE:
+ return EnumSet.allOf(AccessKind.class);
+ }
+ }
+
+ public AccessKind getAccessValue(ElementKind kind) {
+ if (!ALLOWED_KINDS.contains(kind)) {
+ throw new IllegalArgumentException("not allowed: " + kind);
+ }
+ return accessMap.getOrDefault(kind, AccessKind.PROTECTED);
+ }
+
+ /**
+ * Returns true if access is allowed.
+ *
+ * @param e the element in question
+ * @return whether the modifiers pass this filter
+ */
+ public boolean checkModifier(Element e) {
+ Set<Modifier> modifiers = e.getModifiers();
+ AccessKind fflag = AccessKind.PACKAGE;
+ if (modifiers.contains(Modifier.PUBLIC)) {
+ fflag = AccessKind.PUBLIC;
+ } else if (modifiers.contains(Modifier.PROTECTED)) {
+ fflag = AccessKind.PROTECTED;
+ } else if (modifiers.contains(Modifier.PRIVATE)) {
+ fflag = AccessKind.PRIVATE;
+ }
+ EnumSet<AccessKind> filterSet = filterMap.get(getAllowedKind(e.getKind()));
+ return filterSet.contains(fflag);
+ }
+
+ // convert a requested element kind to an allowed access kind
+ private ElementKind getAllowedKind(ElementKind kind) {
+ switch (kind) {
+ case CLASS: case METHOD: case MODULE: case PACKAGE:
+ return kind;
+ case ANNOTATION_TYPE: case ENUM: case INTERFACE:
+ return ElementKind.CLASS;
+ case CONSTRUCTOR: case ENUM_CONSTANT: case EXCEPTION_PARAMETER:
+ case FIELD: case INSTANCE_INIT: case LOCAL_VARIABLE: case PARAMETER:
+ case RESOURCE_VARIABLE: case STATIC_INIT: case TYPE_PARAMETER:
+ return ElementKind.METHOD;
+ default:
+ throw new AssertionError("unsupported kind: " + kind);
+ }
+ }
+ } // end ModifierFilter
+}
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/JavadocTool.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/JavadocTool.java Fri Aug 26 10:14:15 2016 -0700
@@ -29,27 +29,18 @@
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
import java.util.HashSet;
-import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import javax.tools.JavaFileManager;
-import javax.tools.JavaFileManager.Location;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
-import javax.tools.StandardLocation;
import com.sun.tools.javac.code.ClassFinder;
import com.sun.tools.javac.code.Symbol.Completer;
import com.sun.tools.javac.code.Symbol.CompletionFailure;
-import com.sun.tools.javac.code.Symbol.ModuleSymbol;
-import com.sun.tools.javac.code.Symbol.PackageSymbol;
import com.sun.tools.javac.comp.Enter;
import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.JCTree.JCClassDecl;
@@ -57,11 +48,9 @@
import com.sun.tools.javac.util.Abort;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.ListBuffer;
-import com.sun.tools.javac.util.Name;
import com.sun.tools.javac.util.Position;
import jdk.javadoc.doclet.DocletEnvironment;
-
/**
* This class could be the main entry point for Javadoc when Javadoc is used as a
* component in a larger software system. It provides operations to
@@ -131,44 +120,41 @@
}
}
- public DocletEnvironment getEnvironment(String encoding,
- String showAccess,
- String overviewpath,
- List<String> args,
- Iterable<? extends JavaFileObject> fileObjects,
- List<String> subPackages,
- List<String> excludedPackages,
- boolean docClasses,
- boolean quiet) throws IOException {
+ public DocletEnvironment getEnvironment(Map<ToolOption, Object> jdtoolOpts,
+ List<String> javaNames,
+ Iterable<? extends JavaFileObject> fileObjects) throws IOException {
toolEnv = ToolEnvironment.instance(context);
- toolEnv.intialize(encoding, showAccess, overviewpath, args, fileObjects,
- subPackages, excludedPackages, docClasses, quiet);
-
- javadocFinder.sourceCompleter = docClasses ? Completer.NULL_COMPLETER : sourceCompleter;
+ toolEnv.initialize(jdtoolOpts);
+ ElementsTable etable = new ElementsTable(context, jdtoolOpts);
+ javadocFinder.sourceCompleter = etable.xclasses
+ ? Completer.NULL_COMPLETER
+ : sourceCompleter;
- if (docClasses) {
- // If -Xclasses is set, the args should be a series of class names
- for (String arg: args) {
+ if (etable.xclasses) {
+ // If -Xclasses is set, the args should be a list of class names
+ for (String arg: javaNames) {
if (!isValidPackageName(arg)) // checks
- toolEnv.error(null, "main.illegal_class_name", arg);
+ toolEnv.error("main.illegal_class_name", arg);
}
if (messager.nerrors() != 0) {
return null;
}
- return new DocEnvImpl(toolEnv, args);
+ etable.setClassArgList(javaNames);
+ // prepare, force the data structures to be analyzed
+ etable.analyze();
+ return new DocEnvImpl(toolEnv, etable);
}
ListBuffer<JCCompilationUnit> classTrees = new ListBuffer<>();
- Set<String> includedPackages = new LinkedHashSet<>();
try {
-
StandardJavaFileManager fm = toolEnv.fileManager instanceof StandardJavaFileManager
- ? (StandardJavaFileManager) toolEnv.fileManager : null;
+ ? (StandardJavaFileManager) toolEnv.fileManager
+ : null;
Set<String> packageNames = new LinkedHashSet<>();
// Normally, the args should be a series of package names or file names.
// Parse the files and collect the package names.
- for (String arg: args) {
+ for (String arg: javaNames) {
if (fm != null && arg.endsWith(".java") && new File(arg).exists()) {
if (new File(arg).getName().equals("module-info.java")) {
toolEnv.warning("main.file_ignored", arg);
@@ -181,37 +167,22 @@
if (fm == null)
throw new IllegalArgumentException();
else
- toolEnv.error(null, "main.file_not_found", arg);
+ toolEnv.error("main.file_not_found", arg);
} else {
- toolEnv.error(null, "main.illegal_package_name", arg);
+ toolEnv.error("main.illegal_package_name", arg);
}
}
// Parse file objects provide via the DocumentationTool API
parse(fileObjects, classTrees, true);
- modules.initModules(classTrees.toList());
-
- // Build up the complete list of any packages to be documented
- Location location = modules.multiModuleMode ? StandardLocation.MODULE_SOURCE_PATH
- : toolEnv.fileManager.hasLocation(StandardLocation.SOURCE_PATH) ? StandardLocation.SOURCE_PATH
- : StandardLocation.CLASS_PATH;
-
- PackageTable t = new PackageTable(toolEnv.fileManager, location)
- .packages(packageNames)
- .subpackages(subPackages, excludedPackages);
+ etable.packages(packageNames)
+ .classTrees(classTrees.toList())
+ .scanSpecifiedItems();
- includedPackages = t.getIncludedPackages();
-
- // Parse the files in the packages to be documented
+ // Parse the files in the packages and subpackages to be documented
ListBuffer<JCCompilationUnit> packageTrees = new ListBuffer<>();
- for (String packageName: includedPackages) {
- List<JavaFileObject> files = t.getFiles(packageName);
- toolEnv.notice("main.Loading_source_files_for_package", packageName);
- if (files.isEmpty())
- toolEnv.warning("main.no_source_files_for_package", packageName);
- parse(files, packageTrees, false);
- }
+ parse(etable.getFilesToParse(), packageTrees, false);
modules.enter(packageTrees.toList(), null);
if (messager.nerrors() != 0) {
@@ -220,24 +191,40 @@
// Enter symbols for all files
toolEnv.notice("main.Building_tree");
- javadocEnter.main(classTrees.toList().appendList(packageTrees.toList()));
+ javadocEnter.main(classTrees.toList().appendList(packageTrees));
+ etable.setClassDeclList(listClasses(classTrees.toList()));
enterDone = true;
+ etable.analyze();
+ } catch (CompletionFailure cf) {
+ toolEnv.printError(cf.getMessage());
} catch (Abort ex) {}
if (messager.nerrors() != 0)
return null;
- toolEnv.docEnv = new DocEnvImpl(toolEnv, listClasses(classTrees.toList()),
- new ArrayList<>(includedPackages));
+
+ toolEnv.docEnv = new DocEnvImpl(toolEnv, etable);
return toolEnv.docEnv;
}
/** Is the given string a valid package name? */
boolean isValidPackageName(String s) {
- int index;
- while ((index = s.indexOf('.')) != -1) {
- if (!isValidClassName(s.substring(0, index))) return false;
- s = s.substring(index+1);
+ if (s.contains("/")) {
+ String[] a = s.split("/");
+ if (a.length == 2) {
+ return isValidPackageName0(a[0]) && isValidPackageName0(a[1]);
+ }
+ return false;
+ }
+ return isValidPackageName0(s);
+ }
+
+ private boolean isValidPackageName0(String s) {
+ for (int index = s.indexOf('.') ; index != -1; index = s.indexOf('.')) {
+ if (!isValidClassName(s.substring(0, index))) {
+ return false;
+ }
+ s = s.substring(index + 1);
}
return isValidClassName(s);
}
@@ -253,8 +240,7 @@
}
}
- /** Are surrogates supported?
- */
+ /** Are surrogates supported? */
final static boolean surrogatesSupported = surrogatesSupported();
private static boolean surrogatesSupported() {
try {
@@ -279,7 +265,7 @@
int cp = s.codePointAt(0);
if (!Character.isJavaIdentifierStart(cp))
return false;
- for (int j=Character.charCount(cp); j<s.length(); j+=Character.charCount(cp)) {
+ for (int j = Character.charCount(cp); j < s.length(); j += Character.charCount(cp)) {
cp = s.codePointAt(j);
if (!Character.isJavaIdentifierPart(cp))
return false;
@@ -287,7 +273,7 @@
} else {
if (!Character.isJavaIdentifierStart(s.charAt(0)))
return false;
- for (int j=1; j<s.length(); j++)
+ for (int j = 1; j < s.length(); j++)
if (!Character.isJavaIdentifierPart(s.charAt(j)))
return false;
}
@@ -307,141 +293,4 @@
}
return result;
}
-
- /**
- * A table to manage included and excluded packages.
- */
- class PackageTable {
- private final Map<String, Entry> entries = new LinkedHashMap<>();
- private final Set<String> includedPackages = new LinkedHashSet<>();
- private final JavaFileManager fm;
- private final Location location;
- private final Set<JavaFileObject.Kind> sourceKinds = EnumSet.of(JavaFileObject.Kind.SOURCE);
-
- /**
- * Creates a table to manage included and excluded packages.
- * @param fm The file manager used to locate source files
- * @param locn the location used to locate source files
- */
- PackageTable(JavaFileManager fm, Location locn) {
- this.fm = fm;
- this.location = locn;
- getEntry("").excluded = false;
- }
-
- PackageTable packages(Collection<String> packageNames) {
- includedPackages.addAll(packageNames);
- return this;
- }
-
- PackageTable subpackages(Collection<String> packageNames, Collection<String> excludePackageNames)
- throws IOException {
- for (String p: excludePackageNames) {
- getEntry(p).excluded = true;
- }
-
- for (String packageName: packageNames) {
- for (JavaFileObject fo: fm.list(location, packageName, sourceKinds, true)) {
- String binaryName = fm.inferBinaryName(location, fo);
- String pn = getPackageName(binaryName);
- String simpleName = getSimpleName(binaryName);
- Entry e = getEntry(pn);
- if (!e.isExcluded() && isValidClassName(simpleName)) {
- includedPackages.add(pn);
- e.files = (e.files == null
- ? com.sun.tools.javac.util.List.of(fo)
- : e.files.prepend(fo));
- }
- }
- }
- return this;
- }
-
- /**
- * Returns the aggregate set of included packages.
- * @return the aggregate set of included packages
- */
- Set<String> getIncludedPackages() {
- return includedPackages;
- }
-
- /**
- * Returns the set of source files for a package.
- * @param packageName the specified package
- * @return the set of file objects for the specified package
- * @throws IOException if an error occurs while accessing the files
- */
- List<JavaFileObject> getFiles(String packageName) throws IOException {
- Entry e = getEntry(packageName);
- // The files may have been found as a side effect of searching for subpackages
- if (e.files != null)
- return e.files;
-
- ListBuffer<JavaFileObject> lb = new ListBuffer<>();
- Location packageLocn = getLocation(packageName);
- if (packageLocn == null)
- return Collections.emptyList();
- for (JavaFileObject fo: fm.list(packageLocn, packageName, sourceKinds, false)) {
- String binaryName = fm.inferBinaryName(packageLocn, fo);
- String simpleName = getSimpleName(binaryName);
- if (isValidClassName(simpleName)) {
- lb.append(fo);
- }
- }
-
- return lb.toList();
- }
-
- private Location getLocation(String packageName) throws IOException {
- if (location == StandardLocation.MODULE_SOURCE_PATH) {
- // TODO: handle invalid results better.
- Name pack = names.fromString(packageName);
-
- for (ModuleSymbol msym : modules.allModules()) {
- PackageSymbol p = syms.getPackage(msym, pack);
- if (p != null && !p.members().isEmpty()) {
- return fm.getModuleLocation(location, msym.name.toString());
- }
- }
-
- return null;
- } else {
- return location;
- }
- }
-
- private Entry getEntry(String name) {
- Entry e = entries.get(name);
- if (e == null)
- entries.put(name, e = new Entry(name));
- return e;
- }
-
- private String getPackageName(String name) {
- int lastDot = name.lastIndexOf(".");
- return (lastDot == -1 ? "" : name.substring(0, lastDot));
- }
-
- private String getSimpleName(String name) {
- int lastDot = name.lastIndexOf(".");
- return (lastDot == -1 ? name : name.substring(lastDot + 1));
- }
-
- class Entry {
- final String name;
- Boolean excluded;
- com.sun.tools.javac.util.List<JavaFileObject> files;
-
- Entry(String name) {
- this.name = name;
- }
-
- boolean isExcluded() {
- if (excluded == null)
- excluded = getEntry(getPackageName(name)).isExcluded();
- return excluded;
- }
- }
- }
-
}
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/Start.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/Start.java Fri Aug 26 10:14:15 2016 -0700
@@ -29,7 +29,6 @@
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
-import java.lang.reflect.Method;
import java.nio.file.Path;
import java.text.BreakIterator;
import java.util.ArrayList;
@@ -41,8 +40,6 @@
import java.util.Objects;
import java.util.Set;
-import static javax.tools.DocumentationTool.Location.*;
-
import javax.tools.JavaFileManager;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
@@ -65,6 +62,8 @@
import jdk.javadoc.doclet.Doclet.Option;
import jdk.javadoc.doclet.DocletEnvironment;
+import static javax.tools.DocumentationTool.Location.*;
+
import static com.sun.tools.javac.main.Option.*;
/**
@@ -92,9 +91,6 @@
private static final String ProgramName = "javadoc";
- // meaning we allow all visibility of PROTECTED and PUBLIC
- private static final String defaultModifier = "protected";
-
private Messager messager;
private final String docletName;
@@ -337,6 +333,7 @@
/**
* Main program - internal
*/
+ @SuppressWarnings("unchecked")
private boolean parseAndExecute(List<String> argList,
Iterable<? extends JavaFileObject> fileObjects) throws IOException {
long tm = System.currentTimeMillis();
@@ -390,28 +387,25 @@
}
compOpts.notifyListeners();
+ List<String> modules = (List<String>) jdtoolOpts.computeIfAbsent(ToolOption.MODULE,
+ s -> Collections.EMPTY_LIST);
- if (javaNames.isEmpty() && subPackages.isEmpty() && isEmpty(fileObjects)) {
- usageError("main.No_packages_or_classes_specified");
+ if (modules.isEmpty()) {
+ List<String> subpkgs = (List<String>) jdtoolOpts.computeIfAbsent(ToolOption.SUBPACKAGES,
+ s -> Collections.EMPTY_LIST);
+ if (subpkgs.isEmpty()) {
+ if (javaNames.isEmpty() && isEmpty(fileObjects)) {
+ usageError("main.No_modules_packages_or_classes_specified");
+ }
+ }
}
JavadocTool comp = JavadocTool.make0(context);
if (comp == null) return false;
- if (showAccess == null) {
- setFilter(defaultModifier);
- }
-
- DocletEnvironment root = comp.getEnvironment(
- encoding,
- showAccess,
- overviewpath,
+ DocletEnvironment docEnv = comp.getEnvironment(jdtoolOpts,
javaNames,
- fileObjects,
- subPackages,
- excludedPackages,
- docClasses,
- quiet);
+ fileObjects);
// release resources
comp = null;
@@ -421,8 +415,8 @@
trees.setBreakIterator(BreakIterator.getSentenceInstance(locale));
}
// pass off control to the doclet
- boolean ok = root != null;
- if (ok) ok = doclet.run(root);
+ boolean ok = docEnv != null;
+ if (ok) ok = doclet.run(docEnv);
// We're done.
if (compOpts.get("-verbose") != null) {
@@ -470,11 +464,11 @@
for (int i = 0 ; i < argv.size() ; i++) {
String arg = argv.get(i);
if (arg.equals(ToolOption.LOCALE.opt)) {
- oneArg(argv, i++);
+ checkOneArg(argv, i++);
String lname = argv.get(i);
locale = getLocale(lname);
} else if (arg.equals(ToolOption.DOCLET.opt)) {
- oneArg(argv, i++);
+ checkOneArg(argv, i++);
if (userDocletName != null) {
usageError("main.more_than_one_doclet_specified_0_and_1",
userDocletName, argv.get(i));
@@ -485,7 +479,7 @@
}
userDocletName = argv.get(i);
} else if (arg.equals(ToolOption.DOCLETPATH.opt)) {
- oneArg(argv, i++);
+ checkOneArg(argv, i++);
if (userDocletPath == null) {
userDocletPath = argv.get(i);
} else {
@@ -605,12 +599,11 @@
handleDocletOptions(i, args, true);
if (o.hasArg) {
- oneArg(args, i++);
+ checkOneArg(args, i++);
o.process(this, args.get(i));
} else if (o.hasSuffix) {
o.process(this, arg);
} else {
- setOption(arg);
o.process(this);
}
} else if (arg.startsWith("-XD")) {
@@ -633,13 +626,11 @@
}
/**
- * Set one arg option.
+ * Check the one arg option.
* Error and exit if one argument is not provided.
*/
- private void oneArg(List<String> args, int index) {
- if ((index + 1) < args.size()) {
- setOption(args.get(index), args.get(index+1));
- } else {
+ private void checkOneArg(List<String> args, int index) {
+ if ((index + 1) >= args.size() || args.get(index + 1).startsWith("-d")) {
usageError("main.requires_argument", args.get(index));
}
}
@@ -659,32 +650,6 @@
}
/**
- * indicate an option with no arguments was given.
- */
- private void setOption(String opt) {
- String[] option = { opt };
- options.add(Arrays.asList(option));
- }
-
- /**
- * indicate an option with one argument was given.
- */
- private void setOption(String opt, String argument) {
- String[] option = { opt, argument };
- options.add(Arrays.asList(option));
- }
-
- /**
- * indicate an option with the specified list of arguments was given.
- */
- private void setOption(String opt, List<String> arguments) {
- List<String> args = new ArrayList<>(arguments.size() + 1);
- args.add(opt);
- args.addAll(arguments);
- options.add(args);
- }
-
- /**
* Get the locale if specified on the command line
* else return null and if locale option is not used
* then return default locale.
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolEnvironment.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolEnvironment.java Fri Aug 26 10:14:15 2016 -0700
@@ -26,16 +26,12 @@
package jdk.javadoc.internal.tool;
-import java.lang.reflect.Modifier;
import java.util.*;
import javax.lang.model.element.Element;
-import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
-import javax.lang.model.element.VariableElement;
import javax.lang.model.util.Elements;
-import javax.lang.model.util.SimpleElementVisitor9;
import javax.tools.JavaFileManager;
import javax.tools.JavaFileObject;
@@ -44,15 +40,11 @@
import com.sun.tools.javac.api.JavacTrees;
import com.sun.tools.javac.code.ClassFinder;
import com.sun.tools.javac.code.Flags;
-import com.sun.tools.javac.code.Kinds.Kind;
import com.sun.tools.javac.code.Source;
import com.sun.tools.javac.code.Symbol;
import com.sun.tools.javac.code.Symbol.ClassSymbol;
import com.sun.tools.javac.code.Symbol.CompletionFailure;
-import com.sun.tools.javac.code.Symbol.MethodSymbol;
import com.sun.tools.javac.code.Symbol.ModuleSymbol;
-import com.sun.tools.javac.code.Symbol.PackageSymbol;
-import com.sun.tools.javac.code.Symbol.VarSymbol;
import com.sun.tools.javac.code.Symtab;
import com.sun.tools.javac.comp.AttrContext;
import com.sun.tools.javac.comp.Check;
@@ -67,13 +59,9 @@
import com.sun.tools.javac.tree.JCTree.JCPackageDecl;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.Convert;
-import com.sun.tools.javac.util.DefinedBy;
-import com.sun.tools.javac.util.DefinedBy.Api;
import com.sun.tools.javac.util.Name;
import com.sun.tools.javac.util.Names;
-import static com.sun.tools.javac.code.Scope.LookupKind.NON_RECURSIVE;
-
/**
* Holds the environment for a run of javadoc.
* Holds only the information needed throughout the
@@ -113,14 +101,8 @@
/** The name table. */
private Names names;
- /** The encoding name. */
- private String encoding;
-
final Symbol externalizableSym;
- /** Access filter (public, protected, ...). */
- protected ModifierFilter filter;
-
/**
* True if we do not want to print any notifications at all.
*/
@@ -181,20 +163,8 @@
elementToTreePath = new HashMap<>();
}
- public void intialize(String encoding,
- String showAccess,
- String overviewpath,
- List<String> javaNames,
- Iterable<? extends JavaFileObject> fileObjects,
- List<String> subPackages,
- List<String> excludedPackages,
- boolean docClasses,
- boolean quiet) {
- this.filter = ModifierFilter.getModifierFilter(showAccess);
- this.quiet = quiet;
-
- this.setEncoding(encoding);
- this.docClasses = docClasses;
+ public void initialize(Map<ToolOption, Object> toolOpts) {
+ this.quiet = (boolean)toolOpts.getOrDefault(ToolOption.QUIET, false);
}
/**
@@ -212,54 +182,8 @@
}
}
- private boolean isSynthetic(long flags) {
- return (flags & Flags.SYNTHETIC) != 0;
- }
-
- private boolean isSynthetic(Symbol sym) {
- return isSynthetic(sym.flags_field);
- }
-
- SimpleElementVisitor9<Boolean, Void> shouldDocumentVisitor = null;
- public boolean shouldDocument(Element e) {
- if (shouldDocumentVisitor == null) {
- shouldDocumentVisitor = new SimpleElementVisitor9<Boolean, Void>() {
-
- @Override @DefinedBy(Api.LANGUAGE_MODEL)
- public Boolean visitType(TypeElement e, Void p) {
- return shouldDocument((ClassSymbol)e);
- }
-
- @Override @DefinedBy(Api.LANGUAGE_MODEL)
- public Boolean visitVariable(VariableElement e, Void p) {
- return shouldDocument((VarSymbol)e);
- }
-
- @Override @DefinedBy(Api.LANGUAGE_MODEL)
- public Boolean visitExecutable(ExecutableElement e, Void p) {
- return shouldDocument((MethodSymbol)e);
- }
- };
- }
- return shouldDocumentVisitor.visit(e);
- }
-
- /** Check whether this member should be documented. */
- public boolean shouldDocument(VarSymbol sym) {
- long mod = sym.flags();
- if (isSynthetic(mod)) {
- return false;
- }
- return filter.checkModifier(translateModifiers(mod));
- }
-
- /** Check whether this member should be documented. */
- public boolean shouldDocument(MethodSymbol sym) {
- long mod = sym.flags();
- if (isSynthetic(mod)) {
- return false;
- }
- return filter.checkModifier(translateModifiers(mod));
+ boolean isSynthetic(Symbol sym) {
+ return (sym.flags() & Flags.SYNTHETIC) != 0;
}
void setElementToTreePath(Element e, TreePath tree) {
@@ -268,43 +192,16 @@
elementToTreePath.put(e, tree);
}
- private boolean hasLeaf(ClassSymbol sym) {
+ /**
+ * Returns true if the symbol has a tree path associated with it.
+ * Primarily used to disambiguate a symbol associated with a source
+ * file versus a class file.
+ * @param sym the symbol to be checked
+ * @return true if the symbol has a tree path
+ */
+ boolean hasPath(ClassSymbol sym) {
TreePath path = elementToTreePath.get(sym);
- if (path == null)
- return false;
- return path.getLeaf() != null;
- }
-
- /** check whether this class should be documented. */
- public boolean shouldDocument(ClassSymbol sym) {
- return
- !isSynthetic(sym.flags_field) && // no synthetics
- (docClasses || hasLeaf(sym)) &&
- isVisible(sym);
- }
-
- //### Comment below is inaccurate wrt modifier filter testing
- /**
- * Check the visibility if this is an nested class.
- * if this is not a nested class, return true.
- * if this is an static visible nested class,
- * return true.
- * if this is an visible nested class
- * if the outer class is visible return true.
- * else return false.
- * IMPORTANT: This also allows, static nested classes
- * to be defined inside an nested class, which is not
- * allowed by the compiler. So such an test case will
- * not reach upto this method itself, but if compiler
- * allows it, then that will go through.
- */
- public boolean isVisible(ClassSymbol sym) {
- long mod = sym.flags_field;
- if (!filter.checkModifier(translateModifiers(mod))) {
- return false;
- }
- ClassSymbol encl = sym.owner.enclClass();
- return (encl == null || (mod & Flags.STATIC) != 0 || isVisible(encl));
+ return path != null;
}
//---------------- print forwarders ----------------//
@@ -366,6 +263,15 @@
/**
* Print error message, increment error count.
+ * @param key selects message from resource
+ * @param args replacement arguments
+ */
+ public void error(String key, String... args) {
+ error(null, key, args);
+ }
+
+ /**
+ * Print error message, increment error count.
*
* @param element the source element
* @param key selects message from resource
@@ -553,48 +459,6 @@
throw new Messager.ExitJavadoc();
}
- /**
- * Adds all inner classes of this class, and their inner classes recursively, to the list
- */
- void addAllClasses(Collection<TypeElement> list, TypeElement typeElement, boolean filtered) {
- ClassSymbol klass = (ClassSymbol)typeElement;
- try {
- if (isSynthetic(klass.flags())) return;
- // sometimes synthetic classes are not marked synthetic
- if (!JavadocTool.isValidClassName(klass.name.toString())) return;
- if (filtered && !shouldDocument(klass)) return;
- if (list.contains(klass)) return;
- list.add(klass);
- for (Symbol sym : klass.members().getSymbols(NON_RECURSIVE)) {
- if (sym != null && sym.kind == Kind.TYP) {
- ClassSymbol s = (ClassSymbol)sym;
- if (!isSynthetic(s.flags())) {
- addAllClasses(list, s, filtered);
- }
- }
- }
- } catch (CompletionFailure e) {
- // quietly ignore completion failures
- }
- }
-
- /**
- * Return a list of all classes contained in this package, including
- * member classes of those classes, and their member classes, etc.
- */
- void addAllClasses(Collection<TypeElement> list, PackageElement pkg) {
- boolean filtered = true;
- PackageSymbol sym = (PackageSymbol)pkg;
- for (Symbol isym : sym.members().getSymbols(NON_RECURSIVE)) {
- if (isym != null) {
- ClassSymbol s = (ClassSymbol)isym;
- if (!isSynthetic(s)) {
- addAllClasses(list, s, filtered);
- }
- }
- }
- }
-
TreePath getTreePath(JCCompilationUnit tree) {
TreePath p = treePaths.get(tree);
if (p == null)
@@ -624,225 +488,11 @@
return types;
}
- /**
- * Set the encoding.
- */
- public void setEncoding(String encoding) {
- this.encoding = encoding;
- }
-
public Env<AttrContext> getEnv(ClassSymbol tsym) {
return enter.getEnv(tsym);
}
- /**
- * Get the encoding.
- */
- public String getEncoding() {
- return encoding;
- }
-
- /**
- * Convert modifier bits from private coding used by
- * the compiler to that of java.lang.reflect.Modifier.
- */
- static int translateModifiers(long flags) {
- int result = 0;
- if ((flags & Flags.ABSTRACT) != 0)
- result |= Modifier.ABSTRACT;
- if ((flags & Flags.FINAL) != 0)
- result |= Modifier.FINAL;
- if ((flags & Flags.INTERFACE) != 0)
- result |= Modifier.INTERFACE;
- if ((flags & Flags.NATIVE) != 0)
- result |= Modifier.NATIVE;
- if ((flags & Flags.PRIVATE) != 0)
- result |= Modifier.PRIVATE;
- if ((flags & Flags.PROTECTED) != 0)
- result |= Modifier.PROTECTED;
- if ((flags & Flags.PUBLIC) != 0)
- result |= Modifier.PUBLIC;
- if ((flags & Flags.STATIC) != 0)
- result |= Modifier.STATIC;
- if ((flags & Flags.SYNCHRONIZED) != 0)
- result |= Modifier.SYNCHRONIZED;
- if ((flags & Flags.TRANSIENT) != 0)
- result |= Modifier.TRANSIENT;
- if ((flags & Flags.VOLATILE) != 0)
- result |= Modifier.VOLATILE;
- return result;
- }
-
- private final Set<Element> includedSet = new HashSet<>();
-
- public void setIncluded(Element element) {
- includedSet.add(element);
- }
-
- private SimpleElementVisitor9<Boolean, Void> includedVisitor = null;
-
- public boolean isIncluded(Element e) {
- if (e == null) {
- return false;
- }
- if (includedVisitor == null) {
- includedVisitor = new SimpleElementVisitor9<Boolean, Void>() {
- @Override @DefinedBy(Api.LANGUAGE_MODEL)
- public Boolean visitType(TypeElement e, Void p) {
- if (includedSet.contains(e)) {
- return true;
- }
- if (shouldDocument(e)) {
- // Class is nameable from top-level and
- // the class and all enclosing classes
- // pass the modifier filter.
- PackageElement pkg = elements.getPackageOf(e);
- if (includedSet.contains(pkg)) {
- setIncluded(e);
- return true;
- }
- Element enclosing = e.getEnclosingElement();
- if (enclosing != null && includedSet.contains(enclosing)) {
- setIncluded(e);
- return true;
- }
- }
- return false;
- }
-
- @Override @DefinedBy(Api.LANGUAGE_MODEL)
- public Boolean visitPackage(PackageElement e, Void p) {
- return includedSet.contains(e);
- }
-
- @Override @DefinedBy(Api.LANGUAGE_MODEL)
- public Boolean visitUnknown(Element e, Void p) {
- throw new AssertionError("unknown element: " + e);
- }
-
- @Override @DefinedBy(Api.LANGUAGE_MODEL)
- public Boolean defaultAction(Element e, Void p) {
- return visit(e.getEnclosingElement()) && shouldDocument(e);
- }
- };
- }
- return includedVisitor.visit(e);
- }
-
public boolean isQuiet() {
return quiet;
}
-
- /**
- * A class which filters the access flags on classes, fields, methods, etc.
- *
- * <p>
- * <b>This is NOT part of any supported API. 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.</b>
- *
- * @see javax.lang.model.element.Modifier
- * @author Robert Field
- */
-
- private static class ModifierFilter {
-
- static enum FilterFlag {
- PACKAGE,
- PRIVATE,
- PROTECTED,
- PUBLIC
- }
-
- private Set<FilterFlag> oneOf;
-
- /**
- * Constructor - Specify a filter.
- *
- * @param oneOf a set containing desired flags to be matched.
- */
- ModifierFilter(Set<FilterFlag> oneOf) {
- this.oneOf = oneOf;
- }
-
- /**
- * Constructor - Specify a filter.
- *
- * @param oneOf an array containing desired flags to be matched.
- */
- ModifierFilter(FilterFlag... oneOf) {
- this.oneOf = new HashSet<>();
- this.oneOf.addAll(Arrays.asList(oneOf));
- }
-
- static ModifierFilter getModifierFilter(String showAccess) {
- switch (showAccess) {
- case "public":
- return new ModifierFilter(FilterFlag.PUBLIC);
- case "package":
- return new ModifierFilter(FilterFlag.PUBLIC, FilterFlag.PROTECTED,
- FilterFlag.PACKAGE);
- case "private":
- return new ModifierFilter(FilterFlag.PRIVATE);
- default:
- return new ModifierFilter(FilterFlag.PUBLIC, FilterFlag.PROTECTED);
- }
- }
-
- private boolean hasFlag(long flag, long modifierBits) {
- return (flag & modifierBits) != 0;
- }
-
- private List<FilterFlag> flagsToModifiers(long modifierBits) {
- List<FilterFlag> list = new ArrayList<>();
- boolean isPackage = true;
- if (hasFlag(com.sun.tools.javac.code.Flags.PRIVATE, modifierBits)) {
- list.add(FilterFlag.PRIVATE);
- isPackage = false;
- }
- if (hasFlag(com.sun.tools.javac.code.Flags.PROTECTED, modifierBits)) {
- list.add(FilterFlag.PROTECTED);
- isPackage = false;
- }
- if (hasFlag(com.sun.tools.javac.code.Flags.PUBLIC, modifierBits)) {
- list.add(FilterFlag.PUBLIC);
- isPackage = false;
- }
- if (isPackage) {
- list.add(FilterFlag.PACKAGE);
- }
- return list;
- }
-
- /**
- * Filter on modifier bits.
- *
- * @param modifierBits Bits as specified in the Modifier class
- *
- * @return Whether the modifierBits pass this filter.
- */
- public boolean checkModifier(int modifierBits) {
- return checkModifier(flagsToModifiers(modifierBits));
- }
-
- /**
- * Filter on Filter flags
- *
- * @param modifiers Flags as specified in the FilterFlags enumeration.
- *
- * @return if the modifier is contained.
- */
- public boolean checkModifier(List<FilterFlag> modifiers) {
- if (oneOf.contains(FilterFlag.PRIVATE)) {
- return true;
- }
- for (FilterFlag mod : modifiers) {
- if (oneOf.contains(mod)) {
- return true;
- }
- }
- return false;
- }
-
- } // end ModifierFilter
}
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOption.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOption.java Fri Aug 26 10:14:15 2016 -0700
@@ -26,10 +26,13 @@
package jdk.javadoc.internal.tool;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.EnumMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
-import java.util.StringTokenizer;
+
+import javax.lang.model.element.ElementKind;
import com.sun.tools.javac.main.Option;
import com.sun.tools.javac.main.OptionHelper;
@@ -44,6 +47,7 @@
* deletion without notice.</b>
*/
public enum ToolOption {
+
// ----- options for underlying compiler -----
BOOTCLASSPATH("-bootclasspath", true) {
@@ -193,10 +197,16 @@
}
},
+ MODULE("--module", true) {
+ @Override
+ public void process(Helper helper, String arg) {
+ helper.addToList(this, ",", arg);
+ }
+ },
+
ENCODING("-encoding", true) {
@Override
public void process(Helper helper, String arg) {
- helper.encoding = arg;
helper.setFileManagerOpt(Option.ENCODING, arg);
}
},
@@ -296,14 +306,14 @@
SUBPACKAGES("-subpackages", true) {
@Override
public void process(Helper helper, String arg) {
- helper.addToList(helper.subPackages, arg);
+ helper.addToList(this, ":", arg);
}
},
EXCLUDE("-exclude", true) {
@Override
public void process(Helper helper, String arg) {
- helper.addToList(helper.excludedPackages, arg);
+ helper.addToList(this, ":", arg);
}
},
@@ -312,28 +322,63 @@
PACKAGE("-package") {
@Override
public void process(Helper helper) {
- helper.setFilter("package");
+ helper.setSimpleFilter("package");
}
},
PRIVATE("-private") {
@Override
public void process(Helper helper) {
- helper.setFilter("private");
+ helper.setSimpleFilter("private");
}
},
PROTECTED("-protected") {
@Override
public void process(Helper helper) {
- helper.setFilter("protected");
+ helper.setSimpleFilter("protected");
}
},
PUBLIC("-public") {
@Override
public void process(Helper helper) {
- helper.setFilter("public");
+ helper.setSimpleFilter("public");
+ }
+ },
+
+ SHOW_MEMBERS("--show-members:") {
+ @Override
+ public void process(Helper helper, String arg) {
+ helper.setFilter(this, arg);
+ }
+ },
+
+ SHOW_TYPES("--show-types:") {
+ @Override
+ public void process(Helper helper, String arg) {
+ helper.setFilter(this, arg);
+ }
+ },
+
+ SHOW_PACKAGES("--show-packages:") {
+ @Override
+ public void process(Helper helper, String arg) {
+ helper.setShowPackageAccess(SHOW_PACKAGES, helper.getOptionArgumentValue(arg));
+ }
+ },
+
+ SHOW_MODULE_CONTENTS("--show-module-contents:") {
+ @Override
+ public void process(Helper helper, String arg) {
+ helper.setShowModuleContents(SHOW_MODULE_CONTENTS, helper.getOptionArgumentValue(arg));
+ }
+ },
+
+ EXPAND_REQUIRES("--expand-requires:") {
+ @Override
+ public void process(Helper helper, String arg) {
+ helper.setExpandRequires(EXPAND_REQUIRES, helper.getOptionArgumentValue(arg));
}
},
@@ -350,7 +395,7 @@
QUIET("-quiet") {
@Override
public void process(Helper helper) {
- helper.quiet = true;
+ helper.jdtoolOpts.put(QUIET, true);
}
},
@@ -385,19 +430,10 @@
}
},
- // the doclet consumes this
- OVERVIEW("-overview", true) {
- @Override
- public void process(Helper helper, String arg) {
- helper.setOverviewpath(arg);
- }
- },
-
XCLASSES("-Xclasses") {
@Override
public void process(Helper helper) {
- helper.docClasses = true;
-
+ helper.jdtoolOpts.put(XCLASSES, true);
}
},
@@ -452,14 +488,6 @@
}
static abstract class Helper {
- /** List of decoded options. */
- final List<List<String>> options = new ArrayList<>();
-
- /** Selected packages, from -subpackages. */
- final List<String> subPackages = new ArrayList<>();
-
- /** Excluded packages, from -exclude. */
- final List<String> excludedPackages = new ArrayList<>();
// File manager options
final Map<Option, String> fileManagerOpts = new LinkedHashMap<>();
@@ -467,18 +495,12 @@
/** javac options, set by various options. */
Options compOpts; // = Options.instance(context)
- /* Encoding for javac, and files written? set by -encoding. */
- String encoding = null;
+ /** Javadoc tool options */
+ final Map<ToolOption, Object> jdtoolOpts = new EnumMap<>(ToolOption.class);
/** Set by -breakiterator. */
boolean breakiterator = false;
- /** Set by -quiet. */
- boolean quiet = false;
-
- /** Set by -Xclasses. */
- boolean docClasses = false;
-
/** Set by -Xwerror. */
boolean rejectWarnings = false;
@@ -488,9 +510,9 @@
/** Set by -locale. */
String docLocale = "";
- /** Set by -public, private, -protected, -package. */
- String showAccess = null;
- String overviewpath;
+ Helper() {
+ populateDefaultAccessMap();
+ }
abstract void usage();
abstract void Xusage();
@@ -498,33 +520,129 @@
abstract void usageError(String msg, Object... args);
abstract OptionHelper getOptionHelper();
- void addToList(List<String> list, String str){
- StringTokenizer st = new StringTokenizer(str, ":");
- String current;
- while(st.hasMoreTokens()){
- current = st.nextToken();
- list.add(current);
+ @SuppressWarnings("unchecked")
+ void addToList(ToolOption opt, String delimiter, String str) {
+ List<String> list = (List<String>) jdtoolOpts.computeIfAbsent(opt, v -> new ArrayList<>());
+ list.addAll(Arrays.asList(str.split(delimiter)));
+ jdtoolOpts.put(opt, list);
+ }
+
+ String getOptionArgumentValue(String in) {
+ String[] values = in.trim().split(":");
+ return values[1];
+ }
+
+ void setExpandRequires(ToolOption opt, String arg) {
+ switch (arg) {
+ case "public":
+ jdtoolOpts.put(opt, AccessKind.PUBLIC);
+ break;
+ case "all":
+ jdtoolOpts.put(opt, AccessKind.PRIVATE);
+ break;
+ default:
+ usageError("main.illegal_option_value", arg);
}
}
- void setFilter(String showAccess) {
- if (showAccess != null) {
- if (!"public".equals(showAccess)
- && !"protected".equals(showAccess)
- && !"private".equals(showAccess)
- && !"package".equals(showAccess)) {
- usageError("main.incompatible.access.flags");
- }
- this.showAccess = showAccess;
+ void setShowModuleContents(ToolOption opt, String arg) {
+ switch (arg) {
+ case "api":
+ jdtoolOpts.put(opt, AccessKind.PUBLIC);
+ break;
+ case "all":
+ jdtoolOpts.put(opt, AccessKind.PRIVATE);
+ break;
+ default:
+ usageError("main.illegal_option_value", arg);
}
}
+ void setShowPackageAccess(ToolOption opt, String arg) {
+ switch (arg) {
+ case "exported":
+ jdtoolOpts.put(opt, AccessKind.PUBLIC);
+ break;
+ case "all":
+ jdtoolOpts.put(opt, AccessKind.PRIVATE);
+ break;
+ default:
+ usageError("main.illegal_option_value", arg);
+ }
+ }
+
+
+ void setFilter(ToolOption opt, String arg) {
+ jdtoolOpts.put(opt, getAccessValue(arg));
+ }
+
+ void setSimpleFilter(String arg) {
+ handleSimpleOption(arg);
+ }
+
void setFileManagerOpt(Option opt, String arg) {
fileManagerOpts.put(opt, arg);
}
- private void setOverviewpath(String arg) {
- this.overviewpath = arg;
+ void handleSimpleOption(String arg) {
+ populateSimpleAccessMap(getAccessValue(arg));
+ }
+
+ /*
+ * This method handles both the simple options -package,
+ * -private, so on, in addition to the new ones such as
+ * --show-types:public and so on.
+ */
+ private AccessKind getAccessValue(String arg) {
+ int colon = arg.indexOf(':');
+ String value = (colon > 0)
+ ? arg.substring(colon + 1)
+ : arg;
+ switch (value) {
+ case "public":
+ return AccessKind.PUBLIC;
+ case "protected":
+ return AccessKind.PROTECTED;
+ case "package":
+ return AccessKind.PACKAGE;
+ case "private":
+ return AccessKind.PRIVATE;
+ default:
+ usageError("main.illegal_option_value", value);
+ return null;
+ }
+ }
+
+ /*
+ * Sets the entire kind map to PROTECTED this is the default.
+ */
+ private void populateDefaultAccessMap() {
+ populateSimpleAccessMap(AccessKind.PROTECTED);
+ }
+
+ /*
+ * This sets access to all the allowed kinds in the
+ * access map.
+ */
+ void populateSimpleAccessMap(AccessKind accessValue) {
+ for (ElementKind kind : ElementsTable.ModifierFilter.ALLOWED_KINDS) {
+ switch (kind) {
+ case METHOD:
+ jdtoolOpts.put(SHOW_MEMBERS, accessValue);
+ break;
+ case CLASS:
+ jdtoolOpts.put(SHOW_TYPES, accessValue);
+ break;
+ case PACKAGE:
+ jdtoolOpts.put(SHOW_PACKAGES, accessValue);
+ break;
+ case MODULE:
+ jdtoolOpts.put(SHOW_MODULE_CONTENTS, accessValue);
+ break;
+ default:
+ throw new AssertionError("unknown element kind:" + kind);
+ }
+ }
}
}
}
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc.properties Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc.properties Fri Aug 26 10:14:15 2016 -0700
@@ -31,18 +31,53 @@
main.usage=Usage: javadoc [options] [packagenames] [sourcefiles] [@files]\n\
\ -overview <file> Read overview documentation from HTML file\n\
\ -public Show only public classes and members\n\
-\ -protected Show protected/public classes and members (default)\n\
-\ -package Show package/protected/public classes and members\n\
+\ -protected Show protected/public classes and \n\
+\ members (default)\n\
+\ -package Show package/protected/public classes\n\
+\ and members\n\
\ -private Show all classes and members\n\
+\ --show-members:value Specifies which members (fields, methods\n\
+\ etc.) will be documented, where value can\n\
+\ be one of "public", "protected", "package"\n\
+\ or "private".\n\
+\ Default is protected, will show public and\n\
+\ protected members, "public" will show only\n\
+\ public members, "package" will show public,\n\
+\ protected and package members and \n\
+\ "private" will show all members\n\
+\ --show-types:value Specifies which types (classes, interfaces\n\
+\ etc.) will be documented, where value can be\n\
+\ one of "public", "protected", "package" or\n\
+\ "private".\n\
+\ Default is "protected", show public and\n\
+\ protected types, "package" will show public,\n\
+\ protected and package types and "private"\n\
+\ will show all types\n\
+\ --show-packages:value Specifies which module's packages will be\n\
+\ documented. Possible values are "exported"\n\
+\ or "all" packages\n\
+\ --show-module-contents:value Specifies the documentation granularity of\n\
+\ module declarations.\n\
+\ Possible values are "api" or "all".\n\
+\ --expand-requires:value Instructs the tool to expand the "requires"\n\
+\ module dependencies "public" expands all the\n\
+\ "requires public" edges of the module graph.\n\
+\ "all" expands all the "requires" edges of\n\
+\ the module graph by default only the\n\
+\ specified modules will be considered.\n\
\ -help Display command line options and exit\n\
+\ --module m1, m2.. Document the specified module(s)\n\
\ -doclet <class> Generate output via alternate doclet\n\
\ -docletpath <path> Specify where to find doclet class files\n\
-\ --module-source-path <path> Specify where to find input source files for multiple modules\n\
+\ --module-source-path <path> Specify where to find input source files\n\
+\ for multiple modules\n\
\ --upgrade-module-path <path> Override location of upgradeable modules\n\
\ --module-path <path>, -p <path> Specify where to find application modules\n\
\ --add-modules <module>(,<module>)*\n\
-\ Root modules to resolve in addition to the initial modules,\n\
-\ or all modules on the module path if <module> is ALL-MODULE-PATH.\n\
+\ Root modules to resolve in addition to the\n\
+\ initial modules,\n\
+\ or all modules on the module path if\n\
+\ <module> is ALL-MODULE-PATH.\n\
\ --limit-modules <module>(,<module>)*\n\
\ Limit the universe of observable modules\n\
\ --source-path <path> Specify where to find source files\n\
@@ -57,35 +92,40 @@
\ used for non-modular releases\n\
\ --system <jdk> Override location of system modules used\n\
\ for modular releases.\n\
-\ --release <release> Provide source compatibility with specified release\n\
-\ -source <release> Provide source compatibility with specified release\n\
+\ --release <release> Provide source compatibility with\n\
+\ specified release\n\
+\ -source <release> Provide source compatibility with\n\
+\ specified release\n\
\ -extdirs <dirlist> Override location of installed extensions\n\
\ -verbose Output messages about what Javadoc is doing\n\
\ -locale <name> Locale to be used, e.g. en_US or en_US_WIN\n\
\ -encoding <name> Source file encoding name\n\
\ -quiet Do not display status messages\n\
\ -J<flag> Pass <flag> directly to the runtime system\n\
-\ -X Print a synopsis of nonstandard options and exit\n
+\ -X Print a synopsis of nonstandard\n\
+\ options and exit\n
main.usage.foot=\n\
-GNU-style options may use '=' instead whitespace to separate the name of an option\n\
-from its value.\n
+GNU-style options may use '=' instead of whitespace to separate the name of an\n\
+option from its value.\n
main.Xusage=\
\ -Xmaxerrs <number> Set the maximum number of errors to print\n\
\ -Xmaxwarns <number> Set the maximum number of warnings to print\n\
\ --add-exports <module>/<package>=<other-module>(,<other-module>)*\n\
-\ Specify a package to be considered as exported from its \n\
-\ defining module to additional modules, or to all unnamed \n\
-\ modules if <other-module> is ALL-UNNAMED.\n\
+\ Specify a package to be considered as exported\n\
+\ from its defining module to additional modules,\n\
+\ or to all unnamed modules if <other-module> is\n\
+\ ALL-UNNAMED.\n\
\ --add-reads <module>=<other-module>(,<other-module>)*\n\
-\ Specify additional modules to be considered as required by a\n\
-\ given module. <other-module> may be ALL-UNNAMED to require\n\
-\ the unnamed module.\n\
-\ -Xmodule:<module-name> Specify a module to which the classes being compiled belong.\n\
+\ Specify additional modules to be considered as\n\
+\ required by a given module. <other-module> may be\n\
+\ ALL-UNNAMED to require the unnamed module.\n\
+\ -Xmodule:<module-name> Specify a module to which the classes being\n\
+\ compiled belong.\n\
\ --patch-module <module>=<file>(:<file>)*\n\
-\ Override or augment a module with classes and resources\n\
-\ in JAR files or directories\n\
+\ Override or augment a module with classes\n\
+\ and resources in JAR files or directories\n\
\ -Xold Invoke the legacy javadoc tool\n
main.Xusage.foot=\
@@ -95,13 +135,14 @@
main.requires_argument=option {0} requires an argument.
main.invalid_flag=invalid flag: {0}
-main.No_packages_or_classes_specified=No packages or classes specified.
-main.incompatible.access.flags=More than one of -public, -private, -package, or -protected specified.
+main.No_modules_packages_or_classes_specified=No modules, packages or classes specified.
+main.module_not_found=module {0} not found.\n
main.cant.read=cannot read {0}
main.Loading_source_files_for_package=Loading source files for package {0}...
main.Loading_source_file=Loading source file {0}...
main.Building_tree=Constructing Javadoc information...
main.no_source_files_for_package=No source files for package {0}
+main.package_not_found=Package {0} not found
main.fatal.error=fatal error
main.fatal.exception=fatal exception
main.out.of.memory=java.lang.OutOfMemoryError: Please increase memory.\n\
@@ -119,6 +160,7 @@
main.file_ignored=File ignored: "{0}" (not yet supported)
main.illegal_class_name=Illegal class name: "{0}"
main.illegal_package_name=Illegal package name: "{0}"
+main.illegal_option_value=Illegal option value: "{0}"
main.release.bootclasspath.conflict=option {0} cannot be used together with -release
main.unsupported.release.version=release version {0} not supported
main.release.not.standard.file.manager=-release option specified, but the provided JavaFileManager is not a StandardJavaFileManager.
--- a/langtools/src/jdk.javadoc/share/classes/module-info.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/module-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -23,6 +23,10 @@
* questions.
*/
+/** Defines the implementation of the
+ * {@link javax.tools.ToolProvider#getSystemDocumentationTool system documentation tool}
+ * and its command line equivalent, <em>javadoc</em>.
+ */
module jdk.javadoc {
requires public java.compiler;
requires public jdk.compiler;
--- a/langtools/src/jdk.jdeps/share/classes/module-info.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.jdeps/share/classes/module-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -23,6 +23,9 @@
* questions.
*/
+/** Defines tools for analysing dependencies in Java libraries and programs, including
+ * the <em>jdeps</em> and <em>javap</em> tools.
+ */
module jdk.jdeps {
requires java.base;
requires java.compiler;
--- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java Fri Aug 26 10:14:15 2016 -0700
@@ -923,7 +923,7 @@
for (String alternative : alternatives) {
if (alternative.startsWith(input)) {
- result.add(new Suggestion(alternative, false));
+ result.add(new ArgSuggestion(alternative));
}
}
@@ -951,7 +951,7 @@
List<Suggestion> result = new ArrayList<>();
try (Stream<Path> dir = Files.list(current)) {
dir.filter(f -> accept.test(f) && f.getFileName().toString().startsWith(prefix))
- .map(f -> new Suggestion(f.getFileName() + (Files.isDirectory(f) ? "/" : ""), false))
+ .map(f -> new ArgSuggestion(f.getFileName() + (Files.isDirectory(f) ? "/" : "")))
.forEach(result::add);
} catch (IOException ex) {
//ignore...
@@ -959,7 +959,7 @@
if (path.isEmpty()) {
StreamSupport.stream(FileSystems.getDefault().getRootDirectories().spliterator(), false)
.filter(root -> accept.test(root) && root.toString().startsWith(prefix))
- .map(root -> new Suggestion(root.toString(), false))
+ .map(root -> new ArgSuggestion(root.toString()))
.forEach(result::add);
}
anchor[0] = path.length();
@@ -981,7 +981,7 @@
? Stream.of(String.valueOf(k.id()), ((DeclarationSnippet) k).name())
: Stream.of(String.valueOf(k.id())))
.filter(k -> k.startsWith(prefix))
- .map(k -> new Suggestion(k, false))
+ .map(k -> new ArgSuggestion(k))
.collect(Collectors.toList());
};
}
@@ -1146,7 +1146,7 @@
.filter(cmd -> cmd.kind.shouldSuggestCompletions)
.map(cmd -> cmd.command)
.filter(key -> key.startsWith(prefix))
- .map(key -> new Suggestion(key + " ", false));
+ .map(key -> new ArgSuggestion(key + " "));
anchor[0] = 0;
} else {
String arg = prefix.substring(space + 1);
@@ -1919,7 +1919,7 @@
{
String val = state.status(vk) == Status.VALID
? state.varValue(vk)
- : "jshell.msg.vars.not.active";
+ : getResourceString("jshell.msg.vars.not.active");
hard(" %s %s = %s", vk.typeName(), vk.name(), val);
});
return true;
@@ -2457,6 +2457,42 @@
this.tid = tid;
}
}
+
+ private static class ArgSuggestion implements Suggestion {
+
+ private final String continuation;
+
+ /**
+ * Create a {@code Suggestion} instance.
+ *
+ * @param continuation a candidate continuation of the user's input
+ */
+ public ArgSuggestion(String continuation) {
+ this.continuation = continuation;
+ }
+
+ /**
+ * The candidate continuation of the given user's input.
+ *
+ * @return the continuation string
+ */
+ @Override
+ public String continuation() {
+ return continuation;
+ }
+
+ /**
+ * Indicates whether input continuation matches the target type and is thus
+ * more likely to be the desired continuation. A matching continuation is
+ * preferred.
+ *
+ * @return {@code false}, non-types analysis
+ */
+ @Override
+ public boolean matchesType() {
+ return false;
+ }
+ }
}
abstract class NonInteractiveIOContext extends IOContext {
--- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/JShell.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/JShell.java Fri Aug 26 10:14:15 2016 -0700
@@ -503,10 +503,8 @@
/**
* Return all snippets.
* @return the snippets for all current snippets in id order.
- * @throws IllegalStateException if this JShell instance is closed.
*/
- public Stream<Snippet> snippets() throws IllegalStateException {
- checkIfAlive();
+ public Stream<Snippet> snippets() {
return maps.snippetList().stream();
}
@@ -517,9 +515,8 @@
* {@code && snippet.kind() == Kind.VARIABLE}
* and cast to {@code VarSnippet}.
* @return the active declared variables.
- * @throws IllegalStateException if this JShell instance is closed.
*/
- public Stream<VarSnippet> variables() throws IllegalStateException {
+ public Stream<VarSnippet> variables() {
return snippets()
.filter(sn -> status(sn).isActive() && sn.kind() == Snippet.Kind.VAR)
.map(sn -> (VarSnippet) sn);
@@ -532,9 +529,8 @@
* {@code && snippet.kind() == Kind.METHOD}
* and cast to MethodSnippet.
* @return the active declared methods.
- * @throws IllegalStateException if this JShell instance is closed.
*/
- public Stream<MethodSnippet> methods() throws IllegalStateException {
+ public Stream<MethodSnippet> methods() {
return snippets()
.filter(sn -> status(sn).isActive() && sn.kind() == Snippet.Kind.METHOD)
.map(sn -> (MethodSnippet)sn);
@@ -547,9 +543,8 @@
* {@code && snippet.kind() == Kind.TYPE_DECL}
* and cast to TypeDeclSnippet.
* @return the active declared type declarations.
- * @throws IllegalStateException if this JShell instance is closed.
*/
- public Stream<TypeDeclSnippet> types() throws IllegalStateException {
+ public Stream<TypeDeclSnippet> types() {
return snippets()
.filter(sn -> status(sn).isActive() && sn.kind() == Snippet.Kind.TYPE_DECL)
.map(sn -> (TypeDeclSnippet) sn);
@@ -562,9 +557,8 @@
* {@code && snippet.kind() == Kind.IMPORT}
* and cast to ImportSnippet.
* @return the active declared import declarations.
- * @throws IllegalStateException if this JShell instance is closed.
*/
- public Stream<ImportSnippet> imports() throws IllegalStateException {
+ public Stream<ImportSnippet> imports() {
return snippets()
.filter(sn -> status(sn).isActive() && sn.kind() == Snippet.Kind.IMPORT)
.map(sn -> (ImportSnippet) sn);
--- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysis.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysis.java Fri Aug 26 10:14:15 2016 -0700
@@ -144,30 +144,16 @@
/**
* The result of {@code analyzeCompletion(String input)}.
- * Describes the completeness and position of the first snippet in the given input.
+ * Describes the completeness of the first snippet in the given input.
*/
- public static class CompletionInfo {
-
- private final Completeness completeness;
- private final int unitEndPos;
- private final String source;
- private final String remaining;
-
- CompletionInfo(Completeness completeness, int unitEndPos, String source, String remaining) {
- this.completeness = completeness;
- this.unitEndPos = unitEndPos;
- this.source = source;
- this.remaining = remaining;
- }
+ public interface CompletionInfo {
/**
* The analyzed completeness of the input.
*
* @return an enum describing the completeness of the input string.
*/
- public Completeness completeness() {
- return completeness;
- }
+ Completeness completeness();
/**
* Input remaining after the complete part of the source.
@@ -175,9 +161,7 @@
* @return the portion of the input string that remains after the
* complete Snippet
*/
- public String remaining() {
- return remaining;
- }
+ String remaining();
/**
* Source code for the first Snippet of code input. For example, first
@@ -186,18 +170,7 @@
*
* @return the source of the first encountered Snippet
*/
- public String source() {
- return source;
- }
-
- /**
- * The end of the first Snippet of source.
- *
- * @return the position of the end of the first Snippet in the input.
- */
- public int unitEndPos() {
- return unitEndPos;
- }
+ String source();
}
/**
@@ -272,30 +245,14 @@
/**
* A candidate for continuation of the given user's input.
*/
- public static class Suggestion {
-
- private final String continuation;
- private final boolean matchesType;
-
- /**
- * Create a {@code Suggestion} instance.
- *
- * @param continuation a candidate continuation of the user's input
- * @param matchesType does the candidate match the target type
- */
- public Suggestion(String continuation, boolean matchesType) {
- this.continuation = continuation;
- this.matchesType = matchesType;
- }
+ public interface Suggestion {
/**
* The candidate continuation of the given user's input.
*
* @return the continuation string
*/
- public String continuation() {
- return continuation;
- }
+ String continuation();
/**
* Indicates whether input continuation matches the target type and is thus
@@ -305,9 +262,7 @@
* @return {@code true} if this suggested continuation matches the
* target type; otherwise {@code false}
*/
- public boolean matchesType() {
- return matchesType;
- }
+ boolean matchesType();
}
/**
--- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysisImpl.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysisImpl.java Fri Aug 26 10:14:15 2016 -0700
@@ -171,13 +171,13 @@
MaskCommentsAndModifiers mcm = new MaskCommentsAndModifiers(srcInput, false);
if (mcm.endsWithOpenComment()) {
proc.debug(DBG_COMPA, "Incomplete (open comment): %s\n", srcInput);
- return new CompletionInfo(DEFINITELY_INCOMPLETE, srcInput.length(), null, srcInput + '\n');
+ return new CompletionInfoImpl(DEFINITELY_INCOMPLETE, null, srcInput + '\n');
}
String cleared = mcm.cleared();
String trimmedInput = Util.trimEnd(cleared);
if (trimmedInput.isEmpty()) {
// Just comment or empty
- return new CompletionInfo(Completeness.EMPTY, srcInput.length(), srcInput, "");
+ return new CompletionInfoImpl(Completeness.EMPTY, srcInput, "");
}
CaInfo info = ca.scan(trimmedInput);
Completeness status = info.status;
@@ -195,12 +195,12 @@
+ mcm.mask().substring(nonCommentNonWhiteLength);
proc.debug(DBG_COMPA, "Complete: %s\n", compileSource);
proc.debug(DBG_COMPA, " nothing remains.\n");
- return new CompletionInfo(status, unitEndPos, compileSource, "");
+ return new CompletionInfoImpl(status, compileSource, "");
} else {
String remain = srcInput.substring(unitEndPos);
proc.debug(DBG_COMPA, "Complete: %s\n", src);
proc.debug(DBG_COMPA, " remaining: %s\n", remain);
- return new CompletionInfo(status, unitEndPos, src, remain);
+ return new CompletionInfoImpl(status, src, remain);
}
case COMPLETE_WITH_SEMI:
// The unit is the whole non-coment/white input plus semicolon
@@ -209,19 +209,19 @@
+ mcm.mask().substring(nonCommentNonWhiteLength);
proc.debug(DBG_COMPA, "Complete with semi: %s\n", compileSource);
proc.debug(DBG_COMPA, " nothing remains.\n");
- return new CompletionInfo(status, unitEndPos, compileSource, "");
+ return new CompletionInfoImpl(status, compileSource, "");
case DEFINITELY_INCOMPLETE:
proc.debug(DBG_COMPA, "Incomplete: %s\n", srcInput);
- return new CompletionInfo(status, unitEndPos, null, srcInput + '\n');
+ return new CompletionInfoImpl(status, null, srcInput + '\n');
case CONSIDERED_INCOMPLETE:
proc.debug(DBG_COMPA, "Considered incomplete: %s\n", srcInput);
- return new CompletionInfo(status, unitEndPos, null, srcInput + '\n');
+ return new CompletionInfoImpl(status, null, srcInput + '\n');
case EMPTY:
proc.debug(DBG_COMPA, "Detected empty: %s\n", srcInput);
- return new CompletionInfo(status, unitEndPos, srcInput, "");
+ return new CompletionInfoImpl(status, srcInput, "");
case UNKNOWN:
proc.debug(DBG_COMPA, "Detected error: %s\n", srcInput);
- return new CompletionInfo(status, unitEndPos, srcInput, "");
+ return new CompletionInfoImpl(status, srcInput, "");
}
throw new InternalError();
}
@@ -665,7 +665,7 @@
if (c.getKind() == ElementKind.CONSTRUCTOR || c.getKind() == ElementKind.METHOD) {
simpleName += paren.apply(hasParams.contains(simpleName));
}
- result.add(new Suggestion(simpleName, smart.test(c)));
+ result.add(new SuggestionImpl(simpleName, smart.test(c)));
}
}
@@ -1196,6 +1196,11 @@
fm.setLocationFromPaths(StandardLocation.SOURCE_PATH, sources);
} catch (IOException ex) {
proc.debug(ex, "SourceCodeAnalysisImpl.SourceCache.<init>(...)");
+ try {
+ fm.close();
+ } catch (IOException closeEx) {
+ proc.debug(closeEx, "SourceCodeAnalysisImpl.SourceCache.close()");
+ }
fm = null;
}
this.fm = fm;
@@ -1700,4 +1705,98 @@
}
}
}
+
+ /**
+ * A candidate for continuation of the given user's input.
+ */
+ private static class SuggestionImpl implements Suggestion {
+
+ private final String continuation;
+ private final boolean matchesType;
+
+ /**
+ * Create a {@code Suggestion} instance.
+ *
+ * @param continuation a candidate continuation of the user's input
+ * @param matchesType does the candidate match the target type
+ */
+ public SuggestionImpl(String continuation, boolean matchesType) {
+ this.continuation = continuation;
+ this.matchesType = matchesType;
+ }
+
+ /**
+ * The candidate continuation of the given user's input.
+ *
+ * @return the continuation string
+ */
+ @Override
+ public String continuation() {
+ return continuation;
+ }
+
+ /**
+ * Indicates whether input continuation matches the target type and is thus
+ * more likely to be the desired continuation. A matching continuation is
+ * preferred.
+ *
+ * @return {@code true} if this suggested continuation matches the
+ * target type; otherwise {@code false}
+ */
+ @Override
+ public boolean matchesType() {
+ return matchesType;
+ }
+ }
+
+ /**
+ * The result of {@code analyzeCompletion(String input)}.
+ * Describes the completeness and position of the first snippet in the given input.
+ */
+ private static class CompletionInfoImpl implements CompletionInfo {
+
+ private final Completeness completeness;
+ private final String source;
+ private final String remaining;
+
+ CompletionInfoImpl(Completeness completeness, String source, String remaining) {
+ this.completeness = completeness;
+ this.source = source;
+ this.remaining = remaining;
+ }
+
+ /**
+ * The analyzed completeness of the input.
+ *
+ * @return an enum describing the completeness of the input string.
+ */
+ @Override
+ public Completeness completeness() {
+ return completeness;
+ }
+
+ /**
+ * Input remaining after the complete part of the source.
+ *
+ * @return the portion of the input string that remains after the
+ * complete Snippet
+ */
+ @Override
+ public String remaining() {
+ return remaining;
+ }
+
+ /**
+ * Source code for the first Snippet of code input. For example, first
+ * statement, or first method declaration. Trailing semicolons will be
+ * added, as needed.
+ *
+ * @return the source of the first encountered Snippet
+ */
+ @Override
+ public String source() {
+ return source;
+ }
+ }
+
}
--- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DefaultLoaderDelegate.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DefaultLoaderDelegate.java Fri Aug 26 10:14:15 2016 -0700
@@ -77,6 +77,7 @@
public DefaultLoaderDelegate() {
this.loader = new RemoteClassLoader();
+ Thread.currentThread().setContextClassLoader(loader);
}
@Override
--- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/ExecutionControlForwarder.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/ExecutionControlForwarder.java Fri Aug 26 10:14:15 2016 -0700
@@ -44,6 +44,13 @@
*/
class ExecutionControlForwarder {
+ /**
+ * Maximum number of characters for writeUTF(). Byte maximum is 65535, at
+ * maximum three bytes per character that is 65535 / 3 == 21845. Minus one
+ * for safety.
+ */
+ private static final int MAX_UTF_CHARS = 21844;
+
private final ExecutionControl ec;
private final ObjectInput in;
private final ObjectOutput out;
@@ -89,6 +96,9 @@
private void writeUTF(String s) throws IOException {
if (s == null) {
s = "";
+ } else if (s.length() > MAX_UTF_CHARS) {
+ // Truncate extremely long strings to prevent writeUTF from crashing the VM
+ s = s.substring(0, MAX_UTF_CHARS);
}
out.writeUTF(s);
}
--- a/langtools/test/jdk/javadoc/doclet/lib/JavadocTester.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/javadoc/doclet/lib/JavadocTester.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -40,6 +40,7 @@
import java.nio.file.Files;
import java.util.Arrays;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.List;
@@ -157,7 +158,7 @@
private final Map<File,SoftReference<String>> fileContentCache = new HashMap<>();
/** Stream used for logging messages. */
- private final PrintStream out = System.out;
+ protected final PrintStream out = System.out;
/** The directory containing the source code for the test. */
public static final String testSrc = System.getProperty("test.src");
@@ -416,6 +417,17 @@
* @param paths the files to check, within the most recent output directory.
* */
public void checkFiles(boolean expectedFound, String... paths) {
+ checkFiles(expectedFound, Arrays.asList(paths));
+ }
+
+ /**
+ * Check for files in (or not in) the generated output.
+ * @param expectedFound true if all of the files are expected
+ * to be found, or false if all of the files are expected to be
+ * not found
+ * @param paths the files to check, within the most recent output directory.
+ * */
+ public void checkFiles(boolean expectedFound, Collection<String> paths) {
for (String path: paths) {
// log.logCheckFile(path, expectedFound);
checking("checkFile");
@@ -574,7 +586,7 @@
return content;
content = new String(Files.readAllBytes(file.toPath()));
- fileContentCache.put(file, new SoftReference(content));
+ fileContentCache.put(file, new SoftReference<>(content));
return content;
} catch (FileNotFoundException e) {
System.err.println(e);
@@ -613,16 +625,19 @@
* Print a summary of the test results.
*/
protected void printSummary() {
-// log.write();
+ String javadocRuns = (javadocRunNum <= 1) ? ""
+ : ", in " + javadocRunNum + " runs of javadoc";
+
if (numTestsRun != 0 && numTestsPassed == numTestsRun) {
// Test passed
out.println();
- out.println("All " + numTestsPassed + " subtests passed");
+ out.println("All " + numTestsPassed + " subtests passed" + javadocRuns);
} else {
// Test failed
throw new Error((numTestsRun - numTestsPassed)
+ " of " + (numTestsRun)
- + " subtests failed");
+ + " subtests failed"
+ + javadocRuns);
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/jdk/javadoc/doclet/testClassLinks/TestClassLinks.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8163800
+ * @summary The fix for JDK-8072052 shows up other minor incorrect use of styles
+ * @library ../lib
+ * @modules jdk.javadoc/jdk.javadoc.internal.tool
+ * @build JavadocTester
+ * @build TestClassLinks
+ * @run main TestClassLinks
+ */
+
+public class TestClassLinks extends JavadocTester {
+
+ public static void main(String... args) throws Exception {
+ TestClassLinks tester = new TestClassLinks();
+ tester.runTests();
+ }
+
+ @Test
+ void test() {
+
+ javadoc("-d", "out",
+ "-Xdoclint:none",
+ "-sourcepath", testSrc,
+ "-package",
+ "p");
+ checkExit(Exit.OK);
+
+ checkOutput("p/C1.html", true,
+ "<code><a href=\"../p/C2.html\" title=\"class in p\">C2</a></code>",
+ "<code><span class=\"memberNameLink\"><a href=\"../p/C1.html#C1--\">C1</a></span>()</code>");
+
+ checkOutput("p/C2.html", true,
+ "<code><a href=\"../p/C3.html\" title=\"class in p\">C3</a></code>",
+ "<code><span class=\"memberNameLink\"><a href=\"../p/C2.html#C2--\">C2</a></span>()</code>");
+
+ checkOutput("p/C3.html", true,
+ "<code><a href=\"../p/I1.html\" title=\"interface in p\">I1</a></code>, "
+ + "<code><a href=\"../p/I12.html\" title=\"interface in p\">I12</a></code>, "
+ + "<code><a href=\"../p/I2.html\" title=\"interface in p\">I2</a></code>, "
+ + "<code><a href=\"../p/IT1.html\" title=\"interface in p\">IT1</a><T></code>, "
+ + "<code><a href=\"../p/IT2.html\" title=\"interface in p\">IT2</a><java.lang.String></code>",
+ "<code><span class=\"memberNameLink\"><a href=\"../p/C3.html#C3--\">C3</a></span>()</code>");
+
+ checkOutput("p/I1.html", true,
+ "<code><a href=\"../p/C3.html\" title=\"class in p\">C3</a></code>",
+ "<code><a href=\"../p/I12.html\" title=\"interface in p\">I12</a></code>");
+
+ checkOutput("p/I2.html", true,
+ "<code><a href=\"../p/C3.html\" title=\"class in p\">C3</a></code>",
+ "<code><a href=\"../p/I12.html\" title=\"interface in p\">I12</a></code>");
+
+ checkOutput("p/I12.html", true,
+ "<code><a href=\"../p/C3.html\" title=\"class in p\">C3</a></code>",
+ "<code><a href=\"../p/I1.html\" title=\"interface in p\">I1</a></code>, <code><a href=\"../p/I2.html\" title=\"interface in p\">I2</a></code>");
+
+ checkOutput("p/IT1.html", true,
+ "<code><a href=\"../p/C3.html\" title=\"class in p\">C3</a></code>");
+
+ checkOutput("p/IT2.html", true,
+ "code><a href=\"../p/C3.html\" title=\"class in p\">C3</a></code>");
+
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/jdk/javadoc/doclet/testClassLinks/p/C.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package p;
+
+interface I1 { }
+
+interface I2 { }
+
+interface I12 extends I1, I2 { }
+
+interface IT1<T> { }
+
+interface IT2<T> { }
+
+class C1 { }
+
+class C2 extends C1 { }
+
+class C3<T> extends C2 implements I12, IT1<T>, IT2<String> { }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/jdk/javadoc/doclet/testFramesNoFrames/TestFramesNoFrames.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,394 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8162353
+ * @summary javadoc should provide a way to disable use of frames
+ * @library /tools/lib ../lib
+ * @modules
+ * jdk.compiler/com.sun.tools.javac.api
+ * jdk.compiler/com.sun.tools.javac.main
+ * jdk.javadoc/jdk.javadoc.internal.tool
+ * @build toolbox.ModuleBuilder toolbox.ToolBox
+ * @build JavadocTester
+ * @run main TestFramesNoFrames
+ */
+
+import java.io.*;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.nio.file.*;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import toolbox.ModuleBuilder;
+import toolbox.ToolBox;
+
+public class TestFramesNoFrames extends JavadocTester {
+
+ public static void main(String... args) throws Exception {
+ TestFramesNoFrames tester = new TestFramesNoFrames();
+ tester.generateSource();
+ tester.runTests();
+ }
+
+ ToolBox tb = new ToolBox();
+ Path gensrcModules = Paths.get("gensrc/modules");
+ Path gensrcPackages = Paths.get("gensrc/packages");
+
+ void generateSource() throws IOException {
+ String[] modules = { "", "m1", "m2", "m3" };
+ String[] packages = { "p1", "p2", "p3" };
+ String[] classes = { "C1", "C2", "C3" };
+ for (String m: modules) {
+ ModuleBuilder mb = m.equals("") ? null : new ModuleBuilder(tb, m);
+ for (String p: packages) {
+ Path pkgRoot;
+ if (m.equals("")) {
+ pkgRoot = gensrcPackages;
+ } else {
+ pkgRoot = gensrcModules.resolve(m);
+ mb.exports(m + p);
+ }
+ for (String c: classes) {
+ tb.writeJavaFiles(pkgRoot,
+ "package " + (m + p) + ";\n"
+ + "/** class " + (m + p + c).toUpperCase() + ". */\n"
+ + "public class " + (m + p + c).toUpperCase() + " { }"
+ );
+ }
+ }
+ if (!m.equals("")) {
+ mb.write(gensrcModules);
+ }
+ }
+ tb.writeFile("overview.html",
+ "<html><body>This is the overview file</body></html>");
+ }
+
+ enum FrameKind {
+ DEFAULT(),
+ FRAMES("--frames"),
+ NO_FRAMES("--no-frames");
+ FrameKind(String... opts) {
+ this.opts = Arrays.asList(opts);
+ }
+ final List<String> opts;
+ }
+
+ enum OverviewKind {
+ DEFAULT(),
+ OVERVIEW("-overview", "overview.html"),
+ NO_OVERVIEW("-nooverview");
+ OverviewKind(String... opts) {
+ this.opts = Arrays.asList(opts);
+ }
+ final List<String> opts;
+ }
+
+ enum HtmlKind {
+ HTML4("-html4"),
+ HTML5("-html5");
+ HtmlKind(String... opts) {
+ this.opts = Arrays.asList(opts);
+ }
+ final List<String> opts;
+ }
+
+ @Override
+ public void runTests() throws Exception {
+ for (Method m : getClass().getDeclaredMethods()) {
+ Annotation a = m.getAnnotation(Test.class);
+ if (a != null) {
+ for (FrameKind fk : FrameKind.values()) {
+ for (OverviewKind ok : OverviewKind.values()) {
+ for (HtmlKind hk : HtmlKind.values()) {
+ try {
+ out.println("Running test " + m.getName() + " " + fk + " " + ok + " " + hk);
+ Path base = Paths.get(m.getName() + "_" + fk + "_" + ok + "_" + hk);
+ Files.createDirectories(base);
+ m.invoke(this, new Object[]{base, fk, ok, hk});
+ } catch (InvocationTargetException e) {
+ Throwable cause = e.getCause();
+ throw (cause instanceof Exception) ? ((Exception) cause) : e;
+ }
+ out.println();
+ }
+ }
+ }
+ }
+ }
+ printSummary();
+ }
+
+ void javadoc(Path outDir, FrameKind fKind, OverviewKind oKind, HtmlKind hKind, String... rest) {
+ List<String> args = new ArrayList<>();
+ args.add("-d");
+ args.add(outDir.toString());
+ args.addAll(fKind.opts);
+ args.addAll(oKind.opts);
+ args.addAll(hKind.opts);
+ args.addAll(Arrays.asList(rest));
+ javadoc(args.toArray(new String[0]));
+ checkExit(Exit.OK);
+ }
+
+ @Test
+ void testClass(Path base, FrameKind fKind, OverviewKind oKind, HtmlKind hKind) throws Exception {
+ javadoc(base, fKind, oKind, hKind,
+ gensrcPackages.resolve("p1/P1C1.java").toString());
+
+ new Checker(fKind, oKind, hKind)
+ .classes("p1.P1C1")
+ .check();
+ }
+
+ @Test
+ void testClasses(Path base, FrameKind fKind, OverviewKind oKind, HtmlKind hKind) throws IOException {
+ javadoc(base, fKind, oKind, hKind,
+ gensrcPackages.resolve("p1/P1C1.java").toString(),
+ gensrcPackages.resolve("p1/P1C2.java").toString(),
+ gensrcPackages.resolve("p1/P1C3.java").toString());
+
+ new Checker(fKind, oKind, hKind)
+ .classes("p1.P1C1", "p1.P1C2", "p1.P1C3")
+ .check();
+ }
+
+ @Test
+ void testPackage(Path base, FrameKind fKind, OverviewKind oKind, HtmlKind hKind) throws IOException {
+ javadoc(base, fKind, oKind, hKind,
+ "-sourcepath", gensrcPackages.toString(),
+ "p1");
+
+ new Checker(fKind, oKind, hKind)
+ .classes("p1.P1C1", "p1.P1C2", "p1.P1C3")
+ .check();
+ }
+
+ @Test
+ void testPackages(Path base, FrameKind fKind, OverviewKind oKind, HtmlKind hKind) throws IOException {
+ javadoc(base, fKind, oKind, hKind,
+ "-sourcepath", gensrcPackages.toString(),
+ "p1", "p2", "p3");
+
+ new Checker(fKind, oKind, hKind)
+ .classes("p1.P1C1", "p1.P1C2", "p1.P1C3",
+ "p2.P2C1", "p2.P2C2", "p2.P2C3",
+ "p3.P3C1", "p3.P3C2", "p3.P3C3")
+ .check();
+ }
+
+ @Test
+ void testModules(Path base, FrameKind fKind, OverviewKind oKind, HtmlKind hKind) throws IOException {
+ javadoc(base, fKind, oKind, hKind,
+ "-modulesourcepath", gensrcModules.toString(),
+ "--module", "m1,m2,m3");
+
+ new Checker(fKind, oKind, hKind)
+ .classes("m1/m1p1.M1P1C1", "m1/m1p1.M1P1C2", "m1/m1p1.M1P1C3",
+ "m2/m2p1.M2P1C1", "m2/m2p1.M2P1C2", "m2/m2p1.M2P1C3",
+ "m3/m3p1.M3P1C1", "m3/m3p1.M3P1C2", "m3/m3p1.M3P1C3")
+ .check();
+ }
+
+ /**
+ * Check the contents of the generated output, according to the
+ * specified options.
+ */
+ class Checker {
+ private final FrameKind fKind;
+ private final OverviewKind oKind;
+ private final HtmlKind hKind;
+ List<String> classes;
+
+ private boolean frames;
+ private boolean overview;
+
+ Checker(FrameKind fKind, OverviewKind oKind, HtmlKind hKind) {
+ this.fKind = fKind;
+ this.oKind = oKind;
+ this.hKind = hKind;
+ }
+
+ Checker classes(String... classes) {
+ this.classes = Arrays.asList(classes);
+ return this;
+ }
+
+ void check() throws IOException {
+ switch (fKind) {
+ case DEFAULT:
+ case FRAMES:
+ frames = true;
+ break;
+
+ case NO_FRAMES:
+ frames = false;
+ break;
+ }
+
+ switch (oKind) {
+ case DEFAULT:
+ overview = (getPackageCount() > 1);
+ break;
+
+ case OVERVIEW:
+ overview = true;
+ break;
+
+ case NO_OVERVIEW:
+ overview = false;
+ break;
+ }
+
+ checkAllClassesFiles();
+ checkFrameFiles();
+ checkOverviewSummary();
+
+ checkIndex();
+ checkNavBar();
+ checkHelpDoc();
+
+ }
+
+ private void checkAllClassesFiles() {
+ // these files are only generated in frames mode
+ checkFiles(frames,
+ "allclasses-frame.html",
+ "allclasses-noframe.html");
+
+ // this file is only generated when not in frames mode
+ checkFiles(!frames,
+ "allclasses.html");
+ }
+
+ private void checkFrameFiles() {
+ // these files are all only generated in frames mode
+
+ // <module>-frame.html and <module>-type-frame.html files
+ checkFiles(frames, classes.stream()
+ .filter(c -> isInModule(c))
+ .map(c -> modulePart(c))
+ .flatMap(m -> Arrays.asList(
+ m + "-frame.html",
+ m + "-type-frame.html").stream())
+ .collect(Collectors.toSet()));
+
+ // <package>/package-frame.html files
+ checkFiles(frames, classes.stream()
+ .map(c -> packagePart(c) + "/package-frame.html")
+ .collect(Collectors.toSet()));
+ }
+
+ private void checkHelpDoc() {
+ // the Help page only describes Frame/NoFrames in frames mode
+ checkOutput("help-doc.html", frames,
+ "<h2>Frames/No Frames</h2>");
+ }
+
+ private void checkIndex() {
+ // the index.html page only contains frames in frames mode
+ checkOutput("index.html", frames,
+ "<iframe ",
+ "</iframe>");
+
+ // the index.html contains the overview if one
+ // has been given, and not in frames mode
+ checkOutput("index.html", !frames && oKind == OverviewKind.OVERVIEW,
+ "This is the overview file");
+
+ // the index.html file contains a summary table
+ // if an overview was generated and not in frames mode
+ checkOutput("index.html", !frames && overview,
+ "<table class=\"overviewSummary\"");
+
+ // the index.html file contains a redirect if
+ // no frames and no overview
+ checkOutput("index.html", !frames && !overview,
+ "<meta http-equiv=\"Refresh\" content=\"0;",
+ "<script type=\"text/javascript\">window.location.replace(");
+
+ // the index.html file <meta> refresh should only use <noscript> in HTML 5
+ if (!frames && !overview) {
+ checkOutput("index.html", hKind == HtmlKind.HTML5,
+ "<noscript>\n<meta http-equiv=\"Refresh\" content=\"0;");
+ }
+ }
+
+ private void checkNavBar() {
+ // the files containing a navigation bar should only
+ // contain FRAMES/NO-FRAMES links in frames mode
+ List<String> navbarFiles = new ArrayList<>();
+ navbarFiles.addAll(classes.stream()
+ .map(c -> toHtml(packageClassPart(c)))
+ .collect(Collectors.toSet()));
+ for (String f : navbarFiles) {
+ checkOutput(f, frames,
+ "target=\"_top\">Frames</a>",
+ "target=\"_top\">No Frames</a>");
+ }
+ }
+
+ private void checkOverviewSummary() {
+ // the overview-summary.html file only appears if
+ // in frames mode and (overview requested or multiple packages)
+ checkFiles(frames && overview,
+ "overview-summary.html");
+ }
+
+ private long getPackageCount() {
+ return this.classes.stream()
+ .filter(name -> name.contains("."))
+ .map(name -> name.substring(0, name.lastIndexOf(".")))
+ .distinct()
+ .count();
+ }
+
+ private String packagePart(String className) {
+ int slash = className.indexOf("/");
+ int lastDot = className.lastIndexOf(".");
+ return className.substring(slash + 1, lastDot);
+ }
+
+ private String packageClassPart(String className) {
+ int slash = className.indexOf("/");
+ return className.substring(slash + 1);
+ }
+
+ private boolean isInModule(String className) {
+ return className.contains("/");
+ }
+
+ private String modulePart(String className) {
+ int slash = className.indexOf("/");
+ return className.substring(0, slash);
+ }
+
+ private String toHtml(String className) {
+ return className.replace(".", "/") + ".html";
+ }
+ }
+}
--- a/langtools/test/jdk/javadoc/doclet/testHiddenTag/TestHiddenTag.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/javadoc/doclet/testHiddenTag/TestHiddenTag.java Fri Aug 26 10:14:15 2016 -0700
@@ -54,9 +54,9 @@
"<a name=\"visibleField\">",
"<a name=\"visibleMethod--\">",
"<dt>Direct Known Subclasses:</dt>\n" +
- "<dd><a href=\"../pkg1/A.VisibleInner.html\" title=\"class in pkg1\">" +
- "A.VisibleInner</a>, <a href=\"../pkg1/A.VisibleInnerExtendsInvisibleInner.html\" " +
- "title=\"class in pkg1\">A.VisibleInnerExtendsInvisibleInner</a></dd>");
+ "<dd><code><a href=\"../pkg1/A.VisibleInner.html\" title=\"class in pkg1\">" +
+ "A.VisibleInner</a></code>, <code><a href=\"../pkg1/A.VisibleInnerExtendsInvisibleInner.html\" " +
+ "title=\"class in pkg1\">A.VisibleInnerExtendsInvisibleInner</a></code></dd>");
checkOutput("pkg1/A.html", false,
"<a name=\"inVisibleField\">",
--- a/langtools/test/jdk/javadoc/doclet/testInterface/TestInterface.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/javadoc/doclet/testInterface/TestInterface.java Fri Aug 26 10:14:15 2016 -0700
@@ -36,7 +36,7 @@
*/
/*
- * TODO: make it Inteferface<PE> ie. fix all ParameterTypes, likely should get
+ * TODO: make it Interface<PE> ie. fix all ParameterTypes, likely should get
* fixed when Doc is replace by j.l.m, but meanwhile this test has been adjusted
* take the current format this is better than @ignore because we can follow the
* differences as the work progress.
@@ -69,17 +69,17 @@
// Make sure known implementing class list is correct and omits type parameters.
"<dl>\n"
+ "<dt>All Known Implementing Classes:</dt>\n"
- + "<dd><a href=\"../pkg/Child.html\" title=\"class in pkg\">Child"
- + "</a>, <a href=\"../pkg/Parent.html\" title=\"class in pkg\">Parent"
- + "</a></dd>\n"
+ + "<dd><code><a href=\"../pkg/Child.html\" title=\"class in pkg\">Child"
+ + "</a></code>, <code><a href=\"../pkg/Parent.html\" title=\"class in pkg\">Parent"
+ + "</a></code></dd>\n"
+ "</dl>");
checkOutput("pkg/Child.html", true,
// Make sure "All Implemented Interfaces": has substituted type parameters
"<dl>\n"
+ "<dt>All Implemented Interfaces:</dt>\n"
- + "<dd><a href=\"../pkg/Interface.html\" title=\"interface in pkg\">"
- + "Interface</a><CE></dd>\n"
+ + "<dd><code><a href=\"../pkg/Interface.html\" title=\"interface in pkg\">"
+ + "Interface</a><CE></code></dd>\n"
+ "</dl>",
//Make sure Class Tree has substituted type parameters.
"<ul class=\"inheritance\">\n"
@@ -114,8 +114,8 @@
//Make sure "Direct Know Subclasses" omits type parameters
"<dl>\n"
+ "<dt>Direct Known Subclasses:</dt>\n"
- + "<dd><a href=\"../pkg/Child.html\" title=\"class in pkg\">Child"
- + "</a></dd>\n"
+ + "<dd><code><a href=\"../pkg/Child.html\" title=\"class in pkg\">Child"
+ + "</a></code></dd>\n"
+ "</dl>");
checkOutput("pkg/Interface.html", false,
--- a/langtools/test/jdk/javadoc/doclet/testLinkTaglet/TestLinkTaglet.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/javadoc/doclet/testLinkTaglet/TestLinkTaglet.java Fri Aug 26 10:14:15 2016 -0700
@@ -70,5 +70,7 @@
checkOutput(Output.OUT, false,
"Tag @see: reference not found: A");
+
+ checkFiles(false, "checkPkg/A.html");
}
}
--- a/langtools/test/jdk/javadoc/doclet/testModules/TestModules.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/javadoc/doclet/testModules/TestModules.java Fri Aug 26 10:14:15 2016 -0700
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8154119 8154262 8156077 8157987 8154261 8154817
+ * @bug 8154119 8154262 8156077 8157987 8154261 8154817 8135291 8155995
* @summary Test modules support in javadoc.
* @author bpatel
* @library ../lib
@@ -31,7 +31,6 @@
* @build JavadocTester
* @run main TestModules
*/
-
public class TestModules extends JavadocTester {
public static void main(String... args) throws Exception {
@@ -39,72 +38,112 @@
tester.runTests();
}
+ /**
+ * Test generated module pages for HTML 4.
+ */
@Test
- void test1() {
+ void testHtml4() {
javadoc("-d", "out", "-use",
"--module-source-path", testSrc,
"--add-modules", "module1,module2",
"testpkgmdl1", "testpkgmdl2");
checkExit(Exit.OK);
- testDescription(true);
- testNoDescription(false);
- testOverviewSummaryModules();
- testModuleLink();
- testModuleClickThroughLinks();
- testModuleClickThrough(true);
+ checkDescription(true);
+ checkNoDescription(false);
+ checkOverviewSummaryModules();
+ checkModuleLink();
+ checkModuleClickThroughLinks();
+ checkModuleClickThrough(true);
+ checkModuleFilesAndLinks(true);
+ checkModulesInSearch(true);
}
+ /**
+ * Test generated module pages for HTML 5.
+ */
@Test
- void test2() {
+ void testHtml5() {
javadoc("-d", "out-html5", "-html5", "-use",
"--module-source-path", testSrc,
"--add-modules", "module1,module2",
"testpkgmdl1", "testpkgmdl2");
checkExit(Exit.OK);
- testHtml5Description(true);
- testHtml5NoDescription(false);
- testHtml5OverviewSummaryModules();
- testModuleLink();
- testModuleClickThroughLinks();
- testModuleClickThrough(true);
+ checkHtml5Description(true);
+ checkHtml5NoDescription(false);
+ checkHtml5OverviewSummaryModules();
+ checkModuleLink();
+ checkModuleClickThroughLinks();
+ checkModuleClickThrough(true);
+ checkModuleFilesAndLinks(true);
+ checkModulesInSearch(true);
}
+ /**
+ * Test generated module pages for HTML 4 with -nocomment option.
+ */
@Test
- void test3() {
+ void testHtml4NoComment() {
javadoc("-d", "out-nocomment", "-nocomment", "-use",
"--module-source-path", testSrc,
"--add-modules", "module1,module2",
"testpkgmdl1", "testpkgmdl2");
checkExit(Exit.OK);
- testDescription(false);
- testNoDescription(true);
- testModuleLink();
+ checkDescription(false);
+ checkNoDescription(true);
+ checkModuleLink();
+ checkModuleFilesAndLinks(true);
}
+ /**
+ * Test generated module pages for HTML 5 with -nocomment option.
+ */
@Test
- void test4() {
+ void testHtml5NoComment() {
javadoc("-d", "out-html5-nocomment", "-nocomment", "-html5", "-use",
"--module-source-path", testSrc,
"--add-modules", "module1,module2",
"testpkgmdl1", "testpkgmdl2");
checkExit(Exit.OK);
- testHtml5Description(false);
- testHtml5NoDescription(true);
- testModuleLink();
+ checkHtml5Description(false);
+ checkHtml5NoDescription(true);
+ checkModuleLink();
+ checkModuleFilesAndLinks(true);
}
- @Test
- void test5() {
+ /**
+ * Test generated pages, in an unnamed module, for HTML 4.
+ */
+ @Test
+ void testHtml4UnnamedModule() {
javadoc("-d", "out-nomodule", "-use",
"-sourcepath", testSrc,
"testpkgnomodule", "testpkgnomodule1");
checkExit(Exit.OK);
- testOverviewSummaryPackages();
- testModuleClickThrough(false);
+ checkOverviewSummaryPackages();
+ checkModuleClickThrough(false);
+ checkModuleFilesAndLinks(false);
+ checkModulesInSearch(false);
}
- @Test
- void test6() {
+ /**
+ * Test generated pages, in an unnamed module, for HTML 5.
+ */
+ @Test
+ void testHtml5UnnamedModule() {
+ javadoc("-d", "out-html5-nomodule", "-html5", "-use",
+ "-sourcepath", testSrc,
+ "testpkgnomodule", "testpkgnomodule1");
+ checkExit(Exit.OK);
+ checkHtml5OverviewSummaryPackages();
+ checkModuleFilesAndLinks(false);
+ checkModulesInSearch(false);
+ }
+
+ /**
+ * Test generated module pages with javadoc tags.
+ */
+ @Test
+ void testJDTagsInModules() {
javadoc("-d", "out-mdltags", "-author", "-version",
"-tag", "regular:a:Regular Tag:",
"-tag", "moduletag:s:Module Tag:",
@@ -112,45 +151,54 @@
"--add-modules", "moduletags,module2",
"testpkgmdltags", "testpkgmdl2");
checkExit(Exit.OK);
- testModuleTags();
+ checkModuleTags();
}
+ /**
+ * Test generated module summary page.
+ */
@Test
- void test7() {
+ void testModuleSummary() {
javadoc("-d", "out-moduleSummary", "-use",
"-modulesourcepath", testSrc,
"-addmods", "module1,module2",
- "testpkgmdl1", "testpkgmdl2", "testpkg2mdl2");
+ "testpkgmdl1", "testpkgmdl2", "module2/testpkg2mdl2");
checkExit(Exit.OK);
- testModuleSummary();
- testNegatedModuleSummary();
+ checkModuleSummary();
+ checkNegatedModuleSummary();
}
- @Test
- void test8() {
- javadoc("-d", "out-html5-nomodule", "-html5", "-use",
- "-sourcepath", testSrc,
- "testpkgnomodule", "testpkgnomodule1");
+ /**
+ * Test generated module pages and pages with link to modules.
+ */
+ @Test
+ void testModuleFilesAndLinks() {
+ javadoc("-d", "out-modulelinks",
+ "-modulesourcepath", testSrc,
+ "-addmods", "module1",
+ "testpkgmdl1");
checkExit(Exit.OK);
- testHtml5OverviewSummaryPackages();
+ checkModuleFilesAndLinks(true);
}
- void testDescription(boolean found) {
+ void checkDescription(boolean found) {
checkOutput("module1-summary.html", found,
"<!-- ============ MODULE DESCRIPTION =========== -->\n"
+ "<a name=\"module.description\">\n"
+ "<!-- -->\n"
+ "</a>\n"
- + "<div class=\"block\">This is a test description for the module1 module.</div>");
+ + "<div class=\"block\">This is a test description for the module1 module. Search "
+ + "phrase <a id=\"searchphrase\">search phrase</a>.</div>");
checkOutput("module2-summary.html", found,
"<!-- ============ MODULE DESCRIPTION =========== -->\n"
+ "<a name=\"module.description\">\n"
+ "<!-- -->\n"
+ "</a>\n"
- + "<div class=\"block\">This is a test description for the module2 module.</div>");
+ + "<div class=\"block\">This is a test description for the module2 module. Search "
+ + "word <a id=\"search_word\">search_word</a> with no description.</div>");
}
- void testNoDescription(boolean found) {
+ void checkNoDescription(boolean found) {
checkOutput("module1-summary.html", found,
"<div class=\"contentContainer\">\n"
+ "<ul class=\"blockList\">\n"
@@ -167,26 +215,26 @@
+ "<!-- ============ MODULES SUMMARY =========== -->");
}
- void testHtml5Description(boolean found) {
+ void checkHtml5Description(boolean found) {
checkOutput("module1-summary.html", found,
"<section role=\"region\">\n"
+ "<!-- ============ MODULE DESCRIPTION =========== -->\n"
+ "<a id=\"module.description\">\n"
+ "<!-- -->\n"
+ "</a>\n"
- + "<div class=\"block\">This is a test description for the module1 module.</div>\n"
- + "</section>");
+ + "<div class=\"block\">This is a test description for the module1 module. Search "
+ + "phrase <a id=\"searchphrase\">search phrase</a>.</div>");
checkOutput("module2-summary.html", found,
"<section role=\"region\">\n"
+ "<!-- ============ MODULE DESCRIPTION =========== -->\n"
+ "<a id=\"module.description\">\n"
+ "<!-- -->\n"
+ "</a>\n"
- + "<div class=\"block\">This is a test description for the module2 module.</div>\n"
- + "</section>");
+ + "<div class=\"block\">This is a test description for the module2 module. Search "
+ + "word <a id=\"search_word\">search_word</a> with no description.</div>");
}
- void testHtml5NoDescription(boolean found) {
+ void checkHtml5NoDescription(boolean found) {
checkOutput("module1-summary.html", found,
"<div class=\"contentContainer\">\n"
+ "<ul class=\"blockList\">\n"
@@ -203,17 +251,13 @@
+ "<!-- ============ MODULES SUMMARY =========== -->");
}
- void testModuleLink() {
+ void checkModuleLink() {
checkOutput("overview-summary.html", true,
"<li>Module</li>");
checkOutput("module1-summary.html", true,
"<li class=\"navBarCell1Rev\">Module</li>");
checkOutput("module2-summary.html", true,
"<li class=\"navBarCell1Rev\">Module</li>");
- checkOutput("testpkgmdl1/package-summary.html", true,
- "<li><a href=\"../module1-summary.html\">Module</a></li>");
- checkOutput("testpkgmdl1/TestClassInModule1.html", true,
- "<li><a href=\"../module1-summary.html\">Module</a></li>");
checkOutput("testpkgmdl1/class-use/TestClassInModule1.html", true,
"<li><a href=\"../../module1-summary.html\">Module</a></li>");
checkOutput("testpkgmdl2/package-summary.html", true,
@@ -224,7 +268,7 @@
"<li><a href=\"../../module2-summary.html\">Module</a></li>");
}
- void testNoModuleLink() {
+ void checkNoModuleLink() {
checkOutput("testpkgnomodule/package-summary.html", true,
"<ul class=\"navList\" title=\"Navigation\">\n"
+ "<li><a href=\"../testpkgnomodule/package-summary.html\">Package</a></li>");
@@ -236,7 +280,7 @@
+ "<li><a href=\"../../testpkgnomodule/package-summary.html\">Package</a></li>");
}
- void testModuleTags() {
+ void checkModuleTags() {
checkOutput("moduletags-summary.html", true,
"Type Link: <a href=\"testpkgmdltags/TestClassInModuleTags.html\" title=\"class in "
+ "testpkgmdltags\"><code>TestClassInModuleTags</code></a>.");
@@ -270,7 +314,7 @@
+ "<dd>Just a simple module tag.</dd>");
}
- void testOverviewSummaryModules() {
+ void checkOverviewSummaryModules() {
checkOutput("overview-summary.html", true,
"<table class=\"overviewSummary\" summary=\"Module Summary table, listing modules, and an explanation\">\n"
+ "<caption><span>Modules</span><span class=\"tabEnd\"> </span></caption>\n"
@@ -287,7 +331,7 @@
+ "</tr>");
}
- void testOverviewSummaryPackages() {
+ void checkOverviewSummaryPackages() {
checkOutput("overview-summary.html", false,
"<table class=\"overviewSummary\" summary=\"Module Summary table, listing modules, and an explanation\">\n"
+ "<caption><span>Modules</span><span class=\"tabEnd\"> </span></caption>\n"
@@ -304,7 +348,7 @@
+ "</tr>");
}
- void testHtml5OverviewSummaryModules() {
+ void checkHtml5OverviewSummaryModules() {
checkOutput("overview-summary.html", true,
"<table class=\"overviewSummary\">\n"
+ "<caption><span>Modules</span><span class=\"tabEnd\"> </span></caption>\n"
@@ -321,7 +365,7 @@
+ "</tr>");
}
- void testHtml5OverviewSummaryPackages() {
+ void checkHtml5OverviewSummaryPackages() {
checkOutput("overview-summary.html", false,
"<table class=\"overviewSummary\">\n"
+ "<caption><span>Modules</span><span class=\"tabEnd\"> </span></caption>\n"
@@ -338,7 +382,7 @@
+ "</tr>");
}
- void testModuleSummary() {
+ void checkModuleSummary() {
checkOutput("module1-summary.html", true,
"<ul class=\"subNavList\">\n"
+ "<li>Module: </li>\n"
@@ -380,7 +424,8 @@
+ "</a>");
checkOutput("module2-summary.html", true,
"<tr class=\"rowColor\">\n"
- + "<td class=\"colFirst\">testpkg2mdl2</td>\n"
+ + "<td class=\"colFirst\"><a href=\"testpkg2mdl2/package-summary.html\">"
+ + "testpkg2mdl2</a></td>\n"
+ "<td class=\"colSecond\">module1</td>\n"
+ "<td class=\"colLast\"> </td>\n"
+ "</tr>");
@@ -407,9 +452,10 @@
+ "</tr>");
checkOutput("module2-summary.html", true,
"<tr class=\"altColor\">\n"
- + "<td class=\"colFirst\">testpkg2mdl2.TestInterfaceInModule2<br>(<span "
- + "class=\"implementationLabel\">Implementation:</span> <a "
- + "href=\"testpkgmdl2/TestClassInModule2.html\" title=\"class in testpkgmdl2\">"
+ + "<td class=\"colFirst\"><a href=\"testpkg2mdl2/TestInterfaceInModule2.html\" "
+ + "title=\"interface in testpkg2mdl2\">TestInterfaceInModule2</a><br>"
+ + "(<span class=\"implementationLabel\">Implementation:</span> "
+ + "<a href=\"testpkgmdl2/TestClassInModule2.html\" title=\"class in testpkgmdl2\">"
+ "TestClassInModule2</a>)</td>\n"
+ "<td class=\"colLast\"> </td>\n"
+ "</tr");
@@ -440,7 +486,7 @@
+ "</tr>");
}
- void testNegatedModuleSummary() {
+ void checkNegatedModuleSummary() {
checkOutput("module1-summary.html", false,
"<!-- ============ SERVICES SUMMARY =========== -->\n"
+ "<a name=\"services.summary\">\n"
@@ -448,7 +494,7 @@
+ "</a>");
}
- void testModuleClickThroughLinks() {
+ void checkModuleClickThroughLinks() {
checkOutput("module-overview-frame.html", true,
"<li><a href=\"module1-frame.html\" target=\"packageListFrame\" "
+ "onclick=\"updateModuleFrame('module1-type-frame.html','module1-summary.html');"
@@ -458,16 +504,56 @@
+ "onclick=\"updateModuleFrame('module2-type-frame.html','module2-summary.html');"
+ "\">module2</a></li>");
checkOutput("script.js", true,
- "function updateModuleFrame(pFrame, cFrame)\n"
- + "{\n"
- + " top.packageFrame.location = pFrame;\n"
- + " top.classFrame.location = cFrame;\n"
- + "}");
-}
+ "function updateModuleFrame(pFrame, cFrame)\n"
+ + "{\n"
+ + " top.packageFrame.location = pFrame;\n"
+ + " top.classFrame.location = cFrame;\n"
+ + "}");
+ }
- void testModuleClickThrough(boolean found) {
+ void checkModuleClickThrough(boolean found) {
checkFiles(found,
"module1-type-frame.html",
"module2-type-frame.html");
- }
+ }
+
+ void checkModuleFilesAndLinks(boolean found) {
+ checkOutput("testpkgmdl1/package-summary.html", found,
+ "<li><a href=\"../module1-summary.html\">Module</a></li>");
+ checkOutput("testpkgmdl1/package-summary.html", found,
+ "<div class=\"subTitle\"><span class=\"moduleLabelInClass\">Module</span> "
+ + "<a href=\"../module1-summary.html\">module1</a></div>");
+ checkOutput("testpkgmdl1/TestClassInModule1.html", found,
+ "<li><a href=\"../module1-summary.html\">Module</a></li>");
+ checkOutput("testpkgmdl1/TestClassInModule1.html", found,
+ "<div class=\"subTitle\"><span class=\"moduleLabelInClass\">Module</span> "
+ + "<a href=\"../module1-summary.html\">module1</a></div>");
+ checkFiles(found,
+ "module1-frame.html",
+ "module1-summary.html",
+ "module-overview-frame.html");
+ }
+
+ void checkModulesInSearch(boolean found) {
+ checkOutput("index-all.html", found,
+ "<dl>\n"
+ + "<dt><a href=\"module1-summary.html\">module1</a> - module module1</dt>\n"
+ + "<dd>\n"
+ + "<div class=\"block\">This is a test description for the module1 module.</div>\n"
+ + "</dd>\n"
+ + "<dt><a href=\"module2-summary.html\">module2</a> - module module2</dt>\n"
+ + "<dd>\n"
+ + "<div class=\"block\">This is a test description for the module2 module.</div>\n"
+ + "</dd>\n"
+ + "</dl>");
+ checkOutput("index-all.html", found,
+ "<dl>\n"
+ + "<dt><span class=\"searchTagLink\"><a href=\"module1-summary.html#searchphrase\">"
+ + "search phrase</a></span> - Search tag in module1</dt>\n"
+ + "<dd>with description</dd>\n"
+ + "<dt><span class=\"searchTagLink\"><a href=\"module2-summary.html#search_word\">"
+ + "search_word</a></span> - Search tag in module2</dt>\n"
+ + "<dd> </dd>\n"
+ + "</dl>");
}
+}
--- a/langtools/test/jdk/javadoc/doclet/testModules/module1/module-info.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/javadoc/doclet/testModules/module1/module-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -24,7 +24,7 @@
*/
/**
- * This is a test description for the module1 module.
+ * This is a test description for the module1 module. Search phrase {@index "search phrase" with description}.
*/
module module1 {
requires module2;
--- a/langtools/test/jdk/javadoc/doclet/testModules/module2/module-info.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/javadoc/doclet/testModules/module2/module-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -24,7 +24,7 @@
*/
/**
- * This is a test description for the module2 module.
+ * This is a test description for the module2 module. Search word {@index search_word} with no description.
*/
module module2 {
exports testpkgmdl2;
--- a/langtools/test/jdk/javadoc/doclet/testNewLanguageFeatures/TestNewLanguageFeatures.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/javadoc/doclet/testNewLanguageFeatures/TestNewLanguageFeatures.java Fri Aug 26 10:14:15 2016 -0700
@@ -186,22 +186,22 @@
checkOutput("pkg/TypeParameters.html", true,
"<dl>\n"
+ "<dt>All Implemented Interfaces:</dt>\n"
- + "<dd><a href=\"../pkg/SubInterface.html\" title=\"interface in pkg\">"
- + "SubInterface</a><E>, <a href=\"../pkg/SuperInterface.html\" "
- + "title=\"interface in pkg\">SuperInterface</a><E></dd>\n"
+ + "<dd><code><a href=\"../pkg/SubInterface.html\" title=\"interface in pkg\">"
+ + "SubInterface</a><E></code>, <code><a href=\"../pkg/SuperInterface.html\" "
+ + "title=\"interface in pkg\">SuperInterface</a><E></code></dd>\n"
+ "</dl>");
checkOutput("pkg/SuperInterface.html", true,
"<dl>\n"
+ "<dt>All Known Subinterfaces:</dt>\n"
- + "<dd><a href=\"../pkg/SubInterface.html\" title=\"interface in pkg\">"
- + "SubInterface</a><V></dd>\n"
+ + "<dd><code><a href=\"../pkg/SubInterface.html\" title=\"interface in pkg\">"
+ + "SubInterface</a><V></code></dd>\n"
+ "</dl>");
checkOutput("pkg/SubInterface.html", true,
"<dl>\n"
+ "<dt>All Superinterfaces:</dt>\n"
- + "<dd><a href=\"../pkg/SuperInterface.html\" title=\"interface in pkg\">"
- + "SuperInterface</a><V></dd>\n"
+ + "<dd><code><a href=\"../pkg/SuperInterface.html\" title=\"interface in pkg\">"
+ + "SuperInterface</a><V></code></dd>\n"
+ "</dl>");
//==============================================================
--- a/langtools/test/jdk/javadoc/doclet/testOrdering/TestOrdering.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/javadoc/doclet/testOrdering/TestOrdering.java Fri Aug 26 10:14:15 2016 -0700
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8039410 8042601 8042829 8049393 8050031 8155061
+ * @bug 8039410 8042601 8042829 8049393 8050031 8155061 8155995
* @summary test to determine if members are ordered correctly
* @author ksrini
* @library ../lib/
@@ -179,10 +179,27 @@
"something()</a></span> - Method in class a.<a href=\"a/something.html\"",
"something()</a></span> - Method in class something.<a href=\"something/J.html\""
};
+
String[] composeTestVectors() {
List<String> testList = new ArrayList<>();
testList.addAll(Arrays.asList(expectedPackageOrdering));
+ for (String x : expectedEnumOrdering) {
+ testList.add(x.replace("REPLACE_ME", "<Unnamed>"));
+ for (int i = 0; i < MAX_PACKAGES; i++) {
+ String wpkg = "add" + i;
+ testList.add(wpkg + "/" + x.replace("REPLACE_ME",
+ wpkg));
+ String dpkg = wpkg;
+ for (int j = 1; j < MAX_SUBPACKAGES_DEPTH; j++) {
+ dpkg = dpkg + "/" + "add";
+ testList.add(dpkg + "/" + x.replace("REPLACE_ME",
+ pathToPackage(dpkg)));
+ }
+ }
+ }
+
+ testList.addAll(Arrays.asList(expectedFieldOrdering));
for (String x : expectedMethodOrdering) {
testList.add(x);
@@ -197,21 +214,6 @@
}
}
- for (String x : expectedEnumOrdering) {
- testList.add(x.replace("REPLACE_ME", "<Unnamed>"));
- for (int i = 0; i < MAX_PACKAGES; i++) {
- String wpkg = "add" + i;
- testList.add(wpkg + "/" + x.replace("REPLACE_ME", wpkg));
- String dpkg = wpkg;
- for (int j = 1; j < MAX_SUBPACKAGES_DEPTH; j++) {
- dpkg = dpkg + "/" + "add";
- testList.add(dpkg + "/" + x.replace("REPLACE_ME", pathToPackage(dpkg)));
- }
- }
- }
-
- testList.addAll(Arrays.asList(expectedFieldOrdering));
-
return testList.toArray(new String[testList.size()]);
}
--- a/langtools/test/jdk/javadoc/doclet/testPrivateClasses/TestPrivateClasses.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/javadoc/doclet/testPrivateClasses/TestPrivateClasses.java Fri Aug 26 10:14:15 2016 -0700
@@ -77,8 +77,8 @@
"<pre>public void methodInheritedFromParent(int p1)",
"<dl>\n"
+ "<dt>All Implemented Interfaces:</dt>\n"
- + "<dd><a href=\"../pkg/PublicInterface.html\" title=\"interface in pkg\">"
- + "PublicInterface</a></dd>\n"
+ + "<dd><code><a href=\"../pkg/PublicInterface.html\" title=\"interface in pkg\">"
+ + "PublicInterface</a></code></dd>\n"
+ "</dl>");
checkOutput("pkg/PublicChild.html", false,
@@ -115,8 +115,8 @@
//Make sure implemented interfaces from private superclass are inherited
"<dl>\n"
+ "<dt>All Known Implementing Classes:</dt>\n"
- + "<dd><a href=\"../pkg/PublicChild.html\" title=\"class in pkg\">"
- + "PublicChild</a></dd>\n"
+ + "<dd><code><a href=\"../pkg/PublicChild.html\" title=\"class in pkg\">"
+ + "PublicChild</a></code></dd>\n"
+ "</dl>");
checkOutput("pkg/PublicInterface.html", false,
@@ -178,10 +178,10 @@
"extends",
"<dl>\n"
+ "<dt>All Implemented Interfaces:</dt>\n"
- + "<dd><a href=\"../pkg/PrivateInterface.html\" title=\"interface in pkg\">"
- + "PrivateInterface</a>, "
- + "<a href=\"../pkg/PublicInterface.html\" title=\"interface in pkg\">"
- + "PublicInterface</a></dd>\n"
+ + "<dd><code><a href=\"../pkg/PrivateInterface.html\" title=\"interface in pkg\">"
+ + "PrivateInterface</a></code>, "
+ + "<code><a href=\"../pkg/PublicInterface.html\" title=\"interface in pkg\">"
+ + "PublicInterface</a></code></dd>\n"
+ "</dl>",
"<pre>public class <span class=\"typeNameLabel\">PublicChild</span>");
@@ -202,10 +202,10 @@
//Make sure implemented interfaces from private superclass are inherited
"<dl>\n"
+ "<dt>All Known Implementing Classes:</dt>\n"
- + "<dd><a href=\"../pkg/PrivateParent.html\" title=\"class in pkg\">"
- + "PrivateParent</a>, "
- + "<a href=\"../pkg/PublicChild.html\" title=\"class in pkg\">PublicChild"
- + "</a></dd>\n"
+ + "<dd><code><a href=\"../pkg/PrivateParent.html\" title=\"class in pkg\">"
+ + "PrivateParent</a></code>, "
+ + "<code><a href=\"../pkg/PublicChild.html\" title=\"class in pkg\">PublicChild"
+ + "</a></code></dd>\n"
+ "</dl>");
checkOutput("pkg/PrivateInterface.html", true,
--- a/langtools/test/jdk/javadoc/tool/6227454/Test.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/javadoc/tool/6227454/Test.java Fri Aug 26 10:14:15 2016 -0700
@@ -140,9 +140,9 @@
public boolean run(DocletEnvironment root) {
DocTrees docTrees = root.getDocTrees();
- System.out.println("classes:" + root.getIncludedClasses());
+ System.out.println("classes:" + root.getIncludedTypeElements());
- Element klass = root.getIncludedClasses().iterator().next();
+ Element klass = root.getIncludedTypeElements().iterator().next();
String text = "";
try {
DocCommentTree dcTree = docTrees.getDocCommentTree(klass, overviewpath);
--- a/langtools/test/jdk/javadoc/tool/BreakIteratorWarning.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/javadoc/tool/BreakIteratorWarning.java Fri Aug 26 10:14:15 2016 -0700
@@ -75,7 +75,7 @@
}
public boolean run(DocletEnvironment root) {
- TypeElement cd = root.getIncludedClasses().iterator().next();
+ TypeElement cd = root.getIncludedTypeElements().iterator().next();
VariableElement fd = getFields(cd).get(0);
DocTrees docTrees = root.getDocTrees();
DocCommentTree docCommentTree = docTrees.getDocCommentTree(fd);
--- a/langtools/test/jdk/javadoc/tool/InlineTagsWithBraces.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/javadoc/tool/InlineTagsWithBraces.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -80,7 +80,7 @@
public boolean run(DocletEnvironment root) {
DocTrees trees = root.getDocTrees();
- TypeElement cd = root.getIncludedClasses().iterator().next();
+ TypeElement cd = root.getIncludedTypeElements().iterator().next();
DocCommentTree docCommentTree = trees.getDocCommentTree(cd);
List<? extends DocTree> tags = docCommentTree.getBody();
--- a/langtools/test/jdk/javadoc/tool/NoStar.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/javadoc/tool/NoStar.java Fri Aug 26 10:14:15 2016 -0700
@@ -62,7 +62,7 @@
}
public boolean run(DocletEnvironment root) {
- Set<TypeElement> classes = root.getIncludedClasses();
+ Set<TypeElement> classes = root.getIncludedTypeElements();
if (classes.size() != 1)
throw new Error("1 " + Arrays.asList(classes));
TypeElement self = classes.iterator().next();
--- a/langtools/test/jdk/javadoc/tool/T4994049/T4994049.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/javadoc/tool/T4994049/T4994049.java Fri Aug 26 10:14:15 2016 -0700
@@ -59,7 +59,7 @@
DocTrees trees = root.getDocTrees();
SourcePositions sourcePositions = trees.getSourcePositions();
- for (TypeElement klass : root.getIncludedClasses()) {
+ for (TypeElement klass : root.getIncludedTypeElements()) {
for (ExecutableElement method : getMethods(klass)) {
if (method.getSimpleName().toString().equals("tabbedMethod")) {
TreePath path = trees.getPath(method);
--- a/langtools/test/jdk/javadoc/tool/completionFailure/CompletionFailure.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/javadoc/tool/completionFailure/CompletionFailure.java Fri Aug 26 10:14:15 2016 -0700
@@ -54,7 +54,7 @@
}
public boolean run(DocletEnvironment root) {
- Set<TypeElement> classes = root.getIncludedClasses();
+ Set<TypeElement> classes = root.getIncludedTypeElements();
if (classes.size() != 1)
throw new Error("1 " + Arrays.asList(classes));
return true;
--- a/langtools/test/jdk/javadoc/tool/dupOk/DupOk.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/javadoc/tool/dupOk/DupOk.java Fri Aug 26 10:14:15 2016 -0700
@@ -48,7 +48,6 @@
String path1 = new File(srcFile, "sp1").getPath();
String path2 = new File(srcFile, "sp2").getPath();
String[] aargs = {
- "javadoc",
"-docletpath",
new File(System.getProperty("test.classes", ".")).getPath(),
"-doclet",
@@ -63,7 +62,7 @@
}
public boolean run(DocletEnvironment root) {
- Set<TypeElement> classes = root.getIncludedClasses();
+ Set<TypeElement> classes = root.getIncludedTypeElements();
if (classes.size() != 2)
throw new Error("1 " + Arrays.asList(classes));
for (TypeElement clazz : classes) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/jdk/javadoc/tool/modules/FilterOptions.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,429 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8159305
+ * @summary Tests elements filtering options
+ * @modules
+ * jdk.javadoc/jdk.javadoc.internal.api
+ * jdk.javadoc/jdk.javadoc.internal.doclets.standard
+ * jdk.javadoc/jdk.javadoc.internal.tool
+ * jdk.compiler/com.sun.tools.javac.api
+ * jdk.compiler/com.sun.tools.javac.main
+ * @library /tools/lib
+ * @build toolbox.ToolBox toolbox.TestRunner
+ * @run main FilterOptions
+ */
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import toolbox.*;
+
+public class FilterOptions extends ModuleTestBase {
+
+ private static final String NL = System.getProperty("line.separator");
+ private static final String INDENT = " ";
+
+ // the sources are shared, so create it once
+ private final String src;
+
+ public static void main(String... args) throws Exception {
+ new FilterOptions().runTests();
+ }
+
+ FilterOptions() throws IOException {
+ this.src = createSources(Paths.get(".").resolve("src"));
+ }
+
+ @Test
+ public void testDefault(Path base) throws Exception {
+ execTask("-modulesourcepath", src, "--module", "m1");
+
+ checkModulesSpecified("m1");
+ checkModulesIncluded("m1");
+ checkPackagesIncluded("pub");
+ checkTypesIncluded("pub.A", "pub.A.ProtectedNested", "pub.A.PublicNested");
+ }
+
+ @Test
+ public void testModuleModeApi(Path base) throws Exception {
+ execTask("-modulesourcepath", src,
+ "--module", "m1", "--show-module-contents:api");
+
+ checkModuleMode("API");
+ }
+
+ @Test
+ public void testModuleModeAll(Path base) throws Exception {
+ execTask("-modulesourcepath", src,
+ "--module", "m1", "--show-module-contents:all");
+
+ checkModuleMode("ALL");
+ }
+
+ @Test
+ public void testShowPackagesExported(Path base) throws Exception {
+ execTask("-modulesourcepath", src,
+ "--module", "m1",
+ "--show-packages:exported"); // default
+
+ checkModulesSpecified("m1");
+ checkModulesIncluded("m1");
+ checkPackagesIncluded("pub");
+ checkTypesIncluded("pub.A", "pub.A.ProtectedNested", "pub.A.PublicNested");
+ }
+
+ @Test
+ public void testShowPackagesAll(Path base) throws Exception {
+ execTask("-modulesourcepath", src,
+ "--module", "m1",
+ "--show-packages:all");
+ checkModulesSpecified("m1");
+ checkModulesIncluded("m1");
+ checkPackagesIncluded("pub", "pro");
+
+ checkTypesIncluded("pub.A", "pub.A.ProtectedNested", "pub.A.PublicNested",
+ "pro.A", "pro.A.ProtectedNested", "pro.A.PublicNested");
+ }
+
+ @Test
+ public void testShowTypesPrivate(Path base) throws Exception {
+ execTask("-modulesourcepath", src,
+ "--module", "m1",
+ "--show-types:private");
+
+ checkModulesSpecified("m1");
+ checkModulesIncluded("m1");
+ checkPackagesIncluded("pub");
+
+ checkTypesIncluded("pub.A", "pub.A.PrivateNested", "pub.A.Nested", "pub.A.ProtectedNested",
+ "pub.A.PublicNested",
+ "pub.B", "pub.B.PrivateNested", "pub.B.Nested", "pub.B.ProtectedNested",
+ "pub.B.PublicNested");
+
+ }
+
+ @Test
+ public void testShowTypesPackage(Path base) throws Exception {
+ execTask("-modulesourcepath", src,
+ "--module", "m1",
+ "--show-types:package");
+
+ checkModulesSpecified("m1");
+ checkModulesIncluded("m1");
+ checkPackagesIncluded("pub");
+
+ checkTypesIncluded("pub.A", "pub.A.Nested", "pub.A.ProtectedNested", "pub.A.PublicNested",
+ "pub.B", "pub.B.Nested", "pub.B.ProtectedNested", "pub.B.PublicNested");
+
+ checkTypesNotIncluded(".*private.*");
+ }
+
+ @Test
+ public void testShowTypesProtected(Path base) throws Exception {
+ execTask("-modulesourcepath", src,
+ "--module", "m1",
+ "--show-types:protected");
+
+ checkModulesSpecified("m1");
+ checkModulesIncluded("m1");
+ checkPackagesIncluded("pub");
+
+ checkTypesIncluded("pub.A", "pub.A.ProtectedNested", "pub.A.PublicNested");
+
+ checkTypesNotIncluded("pub.A.Nested", "pub.A.PrivateNested", "pub.B.Nested",
+ "pub.B.PrivateNested", "pub.B.ProtectedNested",
+ "pub.B.PublicNested");
+ }
+
+ @Test
+ public void testShowTypesPublic(Path base) throws Exception {
+ execTask("-modulesourcepath", src,
+ "--module", "m1",
+ "--show-types:public");
+
+ checkModulesSpecified("m1");
+ checkModulesIncluded("m1");
+ checkPackagesIncluded("pub");
+
+ checkTypesIncluded("pub.A", "pub.A.PublicNested");
+ checkTypesNotIncluded("pub.A.Nested",
+ "pub.A.ProtectedNested", "pub.A.PrivateNested",
+ "pub.B.Nested", "pub.B.ProtectedNested", "pub.B.PrivateNested",
+ "pub.B.PublicNested");
+ }
+
+ @Test
+ public void testShowMembersPrivate(Path base) throws Exception {
+ execTask("-modulesourcepath", src,
+ "--module", "m1",
+ "--show-members:private");
+
+ checkMembers(Visibility.PRIVATE);
+ }
+
+ @Test
+ public void testShowMembersPackage(Path base) throws Exception {
+ execTask("-modulesourcepath", src,
+ "--module", "m1",
+ "--show-members:package");
+
+ checkMembers(Visibility.PACKAGE);
+ }
+
+ @Test
+ public void testShowMembersProtected(Path base) throws Exception {
+ execTask("-modulesourcepath", src,
+ "--module", "m1",
+ "--show-members:protected");
+
+ checkMembers(Visibility.PROTECTED);
+ }
+
+ @Test
+ public void testShowMembersPublic(Path base) throws Exception {
+ execTask("-modulesourcepath", src,
+ "--module", "m1",
+ "--show-members:public");
+
+ checkMembers(Visibility.PUBLIC);
+ }
+
+ @Test
+ public void testLegacyPublic(Path base) throws Exception {
+ execTask("-modulesourcepath", src,
+ "--module", "m1",
+ "-public");
+
+ checkModuleMode("API");
+ checkModulesSpecified("m1");
+ checkModulesIncluded("m1");
+ checkPackagesIncluded("pub");
+ checkTypesIncluded("pub.A", "pub.A.PublicNested");
+
+ checkMembers(Visibility.PUBLIC);
+ }
+
+ @Test
+ public void testLegacyDefault(Path base) throws Exception {
+ execTask("-modulesourcepath", src,
+ "--module", "m1");
+
+ checkModuleMode("API");
+ checkModulesSpecified("m1");
+ checkModulesIncluded("m1");
+ checkPackagesIncluded("pub");
+ checkTypesIncluded("pub.A", "pub.A.ProtectedNested", "pub.A.PublicNested");
+
+ checkMembers(Visibility.PROTECTED);
+ }
+
+ @Test
+ public void testLegacyProtected(Path base) throws Exception {
+ execTask("-modulesourcepath", src,
+ "--module", "m1",
+ "-protected");
+
+ checkModuleMode("API");
+ checkModulesSpecified("m1");
+ checkModulesIncluded("m1");
+ checkPackagesIncluded("pub");
+ checkTypesIncluded("pub.A", "pub.A.ProtectedNested", "pub.A.PublicNested");
+
+ checkMembers(Visibility.PROTECTED);
+ }
+
+ @Test
+ public void testLegacyPackage(Path base) throws Exception {
+ execTask("-modulesourcepath", src,
+ "--module", "m1",
+ "-package");
+
+ checkModuleMode("ALL");
+ checkModulesSpecified("m1");
+ checkModulesIncluded("m1");
+ checkPackagesIncluded("pub");
+ checkPackagesIncluded("pro");
+ checkTypesIncluded("pub.B", "pub.B.Nested", "pub.B.ProtectedNested", "pub.B.PublicNested",
+ "pub.A", "pub.A.Nested", "pub.A.ProtectedNested", "pub.A.PublicNested",
+ "pro.B", "pro.B.Nested", "pro.B.ProtectedNested", "pro.B.PublicNested",
+ "pro.A", "pro.A.Nested", "pro.A.ProtectedNested", "pro.A.PublicNested");
+
+ checkMembers(Visibility.PACKAGE);
+ }
+
+ @Test
+ public void testLegacyPrivate(Path base) throws Exception {
+ execTask("-modulesourcepath", src,
+ "--module", "m1",
+ "-private");
+
+ checkModuleMode("ALL");
+ checkModulesSpecified("m1");
+ checkModulesIncluded("m1");
+ checkPackagesIncluded("pub");
+ checkPackagesIncluded("pro");
+ checkTypesIncluded("pub.B", "pub.B.PrivateNested", "pub.B.Nested", "pub.B.ProtectedNested",
+ "pub.B.PublicNested",
+ "pub.A", "pub.A.PrivateNested", "pub.A.Nested", "pub.A.ProtectedNested",
+ "pub.A.PublicNested",
+ "pro.B", "pro.B.PrivateNested", "pro.B.Nested", "pro.B.ProtectedNested",
+ "pro.B.PublicNested",
+ "pro.A", "pro.A.PrivateNested", "pro.A.Nested", "pro.A.ProtectedNested",
+ "pro.A.PublicNested");
+
+ checkMembers(Visibility.PRIVATE);
+ }
+
+ private static enum Visibility {
+ PRIVATE, PACKAGE, PROTECTED, PUBLIC;
+ }
+
+ void checkMembers(Visibility v) throws Exception {
+ checkMembersPresence(v);
+ checkMembersAbsence(v);
+ }
+
+ void checkMembersPresence(Visibility v) throws Exception {
+ switch (v) {
+ case PRIVATE:
+ checkMembersSelected("pub.A.privateFieldA",
+ "pub.A.PublicNested.privateFieldPublicNested",
+ "pub.A.ProtectedNested.privateFieldProtectedNested");
+
+ case PACKAGE:
+ checkMembersSelected("pub.A.FieldA",
+ "pub.A.PublicNested.FieldPublicNested",
+ "pub.A.ProtectedNested.FieldProtectedNested");
+
+ case PROTECTED:
+ checkMembersSelected("pub.A.<init>",
+ "pub.A.protectedFieldA",
+ "pub.A.PublicNested.protectedFieldPublicNested",
+ "pub.A.ProtectedNested.<init>",
+ "pub.A.ProtectedNested.protectedFieldProtectedNested",
+ "pub.A.ProtectedNested.publicFieldProtectedNested");
+
+ case PUBLIC:
+ checkMembersSelected("pub.A.publicFieldA",
+ "pub.A.PublicNested.<init>",
+ "pub.A.PublicNested.publicFieldPublicNested");
+
+ break;
+ }
+ }
+
+ void checkMembersAbsence(Visibility v) throws Exception {
+ switch (v) {
+ case PUBLIC:
+ checkMembersNotSelected("pub.A.protectedFieldA",
+ "pub.A.PublicNested.protectedFieldPublicNested",
+ "pub.A.ProtectedNested.<init>",
+ "pub.A.ProtectedNested.protectedFieldProtectedNested");
+
+ case PROTECTED:
+ checkMembersNotSelected("pub.A.FieldA",
+ "pub.A.PublicNested.FieldPublicNested",
+ "pub.A.ProtectedNested.FieldProtectedNested");
+
+ case PACKAGE:
+ checkMembersNotSelected("pub.A.privateFieldA",
+ "pub.A.PublicNested.privateFieldPublicNested",
+ "pub.A.ProtectedNested.privateFieldProtectedNested");
+
+ case PRIVATE:
+ break;
+ }
+ }
+
+ String createSources(Path src) throws IOException {
+ ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");
+ mb1.comment("The first module.")
+ .classes(createClass("pub", "A", true))
+ .classes(createClass("pub", "B", false))
+ .classes(createClass("pro", "A", true))
+ .classes(createClass("pro", "B", false))
+ .exports("pub")
+ .write(src);
+ return src.toString();
+ }
+
+ String createClass(String pkg, String name, boolean isPublic) {
+ StringBuilder sb = new StringBuilder("package ")
+ .append(pkg)
+ .append("; ")
+ .append(NL);
+ sb.append(" /** Klass ")
+ .append(name)
+ .append(" */")
+ .append(NL);
+ sb.append(isPublic ? "public " : " ")
+ .append("class ")
+ .append(name)
+ .append(" {")
+ .append(NL);
+
+ sb.append(createMembers(INDENT, name));
+ sb.append(createNestedClass(INDENT, "PublicNested", name, "public"));
+ sb.append(createNestedClass(INDENT, "ProtectedNested", name, "protected"));
+ sb.append(createNestedClass(INDENT, "Nested", name, ""));
+ sb.append(createNestedClass(INDENT, "PrivateNested", name, "private"));
+
+ return sb.append("}").toString();
+ }
+
+ StringBuilder createNestedClass(String indent, String name, String enclosing, String visibility) {
+ return new StringBuilder()
+ .append(indent).append(" /** Klass ").append(name).append(" */").append(NL)
+ .append(indent).append(visibility).append(" class ").append(name).append(" {").append(NL)
+ .append(createMembers(indent + INDENT, name)).append(indent).append("}").append(NL);
+ }
+
+ StringBuilder createMembers(String indent, String enclosing) {
+ return new StringBuilder()
+ .append(indent).append(createMember(enclosing, "public"))
+ .append(indent).append(createMember(enclosing, "protected"))
+ .append(indent).append(createMember(enclosing, ""))
+ .append(indent).append(createMember(enclosing, "private"))
+ .append(NL);
+ }
+
+ StringBuilder createMember(String enclosingClass, String visibility) {
+ return new StringBuilder()
+ .append("/** a ")
+ .append(visibility)
+ .append("Field in ")
+ .append(enclosingClass)
+ .append(" */ ")
+ .append(visibility)
+ .append(" String ")
+ .append(visibility)
+ .append("Field")
+ .append(enclosingClass)
+ .append(";")
+ .append(NL);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/jdk/javadoc/tool/modules/ModuleTestBase.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,391 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import java.util.TreeSet;
+
+import javax.lang.model.SourceVersion;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.ElementKind;
+import javax.lang.model.element.ModuleElement;
+import javax.lang.model.element.PackageElement;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.util.ElementFilter;
+import javax.lang.model.util.SimpleElementVisitor9;
+
+import jdk.javadoc.doclet.Doclet;
+import jdk.javadoc.doclet.DocletEnvironment;
+import jdk.javadoc.doclet.Reporter;
+
+import toolbox.JavadocTask;
+import toolbox.Task;
+import toolbox.Task.Expect;
+import toolbox.TestRunner;
+import toolbox.ToolBox;
+
+import static toolbox.Task.OutputKind.*;
+
+/**
+ * Base class for module tests.
+ */
+public class ModuleTestBase extends TestRunner {
+
+ // Field Separator
+ private static final String FS = " ";
+
+ protected ToolBox tb;
+ private final Class<?> docletClass;
+
+ private Task.Result currentTask = null;
+
+ ModuleTestBase() {
+ super(System.err);
+ tb = new ToolBox();
+ ClassLoader cl = ModuleTestBase.class.getClassLoader();
+ try {
+ docletClass = cl.loadClass("ModuleTestBase$ModulesTesterDoclet");
+ } catch (ClassNotFoundException cfe) {
+ throw new Error(cfe);
+ }
+ }
+
+ /**
+ * Execute methods annotated with @Test, and throw an exception if any
+ * errors are reported..
+ *
+ * @throws Exception if any errors occurred
+ */
+ protected void runTests() throws Exception {
+ runTests(m -> new Object[] { Paths.get(m.getName()) });
+ }
+
+ Task.Result execTask(String... args) {
+ return execTask0(false, args);
+ }
+
+ Task.Result execNegativeTask(String... args) {
+ return execTask0(true, args);
+ }
+
+ private Task.Result execTask0(boolean isNegative, String... args) {
+ JavadocTask et = new JavadocTask(tb, Task.Mode.API);
+ et.docletClass(docletClass);
+ //Arrays.asList(args).forEach((a -> System.err.println("arg: " + a)));
+ System.err.println(Arrays.asList(args));
+ currentTask = isNegative
+ ? et.options(args).run(Expect.FAIL)
+ : et.options(args).run();
+ return currentTask;
+ }
+
+ Path[] findHtmlFiles(Path... paths) throws IOException {
+ return tb.findFiles(".html", paths);
+ }
+
+ boolean grep(String regex, Path file) throws Exception {
+ List<String> lines = tb.readAllLines(file);
+ List<String> foundList = tb.grep(regex, lines);
+ return !foundList.isEmpty();
+ }
+
+ String normalize(String in) {
+ return in.replace('\\', '/');
+ }
+
+ void checkModulesSpecified(String... args) throws Exception {
+ for (String arg : args) {
+ checkDocletOutputPresent("Specified", ElementKind.MODULE, arg);
+ }
+ }
+
+ void checkPackagesSpecified(String... args) throws Exception {
+ for (String arg : args) {
+ checkDocletOutputPresent("Specified", ElementKind.PACKAGE, arg);
+ }
+ }
+
+ void checkTypesSpecified(String... args) throws Exception {
+ for (String arg : args) {
+ checkDocletOutputPresent("Specified", ElementKind.CLASS, arg);
+ }
+ }
+
+ void checkModulesIncluded(String... args) throws Exception {
+ for (String arg : args) {
+ checkDocletOutputPresent("Included", ElementKind.MODULE, arg);
+ }
+ }
+
+ void checkPackagesIncluded(String... args) throws Exception {
+ for (String arg : args) {
+ checkDocletOutputPresent("Included", ElementKind.PACKAGE, arg);
+ }
+ }
+
+ void checkTypesIncluded(String... args) throws Exception {
+ for (String arg : args) {
+ checkDocletOutputPresent("Included", ElementKind.CLASS, arg);
+ }
+ }
+
+ void checkMembersSelected(String... args) throws Exception {
+ for (String arg : args) {
+ checkDocletOutputPresent("Selected", ElementKind.METHOD, arg);
+ }
+ }
+
+ void checkModuleMode(String mode) throws Exception {
+ assertPresent("^ModuleMode" + FS + mode);
+ }
+
+ void checkStringPresent(String regex) throws Exception {
+ assertPresent(regex);
+ }
+
+ void checkDocletOutputPresent(String category, ElementKind kind, String regex) throws Exception {
+ assertPresent("^" + category + " " + kind.toString() + " " + regex);
+ }
+
+ void assertPresent(String regex) throws Exception {
+ assertPresent(regex, STDOUT);
+ }
+
+ void assertErrorPresent(String regex) throws Exception {
+ assertPresent(regex, Task.OutputKind.DIRECT);
+ }
+
+ void assertPresent(String regex, Task.OutputKind kind) throws Exception {
+ List<String> foundList = tb.grep(regex, currentTask.getOutputLines(kind));
+ if (foundList.isEmpty()) {
+ dumpDocletDiagnostics();
+ throw new Exception(regex + " not found in: " + kind);
+ }
+ }
+
+ void dumpDocletDiagnostics() {
+ for (Task.OutputKind kind : Task.OutputKind.values()) {
+ String output = currentTask.getOutput(kind);
+ if (output != null && !output.isEmpty()) {
+ System.err.println("<" + kind + ">");
+ System.err.println(output);
+ }
+ }
+ }
+
+ void checkModulesNotSpecified(String... args) throws Exception {
+ for (String arg : args) {
+ checkDocletOutputAbsent("Specified", ElementKind.MODULE, arg);
+ }
+ }
+
+ void checkPackagesNotSpecified(String... args) throws Exception {
+ for (String arg : args) {
+ checkDocletOutputAbsent("Specified", ElementKind.PACKAGE, arg);
+ }
+ }
+
+ void checkTypesNotSpecified(String... args) throws Exception {
+ for (String arg : args) {
+ checkDocletOutputAbsent("Specified", ElementKind.CLASS, arg);
+ }
+ }
+
+ void checkModulesNotIncluded(String... args) throws Exception {
+ for (String arg : args) {
+ checkDocletOutputAbsent("Included", ElementKind.MODULE, arg);
+ }
+ }
+
+ void checkPackagesNotIncluded(String... args) throws Exception {
+ for (String arg : args) {
+ checkDocletOutputAbsent("Included", ElementKind.PACKAGE, arg);
+ }
+ }
+
+ void checkTypesNotIncluded(String... args) throws Exception {
+ for (String arg : args) {
+ checkDocletOutputAbsent("Included", ElementKind.CLASS, arg);
+ }
+ }
+
+ void checkMembersNotSelected(String... args) throws Exception {
+ for (String arg : args) {
+ checkDocletOutputAbsent("Selected", ElementKind.METHOD, arg);
+ }
+ }
+
+ void checkStringAbsent(String regex) throws Exception {
+ assertAbsent(regex);
+ }
+
+ void checkDocletOutputAbsent(String category, ElementKind kind, String regex) throws Exception {
+ assertAbsent("^" + category + FS + kind.toString() + FS + regex);
+ }
+
+ void assertAbsent(String regex) throws Exception {
+ List<String> foundList = tb.grep(regex, currentTask.getOutputLines(STDOUT));
+ if (!foundList.isEmpty()) {
+ dumpDocletDiagnostics();
+ throw new Exception(regex + " found in: " + STDOUT);
+ }
+ }
+
+ public static class ModulesTesterDoclet implements Doclet {
+ StringWriter sw = new StringWriter();
+ PrintWriter ps = new PrintWriter(sw);
+
+ // csv style output, for simple regex verification
+ void printDataSet(String header, Set<? extends Element> set) {
+ for (Element e : set) {
+ ps.print(header);
+ new SimpleElementVisitor9<Void, Void>() {
+ @Override
+ public Void visitModule(ModuleElement e, Void p) {
+ ps.print(FS);
+ ps.print(e.getKind());
+ ps.print(FS);
+ ps.println(e.getQualifiedName());
+ return null;
+ }
+
+ @Override
+ public Void visitPackage(PackageElement e, Void p) {
+ ps.print(FS);
+ ps.print(e.getKind());
+ ps.print(FS);
+ ps.println(e.getQualifiedName());
+ return null;
+ }
+
+ @Override
+ public Void visitType(TypeElement e, Void p) {
+ ps.print(FS);
+ ps.print(ElementKind.CLASS);
+ ps.print(FS);
+ ps.println(e.getQualifiedName());
+ return null;
+ }
+
+ @Override
+ protected Void defaultAction(Element e, Void p) {
+ Element encl = e.getEnclosingElement();
+ CharSequence fqn = new SimpleElementVisitor9<CharSequence, Void>() {
+ @Override
+ public CharSequence visitModule(ModuleElement e, Void p) {
+ return e.getQualifiedName();
+ }
+
+ @Override
+ public CharSequence visitType(TypeElement e, Void p) {
+ return e.getQualifiedName();
+ }
+
+ @Override
+ public CharSequence visitPackage(PackageElement e, Void p) {
+ return e.getQualifiedName();
+ }
+
+ }.visit(encl);
+
+ ps.print(FS);
+ ps.print(ElementKind.METHOD); // always METHOD
+ ps.print(FS);
+ ps.print(fqn);
+ ps.print(".");
+ ps.println(e.getSimpleName());
+ return null;
+ }
+ }.visit(e);
+ }
+ }
+
+ @Override
+ public boolean run(DocletEnvironment docenv) {
+ ps.println("ModuleMode" + FS + docenv.getModuleMode());
+ printDataSet("Specified", docenv.getSpecifiedElements());
+ printDataSet("Included", docenv.getIncludedModuleElements());
+ printDataSet("Included", docenv.getIncludedPackageElements());
+ printDataSet("Included", docenv.getIncludedTypeElements());
+ printDataSet("Selected", getAllSelectedElements(docenv));
+ System.out.println(sw);
+ return true;
+ }
+
+ Set<Element> getAllSelectedElements(DocletEnvironment docenv) {
+ Set<Element> result = new TreeSet<Element>((Element e1, Element e2) -> {
+ // some grouping by kind preferred
+ int rc = e1.getKind().compareTo(e2.getKind());
+ if (rc != 0) return rc;
+ rc = e1.toString().compareTo(e2.toString());
+ if (rc != 0) return rc;
+ return Integer.compare(e1.hashCode(), e2.hashCode());
+ });
+ for (ModuleElement me : docenv.getIncludedModuleElements()) {
+ addEnclosedElements(docenv, result, me);
+ }
+ for (PackageElement pe : docenv.getIncludedPackageElements()) {
+ addEnclosedElements(docenv, result, docenv.getElementUtils().getModuleOf(pe));
+ addEnclosedElements(docenv, result, pe);
+ }
+ for (TypeElement te : docenv.getIncludedTypeElements()) {
+ addEnclosedElements(docenv, result, te);
+ }
+ return result;
+ }
+
+ void addEnclosedElements(DocletEnvironment docenv, Set<Element> result, Element e) {
+ List<? extends Element> elems = docenv.getSelectedElements(e.getEnclosedElements());
+ result.addAll(elems);
+ for (TypeElement t : ElementFilter.typesIn(elems)) {
+ addEnclosedElements(docenv, result, t);
+ }
+ }
+
+ @Override
+ public Set<Doclet.Option> getSupportedOptions() {
+ return Collections.emptySet();
+ }
+
+ @Override
+ public void init(Locale locale, Reporter reporter) {}
+
+ @Override
+ public String getName() {
+ return "ModulesTesterDoclet";
+ }
+
+ @Override
+ public SourceVersion getSupportedSourceVersion() {
+ return SourceVersion.latest();
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/jdk/javadoc/tool/modules/Modules.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,311 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8159305
+ * @summary Tests primarily the module graph computations.
+ * @modules
+ * jdk.javadoc/jdk.javadoc.internal.api
+ * jdk.javadoc/jdk.javadoc.internal.doclets.standard
+ * jdk.javadoc/jdk.javadoc.internal.tool
+ * jdk.compiler/com.sun.tools.javac.api
+ * jdk.compiler/com.sun.tools.javac.main
+ * @library /tools/lib
+ * @build toolbox.ToolBox toolbox.TestRunner
+ * @run main Modules
+ */
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import toolbox.*;
+
+public class Modules extends ModuleTestBase {
+
+ public static void main(String... args) throws Exception {
+ new Modules().runTests();
+ }
+
+ @Test
+ public void testBasicMoption(Path base) throws Exception {
+ Files.createDirectory(base);
+ Path src = base.resolve("src");
+ ModuleBuilder mb = new ModuleBuilder(tb, "m1");
+ mb.comment("The first module.")
+ .exports("pub")
+ .classes("package pub; /** Klass A */ public class A {}")
+ .classes("package pro; /** Klass B */ public class B {}")
+ .write(src);
+ execTask("-modulesourcepath", src.toString(),
+ "--module", "m1");
+ checkModulesSpecified("m1");
+ checkPackagesIncluded("pub");
+ checkTypesIncluded("pub.A");
+ }
+
+ @Test
+ public void testMultipleModulesOption1(Path base) throws Exception {
+ Path src = base.resolve("src");
+
+ ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");
+ mb1.comment("The first module.")
+ .exports("m1pub")
+ .requires("m2")
+ .classes("package m1pub; /** Klass A */ public class A {}")
+ .classes("package m1pro; /** Klass B */ public class B {}")
+ .write(src);
+
+ ModuleBuilder mb2 = new ModuleBuilder(tb, "m2");
+ mb2.comment("The second module.")
+ .exports("m2pub")
+ .classes("package m2pub; /** Klass A */ public class A {}")
+ .classes("package m2pro; /** Klass B */ public class B {}")
+ .write(src);
+ execTask("-modulesourcepath", src.toString(),
+ "--module", "m1,m2");
+ checkModulesSpecified("m1", "m2");
+ checkPackagesIncluded("m1pub", "m2pub");
+ checkTypesIncluded("m1pub.A", "m2pub.A");
+
+ }
+
+ @Test
+ public void testMultipleModulesAggregatedModuleOption(Path base) throws Exception {
+ Path src = base.resolve("src");
+
+ ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");
+ mb1.comment("The first module.")
+ .exports("m1pub")
+ .requires("m2")
+ .classes("package m1pub; /** Klass A */ public class A {}")
+ .classes("package m1pro; /** Klass B */ public class B {}")
+ .write(src);
+
+ ModuleBuilder mb2 = new ModuleBuilder(tb, "m2");
+ mb2.comment("The second module.")
+ .exports("m2pub")
+ .classes("package m2pub; /** Klass A */ public class A {}")
+ .classes("package m2pro; /** Klass B */ public class B {}")
+ .write(src);
+ execTask("-modulesourcepath", src.toString(),
+ "--module", "m1",
+ "--module", "m2");
+ checkModulesSpecified("m1", "m2");
+ checkPackagesIncluded("m1pub", "m2pub");
+ checkTypesIncluded("m1pub.A", "m2pub.A");
+
+ }
+
+ /**
+ * Tests diamond graph, inspired by javac diamond tests.
+ *
+ *
+ * Module M : test module, with variable requires
+ *
+ * Module N :
+ * requires public O ---> Module O:
+ * requires J ----> Module J:
+ * exports openO exports openJ
+ *
+ *
+ * Module L :
+ * requires public P ---> Module P:
+ * exports openP
+ *
+ *
+ */
+
+ @Test
+ public void testExpandRequiresNone(Path base) throws Exception {
+ Path src = base.resolve("src");
+
+ createAuxiliaryModules(src);
+
+ new ModuleBuilder(tb, "M")
+ .comment("The M module.")
+ .requires("N", src)
+ .requires("L", src)
+ .requires("O", src)
+ .exports("p")
+ .classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")
+ .write(src);
+
+ execTask("-modulesourcepath", src.toString(),
+ "--module", "M");
+
+ checkModulesSpecified("M");
+ checkModulesIncluded("M");
+ checkPackagesIncluded("p");
+ checkTypesIncluded("p.Main");
+ checkPackagesNotIncluded(".*open.*");
+ }
+
+ @Test
+ public void testExpandRequiresPublic(Path base) throws Exception {
+ Path src = base.resolve("src");
+
+ createAuxiliaryModules(src);
+
+ new ModuleBuilder(tb, "M")
+ .comment("The M module.")
+ .requiresPublic("N", src)
+ .requires("L", src)
+ .exports("p")
+ .classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")
+ .write(src);
+
+ execTask("-modulesourcepath", src.toString(),
+ "--module", "M",
+ "--expand-requires:public");
+
+ checkModulesSpecified("M", "N", "O");
+ checkModulesIncluded("M", "N", "O");
+ checkPackagesIncluded("p", "openN", "openO");
+ checkTypesIncluded("p.Main", "openN.N", "openO.O");
+ }
+
+ @Test
+ public void testExpandRequiresAll(Path base) throws Exception {
+ Path src = base.resolve("src");
+
+ createAuxiliaryModules(src);
+
+ new ModuleBuilder(tb, "M")
+ .comment("The M module.")
+ .requiresPublic("N", src)
+ .requires("L", src)
+ .requires("O", src)
+ .exports("p")
+ .classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")
+ .write(src);
+
+ execTask("-modulesourcepath", src.toString(),
+ "--module", "M",
+ "--expand-requires:all");
+
+ checkModulesSpecified("M", "java.base", "N", "L", "O");
+ checkModulesIncluded("M", "java.base", "N", "L", "O");
+ checkModulesNotIncluded("P", "J", "Q");
+ checkPackagesIncluded("p", "openN", "openL", "openO");
+ checkPackagesNotIncluded(".*openP.*", ".*openJ.*");
+ checkTypesIncluded("p.Main", "openN.N", "openL.L", "openO.O");
+ checkTypesNotIncluded(".*openP.*", ".*openJ.*");
+ }
+
+ @Test
+ public void testMissingModule(Path base) throws Exception {
+ Path src = base.resolve("src");
+
+ createAuxiliaryModules(src);
+
+ new ModuleBuilder(tb, "M")
+ .comment("The M module.")
+ .requiresPublic("N", src)
+ .requires("L", src)
+ .requires("O", src)
+ .exports("p")
+ .classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")
+ .write(src);
+
+ execNegativeTask("-modulesourcepath", src.toString(),
+ "--module", "MIA",
+ "--expand-requires:all");
+
+ assertErrorPresent("javadoc: error - module MIA not found.");
+ }
+
+ @Test
+ public void testMissingModuleMultiModuleCmdline(Path base) throws Exception {
+ Path src = base.resolve("src");
+
+ createAuxiliaryModules(src);
+
+ new ModuleBuilder(tb, "M")
+ .comment("The M module.")
+ .requiresPublic("N", src)
+ .requires("L", src)
+ .requires("O", src)
+ .exports("p")
+ .classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")
+ .write(src);
+
+ execNegativeTask("-modulesourcepath", src.toString(),
+ "--module", "M,N,L,MIA,O,P",
+ "--expand-requires:all");
+
+ assertErrorPresent("javadoc: error - module MIA not found");
+ }
+
+ void createAuxiliaryModules(Path src) throws IOException {
+
+ new ModuleBuilder(tb, "J")
+ .comment("The J module.")
+ .exports("openJ")
+ .classes("package openJ; /** Klass J open. */ public class J { }")
+ .classes("package closedJ; /** Klass J closed. */ public class J { }")
+ .write(src);
+
+ new ModuleBuilder(tb, "L")
+ .comment("The L module.")
+ .exports("openL")
+ .requiresPublic("P")
+ .classes("package openL; /** Klass L open */ public class L { }")
+ .classes("package closedL; /** Klass L closed */ public class L { }")
+ .write(src);
+
+ new ModuleBuilder(tb, "N")
+ .comment("The N module.")
+ .exports("openN")
+ .requiresPublic("O")
+ .classes("package openN; /** Klass N open */ public class N { }")
+ .classes("package closedN; /** Klass N closed */ public class N { }")
+ .write(src);
+
+ new ModuleBuilder(tb, "O")
+ .comment("The O module.")
+ .exports("openO")
+ .requires("J")
+ .classes("package openO; /** Klass O open. */ public class O { openJ.J j; }")
+ .classes("package closedO; /** Klass O closed. */ public class O { }")
+ .write(src);
+
+ new ModuleBuilder(tb, "P")
+ .comment("The O module.")
+ .exports("openP")
+ .requires("J")
+ .classes("package openP; /** Klass O open. */ public class O { openJ.J j; }")
+ .classes("package closedP; /** Klass O closed. */ public class O { }")
+ .write(src);
+
+ new ModuleBuilder(tb, "Q")
+ .comment("The Q module.")
+ .exports("openQ")
+ .requires("J")
+ .classes("package openQ; /** Klass Q open. */ public class Q { openJ.J j; }")
+ .classes("package closedQ; /** Klass Q closed. */ public class Q { }")
+ .write(src);
+
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/jdk/javadoc/tool/modules/PackageOptions.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,304 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8159305
+ * @summary Test modules with packages and subpackages filtering
+ * @modules
+ * jdk.javadoc/jdk.javadoc.internal.api
+ * jdk.javadoc/jdk.javadoc.internal.doclets.standard
+ * jdk.javadoc/jdk.javadoc.internal.tool
+ * jdk.compiler/com.sun.tools.javac.api
+ * jdk.compiler/com.sun.tools.javac.main
+ * @library /tools/lib
+ * @build toolbox.ToolBox toolbox.TestRunner
+ * @run main PackageOptions
+ */
+
+import java.io.IOException;
+import java.nio.file.DirectoryIteratorException;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import toolbox.*;
+
+public class PackageOptions extends ModuleTestBase {
+
+ public static void main(String... args) throws Exception {
+ new PackageOptions().runTests();
+ }
+
+ @Test
+ public void testExportedNonQualifiedPackagesLegacyMode(Path base) throws Exception {
+ execTask("-modulesourcepath", createSources(base.resolve("src")),
+ "-addmods", "m1",
+ "m1pub");
+
+ checkModulesNotSpecified("m1");
+ checkModulesIncluded("m1");
+ checkPackagesSpecified("m1pub");
+ checkPackagesIncluded("m1pub");
+ }
+
+ @Test
+ public void testExportedQualifiedPackagesLegacyMode(Path base) throws Exception {
+ execTask("-modulesourcepath", createSources(base.resolve("src")),
+ "-addmods", "m1",
+ "m1/m1pub");
+
+ checkModulesNotSpecified("m1");
+ checkModulesIncluded("m1");
+ checkPackagesSpecified("m1pub");
+ checkPackagesIncluded("m1pub");
+ }
+
+ @Test
+ public void testNonExportedQualifedPackagesLegacyMode(Path base) throws Exception {
+ execTask("-modulesourcepath", createSources(base.resolve("src")),
+ "-addmods", "m1",
+ "m1/m1pro.pro1" /* not exported, therefore qualify with module */);
+
+ checkModulesNotSpecified("m1");
+ checkModulesIncluded("m1");
+ checkPackagesSpecified("m1pro.pro1");
+ checkPackagesIncluded("m1pro.pro1");
+ checkPackagesNotIncluded("m1pro.pro2");
+ checkPackagesNotIncluded("m1pub");
+ }
+
+ @Test
+ public void testTypesLegacyMode(Path base) throws Exception {
+ Path srcPath = base.resolve("src");
+ Path typPath = srcPath.resolve("m1/m1pub/A.java");
+ execTask("-modulesourcepath", createSources(srcPath),
+ "-addmods", "m1",
+ typPath.toString());
+ checkModulesNotSpecified("m1");
+ checkModulesIncluded("m1");
+ checkPackagesIncluded("m1pub");
+ checkPackagesNotIncluded("m1pro");
+ checkTypesSpecified("m1pub.A");
+ checkTypesIncluded("m1pub.A");
+ checkTypesNotIncluded("m1pub.B");
+ checkTypesNotIncluded("m1pub.C");
+ }
+
+ @Test
+ public void testSubclassedTypesLegacyMode(Path base) throws Exception {
+ Path srcPath = base.resolve("src");
+ Path typPath = srcPath.resolve("m1/m1pub/B.java");
+ execTask("-modulesourcepath", createSources(srcPath),
+ "-addmods", "m1",
+ typPath.toString());
+ checkModulesNotSpecified("m1");
+ checkModulesIncluded("m1");
+ checkPackagesIncluded("m1pub");
+ checkPackagesNotIncluded("m1pro");
+ checkTypesSpecified("m1pub.B");
+ checkTypesIncluded("m1pub.B");
+ checkTypesNotIncluded("m1pub.A");
+ checkTypesNotIncluded("m1pub.C");
+ }
+
+ @Test
+ public void testDefaultPackages(Path base) throws Exception {
+ execTask("-modulesourcepath", createSources(base.resolve("src")),
+ "--module", "m1");
+
+ checkModulesSpecified("m1");
+
+ checkPackagesIncluded("m1pub", "m1pub.pub1", "m1pub.pub1.pub11",
+ "m1pub.pub1.pub12", "m1pub.pub2.pub21");
+ }
+
+ @Test
+ public void testEmptyPackageDirectory(Path base) throws Exception {
+ Path src = base.resolve("src");
+ createSources(src);
+
+ // need an empty package directory, to check whether
+ // the behavior of subpackage and package
+ Path pkgdir = src.resolve("m1/m1pro/");
+ try (DirectoryStream<Path> stream = Files.newDirectoryStream(pkgdir, "*.java")) {
+ for (Path entry : stream) {
+ Files.deleteIfExists(entry);
+ }
+ } catch (DirectoryIteratorException ex) {
+ // I/O error encounted during the iteration
+ throw ex.getCause();
+ }
+ execTask("-modulesourcepath", src.toString(),
+ "-subpackages", "m1/m1pro");
+
+ checkPackagesSpecified("m1pro", "m1pro.pro1", "m1pro.pro2");
+
+ // empty package directory should cause an error
+ execNegativeTask("-modulesourcepath", src.toString(),
+ "m1/m1pro");
+
+ }
+
+ @Test
+ public void testExportedQualifiedSubpackageWithMultipleModules(Path base) throws Exception {
+ execTask("-modulesourcepath", createSources(base.resolve("src"), 2),
+ "--module", "m1",
+ "-subpackages", "m1/m1pro.pro1:m1/m1pro.pro2:m2/m2pub.pub1");
+
+ checkModulesSpecified("m1");
+ checkPackagesSpecified("m1pro", "m1pro.pro2");
+ checkPackagesSpecified("m2pub.pub1");
+
+ checkPackagesIncluded("m1pub", "m1pub.pub1", "m1pub.pub1.pub11",
+ "m1pub.pub1.pub12", "m1pub.pub2.pub21");
+ checkPackagesIncluded("m2pub.pub1");
+ }
+
+ @Test
+ public void testUnexportedUnqualifiedSubpackages(Path base) throws Exception {
+ execNegativeTask("-modulesourcepath", createSources(base.resolve("src")),
+ "--module", "m1",
+ "-subpackages", "m1pub.pub1:pro");
+
+ assertErrorPresent("javadoc: error - No source files for package pro");
+ }
+
+ @Test
+ public void testUnexportedQualifiedPackage(Path base) throws Exception {
+ execTask("-modulesourcepath", createSources(base.resolve("src")),
+ "--module", "m1",
+ "m1/m1pro");
+
+ checkModulesSpecified("m1");
+ checkPackagesSpecified("m1pro");
+
+ checkPackagesIncluded("m1pub", "m1pub.pub1", "m1pub.pub1.pub11",
+ "m1pub.pub1.pub12", "m1pub.pub2.pub21");
+
+ checkTypesIncluded("m1pro.L");
+ }
+
+ @Test
+ public void testUnexportedQualifiedSubpackage(Path base) throws Exception {
+ execTask("-modulesourcepath", createSources(base.resolve("src")),
+ "--module", "m1",
+ "-subpackages", "m1/m1pro");
+
+ checkModulesSpecified("m1");
+ checkPackagesSpecified("m1pro", "m1pro.pro1", "m1pro.pro2");
+
+ checkPackagesIncluded("m1pub", "m1pub.pub1", "m1pub.pub1.pub11",
+ "m1pub.pub1.pub12", "m1pub.pub2.pub21");
+
+ checkTypesIncluded("m1pro.L", "m1pro.pro1.M", "m1pro.pro2.O");
+ }
+
+ @Test
+ public void testUnexportedQualifiedSubpackageExcludeQualified(Path base) throws Exception {
+ execTask("-modulesourcepath", createSources(base.resolve("src")),
+ "--module", "m1",
+ "-subpackages", "m1/m1pro",
+ "-exclude", "m1/m1pro.pro1.pro11:m1/m1pro.pro2.pro21");
+
+ checkModulesSpecified("m1");
+ checkPackagesSpecified("m1pro", "m1pro.pro1", "m1pro.pro2");
+
+ checkPackagesIncluded("m1pub", "m1pub.pub1", "m1pub.pub1.pub11",
+ "m1pub.pub1.pub12", "m1pub.pub2.pub21");
+
+ checkTypesIncluded("m1pro.L", "m1pro.pro1.M", "m1pro.pro2.O");
+ checkPackagesNotSpecified(".*pro11.*", ".*pro21.*");
+ }
+
+ @Test
+ public void testUnexportedQualifiedSubpackageExcludeUnqualified(Path base) throws Exception {
+ execTask("-modulesourcepath", createSources(base.resolve("src")),
+ "--module", "m1",
+ "-subpackages", "m1/m1pro",
+ "-exclude", "m1pro.pro1.pro11:m1pro.pro2.pro21");
+
+ checkModulesSpecified("m1");
+ checkPackagesSpecified("m1pro", "m1pro.pro1", "m1pro.pro2");
+
+ checkPackagesIncluded("m1pub", "m1pub.pub1", "m1pub.pub1.pub11",
+ "m1pub.pub1.pub12", "m1pub.pub2.pub21");
+
+ checkTypesIncluded("m1pro.L", "m1pro.pro1.M", "m1pro.pro2.O");
+ checkPackagesNotSpecified(".*pro11.*", ".*pro21.*");
+ }
+
+ @Test
+ public void testUnexportedQualifiedSubpackages(Path base) throws Exception {
+ execTask("-modulesourcepath", createSources(base.resolve("src")),
+ "--module", "m1",
+ "-subpackages", "m1/m1pro.pro1:m1/m1pro.pro2");
+
+ checkModulesSpecified("m1");
+ checkPackagesSpecified("m1pro.pro1.pro11");
+
+ checkPackagesIncluded("m1pub", "m1pub.pub1", "m1pub.pub1.pub11",
+ "m1pub.pub1.pub12", "m1pub.pub2.pub21");
+ checkTypesIncluded("m1pro.pro1.pro11.N", "m1pro.pro2.pro21.P");
+ checkTypesNotIncluded("m1pro.L");
+ }
+
+ String createSources(Path src) throws IOException {
+ return createSources0(src, 1);
+ }
+
+ String createSources(Path src, int n) throws IOException {
+ for (int i = 1 ; i <= n ; i++) {
+ createSources0(src, i);
+ }
+ return src.toString();
+ }
+
+ String createSources0(Path src, int n) throws IOException {
+ String mn = "m" + n;
+ String pn = "package " + mn;
+
+ ModuleBuilder mb1 = new ModuleBuilder(tb, mn);
+ mb1.comment("The module #" + n)
+ .classes(pn + "pub; /** Klass A */ public class A {}")
+ .classes(pn + "pub; /** Klass B */ public class B extends A{}")
+ .classes(pn + "pub; /** Klass C */ public class C {}")
+ .classes(pn + "pub;")
+ .classes(pn + "pub.pub1; /** Klass B */ public class B {}")
+ .classes(pn + "pub.pub1.pub11; /** Klass C */ public class C {}")
+ .classes(pn + "pub.pub1.pub12; /** Klass C */ public class C {}")
+ .classes(pn + "pub.pub2.pub21; /** Klass C */ public class C {}")
+ .classes(pn + "pro; /** Klass L */ public class L {}")
+ .classes(pn + "pro.pro1; /** Klass M */ public class M {}")
+ .classes(pn + "pro.pro1.pro11; /** Klass N */ public class N {}")
+ .classes(pn + "pro.pro2; /** Klass O */ public class O {}")
+ .classes(pn + "pro.pro2.pro21; /** Klass P */ public class P {}")
+ .exports(mn + "pub")
+ .exports(mn + "pub.pub1")
+ .exports(mn + "pub.pub1.pub11")
+ .exports(mn + "pub.pub1.pub12")
+ .exports(mn + "pub.pub2.pub21")
+ .write(src);
+ return src.toString();
+ }
+}
--- a/langtools/test/jdk/javadoc/tool/sourceOnly/Test.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/javadoc/tool/sourceOnly/Test.java Fri Aug 26 10:14:15 2016 -0700
@@ -34,7 +34,12 @@
public class Test {
public static void main(String[] args) {
// run javadoc on package p
- if (jdk.javadoc.internal.tool.Main.execute("javadoc", "p.SourceOnly", "p") != 0)
+ String[] jdargs = {
+ "-doclet", "p.SourceOnly",
+ "-docletpath", System.getProperty("test.classes", "."),
+ "p"
+ };
+ if (jdk.javadoc.internal.tool.Main.execute(jdargs) != 0)
throw new Error();
}
}
Binary file langtools/test/jdk/javadoc/tool/sourceOnly/p/NonSource.class has changed
--- a/langtools/test/jdk/javadoc/tool/sourceOnly/p/SourceOnly.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/javadoc/tool/sourceOnly/p/SourceOnly.java Fri Aug 26 10:14:15 2016 -0700
@@ -39,11 +39,12 @@
*/
public class SourceOnly implements Doclet {
NonSource dependency; // force a compilation error if not on classpath.
+
@Override
public boolean run(DocletEnvironment root) {
- if (root.getIncludedClasses().size() != 1)
+ if (root.getIncludedTypeElements().size() != 1)
throw new Error("wrong set of classes documented: " +
- Arrays.asList(root.getIncludedClasses()));
+ Arrays.asList(root.getIncludedTypeElements()));
return true;
}
--- a/langtools/test/jdk/javadoc/tool/sourceOption/SourceOption.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/javadoc/tool/sourceOption/SourceOption.java Fri Aug 26 10:14:15 2016 -0700
@@ -92,7 +92,7 @@
}
public boolean run(DocletEnvironment root) {
- root.getIncludedClasses(); // force parser into action
+ root.getIncludedTypeElements();
return true;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/jdk/javadoc/tool/subpackageIgnore/pkg1/ValidFile.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+
+package pkg1;
+
+/**
+ * This file exists simply to ensure that javadoc passes
+ * without complaining about empty directory.
+ */
+public class ValidFile {}
--- a/langtools/test/jdk/jshell/CompletenessStressTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/jshell/CompletenessStressTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -253,10 +253,8 @@
writer.write(String.format("Empty statement: row %d, column %d: -- %s\n",
start, end, unit));
} else {
- String oops = unit.substring(max(0, ci.unitEndPos() - 10), ci.unitEndPos()) + "|||" +
- unit.substring(ci.unitEndPos(), min(unit.length(), ci.unitEndPos() + 10));
writer.write(String.format("Expected %s got %s: '%s' row %d, column %d: -- %s\n",
- expected, ci.completeness(), oops, row, column, unit));
+ expected, ci.completeness(), unit, row, column, unit));
return false;
}
}
--- a/langtools/test/jdk/jshell/JShellQueryTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/jshell/JShellQueryTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -28,8 +28,6 @@
* @build KullaTesting
* @run testng JShellQueryTest
*/
-import java.util.Set;
-import java.util.stream.Stream;
import jdk.jshell.Snippet;
import org.testng.annotations.Test;
@@ -38,46 +36,39 @@
import jdk.jshell.TypeDeclSnippet;
import jdk.jshell.VarSnippet;
import static java.util.stream.Collectors.joining;
-import static java.util.stream.Collectors.toSet;
import static org.testng.Assert.assertEquals;
@Test
public class JShellQueryTest extends KullaTesting {
- private <T> void checkStreamMatch(Stream<T> result, T... expected) {
- Set<T> sns = result.collect(toSet());
- Set<T> exp = Stream.of(expected).collect(toSet());
- assertEquals(sns, exp);
- }
-
public void testSnippets() {
- checkStreamMatch(getState().snippets());
+ assertStreamMatch(getState().snippets());
VarSnippet sx = varKey(assertEval("int x = 5;"));
VarSnippet sfoo = varKey(assertEval("String foo;"));
MethodSnippet smm = methodKey(assertEval("int mm() { return 6; }"));
MethodSnippet svv = methodKey(assertEval("void vv() { }"));
- checkStreamMatch(getState().snippets(), sx, sfoo, smm, svv);
+ assertStreamMatch(getState().snippets(), sx, sfoo, smm, svv);
TypeDeclSnippet sc = classKey(assertEval("class C { }"));
TypeDeclSnippet si = classKey(assertEval("interface I { }"));
ImportSnippet simp = importKey(assertEval("import java.lang.reflect.*;"));
- checkStreamMatch(getState().snippets(), sx, sfoo, smm, svv, sc, si, simp);
+ assertStreamMatch(getState().snippets(), sx, sfoo, smm, svv, sc, si, simp);
}
public void testVars() {
- checkStreamMatch(getState().variables());
+ assertStreamMatch(getState().variables());
VarSnippet sx = varKey(assertEval("int x = 5;"));
VarSnippet sfoo = varKey(assertEval("String foo;"));
MethodSnippet smm = methodKey(assertEval("int mm() { return 6; }"));
MethodSnippet svv = methodKey(assertEval("void vv() { }"));
- checkStreamMatch(getState().variables(), sx, sfoo);
+ assertStreamMatch(getState().variables(), sx, sfoo);
TypeDeclSnippet sc = classKey(assertEval("class C { }"));
TypeDeclSnippet si = classKey(assertEval("interface I { }"));
ImportSnippet simp = importKey(assertEval("import java.lang.reflect.*;"));
- checkStreamMatch(getState().variables(), sx, sfoo);
+ assertStreamMatch(getState().variables(), sx, sfoo);
}
public void testMethods() {
- checkStreamMatch(getState().methods());
+ assertStreamMatch(getState().methods());
VarSnippet sx = varKey(assertEval("int x = 5;"));
VarSnippet sfoo = varKey(assertEval("String foo;"));
MethodSnippet smm = methodKey(assertEval("int mm() { return 6; }"));
@@ -85,11 +76,11 @@
TypeDeclSnippet sc = classKey(assertEval("class C { }"));
TypeDeclSnippet si = classKey(assertEval("interface I { }"));
ImportSnippet simp = importKey(assertEval("import java.lang.reflect.*;"));
- checkStreamMatch(getState().methods(), smm, svv);
+ assertStreamMatch(getState().methods(), smm, svv);
}
public void testTypes() {
- checkStreamMatch(getState().types());
+ assertStreamMatch(getState().types());
VarSnippet sx = varKey(assertEval("int x = 5;"));
VarSnippet sfoo = varKey(assertEval("String foo;"));
MethodSnippet smm = methodKey(assertEval("int mm() { return 6; }"));
@@ -97,11 +88,11 @@
TypeDeclSnippet sc = classKey(assertEval("class C { }"));
TypeDeclSnippet si = classKey(assertEval("interface I { }"));
ImportSnippet simp = importKey(assertEval("import java.lang.reflect.*;"));
- checkStreamMatch(getState().types(), sc, si);
+ assertStreamMatch(getState().types(), sc, si);
}
public void testImports() {
- checkStreamMatch(getState().imports());
+ assertStreamMatch(getState().imports());
VarSnippet sx = varKey(assertEval("int x = 5;"));
VarSnippet sfoo = varKey(assertEval("String foo;"));
MethodSnippet smm = methodKey(assertEval("int mm() { return 6; }"));
@@ -109,12 +100,12 @@
TypeDeclSnippet sc = classKey(assertEval("class C { }"));
TypeDeclSnippet si = classKey(assertEval("interface I { }"));
ImportSnippet simp = importKey(assertEval("import java.lang.reflect.*;"));
- checkStreamMatch(getState().imports(), simp);
+ assertStreamMatch(getState().imports(), simp);
}
public void testDiagnostics() {
Snippet sx = varKey(assertEval("int x = 5;"));
- checkStreamMatch(getState().diagnostics(sx));
+ assertStreamMatch(getState().diagnostics(sx));
Snippet broken = methodKey(assertEvalFail("int m() { blah(); return \"hello\"; }"));
String res = getState().diagnostics(broken)
.map(d -> d.getCode())
@@ -124,8 +115,8 @@
public void testUnresolvedDependencies() {
VarSnippet sx = varKey(assertEval("int x = 5;"));
- checkStreamMatch(getState().unresolvedDependencies(sx));
+ assertStreamMatch(getState().unresolvedDependencies(sx));
MethodSnippet unr = methodKey(getState().eval("void uu() { baz(); zips(); }"));
- checkStreamMatch(getState().unresolvedDependencies(unr), "method zips()", "method baz()");
+ assertStreamMatch(getState().unresolvedDependencies(unr), "method zips()", "method baz()");
}
}
--- a/langtools/test/jdk/jshell/JShellStateClosedTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/jshell/JShellStateClosedTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,7 +22,7 @@
*/
/*
- * @test
+ * @test 8164277
* @summary Testing IllegalStateException.
* @build KullaTesting TestingInputStream JShellStateClosedTest
* @run testng JShellStateClosedTest
@@ -31,8 +31,11 @@
import java.util.function.Consumer;
import jdk.jshell.DeclarationSnippet;
+import jdk.jshell.ImportSnippet;
+import jdk.jshell.MethodSnippet;
import jdk.jshell.PersistentSnippet;
import jdk.jshell.Snippet;
+import jdk.jshell.TypeDeclSnippet;
import jdk.jshell.VarSnippet;
import org.testng.annotations.Test;
@@ -52,19 +55,42 @@
}
public void testClasses() {
- testStateClosedException(() -> getState().types());
+ TypeDeclSnippet sc = classKey(assertEval("class C { }"));
+ TypeDeclSnippet si = classKey(assertEval("interface I { }"));
+ getState().close();
+ assertStreamMatch(getState().types(), sc, si);
}
public void testVariables() {
- testStateClosedException(() -> getState().variables());
+ VarSnippet sx = varKey(assertEval("int x = 5;"));
+ VarSnippet sfoo = varKey(assertEval("String foo;"));
+ getState().close();
+ assertStreamMatch(getState().variables(), sx, sfoo);
}
public void testMethods() {
- testStateClosedException(() -> getState().methods());
+ MethodSnippet smm = methodKey(assertEval("int mm() { return 6; }"));
+ MethodSnippet svv = methodKey(assertEval("void vv() { }"));
+ getState().close();
+ assertStreamMatch(getState().methods(), smm, svv);
}
- public void testKeys() {
- testStateClosedException(() -> getState().snippets());
+ public void testImports() {
+ ImportSnippet simp = importKey(assertEval("import java.lang.reflect.*;"));
+ getState().close();
+ assertStreamMatch(getState().imports(), simp);
+ }
+
+ public void testSnippets() {
+ VarSnippet sx = varKey(assertEval("int x = 5;"));
+ VarSnippet sfoo = varKey(assertEval("String foo;"));
+ MethodSnippet smm = methodKey(assertEval("int mm() { return 6; }"));
+ MethodSnippet svv = methodKey(assertEval("void vv() { }"));
+ TypeDeclSnippet sc = classKey(assertEval("class C { }"));
+ TypeDeclSnippet si = classKey(assertEval("interface I { }"));
+ ImportSnippet simp = importKey(assertEval("import java.lang.reflect.*;"));
+ getState().close();
+ assertStreamMatch(getState().snippets(), sx, sfoo, smm, svv, sc, si, simp);
}
public void testEval() {
--- a/langtools/test/jdk/jshell/KullaTesting.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/jshell/KullaTesting.java Fri Aug 26 10:14:15 2016 -0700
@@ -71,6 +71,7 @@
import jdk.jshell.Diag;
import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toSet;
import static jdk.jshell.Snippet.Status.*;
import static org.testng.Assert.*;
import static jdk.jshell.Snippet.SubKind.METHOD_SUBKIND;
@@ -358,6 +359,12 @@
return checkEvents(() -> getState().eval(input), "eval(" + input + ")", diagMain, diagUpdates, eventChains);
}
+ <T> void assertStreamMatch(Stream<T> result, T... expected) {
+ Set<T> sns = result.collect(toSet());
+ Set<T> exp = Stream.of(expected).collect(toSet());
+ assertEquals(sns, exp);
+ }
+
private Map<Snippet, Snippet> closure(List<SnippetEvent> events) {
Map<Snippet, Snippet> transitions = new HashMap<>();
for (SnippetEvent event : events) {
--- a/langtools/test/jdk/jshell/SimpleRegressionTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/jshell/SimpleRegressionTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -22,7 +22,7 @@
*/
/*
- * @test 8130450
+ * @test 8130450 8158906 8154374
* @summary simple regression test
* @build KullaTesting TestingInputStream
* @run testng SimpleRegressionTest
@@ -39,6 +39,8 @@
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
import static jdk.jshell.Snippet.Status.OVERWRITTEN;
import static jdk.jshell.Snippet.SubKind.TEMP_VAR_EXPRESSION_SUBKIND;
import static jdk.jshell.Snippet.Status.VALID;
@@ -100,6 +102,37 @@
assertEquals(sne.typeName(), "Integer");
}
+ public void testLongRemoteStrings() { //8158906
+ assertEval("String m(int x) { byte[] b = new byte[x]; for (int i = 0; i < x; ++i) b[i] = (byte) 'a'; return new String(b); }");
+ boolean[] shut = new boolean[1];
+ getState().onShutdown(j -> {
+ shut[0] = true;
+ });
+ for (String len : new String[]{"12345", "64000", "65535", "65536", "120000"}) {
+ List<SnippetEvent> el = assertEval("m(" + len + ");");
+ assertFalse(shut[0], "JShell died with long string");
+ assertEquals(el.size(), 1, "Excepted one event");
+ assertTrue(el.get(0).value().length() > 10000,
+ "Expected truncated but long String, got: " + el.get(0).value().length());
+ }
+ }
+
+ public void testLongRemoteJapaneseStrings() { //8158906
+ assertEval("import java.util.stream.*;");
+ assertEval("String m(int x) { return Stream.generate(() -> \"\u3042\").limit(x).collect(Collectors.joining()); }");
+ boolean[] shut = new boolean[1];
+ getState().onShutdown(j -> {
+ shut[0] = true;
+ });
+ for (String len : new String[]{"12345", "21843", "21844", "21845", "21846", "64000", "65535", "65536", "120000"}) {
+ List<SnippetEvent> el = assertEval("m(" + len + ");");
+ assertFalse(shut[0], "JShell died with long string");
+ assertEquals(el.size(), 1, "Excepted one event");
+ assertTrue(el.get(0).value().length() > 10000,
+ "Expected truncated but long String, got: " + el.get(0).value().length());
+ }
+ }
+
// 8130450
public void testDuplicate() {
Snippet snm = methodKey(assertEval("void mm() {}", added(VALID)));
@@ -111,4 +144,9 @@
ste(MAIN_SNIPPET, VALID, VALID, false, null),
ste(snv, VALID, OVERWRITTEN, false, MAIN_SNIPPET));
}
+
+ public void testContextClassLoader() {
+ assertEval("class C {}");
+ assertEval("C.class.getClassLoader() == Thread.currentThread().getContextClassLoader()", "true");
+ }
}
--- a/langtools/test/jdk/jshell/ToolBasicTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/jdk/jshell/ToolBasicTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8143037 8142447 8144095 8140265 8144906 8146138 8147887 8147886 8148316 8148317 8143955 8157953
+ * @bug 8143037 8142447 8144095 8140265 8144906 8146138 8147887 8147886 8148316 8148317 8143955 8157953 8080347
* @summary Tests for Basic tests for REPL tool
* @modules jdk.compiler/com.sun.tools.javac.api
* jdk.compiler/com.sun.tools.javac.main
@@ -542,6 +542,13 @@
}
}
+ public void testVarsWithNotActive() {
+ test(
+ a -> assertVariable(a, "Blath", "x"),
+ a -> assertCommandOutputContains(a, "/var -all", "(not-active)")
+ );
+ }
+
public void testHistoryReference() {
test(false, new String[]{"-nostartup"},
a -> assertCommand(a, "System.err.println(1)", "", "", null, "", "1\n"),
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/doclint/moduleTests/bad/module-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,14 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8162576
+ * @summary Missing doclint check missing for modules
+ * @library ../..
+ * @modules jdk.compiler/com.sun.tools.doclint
+ * @build DocLintTester
+ * @run main DocLintTester -ref module-info.out module-info.java
+ * @compile/fail/ref=module-info.javac.out -XDrawDiagnostics -Werror -Xdoclint:all module-info.java
+ */
+
+// missing doc comment
+module bad {
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/doclint/moduleTests/bad/module-info.javac.out Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,4 @@
+module-info.java:13:1: compiler.warn.proc.messager: no comment
+- compiler.err.warnings.and.werror
+1 error
+1 warning
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/doclint/moduleTests/bad/module-info.out Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,4 @@
+module-info.java:13: warning: no comment
+module bad {
+^
+1 warning
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/doclint/moduleTests/good/module-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8162576
+ * @summary Missing doclint check missing for modules
+ * @library ../..
+ * @modules jdk.compiler/com.sun.tools.doclint
+ * @build DocLintTester
+ * @run main DocLintTester module-info.java
+ * @compile -Xdoclint:all -Werror module-info.java
+ */
+
+/** good module */
+module good {
+}
--- a/langtools/test/tools/javac/StringsInSwitch/BadlyTypedLabel1_6.out Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/tools/javac/StringsInSwitch/BadlyTypedLabel1_6.out Fri Aug 26 10:14:15 2016 -0700
@@ -2,5 +2,6 @@
- compiler.warn.option.obsolete.source: 1.6
- compiler.warn.option.obsolete.suppression
BadlyTypedLabel1.java:10:15: compiler.err.string.switch.not.supported.in.source: 1.6
-1 error
+BadlyTypedLabel1.java:13:14: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: int, java.lang.String)
+2 errors
3 warnings
--- a/langtools/test/tools/javac/StringsInSwitch/BadlyTypedLabel2_6.out Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/tools/javac/StringsInSwitch/BadlyTypedLabel2_6.out Fri Aug 26 10:14:15 2016 -0700
@@ -2,6 +2,6 @@
- compiler.warn.option.obsolete.source: 1.6
- compiler.warn.option.obsolete.suppression
BadlyTypedLabel2.java:12:15: compiler.err.string.switch.not.supported.in.source: 1.6
-BadlyTypedLabel2.java:15:14: compiler.err.const.expr.req
+BadlyTypedLabel2.java:15:14: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: java.math.RoundingMode, java.lang.String)
2 errors
3 warnings
--- a/langtools/test/tools/javac/StringsInSwitch/NonConstantLabel6.out Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/tools/javac/StringsInSwitch/NonConstantLabel6.out Fri Aug 26 10:14:15 2016 -0700
@@ -2,6 +2,6 @@
- compiler.warn.option.obsolete.source: 1.6
- compiler.warn.option.obsolete.suppression
NonConstantLabel.java:11:15: compiler.err.string.switch.not.supported.in.source: 1.6
-NonConstantLabel.java:14:14: compiler.err.const.expr.req
+NonConstantLabel.java:14:14: compiler.err.string.const.req
2 errors
3 warnings
--- a/langtools/test/tools/javac/StringsInSwitch/OneCaseSwitches.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/tools/javac/StringsInSwitch/OneCaseSwitches.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,6 +1,6 @@
/*
* @test /nodynamiccopyright/
- * @bug 6827009
+ * @bug 6827009 8078561
* @summary Positive tests for strings in switch with few alternatives.
* @compile/fail/ref=OneCaseSwitches.out -XDrawDiagnostics -source 6 OneCaseSwitches.java
* @compile OneCaseSwitches.java
--- a/langtools/test/tools/javac/StringsInSwitch/OneCaseSwitches.out Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/tools/javac/StringsInSwitch/OneCaseSwitches.out Fri Aug 26 10:14:15 2016 -0700
@@ -2,13 +2,5 @@
- compiler.warn.option.obsolete.source: 1.6
- compiler.warn.option.obsolete.suppression
OneCaseSwitches.java:23:15: compiler.err.string.switch.not.supported.in.source: 1.6
-OneCaseSwitches.java:33:15: compiler.err.string.switch.not.supported.in.source: 1.6
-OneCaseSwitches.java:52:15: compiler.err.string.switch.not.supported.in.source: 1.6
-OneCaseSwitches.java:66:15: compiler.err.string.switch.not.supported.in.source: 1.6
-OneCaseSwitches.java:85:15: compiler.err.string.switch.not.supported.in.source: 1.6
-OneCaseSwitches.java:99:15: compiler.err.string.switch.not.supported.in.source: 1.6
-OneCaseSwitches.java:119:15: compiler.err.string.switch.not.supported.in.source: 1.6
-OneCaseSwitches.java:130:15: compiler.err.string.switch.not.supported.in.source: 1.6
-OneCaseSwitches.java:242:16: compiler.err.string.switch.not.supported.in.source: 1.6
-9 errors
-3 warnings
+1 error
+3 warnings
\ No newline at end of file
--- a/langtools/test/tools/javac/defaultMethods/static/StaticInvoke.java Fri Aug 26 13:11:39 2016 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-/* @test /nodynamiccopyright/
- * @bug 8037385
- * @summary Must not allow static interface method invocation in legacy code
- * @compile -source 8 -Xlint:-options StaticInvoke.java
- * @compile/fail/ref=StaticInvoke7.out -source 7 -Xlint:-options -XDrawDiagnostics StaticInvoke.java
- * @compile/fail/ref=StaticInvoke6.out -source 6 -Xlint:-options -XDrawDiagnostics StaticInvoke.java
- */
-import java.util.stream.Stream;
-
-class StaticInvoke {
- void test() {
- Stream.empty();
- java.util.stream.Stream.empty();
- }
-}
--- a/langtools/test/tools/javac/defaultMethods/static/StaticInvoke6.out Fri Aug 26 13:11:39 2016 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-StaticInvoke.java:12:15: compiler.err.static.intf.method.invoke.not.supported.in.source: 1.6
-StaticInvoke.java:13:32: compiler.err.static.intf.method.invoke.not.supported.in.source: 1.6
-2 errors
--- a/langtools/test/tools/javac/defaultMethods/static/StaticInvoke7.out Fri Aug 26 13:11:39 2016 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-StaticInvoke.java:12:15: compiler.err.static.intf.method.invoke.not.supported.in.source: 1.7
-StaticInvoke.java:13:32: compiler.err.static.intf.method.invoke.not.supported.in.source: 1.7
-2 errors
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/defaultMethods/static/StaticInvokeQualified.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,13 @@
+/* @test /nodynamiccopyright/
+ * @bug 8037385
+ * @summary Must not allow static interface method invocation in legacy code
+ * @compile -source 8 -Xlint:-options StaticInvokeQualified.java
+ * @compile/fail/ref=StaticInvokeQualified7.out -source 7 -Xlint:-options -XDrawDiagnostics StaticInvokeQualified.java
+ * @compile/fail/ref=StaticInvokeQualified6.out -source 6 -Xlint:-options -XDrawDiagnostics StaticInvokeQualified.java
+ */
+
+class StaticInvokeQualified {
+ void test() {
+ java.util.stream.Stream.empty();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/defaultMethods/static/StaticInvokeQualified6.out Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,2 @@
+StaticInvokeQualified.java:11:32: compiler.err.static.intf.method.invoke.not.supported.in.source: 1.6
+1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/defaultMethods/static/StaticInvokeQualified7.out Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,2 @@
+StaticInvokeQualified.java:11:32: compiler.err.static.intf.method.invoke.not.supported.in.source: 1.7
+1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/defaultMethods/static/StaticInvokeSimple.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,14 @@
+/* @test /nodynamiccopyright/
+ * @bug 8037385
+ * @summary Must not allow static interface method invocation in legacy code
+ * @compile -source 8 -Xlint:-options StaticInvokeSimple.java
+ * @compile/fail/ref=StaticInvokeSimple7.out -source 7 -Xlint:-options -XDrawDiagnostics StaticInvokeSimple.java
+ * @compile/fail/ref=StaticInvokeSimple6.out -source 6 -Xlint:-options -XDrawDiagnostics StaticInvokeSimple.java
+ */
+import java.util.stream.Stream;
+
+class StaticInvokeSimple {
+ void test() {
+ Stream.empty();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/defaultMethods/static/StaticInvokeSimple6.out Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,2 @@
+StaticInvokeSimple.java:12:15: compiler.err.static.intf.method.invoke.not.supported.in.source: 1.6
+1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/defaultMethods/static/StaticInvokeSimple7.out Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,2 @@
+StaticInvokeSimple.java:12:15: compiler.err.static.intf.method.invoke.not.supported.in.source: 1.7
+1 error
\ No newline at end of file
--- a/langtools/test/tools/javac/diags/examples.not-yet.txt Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/tools/javac/diags/examples.not-yet.txt Fri Aug 26 10:14:15 2016 -0700
@@ -102,6 +102,7 @@
compiler.warn.unchecked.assign # DEAD, replaced by compiler.misc.unchecked.assign
compiler.warn.unchecked.cast.to.type # DEAD, replaced by compiler.misc.unchecked.cast.to.type
compiler.warn.unexpected.archive.file # Paths: zip file with unknown extn
+compiler.err.no.zipfs.for.archive # would need zip/jar file
compiler.warn.unknown.enum.constant # in bad class file
compiler.warn.unknown.enum.constant.reason # in bad class file
compiler.warn.override.equals.but.not.hashcode # when a class overrides equals but not hashCode method from Object
@@ -117,6 +118,7 @@
compiler.warn.outdir.is.in.exploded.module # No control over -d specified by test infrastructure
compiler.err.invalid.module.specifier # Not possible (?)
compiler.err.locn.cant.get.module.name.for.jar # bad binary ? Infer module name failure
+compiler.misc.anachronistic.module.info # requires binaries compiled with EA compilers.
compiler.misc.bad.module-info.name # bad class file
compiler.err.locn.bad.module-info # bad class file
compiler.err.locn.cant.read.file # bad class file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/InvalidModuleDirective/module-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+// key: compiler.err.invalid.module.directive
+
+module java.transaction {
+ requires java.base;
+ resuires javax.interceptor.javax.interceptor.api;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/file/LimitedImage.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8153391
+ * @summary Verify javac behaves properly in absence of zip/jar FileSystemProvider
+ * @library /tools/lib
+ * @modules jdk.compiler/com.sun.tools.javac.api
+ * jdk.compiler/com.sun.tools.javac.main
+ * @run main/othervm -limitmods jdk.compiler LimitedImage
+ */
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.List;
+
+import toolbox.JavacTask;
+import toolbox.JarTask;
+import toolbox.Task.Expect;
+import toolbox.Task.Mode;
+import toolbox.Task.OutputKind;
+import toolbox.ToolBox;
+
+public class LimitedImage {
+ public static void main(String... args) throws IOException {
+ ToolBox tb = new ToolBox();
+
+ //showing help should be OK
+ new JavacTask(tb, Mode.CMDLINE)
+ .options("--help")
+ .run().writeAll();
+
+ Path testSource = Paths.get("Test.java");
+ tb.writeFile(testSource, "class Test {}");
+
+ //when zip/jar FS is not needed, compilation should succeed
+ new JavacTask(tb, Mode.CMDLINE)
+ .classpath()
+ .files(testSource)
+ .outdir(".")
+ .run()
+ .writeAll();
+
+ Path testJar = Paths.get("test.jar").toAbsolutePath();
+
+ new JarTask(tb, testJar).run();
+
+ List<String> actualOutput;
+ List<String> expectedOutput = Arrays.asList(
+ "- compiler.err.no.zipfs.for.archive: " + testJar.toString()
+ );
+
+ //check proper diagnostics when zip/jar FS not present:
+ actualOutput = new JavacTask(tb, Mode.CMDLINE)
+ .classpath(testJar)
+ .options("-XDrawDiagnostics")
+ .files(testSource)
+ .outdir(".")
+ .run(Expect.FAIL)
+ .writeAll()
+ .getOutputLines(OutputKind.DIRECT);
+
+ if (!expectedOutput.equals(actualOutput)) {
+ throw new AssertionError("Unexpected output: " + actualOutput);
+ }
+
+ actualOutput = new JavacTask(tb, Mode.CMDLINE)
+ .sourcepath(testJar)
+ .options("-XDrawDiagnostics")
+ .files(testSource)
+ .outdir(".")
+ .run(Expect.FAIL)
+ .writeAll()
+ .getOutputLines(OutputKind.DIRECT);
+
+ if (!expectedOutput.equals(actualOutput)) {
+ throw new AssertionError("Unexpected output: " + actualOutput);
+ }
+
+ actualOutput = new JavacTask(tb, Mode.CMDLINE)
+ .options("-XDrawDiagnostics",
+ "--module-path", testJar.toString())
+ .files(testSource)
+ .outdir(".")
+ .run(Expect.FAIL)
+ .writeAll()
+ .getOutputLines(OutputKind.DIRECT);
+
+ if (!expectedOutput.equals(actualOutput)) {
+ throw new AssertionError("Unexpected output: " + actualOutput);
+ }
+
+ expectedOutput = Arrays.asList(
+ "- compiler.err.no.zipfs.for.archive: " + testJar.toString(),
+ "1 error"
+ );
+
+ actualOutput = new JavacTask(tb, Mode.CMDLINE)
+ .classpath()
+ .options("-XDrawDiagnostics",
+ "--module-path", testJar.getParent().toString())
+ .files(testSource)
+ .outdir(".")
+ .run(Expect.FAIL)
+ .writeAll()
+ .getOutputLines(OutputKind.DIRECT);
+
+ if (!expectedOutput.equals(actualOutput)) {
+ throw new AssertionError("Unexpected output: " + actualOutput);
+ }
+ }
+
+}
\ No newline at end of file
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg09.java Fri Aug 26 13:11:39 2016 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/*
- * @test /nodynamiccopyright/
- * @bug 7020044 8062373
- *
- * @summary Check that diamond is not allowed with anonymous inner class expressions at source < 9
- * @author Maurizio Cimadamore
- * @compile/fail/ref=Neg09.out Neg09.java -source 8 -XDrawDiagnostics
- *
- */
-
-class Neg09 {
- class Member<X> {}
-
- static class Nested<X> {}
-
- void testSimple() {
- Member<?> m1 = new Member<>() {};
- Nested<?> m2 = new Nested<>() {};
- }
-
- void testQualified() {
- Member<?> m1 = this.new Member<>() {};
- Nested<?> m2 = new Neg09.Nested<>() {};
- }
-}
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg09.out Fri Aug 26 13:11:39 2016 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-- compiler.warn.source.no.bootclasspath: 1.8
-Neg09.java:17:34: compiler.err.cant.apply.diamond.1: Neg09.Member<X>, (compiler.misc.diamond.and.anon.class.not.supported.in.source: 1.8)
-Neg09.java:18:34: compiler.err.cant.apply.diamond.1: Neg09.Nested<X>, (compiler.misc.diamond.and.anon.class.not.supported.in.source: 1.8)
-Neg09.java:22:39: compiler.err.cant.apply.diamond.1: Neg09.Member<X>, (compiler.misc.diamond.and.anon.class.not.supported.in.source: 1.8)
-Neg09.java:23:40: compiler.err.cant.apply.diamond.1: Neg09.Nested<X>, (compiler.misc.diamond.and.anon.class.not.supported.in.source: 1.8)
-4 errors
-1 warning
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg09a.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,17 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 7020044 8062373
+ *
+ * @summary Check that diamond is not allowed with anonymous inner class expressions at source < 9
+ * @author Maurizio Cimadamore
+ * @compile/fail/ref=Neg09a.out Neg09a.java -source 8 -XDrawDiagnostics
+ *
+ */
+
+class Neg09a {
+ class Member<X> {}
+
+ void testSimple() {
+ Member<?> m1 = new Member<>() {};
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg09a.out Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,4 @@
+- compiler.warn.source.no.bootclasspath: 1.8
+Neg09a.java:15:34: compiler.err.cant.apply.diamond.1: Neg09a.Member<X>, (compiler.misc.diamond.and.anon.class.not.supported.in.source: 1.8)
+1 error
+1 warning
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg09b.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,19 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 7020044 8062373
+ *
+ * @summary Check that diamond is not allowed with anonymous inner class expressions at source < 9
+ * @author Maurizio Cimadamore
+ * @compile/fail/ref=Neg09b.out Neg09b.java -source 8 -XDrawDiagnostics
+ *
+ */
+
+class Neg09b {
+
+ static class Nested<X> {}
+
+ void testSimple() {
+ Nested<?> m2 = new Nested<>() {};
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg09b.out Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,4 @@
+- compiler.warn.source.no.bootclasspath: 1.8
+Neg09b.java:16:34: compiler.err.cant.apply.diamond.1: Neg09b.Nested<X>, (compiler.misc.diamond.and.anon.class.not.supported.in.source: 1.8)
+1 error
+1 warning
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg09c.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,17 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 7020044 8062373
+ *
+ * @summary Check that diamond is not allowed with anonymous inner class expressions at source < 9
+ * @author Maurizio Cimadamore
+ * @compile/fail/ref=Neg09c.out Neg09c.java -source 8 -XDrawDiagnostics
+ *
+ */
+
+class Neg09c {
+ class Member<X> {}
+
+ void testQualified() {
+ Member<?> m1 = this.new Member<>() {};
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg09c.out Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,4 @@
+- compiler.warn.source.no.bootclasspath: 1.8
+Neg09c.java:15:39: compiler.err.cant.apply.diamond.1: Neg09c.Member<X>, (compiler.misc.diamond.and.anon.class.not.supported.in.source: 1.8)
+1 error
+1 warning
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg09d.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,18 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 7020044 8062373
+ *
+ * @summary Check that diamond is not allowed with anonymous inner class expressions at source < 9
+ * @author Maurizio Cimadamore
+ * @compile/fail/ref=Neg09d.out Neg09d.java -source 8 -XDrawDiagnostics
+ *
+ */
+
+class Neg09d {
+
+ static class Nested<X> {}
+
+ void testQualified() {
+ Nested<?> m2 = new Neg09.Nested<>() {};
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg09d.out Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,4 @@
+- compiler.warn.source.no.bootclasspath: 1.8
+Neg09d.java:16:33: compiler.err.doesnt.exist: Neg09
+1 error
+1 warning
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/modules/AnachronisticModuleInfo/AnachronisticModuleInfoTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8157512
+ * @summary AssertionError in javac when module-info < v53.0
+ * @library /tools/lib
+ * @modules
+ * jdk.compiler/com.sun.tools.javac.api
+ * jdk.compiler/com.sun.tools.javac.main
+ * @build toolbox.ToolBox toolbox.JavacTask module-info
+ * @run main AnachronisticModuleInfoTest
+ */
+
+import toolbox.JavacTask;
+import toolbox.Task;
+import toolbox.TestRunner;
+import toolbox.ToolBox;
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+public class AnachronisticModuleInfoTest extends TestRunner {
+
+ protected ToolBox tb;
+
+ AnachronisticModuleInfoTest() {
+ super(System.err);
+ tb = new ToolBox();
+ }
+
+ public static void main(String... args) throws Exception {
+ AnachronisticModuleInfoTest t = new AnachronisticModuleInfoTest();
+ t.runTests();
+ }
+
+ /**
+ * Run all methods annotated with @Test, and throw an exception if any
+ * errors are reported..
+ *
+ * @throws Exception if any errors occurred
+ */
+ protected void runTests() throws Exception {
+ runTests(m -> new Object[] { Paths.get(m.getName()) });
+ }
+
+ Path[] findJavaFiles(Path... paths) throws IOException {
+ return tb.findJavaFiles(paths);
+ }
+
+ @Test
+ public void anachronisticModuleInfoTest(Path base) throws Exception {
+ Path src = base.resolve("src");
+ tb.writeJavaFiles(src, "class C { }");
+ String modulePath = System.getProperty("test.classes");
+
+ String log = new JavacTask(tb, Task.Mode.CMDLINE)
+ .options("-XDrawDiagnostics",
+ "-upgrademodulepath", modulePath)
+ .files(findJavaFiles(src))
+ .run(Task.Expect.FAIL)
+ .writeAll()
+ .getOutput(Task.OutputKind.DIRECT);
+ String expected = "- compiler.err.cant.access: foo.module-info, (compiler.misc.bad.class.file.header: module-info.class, (compiler.misc.anachronistic.module.info: 52, 0))";
+ if (!log.contains(expected))
+ throw new Exception("expected output not found" + log);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/modules/AnachronisticModuleInfo/module-info.jcod Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,38 @@
+class foo/module-info {
+ 0xCAFEBABE;
+ 0; // minor version
+ 52; // version
+ [] { // Constant Pool
+ ; // first element is empty
+ class #6; // #1
+ Utf8 "SourceFile"; // #2
+ Utf8 "module-info.java"; // #3
+ Utf8 "Module"; // #4
+ Utf8 "java.base"; // #5
+ Utf8 "foo/module-info"; // #6
+ } // Constant Pool
+
+ 0x8000; // access
+ #1;// this_cpx
+ #0;// super_cpx
+
+ [] { // Interfaces
+ } // Interfaces
+
+ [] { // fields
+ } // fields
+
+ [] { // methods
+ } // methods
+
+ [] { // Attributes
+ Attr(#2) { // SourceFile
+ #3;
+ } // end SourceFile
+ ;
+ Attr(#4) { // Module
+ 0x0001000580000000;
+ 0x00000000;
+ } // end Module
+ } // Attributes
+} // end class foo/module-info
--- a/langtools/test/tools/javac/modules/InheritRuntimeEnvironmentTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/tools/javac/modules/InheritRuntimeEnvironmentTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -123,12 +123,17 @@
.files(findJavaFiles(src))
.run();
+ Path emptyClassPath = base.resolve("emptyClassPath");
+
+ Files.createDirectories(emptyClassPath);
+
// This is the test, to verify that the module being compiled will not be able to read
// modules on the module path when a --limit-modules is used
new TestCase(base)
.testOpts("--module-path", modules.toString(), "--limit-modules", "jdk.compiler")
.otherOpts("-XDrawDiagnostics",
- "--module-source-path", src.toString())
+ "--module-source-path", src.toString(),
+ "-classpath", emptyClassPath.toString())
.files(findJavaFiles(src))
.expect(Task.Expect.FAIL, "compiler.err.module.not.found")
.run();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/modules/InvalidModuleDirective/module-info.java Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,15 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8157519
+ * @summary Error messages when compiling a malformed module-info.java confusing
+ * @compile/fail/ref=moduleinfo.out -XDrawDiagnostics module-info.java
+ */
+
+module java.transaction {
+ requires java.base;
+ resuires javax.interceptor.javax.interceptor.api;
+ requires public javax.enterprise.cdi.api;
+ requires public java.sql;
+ requires public java.rmi;
+ export javax.transaction;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/modules/InvalidModuleDirective/moduleinfo.out Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,2 @@
+module-info.java:10:3: compiler.err.invalid.module.directive
+1 error
--- a/langtools/test/tools/javac/tree/TreePosTest.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/tools/javac/tree/TreePosTest.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -108,7 +108,7 @@
* jdk.compiler/com.sun.tools.javac.file
* jdk.compiler/com.sun.tools.javac.tree
* jdk.compiler/com.sun.tools.javac.util
- * @run main TreePosTest -q -r .
+ * @run main/othervm TreePosTest -q -r .
*/
public class TreePosTest {
/**
--- a/langtools/test/tools/javac/varargs/7043922/T7043922.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/tools/javac/varargs/7043922/T7043922.java Fri Aug 26 10:14:15 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,7 @@
* @modules jdk.compiler/com.sun.tools.javac.api
* jdk.compiler/com.sun.tools.javac.file
* jdk.compiler/com.sun.tools.javac.util
+ * @run main/othervm T7043922
*/
import com.sun.source.util.JavacTask;
--- a/langtools/test/tools/lib/toolbox/ModuleBuilder.java Fri Aug 26 13:11:39 2016 +0300
+++ b/langtools/test/tools/lib/toolbox/ModuleBuilder.java Fri Aug 26 10:14:15 2016 -0700
@@ -165,7 +165,7 @@
if (!comment.isEmpty()) {
sb.append("/**\n").append(comment.replace("\n", " *")).append(" */\n");
}
- sb.append("module ").append(name).append(" {");
+ sb.append("module ").append(name).append(" {\n");
requires.forEach(r -> sb.append(" " + r + "\n"));
exports.forEach(e -> sb.append(" " + e + "\n"));
uses.forEach(u -> sb.append(" " + u + "\n"));
--- a/make/common/Modules.gmk Fri Aug 26 13:11:39 2016 +0300
+++ b/make/common/Modules.gmk Fri Aug 26 10:14:15 2016 -0700
@@ -229,6 +229,7 @@
sub(/public/, ""); \
sub(/\/\/.*/, ""); \
sub(/\/\*.*\*\//, ""); \
+ gsub(/^ +\*.*/, ""); \
gsub(/ /, ""); \
printf(" %s", $$0) } \
END { printf("\n") }' $m \
--- a/nashorn/.hgtags Fri Aug 26 13:11:39 2016 +0300
+++ b/nashorn/.hgtags Fri Aug 26 10:14:15 2016 -0700
@@ -365,3 +365,4 @@
68020a486500422e2c8b94b0f35cafe54c9e219a jdk-9+129
0de67a63e2c73781ecf5979a2f3aa9619a445c37 jdk-9+130
ee77c6b3713ab293e027ac3ea1cc16f86dac535f jdk-9+131
+55a75af751dfe44039baef2b762ee7347021025b jdk-9+132
--- a/nashorn/make/nbproject/nbjdk.properties Fri Aug 26 13:11:39 2016 +0300
+++ b/nashorn/make/nbproject/nbjdk.properties Fri Aug 26 10:14:15 2016 -0700
@@ -20,5 +20,5 @@
# or visit www.oracle.com if you need additional information or have any
# questions.
#
-nbjdk.active=JDK_1.8
+nbjdk.active=JDK_9
--- a/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Main.java Fri Aug 26 13:11:39 2016 +0300
+++ b/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Main.java Fri Aug 26 10:14:15 2016 -0700
@@ -34,6 +34,7 @@
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
+import java.io.UncheckedIOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URI;
@@ -50,6 +51,7 @@
import jdk.nashorn.internal.runtime.Property;
import jdk.nashorn.internal.runtime.ScriptEnvironment;
import jdk.nashorn.internal.runtime.ScriptFunction;
+import jdk.nashorn.internal.runtime.ScriptingFunctions;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.ScriptRuntime;
import jdk.nashorn.tools.Shell;
@@ -157,6 +159,15 @@
global.addShellBuiltins();
+ // redefine readLine to use jline Console's readLine!
+ ScriptingFunctions.setReadLineHelper(str-> {
+ try {
+ return in.readLine(str);
+ } catch (final IOException ioExp) {
+ throw new UncheckedIOException(ioExp);
+ }
+ });
+
if (System.getSecurityManager() == null) {
final Consumer<String> evaluator = str -> {
// could be called from different thread (GUI), we need to handle Context set/reset
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java Fri Aug 26 13:11:39 2016 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java Fri Aug 26 10:14:15 2016 -0700
@@ -474,6 +474,8 @@
return toPrimitive((ScriptObject)obj, hint);
} else if (isPrimitive(obj)) {
return obj;
+ } else if (hint == Number.class && obj instanceof Number) {
+ return ((Number) obj).doubleValue();
} else if (obj instanceof JSObject) {
return toPrimitive((JSObject)obj, hint);
} else if (obj instanceof StaticClass) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptingFunctions.java Fri Aug 26 13:11:39 2016 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptingFunctions.java Fri Aug 26 10:14:15 2016 -0700
@@ -42,6 +42,8 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
+import java.util.function.Function;
import jdk.nashorn.internal.objects.NativeArray;
import static jdk.nashorn.internal.runtime.ECMAErrors.rangeError;
@@ -92,11 +94,7 @@
* @throws IOException if an exception occurs
*/
public static Object readLine(final Object self, final Object prompt) throws IOException {
- if (prompt != UNDEFINED) {
- System.out.print(JSType.toString(prompt));
- }
- final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
- return reader.readLine();
+ return readLine(prompt);
}
/**
@@ -219,6 +217,30 @@
return outString;
}
+ // Implementation for pluggable "readLine" functionality
+ // Used by jjs interactive mode
+
+ private static Function<String, String> readLineHelper;
+
+ public static void setReadLineHelper(Function<String, String> func) {
+ readLineHelper = Objects.requireNonNull(func);
+ }
+
+ public static Function<String, String> getReadLineHelper() {
+ return readLineHelper;
+ }
+
+ public static String readLine(final Object prompt) throws IOException {
+ final String p = (prompt != UNDEFINED)? JSType.toString(prompt) : "";
+ if (readLineHelper != null) {
+ return readLineHelper.apply(p);
+ } else {
+ System.out.print(p);
+ final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
+ return reader.readLine();
+ }
+ }
+
private static MethodHandle findOwnMH(final String name, final Class<?> rtype, final Class<?>... types) {
return MH.findStatic(MethodHandles.lookup(), ScriptingFunctions.class, name, MH.type(rtype, types));
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/ShellFunctions.java Fri Aug 26 13:11:39 2016 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/ShellFunctions.java Fri Aug 26 10:14:15 2016 -0700
@@ -34,6 +34,7 @@
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.ScriptingFunctions;
import jdk.nashorn.internal.objects.Global;
/**
@@ -66,11 +67,9 @@
public static Object input(final Object self, final Object endMarker, final Object prompt) throws IOException {
final String endMarkerStr = (endMarker != UNDEFINED)? JSType.toString(endMarker) : "";
final String promptStr = (prompt != UNDEFINED)? JSType.toString(prompt) : ">> ";
- final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
final StringBuilder buf = new StringBuilder();
while (true) {
- System.out.print(promptStr);
- final String line = reader.readLine();
+ final String line = ScriptingFunctions.readLine(promptStr);
if (line == null || line.equals(endMarkerStr)) {
break;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8163945.js Fri Aug 26 10:14:15 2016 -0700
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8163945: Honor Number type hint in toPrimitive on Numbers
+ *
+ * @test
+ * @run
+ */
+
+function assertLessThan(a, b) {
+ Assert.assertTrue(a < b);
+ Assert.assertTrue(a <= b);
+ Assert.assertFalse(a >= b);
+ Assert.assertFalse(a > b);
+}
+
+assertLessThan(new java.lang.Long(2), new java.lang.Long(10));
+assertLessThan(new java.lang.Long(2), 10);
+assertLessThan(2, new java.lang.Long(10));
+
+assertLessThan(new java.math.BigInteger(2), new java.math.BigInteger(10));
+assertLessThan(new java.math.BigInteger(2), 10);
+assertLessThan(2, new java.math.BigInteger(10));
+
+assertLessThan(new java.util.concurrent.atomic.AtomicInteger(2), new java.util.concurrent.atomic.AtomicInteger(10));
+assertLessThan(new java.util.concurrent.atomic.AtomicInteger(2), 10);
+assertLessThan(2, new java.util.concurrent.atomic.AtomicInteger(10));