changeset 807:a93864b5991f

generators: quarantine ASM into separate module, make bytecode generators switchable between asm/reflection.
author shade
date Mon, 09 Jun 2014 22:09:42 +0400
parents 137cfe783916
children fdd7e7779ee7
files jmh-core-ct/pom.xml jmh-core-ct/src/test/java/org/openjdk/jmh/ct/CompileTest.java jmh-core-it/pom.xml jmh-generator-asm/LICENSE jmh-generator-asm/THIRD-PARTY jmh-generator-asm/pom.xml jmh-generator-asm/src/main/java/org/openjdk/jmh/generators/asm/ASMClassInfo.java jmh-generator-asm/src/main/java/org/openjdk/jmh/generators/asm/ASMFieldInfo.java jmh-generator-asm/src/main/java/org/openjdk/jmh/generators/asm/ASMGeneratorSource.java jmh-generator-asm/src/main/java/org/openjdk/jmh/generators/asm/ASMMethodInfo.java jmh-generator-asm/src/main/java/org/openjdk/jmh/generators/asm/ASMParameterInfo.java jmh-generator-asm/src/main/java/org/openjdk/jmh/generators/asm/AnnotationInvocationHandler.java jmh-generator-asm/src/main/java/org/openjdk/jmh/generators/asm/ClassInfoRepo.java jmh-generator-asm/src/main/resources/LICENSE jmh-generator-asm/src/main/resources/THIRD-PARTY jmh-generator-bytecode/pom.xml jmh-generator-bytecode/src/main/java/org/openjdk/jmh/generators/bytecode/ASMClassInfo.java jmh-generator-bytecode/src/main/java/org/openjdk/jmh/generators/bytecode/ASMFieldInfo.java jmh-generator-bytecode/src/main/java/org/openjdk/jmh/generators/bytecode/ASMGeneratorSource.java jmh-generator-bytecode/src/main/java/org/openjdk/jmh/generators/bytecode/ASMMethodInfo.java jmh-generator-bytecode/src/main/java/org/openjdk/jmh/generators/bytecode/ASMParameterInfo.java jmh-generator-bytecode/src/main/java/org/openjdk/jmh/generators/bytecode/AnnotationInvocationHandler.java jmh-generator-bytecode/src/main/java/org/openjdk/jmh/generators/bytecode/ClassInfoRepo.java jmh-generator-bytecode/src/main/java/org/openjdk/jmh/generators/bytecode/JmhBytecodeGenerator.java jmh-generator-reflection/src/main/java/org/openjdk/jmh/generators/reflective/JmhReflectionGenerator.java pom.xml
diffstat 26 files changed, 2244 insertions(+), 918 deletions(-) [+]
line wrap: on
line diff
--- a/jmh-core-ct/pom.xml	Mon Jun 09 21:31:13 2014 +0400
+++ b/jmh-core-ct/pom.xml	Mon Jun 09 22:09:42 2014 +0400
@@ -56,7 +56,7 @@
         </dependency>
         <dependency>
             <groupId>org.openjdk.jmh</groupId>
-            <artifactId>jmh-generator-bytecode</artifactId>
+            <artifactId>jmh-generator-asm</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
--- a/jmh-core-ct/src/test/java/org/openjdk/jmh/ct/CompileTest.java	Mon Jun 09 21:31:13 2014 +0400
+++ b/jmh-core-ct/src/test/java/org/openjdk/jmh/ct/CompileTest.java	Mon Jun 09 22:09:42 2014 +0400
@@ -25,7 +25,7 @@
 package org.openjdk.jmh.ct;
 
 import junit.framework.Assert;
-import org.openjdk.jmh.generators.bytecode.ASMGeneratorSource;
+import org.openjdk.jmh.generators.asm.ASMGeneratorSource;
 import org.openjdk.jmh.generators.core.BenchmarkGenerator;
 import org.openjdk.jmh.generators.core.GeneratorDestination;
 import org.openjdk.jmh.generators.core.MetadataInfo;
--- a/jmh-core-it/pom.xml	Mon Jun 09 21:31:13 2014 +0400
+++ b/jmh-core-it/pom.xml	Mon Jun 09 22:09:42 2014 +0400
@@ -205,6 +205,7 @@
                                         <argument>${project.build.testOutputDirectory}</argument>
                                         <argument>${project.build.testOutputDirectory}/generated-jmh-sources/</argument>
                                         <argument>${project.build.testOutputDirectory}</argument>
+                                        <argument>asm</argument>
                                     </arguments>
                                 </configuration>
                             </execution>
@@ -219,7 +220,7 @@
             <dependencies>
                 <dependency>
                     <groupId>org.openjdk.jmh</groupId>
-                    <artifactId>jmh-generator-reflection</artifactId>
+                    <artifactId>jmh-generator-bytecode</artifactId>
                     <version>${project.version}</version>
                 </dependency>
             </dependencies>
@@ -282,11 +283,12 @@
                                     <goal>java</goal>
                                 </goals>
                                 <configuration>
-                                    <mainClass>org.openjdk.jmh.generators.reflective.JmhReflectionGenerator</mainClass>
+                                    <mainClass>org.openjdk.jmh.generators.bytecode.JmhBytecodeGenerator</mainClass>
                                     <arguments>
                                         <argument>${project.build.testOutputDirectory}</argument>
                                         <argument>${project.build.testOutputDirectory}/generated-jmh-sources/</argument>
                                         <argument>${project.build.testOutputDirectory}</argument>
+                                        <argument>reflection</argument>
                                     </arguments>
                                 </configuration>
                             </execution>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmh-generator-asm/LICENSE	Mon Jun 09 22:09:42 2014 +0400
@@ -0,0 +1,347 @@
+The GNU General Public License (GPL)
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license
+document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share
+and change it.  By contrast, the GNU General Public License is intended to
+guarantee your freedom to share and change free software--to make sure the
+software is free for all its users.  This General Public License applies to
+most of the Free Software Foundation's software and to any other program whose
+authors commit to using it.  (Some other Free Software Foundation software is
+covered by the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not price.  Our
+General Public Licenses are designed to make sure that you have the freedom to
+distribute copies of free software (and charge for this service if you wish),
+that you receive source code or can get it if you want it, that you can change
+the software or use pieces of it in new free programs; and that you know you
+can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to deny
+you these rights or to ask you to surrender the rights.  These restrictions
+translate to certain responsibilities for you if you distribute copies of the
+software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for
+a fee, you must give the recipients all the rights that you have.  You must
+make sure that they, too, receive or can get the source code.  And you must
+show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2)
+offer you this license which gives you legal permission to copy, distribute
+and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that
+everyone understands that there is no warranty for this free software.  If the
+software is modified by someone else and passed on, we want its recipients to
+know that what they have is not the original, so that any problems introduced
+by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents.  We
+wish to avoid the danger that redistributors of a free program will
+individually obtain patent licenses, in effect making the program proprietary.
+To prevent this, we have made it clear that any patent must be licensed for
+everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification
+follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a notice
+placed by the copyright holder saying it may be distributed under the terms of
+this General Public License.  The "Program", below, refers to any such program
+or work, and a "work based on the Program" means either the Program or any
+derivative work under copyright law: that is to say, a work containing the
+Program or a portion of it, either verbatim or with modifications and/or
+translated into another language.  (Hereinafter, translation is included
+without limitation in the term "modification".) Each licensee is addressed as
+"you".
+
+Activities other than copying, distribution and modification are not covered by
+this License; they are outside its scope.  The act of running the Program is
+not restricted, and the output from the Program is covered only if its contents
+constitute a work based on the Program (independent of having been made by
+running the Program).  Whether that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source code as
+you receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice and
+disclaimer of warranty; keep intact all the notices that refer to this License
+and to the absence of any warranty; and give any other recipients of the
+Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you may
+at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it, thus
+forming a work based on the Program, and copy and distribute such modifications
+or work under the terms of Section 1 above, provided that you also meet all of
+these conditions:
+
+    a) You must cause the modified files to carry prominent notices stating
+    that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in whole or
+    in part contains or is derived from the Program or any part thereof, to be
+    licensed as a whole at no charge to all third parties under the terms of
+    this License.
+
+    c) If the modified program normally reads commands interactively when run,
+    you must cause it, when started running for such interactive use in the
+    most ordinary way, to print or display an announcement including an
+    appropriate copyright notice and a notice that there is no warranty (or
+    else, saying that you provide a warranty) and that users may redistribute
+    the program under these conditions, and telling the user how to view a copy
+    of this License.  (Exception: if the Program itself is interactive but does
+    not normally print such an announcement, your work based on the Program is
+    not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If identifiable
+sections of that work are not derived from the Program, and can be reasonably
+considered independent and separate works in themselves, then this License, and
+its terms, do not apply to those sections when you distribute them as separate
+works.  But when you distribute the same sections as part of a whole which is a
+work based on the Program, the distribution of the whole must be on the terms
+of this License, whose permissions for other licensees extend to the entire
+whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your
+rights to work written entirely by you; rather, the intent is to exercise the
+right to control the distribution of derivative or collective works based on
+the Program.
+
+In addition, mere aggregation of another work not based on the Program with the
+Program (or with a work based on the Program) on a volume of a storage or
+distribution medium does not bring the other work under the scope of this
+License.
+
+3. You may copy and distribute the Program (or a work based on it, under
+Section 2) in object code or executable form under the terms of Sections 1 and
+2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable source
+    code, which must be distributed under the terms of Sections 1 and 2 above
+    on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three years, to
+    give any third party, for a charge no more than your cost of physically
+    performing source distribution, a complete machine-readable copy of the
+    corresponding source code, to be distributed under the terms of Sections 1
+    and 2 above on a medium customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer to
+    distribute corresponding source code.  (This alternative is allowed only
+    for noncommercial distribution and only if you received the program in
+    object code or executable form with such an offer, in accord with
+    Subsection b above.)
+
+The source code for a work means the preferred form of the work for making
+modifications to it.  For an executable work, complete source code means all
+the source code for all modules it contains, plus any associated interface
+definition files, plus the scripts used to control compilation and installation
+of the executable.  However, as a special exception, the source code
+distributed need not include anything that is normally distributed (in either
+source or binary form) with the major components (compiler, kernel, and so on)
+of the operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the source
+code from the same place counts as distribution of the source code, even though
+third parties are not compelled to copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as
+expressly provided under this License.  Any attempt otherwise to copy, modify,
+sublicense or distribute the Program is void, and will automatically terminate
+your rights under this License.  However, parties who have received copies, or
+rights, from you under this License will not have their licenses terminated so
+long as such parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not signed it.
+However, nothing else grants you permission to modify or distribute the Program
+or its derivative works.  These actions are prohibited by law if you do not
+accept this License.  Therefore, by modifying or distributing the Program (or
+any work based on the Program), you indicate your acceptance of this License to
+do so, and all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the Program),
+the recipient automatically receives a license from the original licensor to
+copy, distribute or modify the Program subject to these terms and conditions.
+You may not impose any further restrictions on the recipients' exercise of the
+rights granted herein.  You are not responsible for enforcing compliance by
+third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues), conditions
+are imposed on you (whether by court order, agreement or otherwise) that
+contradict the conditions of this License, they do not excuse you from the
+conditions of this License.  If you cannot distribute so as to satisfy
+simultaneously your obligations under this License and any other pertinent
+obligations, then as a consequence you may not distribute the Program at all.
+For example, if a patent license would not permit royalty-free redistribution
+of the Program by all those who receive copies directly or indirectly through
+you, then the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply and
+the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or
+other property right claims or to contest validity of any such claims; this
+section has the sole purpose of protecting the integrity of the free software
+distribution system, which is implemented by public license practices.  Many
+people have made generous contributions to the wide range of software
+distributed through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing to
+distribute software through any other system and a licensee cannot impose that
+choice.
+
+This section is intended to make thoroughly clear what is believed to be a
+consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain
+countries either by patents or by copyrighted interfaces, the original
+copyright holder who places the Program under this License may add an explicit
+geographical distribution limitation excluding those countries, so that
+distribution is permitted only in or among countries not thus excluded.  In
+such case, this License incorporates the limitation as if written in the body
+of this License.
+
+9. The Free Software Foundation may publish revised and/or new versions of the
+General Public License from time to time.  Such new versions will be similar in
+spirit to the present version, but may differ in detail to address new problems
+or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any later
+version", you have the option of following the terms and conditions either of
+that version or of any later version published by the Free Software Foundation.
+If the Program does not specify a version number of this License, you may
+choose any version ever published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs
+whose distribution conditions are different, write to the author to ask for
+permission.  For software which is copyrighted by the Free Software Foundation,
+write to the Free Software Foundation; we sometimes make exceptions for this.
+Our decision will be guided by the two goals of preserving the free status of
+all derivatives of our free software and of promoting the sharing and reuse of
+software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
+THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN OTHERWISE
+STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE
+PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE,
+YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
+ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE
+PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
+BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER
+OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible
+use to the public, the best way to achieve this is to make it free software
+which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program.  It is safest to attach
+them to the start of each source file to most effectively convey the exclusion
+of warranty; and each file should have at least the "copyright" line and a
+pointer to where the full notice is found.
+
+    One line to give the program's name and a brief idea of what it does.
+
+    Copyright (C) <year> <name of author>
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program 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 for
+    more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc., 59
+    Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it
+starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author Gnomovision comes
+    with ABSOLUTELY NO WARRANTY; for details type 'show w'.  This is free
+    software, and you are welcome to redistribute it under certain conditions;
+    type 'show c' for details.
+
+The hypothetical commands 'show w' and 'show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may be
+called something other than 'show w' and 'show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.  Here
+is a sample; alter the names:
+
+    Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+    'Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+    signature of Ty Coon, 1 April 1989
+
+    Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General Public
+License instead of this License.
+
+
+"CLASSPATH" EXCEPTION TO THE GPL
+
+Certain source files distributed by Oracle America and/or its affiliates are
+subject to the following clarification and special exception to the GPL, but
+only where Oracle has expressly included in the particular source file's header
+the words "Oracle designates this particular file as subject to the "Classpath"
+exception as provided by Oracle in the LICENSE file that accompanied this code."
+
+    Linking this library statically or dynamically with other modules is making
+    a combined work based on this library.  Thus, the terms and conditions of
+    the GNU General Public License cover the whole combination.
+
+    As a special exception, the copyright holders of this library give you
+    permission to link this library with independent modules to produce an
+    executable, regardless of the license terms of these independent modules,
+    and to copy and distribute the resulting executable under terms of your
+    choice, provided that you also meet, for each linked independent module,
+    the terms and conditions of the license of that module.  An independent
+    module is a module which is not derived from or based on this library.  If
+    you modify this library, you may extend this exception to your version of
+    the library, but you are not obligated to do so.  If you do not wish to do
+    so, delete this exception statement from your version.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmh-generator-asm/THIRD-PARTY	Mon Jun 09 22:09:42 2014 +0400
@@ -0,0 +1,280 @@
+DO NOT TRANSLATE OR LOCALIZE.
+-----------------------------
+
+%% This notice is provided with respect to JOpt-Simple v4.6
+
+--- begin of LICENSE ---
+
+Copyright (c) SourceForge
+
+The MIT License Copyright (c) Permission is hereby granted, free of
+charge, to any person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use, copy,
+modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+--- end of LICENSE ---
+
+%% This notice is provided with respect to ASM v4.2
+
+--- begin of LICENSE ---
+
+Copyright (c) 2000-2011 INRIA, France Telecom
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the names of its
+    contributors may be used to endorse or promote products derived from
+    this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ THE POSSIBILITY OF SUCH DAMAGE.
+
+--- end of LICENSE ---
+
+The following applies to all products licensed under the Apache 2.0 License:
+
+You may not use the identified files except in compliance with the Apache
+License, Version 2.0 (the "License.")
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
+A copy of the license is also reproduced below.
+
+Unless required by applicable law or agreed to in writing, software distributed
+under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations
+under the License.
+
+                         Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmh-generator-asm/pom.xml	Mon Jun 09 22:09:42 2014 +0400
@@ -0,0 +1,117 @@
+<!--
+Copyright (c) 2005, 2014, 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.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.openjdk.jmh</groupId>
+        <artifactId>jmh-parent</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <name>JMH Generators: ASM</name>
+    <artifactId>jmh-generator-asm</artifactId>
+    <packaging>jar</packaging>
+
+    <description>
+        JMH benchmark generator, based on ASM bytecode manipulation.
+    </description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.openjdk.jmh</groupId>
+            <artifactId>jmh-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.openjdk.jmh</groupId>
+            <artifactId>jmh-generator-reflection</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.ow2.asm</groupId>
+            <artifactId>asm</artifactId>
+            <version>4.2</version>
+        </dependency>
+    </dependencies>
+
+    <prerequisites>
+        <maven>3.0</maven>
+    </prerequisites>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <compilerVersion>1.6</compilerVersion>
+                    <source>1.6</source>
+                    <target>1.6</target>
+                    <compilerArgument>-proc:none</compilerArgument>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.14.1</version>
+                <configuration>
+                    <useFile>false</useFile>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>com.mycila.maven-license-plugin</groupId>
+                <artifactId>maven-license-plugin</artifactId>
+                <version>1.10.b1</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>format</goal>
+                        </goals>
+                        <phase>process-sources</phase>
+                        <configuration>
+                            <header>file:///${project.basedir}/../src/license/gpl_cpe/header.txt</header>
+                            <skipExistingHeaders>true</skipExistingHeaders>
+                            <strictCheck>true</strictCheck>
+                            <mapping>
+                                <java>PHP</java>
+                            </mapping>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+        </plugins>
+    </build>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmh-generator-asm/src/main/java/org/openjdk/jmh/generators/asm/ASMClassInfo.java	Mon Jun 09 22:09:42 2014 +0400
@@ -0,0 +1,237 @@
+/*
+ * Copyright (c) 2005, 2014, 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.openjdk.jmh.generators.asm;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.openjdk.jmh.generators.core.ClassInfo;
+import org.openjdk.jmh.generators.core.FieldInfo;
+import org.openjdk.jmh.generators.core.MethodInfo;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Proxy;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+class ASMClassInfo extends ClassVisitor implements ClassInfo {
+
+    private String idName;
+    private String packageName;
+    private String qualifiedName;
+    private String name;
+    private int access;
+
+    private final List<MethodInfo> methods;
+    private final List<MethodInfo> constructors;
+    private final List<FieldInfo> fields;
+    private final Map<String, AnnotationInvocationHandler> annotations = new HashMap<String, AnnotationInvocationHandler>();
+    private final ClassInfoRepo classInfos;
+    private String superName;
+    private String declaringClass;
+    private boolean isInner;
+    private String origQualifiedName;
+
+    public ASMClassInfo(ClassInfoRepo classInfos) {
+        super(Opcodes.ASM4);
+        this.classInfos = classInfos;
+        methods = new ArrayList<MethodInfo>();
+        constructors = new ArrayList<MethodInfo>();
+        fields = new ArrayList<FieldInfo>();
+    }
+
+    public String getIdName() {
+        return idName;
+    }
+
+    @Override
+    public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
+        super.visit(version, access, name, signature, superName, interfaces);
+        this.superName = superName;
+        this.idName = name;
+        this.access = access;
+        qualifiedName = name.replace("/", ".");
+        packageName = qualifiedName.substring(0, qualifiedName.lastIndexOf("."));
+        origQualifiedName = qualifiedName;
+        qualifiedName = qualifiedName.replace('$', '.');
+        this.name = qualifiedName.substring(qualifiedName.lastIndexOf(".") + 1);
+    }
+
+    @Override
+    public <T extends Annotation> T getAnnotation(Class<T> annClass) {
+        AnnotationInvocationHandler handler = annotations.get(annClass.getCanonicalName());
+        if (handler == null) {
+            return null;
+        } else {
+            return (T) Proxy.newProxyInstance(
+                    Thread.currentThread().getContextClassLoader(),
+                    new Class[]{annClass},
+                    handler);
+        }
+    }
+
+    @Override
+    public AnnotationVisitor visitAnnotation(final String desc, boolean visible) {
+        AnnotationInvocationHandler annHandler = new AnnotationInvocationHandler(super.visitAnnotation(desc, visible));
+        annotations.put(Type.getType(desc).getClassName(), annHandler);
+        return annHandler;
+    }
+
+    @Override
+    public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
+        ClassInfo type = classInfos.get(Type.getReturnType(desc).getClassName());
+        FieldVisitor fv = super.visitField(access, name, desc, signature, value);
+        ASMFieldInfo fi = new ASMFieldInfo(fv, this, access, name, type);
+        fields.add(fi);
+        return fi;
+    }
+
+    @Override
+    public MethodVisitor visitMethod(int access, final String methodName, String methodDesc, String signature, String[] exceptions) {
+        ASMMethodInfo mi = new ASMMethodInfo(super.visitMethod(access, methodName, methodDesc, signature, exceptions),
+                classInfos, this, access, methodName, methodDesc, signature);
+        methods.add(mi);
+        if (methodName.equals("<init>")) {
+            constructors.add(mi);
+        }
+        return mi;
+    }
+
+    @Override
+    public String getPackageName() {
+        return packageName;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public String getQualifiedName() {
+        return qualifiedName;
+    }
+
+    @Override
+    public Collection<FieldInfo> getFields() {
+        return fields;
+    }
+
+    @Override
+    public Collection<MethodInfo> getConstructors() {
+        return constructors;
+    }
+
+    @Override
+    public Collection<MethodInfo> getMethods() {
+        return methods;
+    }
+
+    @Override
+    public ClassInfo getSuperClass() {
+        return classInfos.get(superName);
+    }
+
+    @Override
+    public void visitInnerClass(String name, String outerName, String innerName, int access) {
+        if (name.equals(idName)) {
+            declaringClass = outerName;
+        }
+        super.visitInnerClass(name, outerName, innerName, access);
+    }
+
+    @Override
+    public void visitOuterClass(String owner, String name, String desc) {
+        isInner = true;
+    }
+
+    @Override
+    public ClassInfo getDeclaringClass() {
+        if (declaringClass != null) {
+            return classInfos.get(declaringClass);
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public boolean isAbstract() {
+        return (access & Opcodes.ACC_ABSTRACT) > 0;
+    }
+
+    @Override
+    public boolean isPublic() {
+        return (access & Opcodes.ACC_PUBLIC) > 0;
+    }
+
+    @Override
+    public boolean isStrictFP() {
+        return (access & Opcodes.ACC_STRICT) > 0;
+    }
+
+    @Override
+    public boolean isFinal() {
+        return (access & Opcodes.ACC_FINAL) > 0;
+    }
+
+    @Override
+    public boolean isInner() {
+        return isInner;
+    }
+
+    @Override
+    public boolean isEnum() {
+        return (access & Opcodes.ACC_ENUM) > 0;
+    }
+
+    @Override
+    public Collection<String> getEnumConstants() {
+        if (isEnum()) {
+            try {
+                Collection<String> res = new ArrayList<String>();
+                for (Object cnst : Class.forName(origQualifiedName, false, Thread.currentThread().getContextClassLoader()).getEnumConstants()) {
+                    res.add(cnst.toString());
+                }
+                return res;
+            } catch (ClassNotFoundException e) {
+                throw new IllegalStateException("Can not find and instantiate enum: " + origQualifiedName);
+            }
+        } else {
+            return Collections.emptyList();
+        }
+    }
+
+    @Override
+    public String toString() {
+        return qualifiedName;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmh-generator-asm/src/main/java/org/openjdk/jmh/generators/asm/ASMFieldInfo.java	Mon Jun 09 22:09:42 2014 +0400
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2005, 2014, 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.openjdk.jmh.generators.asm;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.openjdk.jmh.generators.core.ClassInfo;
+import org.openjdk.jmh.generators.core.FieldInfo;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Proxy;
+import java.util.HashMap;
+import java.util.Map;
+
+class ASMFieldInfo extends FieldVisitor implements FieldInfo {
+
+    private final ClassInfo type;
+    private final ASMClassInfo declaringClass;
+    private final int access;
+    private final String name;
+    private final Map<String, AnnotationInvocationHandler> annotations;
+
+    public ASMFieldInfo(FieldVisitor fieldVisitor, ASMClassInfo declaringClass, int access, String name, ClassInfo type) {
+        super(Opcodes.ASM4, fieldVisitor);
+        this.declaringClass = declaringClass;
+        this.access = access;
+        this.name = name;
+        this.type = type;
+        this.annotations = new HashMap<String, AnnotationInvocationHandler>();
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public ClassInfo getType() {
+        return type;
+    }
+
+    @Override
+    public boolean isPublic() {
+        return (access & Opcodes.ACC_PUBLIC) > 0;
+    }
+
+    @Override
+    public boolean isStatic() {
+        return (access & Opcodes.ACC_STATIC) > 0;
+    }
+
+    @Override
+    public <T extends Annotation> T getAnnotation(Class<T> annClass) {
+        AnnotationInvocationHandler handler = annotations.get(annClass.getCanonicalName());
+        if (handler == null) {
+            return null;
+        } else {
+            return (T) Proxy.newProxyInstance(
+                    Thread.currentThread().getContextClassLoader(),
+                    new Class[]{annClass},
+                    handler);
+        }
+    }
+
+    @Override
+    public AnnotationVisitor visitAnnotation(final String desc, boolean visible) {
+        AnnotationInvocationHandler annHandler = new AnnotationInvocationHandler(super.visitAnnotation(desc, visible));
+        annotations.put(Type.getType(desc).getClassName(), annHandler);
+        return annHandler;
+    }
+
+    @Override
+    public ClassInfo getDeclaringClass() {
+        return declaringClass;
+    }
+
+    @Override
+    public String toString() {
+        return declaringClass.getQualifiedName() + "." + name;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmh-generator-asm/src/main/java/org/openjdk/jmh/generators/asm/ASMGeneratorSource.java	Mon Jun 09 22:09:42 2014 +0400
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2005, 2014, 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.openjdk.jmh.generators.asm;
+
+import org.objectweb.asm.ClassReader;
+import org.openjdk.jmh.generators.core.ClassInfo;
+import org.openjdk.jmh.generators.core.GeneratorSource;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collection;
+
+public class ASMGeneratorSource implements GeneratorSource {
+
+    private final ClassInfoRepo classInfos;
+
+    public ASMGeneratorSource() {
+        this.classInfos = new ClassInfoRepo();
+    }
+
+    public void processClasses(Collection<File> classFiles)  throws IOException {
+        for (File f : classFiles) {
+            processClass(f);
+        }
+    }
+
+    public void processClass(File classFile) throws IOException {
+        FileInputStream fos = null;
+        try {
+            fos = new FileInputStream(classFile);
+            processClass(fos);
+        } finally {
+            if (fos != null) {
+                fos.close();
+            }
+        }
+    }
+
+    public void processClass(InputStream stream) throws IOException {
+        final ASMClassInfo ci = new ASMClassInfo(classInfos);
+        ClassReader reader = new ClassReader(stream);
+        reader.accept(ci, 0);
+        classInfos.put(ci.getIdName(), ci);
+    }
+
+    @Override
+    public Collection<ClassInfo> getClasses() {
+        return classInfos.getInfos();
+    }
+
+    @Override
+    public ClassInfo resolveClass(String className) {
+        return classInfos.get(className);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmh-generator-asm/src/main/java/org/openjdk/jmh/generators/asm/ASMMethodInfo.java	Mon Jun 09 22:09:42 2014 +0400
@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 2005, 2014, 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.openjdk.jmh.generators.asm;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.openjdk.jmh.generators.core.ClassInfo;
+import org.openjdk.jmh.generators.core.MethodInfo;
+import org.openjdk.jmh.generators.core.ParameterInfo;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Proxy;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+class ASMMethodInfo extends MethodVisitor implements MethodInfo  {
+
+    private final ASMClassInfo declaringClass;
+    private final Map<String, AnnotationInvocationHandler> annotations;
+    private final int access;
+    private final String name;
+    private final String returnType;
+    private final Type[] argumentTypes;
+    private final ClassInfoRepo repo;
+
+    public ASMMethodInfo(MethodVisitor methodVisitor, ClassInfoRepo repo, ASMClassInfo declaringClass, int access, String name, String desc, String signature) {
+        super(Opcodes.ASM4, methodVisitor);
+        this.declaringClass = declaringClass;
+        this.repo = repo;
+        this.access = access;
+        this.name = name;
+        this.returnType = Type.getReturnType(desc).getClassName();
+        this.annotations = new HashMap<String, AnnotationInvocationHandler>();
+        this.argumentTypes = Type.getArgumentTypes(desc);
+    }
+
+    @Override
+    public <T extends Annotation> T getAnnotation(Class<T> annClass) {
+        AnnotationInvocationHandler handler = annotations.get(annClass.getCanonicalName());
+        if (handler == null) {
+            return null;
+        } else {
+            return (T) Proxy.newProxyInstance(
+                    Thread.currentThread().getContextClassLoader(),
+                    new Class[]{annClass},
+                    handler);
+        }
+    }
+
+    @Override
+    public AnnotationVisitor visitAnnotation(final String desc, boolean visible) {
+        AnnotationInvocationHandler annHandler = new AnnotationInvocationHandler(super.visitAnnotation(desc, visible));
+        annotations.put(Type.getType(desc).getClassName(), annHandler);
+        return annHandler;
+    }
+
+    @Override
+    public ClassInfo getDeclaringClass() {
+        return declaringClass;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public String getQualifiedName() {
+        return declaringClass.getQualifiedName() + "." + name;
+    }
+
+    @Override
+    public String getReturnType() {
+        return returnType;
+    }
+
+    @Override
+    public Collection<ParameterInfo> getParameters() {
+        Collection<ParameterInfo> result = new ArrayList<ParameterInfo>();
+        for (Type t : argumentTypes) {
+            ClassInfo ci = repo.get(t.getClassName());
+            result.add(new ASMParameterInfo(ci));
+        }
+        return result;
+    }
+
+    @Override
+    public boolean isPublic() {
+        return (access & Opcodes.ACC_PUBLIC) > 0;
+    }
+
+    @Override
+    public boolean isAbstract() {
+        return (access & Opcodes.ACC_ABSTRACT) > 0;
+    }
+
+    @Override
+    public boolean isSynchronized() {
+        return (access & Opcodes.ACC_SYNCHRONIZED) > 0;
+    }
+
+    @Override
+    public boolean isStrictFP() {
+        return (access & Opcodes.ACC_STRICT) > 0;
+    }
+
+    @Override
+    public boolean isStatic() {
+        return (access & Opcodes.ACC_STATIC) > 0;
+    }
+
+    @Override
+    public int compareTo(MethodInfo o) {
+        return getQualifiedName().compareTo(o.getQualifiedName());
+    }
+
+    @Override
+    public String toString() {
+        return getQualifiedName() + "()";
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmh-generator-asm/src/main/java/org/openjdk/jmh/generators/asm/ASMParameterInfo.java	Mon Jun 09 22:09:42 2014 +0400
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2005, 2014, 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.openjdk.jmh.generators.asm;
+
+import org.openjdk.jmh.generators.core.ClassInfo;
+import org.openjdk.jmh.generators.core.ParameterInfo;
+
+class ASMParameterInfo implements ParameterInfo {
+
+    private final ClassInfo ci;
+
+    public ASMParameterInfo(ClassInfo ci) {
+        this.ci = ci;
+    }
+
+    @Override
+    public ClassInfo getType() {
+        return ci;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmh-generator-asm/src/main/java/org/openjdk/jmh/generators/asm/AnnotationInvocationHandler.java	Mon Jun 09 22:09:42 2014 +0400
@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2005, 2014, 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.openjdk.jmh.generators.asm;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.Opcodes;
+import org.openjdk.jmh.util.HashMultimap;
+import org.openjdk.jmh.util.Multimap;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+class AnnotationInvocationHandler extends AnnotationVisitor implements InvocationHandler {
+    private final Multimap<String, Object> values;
+
+    public AnnotationInvocationHandler(AnnotationVisitor annotationVisitor) {
+        super(Opcodes.ASM4, annotationVisitor);
+        this.values = new HashMultimap<String, Object>();
+    }
+
+    @Override
+    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+        String key = method.getName();
+        Class<?> returnType = method.getReturnType();
+
+        if (key.equalsIgnoreCase("toString")) {
+            return values;
+        }
+
+        Collection<Object> vs = values.get(key);
+
+        if (returnType.isArray()) {
+            Class<?> componentType = returnType.getComponentType();
+            if (componentType.isEnum()) {
+                int count = vs.size();
+                List<Object> list = new ArrayList<Object>(vs);
+
+                Object o = Array.newInstance(componentType, count);
+                for (int c = 0; c < count; c++) {
+                    Object v = list.get(c);
+                    if (v instanceof String) {
+                        Method m = componentType.getMethod("valueOf", String.class);
+                        v =  m.invoke(null, v);
+                    }
+                    Array.set(o, c, v);
+                }
+                return o;
+            } else if (componentType.isPrimitive()) {
+                throw new IllegalStateException("Primitive arrays are not handled yet");
+            } else {
+                String[] strings = vs.toArray(new String[vs.size()]);
+                if (strings.length == 0) {
+                    strings = (String[]) method.getDefaultValue();
+                }
+                return strings;
+            }
+        } else {
+            Object value;
+            if (vs == null || vs.isEmpty()) {
+                value = method.getDefaultValue();
+            } else {
+                if (vs.size() == 1) {
+                    value = vs.iterator().next();
+                } else {
+                    throw new IllegalStateException("Expected to see a single value, but got " + vs.size());
+                }
+            }
+
+            if (returnType.isEnum() && (value instanceof String)) {
+                Method m = returnType.getMethod("valueOf", String.class);
+                return m.invoke(null, value);
+            }
+            return value;
+        }
+    }
+
+    @Override
+    public void visit(String name, Object value) {
+        values.put(name, value);
+        super.visit(name, value);
+    }
+
+    @Override
+    public void visitEnum(String name, String desc, String value) {
+        values.put(name, value);
+        super.visitEnum(name, desc, value);
+    }
+
+    @Override
+    public AnnotationVisitor visitArray(final String name) {
+        return new AnnotationVisitor(Opcodes.ASM4, super.visitArray(name)) {
+            @Override
+            public void visitEnum(String n, String desc, String value) {
+                values.put(name, value);
+                super.visitEnum(n, desc, value);
+            }
+
+            @Override
+            public void visit(String n, Object value) {
+                values.put(name, value);
+                super.visit(n, value);
+            }
+        };
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmh-generator-asm/src/main/java/org/openjdk/jmh/generators/asm/ClassInfoRepo.java	Mon Jun 09 22:09:42 2014 +0400
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2005, 2014, 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.openjdk.jmh.generators.asm;
+
+import org.openjdk.jmh.generators.core.ClassInfo;
+import org.openjdk.jmh.generators.reflective.RFGeneratorSource;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+class ClassInfoRepo {
+
+    private final Map<String, ClassInfo> map = new HashMap<String, ClassInfo>();
+
+    public ClassInfo get(String desc) {
+        desc = desc.replace('/', '.');
+        ClassInfo info = map.get(desc);
+        if (info != null) {
+            return info;
+        }
+
+        if (desc.equals(boolean.class.getCanonicalName()))  return RFGeneratorSource.resolveClass(boolean.class);
+        if (desc.equals(byte.class.getCanonicalName()))     return RFGeneratorSource.resolveClass(byte.class);
+        if (desc.equals(char.class.getCanonicalName()))     return RFGeneratorSource.resolveClass(char.class);
+        if (desc.equals(short.class.getCanonicalName()))    return RFGeneratorSource.resolveClass(short.class);
+        if (desc.equals(int.class.getCanonicalName()))      return RFGeneratorSource.resolveClass(int.class);
+        if (desc.equals(float.class.getCanonicalName()))    return RFGeneratorSource.resolveClass(float.class);
+        if (desc.equals(long.class.getCanonicalName()))     return RFGeneratorSource.resolveClass(long.class);
+        if (desc.equals(double.class.getCanonicalName()))   return RFGeneratorSource.resolveClass(double.class);
+
+        if (desc.equals(boolean[].class.getCanonicalName()))  return RFGeneratorSource.resolveClass(boolean[].class);
+        if (desc.equals(byte[].class.getCanonicalName()))     return RFGeneratorSource.resolveClass(byte[].class);
+        if (desc.equals(char[].class.getCanonicalName()))     return RFGeneratorSource.resolveClass(char[].class);
+        if (desc.equals(short[].class.getCanonicalName()))    return RFGeneratorSource.resolveClass(short[].class);
+        if (desc.equals(int[].class.getCanonicalName()))      return RFGeneratorSource.resolveClass(int[].class);
+        if (desc.equals(float[].class.getCanonicalName()))    return RFGeneratorSource.resolveClass(float[].class);
+        if (desc.equals(long[].class.getCanonicalName()))     return RFGeneratorSource.resolveClass(long[].class);
+        if (desc.equals(double[].class.getCanonicalName()))   return RFGeneratorSource.resolveClass(double[].class);
+
+        if (desc.endsWith("[]")) {
+            desc = "[L" + desc.substring(0, desc.length() - 2) + ";";
+        }
+
+        try {
+            return RFGeneratorSource.resolveClass(Class.forName(desc, false, Thread.currentThread().getContextClassLoader()));
+        } catch (ClassNotFoundException e) {
+            throw new IllegalStateException("Unable to resolve class: " + desc);
+        }
+    }
+
+    public void put(String desc, ClassInfo info) {
+        desc = desc.replace('/', '.');
+        map.put(desc, info);
+    }
+
+    public Collection<ClassInfo> getInfos() {
+        return map.values();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmh-generator-asm/src/main/resources/LICENSE	Mon Jun 09 22:09:42 2014 +0400
@@ -0,0 +1,347 @@
+The GNU General Public License (GPL)
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license
+document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share
+and change it.  By contrast, the GNU General Public License is intended to
+guarantee your freedom to share and change free software--to make sure the
+software is free for all its users.  This General Public License applies to
+most of the Free Software Foundation's software and to any other program whose
+authors commit to using it.  (Some other Free Software Foundation software is
+covered by the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not price.  Our
+General Public Licenses are designed to make sure that you have the freedom to
+distribute copies of free software (and charge for this service if you wish),
+that you receive source code or can get it if you want it, that you can change
+the software or use pieces of it in new free programs; and that you know you
+can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to deny
+you these rights or to ask you to surrender the rights.  These restrictions
+translate to certain responsibilities for you if you distribute copies of the
+software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for
+a fee, you must give the recipients all the rights that you have.  You must
+make sure that they, too, receive or can get the source code.  And you must
+show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2)
+offer you this license which gives you legal permission to copy, distribute
+and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that
+everyone understands that there is no warranty for this free software.  If the
+software is modified by someone else and passed on, we want its recipients to
+know that what they have is not the original, so that any problems introduced
+by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents.  We
+wish to avoid the danger that redistributors of a free program will
+individually obtain patent licenses, in effect making the program proprietary.
+To prevent this, we have made it clear that any patent must be licensed for
+everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification
+follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a notice
+placed by the copyright holder saying it may be distributed under the terms of
+this General Public License.  The "Program", below, refers to any such program
+or work, and a "work based on the Program" means either the Program or any
+derivative work under copyright law: that is to say, a work containing the
+Program or a portion of it, either verbatim or with modifications and/or
+translated into another language.  (Hereinafter, translation is included
+without limitation in the term "modification".) Each licensee is addressed as
+"you".
+
+Activities other than copying, distribution and modification are not covered by
+this License; they are outside its scope.  The act of running the Program is
+not restricted, and the output from the Program is covered only if its contents
+constitute a work based on the Program (independent of having been made by
+running the Program).  Whether that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source code as
+you receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice and
+disclaimer of warranty; keep intact all the notices that refer to this License
+and to the absence of any warranty; and give any other recipients of the
+Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you may
+at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it, thus
+forming a work based on the Program, and copy and distribute such modifications
+or work under the terms of Section 1 above, provided that you also meet all of
+these conditions:
+
+    a) You must cause the modified files to carry prominent notices stating
+    that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in whole or
+    in part contains or is derived from the Program or any part thereof, to be
+    licensed as a whole at no charge to all third parties under the terms of
+    this License.
+
+    c) If the modified program normally reads commands interactively when run,
+    you must cause it, when started running for such interactive use in the
+    most ordinary way, to print or display an announcement including an
+    appropriate copyright notice and a notice that there is no warranty (or
+    else, saying that you provide a warranty) and that users may redistribute
+    the program under these conditions, and telling the user how to view a copy
+    of this License.  (Exception: if the Program itself is interactive but does
+    not normally print such an announcement, your work based on the Program is
+    not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If identifiable
+sections of that work are not derived from the Program, and can be reasonably
+considered independent and separate works in themselves, then this License, and
+its terms, do not apply to those sections when you distribute them as separate
+works.  But when you distribute the same sections as part of a whole which is a
+work based on the Program, the distribution of the whole must be on the terms
+of this License, whose permissions for other licensees extend to the entire
+whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your
+rights to work written entirely by you; rather, the intent is to exercise the
+right to control the distribution of derivative or collective works based on
+the Program.
+
+In addition, mere aggregation of another work not based on the Program with the
+Program (or with a work based on the Program) on a volume of a storage or
+distribution medium does not bring the other work under the scope of this
+License.
+
+3. You may copy and distribute the Program (or a work based on it, under
+Section 2) in object code or executable form under the terms of Sections 1 and
+2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable source
+    code, which must be distributed under the terms of Sections 1 and 2 above
+    on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three years, to
+    give any third party, for a charge no more than your cost of physically
+    performing source distribution, a complete machine-readable copy of the
+    corresponding source code, to be distributed under the terms of Sections 1
+    and 2 above on a medium customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer to
+    distribute corresponding source code.  (This alternative is allowed only
+    for noncommercial distribution and only if you received the program in
+    object code or executable form with such an offer, in accord with
+    Subsection b above.)
+
+The source code for a work means the preferred form of the work for making
+modifications to it.  For an executable work, complete source code means all
+the source code for all modules it contains, plus any associated interface
+definition files, plus the scripts used to control compilation and installation
+of the executable.  However, as a special exception, the source code
+distributed need not include anything that is normally distributed (in either
+source or binary form) with the major components (compiler, kernel, and so on)
+of the operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the source
+code from the same place counts as distribution of the source code, even though
+third parties are not compelled to copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as
+expressly provided under this License.  Any attempt otherwise to copy, modify,
+sublicense or distribute the Program is void, and will automatically terminate
+your rights under this License.  However, parties who have received copies, or
+rights, from you under this License will not have their licenses terminated so
+long as such parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not signed it.
+However, nothing else grants you permission to modify or distribute the Program
+or its derivative works.  These actions are prohibited by law if you do not
+accept this License.  Therefore, by modifying or distributing the Program (or
+any work based on the Program), you indicate your acceptance of this License to
+do so, and all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the Program),
+the recipient automatically receives a license from the original licensor to
+copy, distribute or modify the Program subject to these terms and conditions.
+You may not impose any further restrictions on the recipients' exercise of the
+rights granted herein.  You are not responsible for enforcing compliance by
+third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues), conditions
+are imposed on you (whether by court order, agreement or otherwise) that
+contradict the conditions of this License, they do not excuse you from the
+conditions of this License.  If you cannot distribute so as to satisfy
+simultaneously your obligations under this License and any other pertinent
+obligations, then as a consequence you may not distribute the Program at all.
+For example, if a patent license would not permit royalty-free redistribution
+of the Program by all those who receive copies directly or indirectly through
+you, then the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply and
+the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or
+other property right claims or to contest validity of any such claims; this
+section has the sole purpose of protecting the integrity of the free software
+distribution system, which is implemented by public license practices.  Many
+people have made generous contributions to the wide range of software
+distributed through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing to
+distribute software through any other system and a licensee cannot impose that
+choice.
+
+This section is intended to make thoroughly clear what is believed to be a
+consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain
+countries either by patents or by copyrighted interfaces, the original
+copyright holder who places the Program under this License may add an explicit
+geographical distribution limitation excluding those countries, so that
+distribution is permitted only in or among countries not thus excluded.  In
+such case, this License incorporates the limitation as if written in the body
+of this License.
+
+9. The Free Software Foundation may publish revised and/or new versions of the
+General Public License from time to time.  Such new versions will be similar in
+spirit to the present version, but may differ in detail to address new problems
+or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any later
+version", you have the option of following the terms and conditions either of
+that version or of any later version published by the Free Software Foundation.
+If the Program does not specify a version number of this License, you may
+choose any version ever published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs
+whose distribution conditions are different, write to the author to ask for
+permission.  For software which is copyrighted by the Free Software Foundation,
+write to the Free Software Foundation; we sometimes make exceptions for this.
+Our decision will be guided by the two goals of preserving the free status of
+all derivatives of our free software and of promoting the sharing and reuse of
+software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
+THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN OTHERWISE
+STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE
+PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE,
+YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
+ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE
+PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
+BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER
+OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible
+use to the public, the best way to achieve this is to make it free software
+which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program.  It is safest to attach
+them to the start of each source file to most effectively convey the exclusion
+of warranty; and each file should have at least the "copyright" line and a
+pointer to where the full notice is found.
+
+    One line to give the program's name and a brief idea of what it does.
+
+    Copyright (C) <year> <name of author>
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program 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 for
+    more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc., 59
+    Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it
+starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author Gnomovision comes
+    with ABSOLUTELY NO WARRANTY; for details type 'show w'.  This is free
+    software, and you are welcome to redistribute it under certain conditions;
+    type 'show c' for details.
+
+The hypothetical commands 'show w' and 'show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may be
+called something other than 'show w' and 'show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.  Here
+is a sample; alter the names:
+
+    Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+    'Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+    signature of Ty Coon, 1 April 1989
+
+    Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General Public
+License instead of this License.
+
+
+"CLASSPATH" EXCEPTION TO THE GPL
+
+Certain source files distributed by Oracle America and/or its affiliates are
+subject to the following clarification and special exception to the GPL, but
+only where Oracle has expressly included in the particular source file's header
+the words "Oracle designates this particular file as subject to the "Classpath"
+exception as provided by Oracle in the LICENSE file that accompanied this code."
+
+    Linking this library statically or dynamically with other modules is making
+    a combined work based on this library.  Thus, the terms and conditions of
+    the GNU General Public License cover the whole combination.
+
+    As a special exception, the copyright holders of this library give you
+    permission to link this library with independent modules to produce an
+    executable, regardless of the license terms of these independent modules,
+    and to copy and distribute the resulting executable under terms of your
+    choice, provided that you also meet, for each linked independent module,
+    the terms and conditions of the license of that module.  An independent
+    module is a module which is not derived from or based on this library.  If
+    you modify this library, you may extend this exception to your version of
+    the library, but you are not obligated to do so.  If you do not wish to do
+    so, delete this exception statement from your version.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmh-generator-asm/src/main/resources/THIRD-PARTY	Mon Jun 09 22:09:42 2014 +0400
@@ -0,0 +1,280 @@
+DO NOT TRANSLATE OR LOCALIZE.
+-----------------------------
+
+%% This notice is provided with respect to JOpt-Simple v4.6
+
+--- begin of LICENSE ---
+
+Copyright (c) SourceForge
+
+The MIT License Copyright (c) Permission is hereby granted, free of
+charge, to any person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use, copy,
+modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+--- end of LICENSE ---
+
+%% This notice is provided with respect to ASM v4.2
+
+--- begin of LICENSE ---
+
+Copyright (c) 2000-2011 INRIA, France Telecom
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the names of its
+    contributors may be used to endorse or promote products derived from
+    this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ THE POSSIBILITY OF SUCH DAMAGE.
+
+--- end of LICENSE ---
+
+The following applies to all products licensed under the Apache 2.0 License:
+
+You may not use the identified files except in compliance with the Apache
+License, Version 2.0 (the "License.")
+
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
+A copy of the license is also reproduced below.
+
+Unless required by applicable law or agreed to in writing, software distributed
+under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations
+under the License.
+
+                         Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
--- a/jmh-generator-bytecode/pom.xml	Mon Jun 09 21:31:13 2014 +0400
+++ b/jmh-generator-bytecode/pom.xml	Mon Jun 09 22:09:42 2014 +0400
@@ -53,9 +53,9 @@
             <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>org.ow2.asm</groupId>
-            <artifactId>asm</artifactId>
-            <version>4.2</version>
+            <groupId>org.openjdk.jmh</groupId>
+            <artifactId>jmh-generator-asm</artifactId>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
--- a/jmh-generator-bytecode/src/main/java/org/openjdk/jmh/generators/bytecode/ASMClassInfo.java	Mon Jun 09 21:31:13 2014 +0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,237 +0,0 @@
-/*
- * Copyright (c) 2005, 2014, 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.openjdk.jmh.generators.bytecode;
-
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.openjdk.jmh.generators.core.ClassInfo;
-import org.openjdk.jmh.generators.core.FieldInfo;
-import org.openjdk.jmh.generators.core.MethodInfo;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Proxy;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-class ASMClassInfo extends ClassVisitor implements ClassInfo {
-
-    private String idName;
-    private String packageName;
-    private String qualifiedName;
-    private String name;
-    private int access;
-
-    private final List<MethodInfo> methods;
-    private final List<MethodInfo> constructors;
-    private final List<FieldInfo> fields;
-    private final Map<String, AnnotationInvocationHandler> annotations = new HashMap<String, AnnotationInvocationHandler>();
-    private final ClassInfoRepo classInfos;
-    private String superName;
-    private String declaringClass;
-    private boolean isInner;
-    private String origQualifiedName;
-
-    public ASMClassInfo(ClassInfoRepo classInfos) {
-        super(Opcodes.ASM4);
-        this.classInfos = classInfos;
-        methods = new ArrayList<MethodInfo>();
-        constructors = new ArrayList<MethodInfo>();
-        fields = new ArrayList<FieldInfo>();
-    }
-
-    public String getIdName() {
-        return idName;
-    }
-
-    @Override
-    public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
-        super.visit(version, access, name, signature, superName, interfaces);
-        this.superName = superName;
-        this.idName = name;
-        this.access = access;
-        qualifiedName = name.replace("/", ".");
-        packageName = qualifiedName.substring(0, qualifiedName.lastIndexOf("."));
-        origQualifiedName = qualifiedName;
-        qualifiedName = qualifiedName.replace('$', '.');
-        this.name = qualifiedName.substring(qualifiedName.lastIndexOf(".") + 1);
-    }
-
-    @Override
-    public <T extends Annotation> T getAnnotation(Class<T> annClass) {
-        AnnotationInvocationHandler handler = annotations.get(annClass.getCanonicalName());
-        if (handler == null) {
-            return null;
-        } else {
-            return (T) Proxy.newProxyInstance(
-                    Thread.currentThread().getContextClassLoader(),
-                    new Class[]{annClass},
-                    handler);
-        }
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotation(final String desc, boolean visible) {
-        AnnotationInvocationHandler annHandler = new AnnotationInvocationHandler(super.visitAnnotation(desc, visible));
-        annotations.put(Type.getType(desc).getClassName(), annHandler);
-        return annHandler;
-    }
-
-    @Override
-    public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
-        ClassInfo type = classInfos.get(Type.getReturnType(desc).getClassName());
-        FieldVisitor fv = super.visitField(access, name, desc, signature, value);
-        ASMFieldInfo fi = new ASMFieldInfo(fv, this, access, name, type);
-        fields.add(fi);
-        return fi;
-    }
-
-    @Override
-    public MethodVisitor visitMethod(int access, final String methodName, String methodDesc, String signature, String[] exceptions) {
-        ASMMethodInfo mi = new ASMMethodInfo(super.visitMethod(access, methodName, methodDesc, signature, exceptions),
-                classInfos, this, access, methodName, methodDesc, signature);
-        methods.add(mi);
-        if (methodName.equals("<init>")) {
-            constructors.add(mi);
-        }
-        return mi;
-    }
-
-    @Override
-    public String getPackageName() {
-        return packageName;
-    }
-
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    @Override
-    public String getQualifiedName() {
-        return qualifiedName;
-    }
-
-    @Override
-    public Collection<FieldInfo> getFields() {
-        return fields;
-    }
-
-    @Override
-    public Collection<MethodInfo> getConstructors() {
-        return constructors;
-    }
-
-    @Override
-    public Collection<MethodInfo> getMethods() {
-        return methods;
-    }
-
-    @Override
-    public ClassInfo getSuperClass() {
-        return classInfos.get(superName);
-    }
-
-    @Override
-    public void visitInnerClass(String name, String outerName, String innerName, int access) {
-        if (name.equals(idName)) {
-            declaringClass = outerName;
-        }
-        super.visitInnerClass(name, outerName, innerName, access);
-    }
-
-    @Override
-    public void visitOuterClass(String owner, String name, String desc) {
-        isInner = true;
-    }
-
-    @Override
-    public ClassInfo getDeclaringClass() {
-        if (declaringClass != null) {
-            return classInfos.get(declaringClass);
-        } else {
-            return null;
-        }
-    }
-
-    @Override
-    public boolean isAbstract() {
-        return (access & Opcodes.ACC_ABSTRACT) > 0;
-    }
-
-    @Override
-    public boolean isPublic() {
-        return (access & Opcodes.ACC_PUBLIC) > 0;
-    }
-
-    @Override
-    public boolean isStrictFP() {
-        return (access & Opcodes.ACC_STRICT) > 0;
-    }
-
-    @Override
-    public boolean isFinal() {
-        return (access & Opcodes.ACC_FINAL) > 0;
-    }
-
-    @Override
-    public boolean isInner() {
-        return isInner;
-    }
-
-    @Override
-    public boolean isEnum() {
-        return (access & Opcodes.ACC_ENUM) > 0;
-    }
-
-    @Override
-    public Collection<String> getEnumConstants() {
-        if (isEnum()) {
-            try {
-                Collection<String> res = new ArrayList<String>();
-                for (Object cnst : Class.forName(origQualifiedName, false, Thread.currentThread().getContextClassLoader()).getEnumConstants()) {
-                    res.add(cnst.toString());
-                }
-                return res;
-            } catch (ClassNotFoundException e) {
-                throw new IllegalStateException("Can not find and instantiate enum: " + origQualifiedName);
-            }
-        } else {
-            return Collections.emptyList();
-        }
-    }
-
-    @Override
-    public String toString() {
-        return qualifiedName;
-    }
-}
--- a/jmh-generator-bytecode/src/main/java/org/openjdk/jmh/generators/bytecode/ASMFieldInfo.java	Mon Jun 09 21:31:13 2014 +0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 2005, 2014, 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.openjdk.jmh.generators.bytecode;
-
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.openjdk.jmh.generators.core.ClassInfo;
-import org.openjdk.jmh.generators.core.FieldInfo;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Proxy;
-import java.util.HashMap;
-import java.util.Map;
-
-class ASMFieldInfo extends FieldVisitor implements FieldInfo {
-
-    private final ClassInfo type;
-    private final ASMClassInfo declaringClass;
-    private final int access;
-    private final String name;
-    private final Map<String, AnnotationInvocationHandler> annotations;
-
-    public ASMFieldInfo(FieldVisitor fieldVisitor, ASMClassInfo declaringClass, int access, String name, ClassInfo type) {
-        super(Opcodes.ASM4, fieldVisitor);
-        this.declaringClass = declaringClass;
-        this.access = access;
-        this.name = name;
-        this.type = type;
-        this.annotations = new HashMap<String, AnnotationInvocationHandler>();
-    }
-
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    @Override
-    public ClassInfo getType() {
-        return type;
-    }
-
-    @Override
-    public boolean isPublic() {
-        return (access & Opcodes.ACC_PUBLIC) > 0;
-    }
-
-    @Override
-    public boolean isStatic() {
-        return (access & Opcodes.ACC_STATIC) > 0;
-    }
-
-    @Override
-    public <T extends Annotation> T getAnnotation(Class<T> annClass) {
-        AnnotationInvocationHandler handler = annotations.get(annClass.getCanonicalName());
-        if (handler == null) {
-            return null;
-        } else {
-            return (T) Proxy.newProxyInstance(
-                    Thread.currentThread().getContextClassLoader(),
-                    new Class[]{annClass},
-                    handler);
-        }
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotation(final String desc, boolean visible) {
-        AnnotationInvocationHandler annHandler = new AnnotationInvocationHandler(super.visitAnnotation(desc, visible));
-        annotations.put(Type.getType(desc).getClassName(), annHandler);
-        return annHandler;
-    }
-
-    @Override
-    public ClassInfo getDeclaringClass() {
-        return declaringClass;
-    }
-
-    @Override
-    public String toString() {
-        return declaringClass.getQualifiedName() + "." + name;
-    }
-}
--- a/jmh-generator-bytecode/src/main/java/org/openjdk/jmh/generators/bytecode/ASMGeneratorSource.java	Mon Jun 09 21:31:13 2014 +0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2005, 2014, 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.openjdk.jmh.generators.bytecode;
-
-import org.objectweb.asm.ClassReader;
-import org.openjdk.jmh.generators.core.ClassInfo;
-import org.openjdk.jmh.generators.core.GeneratorSource;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Collection;
-
-public class ASMGeneratorSource implements GeneratorSource {
-
-    private final ClassInfoRepo classInfos;
-
-    public ASMGeneratorSource() {
-        this.classInfos = new ClassInfoRepo();
-    }
-
-    public void processClasses(Collection<File> classFiles)  throws IOException {
-        for (File f : classFiles) {
-            processClass(f);
-        }
-    }
-
-    public void processClass(File classFile) throws IOException {
-        FileInputStream fos = null;
-        try {
-            fos = new FileInputStream(classFile);
-            processClass(fos);
-        } finally {
-            if (fos != null) {
-                fos.close();
-            }
-        }
-    }
-
-    public void processClass(InputStream stream) throws IOException {
-        final ASMClassInfo ci = new ASMClassInfo(classInfos);
-        ClassReader reader = new ClassReader(stream);
-        reader.accept(ci, 0);
-        classInfos.put(ci.getIdName(), ci);
-    }
-
-    @Override
-    public Collection<ClassInfo> getClasses() {
-        return classInfos.getInfos();
-    }
-
-    @Override
-    public ClassInfo resolveClass(String className) {
-        return classInfos.get(className);
-    }
-
-}
--- a/jmh-generator-bytecode/src/main/java/org/openjdk/jmh/generators/bytecode/ASMMethodInfo.java	Mon Jun 09 21:31:13 2014 +0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,148 +0,0 @@
-/*
- * Copyright (c) 2005, 2014, 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.openjdk.jmh.generators.bytecode;
-
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.openjdk.jmh.generators.core.ClassInfo;
-import org.openjdk.jmh.generators.core.MethodInfo;
-import org.openjdk.jmh.generators.core.ParameterInfo;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Proxy;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-class ASMMethodInfo extends MethodVisitor implements MethodInfo  {
-
-    private final ASMClassInfo declaringClass;
-    private final Map<String, AnnotationInvocationHandler> annotations;
-    private final int access;
-    private final String name;
-    private final String returnType;
-    private final Type[] argumentTypes;
-    private final ClassInfoRepo repo;
-
-    public ASMMethodInfo(MethodVisitor methodVisitor, ClassInfoRepo repo, ASMClassInfo declaringClass, int access, String name, String desc, String signature) {
-        super(Opcodes.ASM4, methodVisitor);
-        this.declaringClass = declaringClass;
-        this.repo = repo;
-        this.access = access;
-        this.name = name;
-        this.returnType = Type.getReturnType(desc).getClassName();
-        this.annotations = new HashMap<String, AnnotationInvocationHandler>();
-        this.argumentTypes = Type.getArgumentTypes(desc);
-    }
-
-    @Override
-    public <T extends Annotation> T getAnnotation(Class<T> annClass) {
-        AnnotationInvocationHandler handler = annotations.get(annClass.getCanonicalName());
-        if (handler == null) {
-            return null;
-        } else {
-            return (T) Proxy.newProxyInstance(
-                    Thread.currentThread().getContextClassLoader(),
-                    new Class[]{annClass},
-                    handler);
-        }
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotation(final String desc, boolean visible) {
-        AnnotationInvocationHandler annHandler = new AnnotationInvocationHandler(super.visitAnnotation(desc, visible));
-        annotations.put(Type.getType(desc).getClassName(), annHandler);
-        return annHandler;
-    }
-
-    @Override
-    public ClassInfo getDeclaringClass() {
-        return declaringClass;
-    }
-
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    @Override
-    public String getQualifiedName() {
-        return declaringClass.getQualifiedName() + "." + name;
-    }
-
-    @Override
-    public String getReturnType() {
-        return returnType;
-    }
-
-    @Override
-    public Collection<ParameterInfo> getParameters() {
-        Collection<ParameterInfo> result = new ArrayList<ParameterInfo>();
-        for (Type t : argumentTypes) {
-            ClassInfo ci = repo.get(t.getClassName());
-            result.add(new ASMParameterInfo(ci));
-        }
-        return result;
-    }
-
-    @Override
-    public boolean isPublic() {
-        return (access & Opcodes.ACC_PUBLIC) > 0;
-    }
-
-    @Override
-    public boolean isAbstract() {
-        return (access & Opcodes.ACC_ABSTRACT) > 0;
-    }
-
-    @Override
-    public boolean isSynchronized() {
-        return (access & Opcodes.ACC_SYNCHRONIZED) > 0;
-    }
-
-    @Override
-    public boolean isStrictFP() {
-        return (access & Opcodes.ACC_STRICT) > 0;
-    }
-
-    @Override
-    public boolean isStatic() {
-        return (access & Opcodes.ACC_STATIC) > 0;
-    }
-
-    @Override
-    public int compareTo(MethodInfo o) {
-        return getQualifiedName().compareTo(o.getQualifiedName());
-    }
-
-    @Override
-    public String toString() {
-        return getQualifiedName() + "()";
-    }
-
-}
--- a/jmh-generator-bytecode/src/main/java/org/openjdk/jmh/generators/bytecode/ASMParameterInfo.java	Mon Jun 09 21:31:13 2014 +0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2005, 2014, 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.openjdk.jmh.generators.bytecode;
-
-import org.openjdk.jmh.generators.core.ClassInfo;
-import org.openjdk.jmh.generators.core.ParameterInfo;
-
-class ASMParameterInfo implements ParameterInfo {
-
-    private final ClassInfo ci;
-
-    public ASMParameterInfo(ClassInfo ci) {
-        this.ci = ci;
-    }
-
-    @Override
-    public ClassInfo getType() {
-        return ci;
-    }
-}
--- a/jmh-generator-bytecode/src/main/java/org/openjdk/jmh/generators/bytecode/AnnotationInvocationHandler.java	Mon Jun 09 21:31:13 2014 +0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,131 +0,0 @@
-/*
- * Copyright (c) 2005, 2014, 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.openjdk.jmh.generators.bytecode;
-
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.Opcodes;
-import org.openjdk.jmh.util.HashMultimap;
-import org.openjdk.jmh.util.Multimap;
-
-import java.lang.reflect.Array;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-class AnnotationInvocationHandler extends AnnotationVisitor implements InvocationHandler {
-    private final Multimap<String, Object> values;
-
-    public AnnotationInvocationHandler(AnnotationVisitor annotationVisitor) {
-        super(Opcodes.ASM4, annotationVisitor);
-        this.values = new HashMultimap<String, Object>();
-    }
-
-    @Override
-    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
-        String key = method.getName();
-        Class<?> returnType = method.getReturnType();
-
-        if (key.equalsIgnoreCase("toString")) {
-            return values;
-        }
-
-        Collection<Object> vs = values.get(key);
-
-        if (returnType.isArray()) {
-            Class<?> componentType = returnType.getComponentType();
-            if (componentType.isEnum()) {
-                int count = vs.size();
-                List<Object> list = new ArrayList<Object>(vs);
-
-                Object o = Array.newInstance(componentType, count);
-                for (int c = 0; c < count; c++) {
-                    Object v = list.get(c);
-                    if (v instanceof String) {
-                        Method m = componentType.getMethod("valueOf", String.class);
-                        v =  m.invoke(null, v);
-                    }
-                    Array.set(o, c, v);
-                }
-                return o;
-            } else if (componentType.isPrimitive()) {
-                throw new IllegalStateException("Primitive arrays are not handled yet");
-            } else {
-                String[] strings = vs.toArray(new String[vs.size()]);
-                if (strings.length == 0) {
-                    strings = (String[]) method.getDefaultValue();
-                }
-                return strings;
-            }
-        } else {
-            Object value;
-            if (vs == null || vs.isEmpty()) {
-                value = method.getDefaultValue();
-            } else {
-                if (vs.size() == 1) {
-                    value = vs.iterator().next();
-                } else {
-                    throw new IllegalStateException("Expected to see a single value, but got " + vs.size());
-                }
-            }
-
-            if (returnType.isEnum() && (value instanceof String)) {
-                Method m = returnType.getMethod("valueOf", String.class);
-                return m.invoke(null, value);
-            }
-            return value;
-        }
-    }
-
-    @Override
-    public void visit(String name, Object value) {
-        values.put(name, value);
-        super.visit(name, value);
-    }
-
-    @Override
-    public void visitEnum(String name, String desc, String value) {
-        values.put(name, value);
-        super.visitEnum(name, desc, value);
-    }
-
-    @Override
-    public AnnotationVisitor visitArray(final String name) {
-        return new AnnotationVisitor(Opcodes.ASM4, super.visitArray(name)) {
-            @Override
-            public void visitEnum(String n, String desc, String value) {
-                values.put(name, value);
-                super.visitEnum(n, desc, value);
-            }
-
-            @Override
-            public void visit(String n, Object value) {
-                values.put(name, value);
-                super.visit(n, value);
-            }
-        };
-    }
-}
--- a/jmh-generator-bytecode/src/main/java/org/openjdk/jmh/generators/bytecode/ClassInfoRepo.java	Mon Jun 09 21:31:13 2014 +0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2005, 2014, 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.openjdk.jmh.generators.bytecode;
-
-import org.openjdk.jmh.generators.core.ClassInfo;
-import org.openjdk.jmh.generators.reflective.RFGeneratorSource;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-class ClassInfoRepo {
-
-    private final Map<String, ClassInfo> map = new HashMap<String, ClassInfo>();
-
-    public ClassInfo get(String desc) {
-        desc = desc.replace('/', '.');
-        ClassInfo info = map.get(desc);
-        if (info != null) {
-            return info;
-        }
-
-        if (desc.equals(boolean.class.getCanonicalName()))  return RFGeneratorSource.resolveClass(boolean.class);
-        if (desc.equals(byte.class.getCanonicalName()))     return RFGeneratorSource.resolveClass(byte.class);
-        if (desc.equals(char.class.getCanonicalName()))     return RFGeneratorSource.resolveClass(char.class);
-        if (desc.equals(short.class.getCanonicalName()))    return RFGeneratorSource.resolveClass(short.class);
-        if (desc.equals(int.class.getCanonicalName()))      return RFGeneratorSource.resolveClass(int.class);
-        if (desc.equals(float.class.getCanonicalName()))    return RFGeneratorSource.resolveClass(float.class);
-        if (desc.equals(long.class.getCanonicalName()))     return RFGeneratorSource.resolveClass(long.class);
-        if (desc.equals(double.class.getCanonicalName()))   return RFGeneratorSource.resolveClass(double.class);
-
-        if (desc.equals(boolean[].class.getCanonicalName()))  return RFGeneratorSource.resolveClass(boolean[].class);
-        if (desc.equals(byte[].class.getCanonicalName()))     return RFGeneratorSource.resolveClass(byte[].class);
-        if (desc.equals(char[].class.getCanonicalName()))     return RFGeneratorSource.resolveClass(char[].class);
-        if (desc.equals(short[].class.getCanonicalName()))    return RFGeneratorSource.resolveClass(short[].class);
-        if (desc.equals(int[].class.getCanonicalName()))      return RFGeneratorSource.resolveClass(int[].class);
-        if (desc.equals(float[].class.getCanonicalName()))    return RFGeneratorSource.resolveClass(float[].class);
-        if (desc.equals(long[].class.getCanonicalName()))     return RFGeneratorSource.resolveClass(long[].class);
-        if (desc.equals(double[].class.getCanonicalName()))   return RFGeneratorSource.resolveClass(double[].class);
-
-        if (desc.endsWith("[]")) {
-            desc = "[L" + desc.substring(0, desc.length() - 2) + ";";
-        }
-
-        try {
-            return RFGeneratorSource.resolveClass(Class.forName(desc, false, Thread.currentThread().getContextClassLoader()));
-        } catch (ClassNotFoundException e) {
-            throw new IllegalStateException("Unable to resolve class: " + desc);
-        }
-    }
-
-    public void put(String desc, ClassInfo info) {
-        desc = desc.replace('/', '.');
-        map.put(desc, info);
-    }
-
-    public Collection<ClassInfo> getInfos() {
-        return map.values();
-    }
-}
--- a/jmh-generator-bytecode/src/main/java/org/openjdk/jmh/generators/bytecode/JmhBytecodeGenerator.java	Mon Jun 09 21:31:13 2014 +0400
+++ b/jmh-generator-bytecode/src/main/java/org/openjdk/jmh/generators/bytecode/JmhBytecodeGenerator.java	Mon Jun 09 22:09:42 2014 +0400
@@ -24,25 +24,40 @@
  */
 package org.openjdk.jmh.generators.bytecode;
 
+import org.openjdk.jmh.generators.asm.ASMGeneratorSource;
 import org.openjdk.jmh.generators.core.BenchmarkGenerator;
 import org.openjdk.jmh.generators.core.FileSystemDestination;
+import org.openjdk.jmh.generators.core.GeneratorSource;
 import org.openjdk.jmh.generators.core.SourceError;
+import org.openjdk.jmh.generators.reflective.RFGeneratorSource;
 import org.openjdk.jmh.util.FileUtils;
 
 import java.io.File;
 import java.net.URL;
 import java.net.URLClassLoader;
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
 
 public class JmhBytecodeGenerator {
 
+    public static final String GENERATOR_TYPE_ASM = "asm";
+    public static final String GENERATOR_TYPE_REFLECTION = "reflection";
+
+    public static final String DEFAULT_GENERATOR_TYPE = GENERATOR_TYPE_ASM;
+
     public static void main(String[] args) throws Exception {
+        if (args.length < 3) {
+            System.err.println("Usage: generator <compiled-bytecode-dir> <output-source-dir> <output-resource-dir> [generator-type]");
+            System.exit(1);
+        }
         File compiledBytecodeDirectory = new File(args[0]);
         File outputSourceDirectory = new File(args[1]);
         File outputResourceDirectory = new File(args[2]);
 
+        String generatorType = DEFAULT_GENERATOR_TYPE;
+        if (args.length < 4) {
+            generatorType = args[3];
+        }
+
         // Include compiled bytecode on classpath, in case we need to
         // resolve the cross-class dependencies
         URLClassLoader amendedCL = new URLClassLoader(
@@ -51,13 +66,32 @@
 
         Thread.currentThread().setContextClassLoader(amendedCL);
 
-        ASMGeneratorSource source = new ASMGeneratorSource();
         FileSystemDestination destination = new FileSystemDestination(outputResourceDirectory, outputSourceDirectory);
 
         Collection<File> classes = FileUtils.getClasses(compiledBytecodeDirectory);
         System.out.println("Processing " + classes.size() + " classes from " + compiledBytecodeDirectory);
         System.out.println("Writing out Java source to "  + outputSourceDirectory + " and resources to " + outputResourceDirectory);
-        source.processClasses(classes);
+
+        GeneratorSource source = null;
+        if (generatorType.equalsIgnoreCase(GENERATOR_TYPE_ASM)) {
+            ASMGeneratorSource src = new ASMGeneratorSource();
+            src.processClasses(classes);
+            source = src;
+        } else if (generatorType.equalsIgnoreCase(GENERATOR_TYPE_REFLECTION)) {
+            RFGeneratorSource src = new RFGeneratorSource();
+            for (File f : classes) {
+                String name = f.getAbsolutePath().substring(compiledBytecodeDirectory.getAbsolutePath().length() + 1);
+                name = name.replaceAll("\\\\", ".");
+                name = name.replaceAll("/", ".");
+                if (name.endsWith(".class")) {
+                    src.processClasses(Class.forName(name.substring(0, name.length() - 6), false, amendedCL));
+                }
+            }
+            source = src;
+        } else {
+            System.err.println("Unknown generator type: " + generatorType);
+            System.exit(1);
+        }
 
         BenchmarkGenerator gen = new BenchmarkGenerator();
         gen.generate(source, destination);
--- a/jmh-generator-reflection/src/main/java/org/openjdk/jmh/generators/reflective/JmhReflectionGenerator.java	Mon Jun 09 21:31:13 2014 +0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2005, 2014, 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.openjdk.jmh.generators.reflective;
-
-import org.openjdk.jmh.generators.core.BenchmarkGenerator;
-import org.openjdk.jmh.generators.core.FileSystemDestination;
-import org.openjdk.jmh.generators.core.SourceError;
-import org.openjdk.jmh.util.FileUtils;
-
-import java.io.File;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-public class JmhReflectionGenerator {
-
-    public static void main(String[] args) throws Exception {
-        File compiledBytecodeDirectory = new File(args[0]);
-        File outputSourceDirectory = new File(args[1]);
-        File outputResourceDirectory = new File(args[2]);
-
-        // Include compiled bytecode on classpath, in case we need to
-        // resolve the cross-class dependencies
-        URLClassLoader amendedCL = new URLClassLoader(
-                new URL[]{compiledBytecodeDirectory.toURI().toURL()},
-                Thread.currentThread().getContextClassLoader());
-
-        Thread.currentThread().setContextClassLoader(amendedCL);
-
-        RFGeneratorSource source = new RFGeneratorSource();
-        FileSystemDestination destination = new FileSystemDestination(outputResourceDirectory, outputSourceDirectory);
-
-        Collection<File> classes = FileUtils.getClasses(compiledBytecodeDirectory);
-        System.out.println("Processing " + classes.size() + " classes from " + compiledBytecodeDirectory);
-        System.out.println("Writing out Java source to "  + outputSourceDirectory + " and resources to " + outputResourceDirectory);
-        for (File f : classes) {
-            String name = f.getAbsolutePath().substring(compiledBytecodeDirectory.getAbsolutePath().length() + 1);
-            name = name.replaceAll("\\\\", ".");
-            name = name.replaceAll("/", ".");
-            if (name.endsWith(".class")) {
-                source.processClasses(Class.forName(name.substring(0, name.length() - 6), false, amendedCL));
-            }
-        }
-
-        BenchmarkGenerator gen = new BenchmarkGenerator();
-        gen.generate(source, destination);
-        gen.complete(source, destination);
-
-        if (destination.hasErrors()) {
-            for (SourceError e : destination.getErrors()) {
-                System.err.println(e.toString() + "\n");
-            }
-            System.exit(1);
-        }
-    }
-
-
-}
--- a/pom.xml	Mon Jun 09 21:31:13 2014 +0400
+++ b/pom.xml	Mon Jun 09 22:09:42 2014 +0400
@@ -160,6 +160,7 @@
         <module>jmh-core-benchmarks</module>
         <module>jmh-samples</module>
         <module>jmh-generator-annprocess</module>
+        <module>jmh-generator-asm</module>
         <module>jmh-generator-bytecode</module>
         <module>jmh-generator-reflection</module>
         <module>jmh-archetypes</module>