build: config spotless plugin and reformat code

This commit is contained in:
Frank.R.Wu 2023-06-15 11:08:09 +08:00
parent 281030a94c
commit 2f42539293
238 changed files with 31053 additions and 30607 deletions

View File

@ -1,9 +1,3 @@
buildscript {
dependencies {
classpath "com.diffplug.spotless:spotless-plugin-gradle:4.5.1"
}
}
plugins { plugins {
id 'java' id 'java'
id 'java-library' id 'java-library'
@ -12,18 +6,7 @@ plugins {
id 'com.github.johnrengelman.shadow' version '4.0.2' id 'com.github.johnrengelman.shadow' version '4.0.2'
} }
apply plugin: "com.diffplug.gradle.spotless" apply from: '../spotless.gradle'
spotless {
java {
removeUnusedImports()
eclipse().configFile('shardingsphere_eclipse_formatter.xml')
target fileTree('.') {
include '**/*.java'
}
}
}
//tasks.compileJava.dependsOn(spotlessJavaApply)
shadowJar { shadowJar {
classifier = "jar" classifier = "jar"

View File

@ -1,431 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<profiles version="13">
<profile kind="CodeFormatterProfile" name="GoogleStyle" version="13">
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_cascading_method_invocation_with_arguments.count_dependent" value="16|-1|16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_prefer_two_fragments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_comment_inline_tags" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_local_variable_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter" value="1040"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type.count_dependent" value="1585|-1|1585"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields.count_dependent" value="16|-1|16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression.count_dependent" value="16|4|80"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration.count_dependent" value="16|4|48"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration.count_dependent" value="16|4|49"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_cascading_method_invocation_with_arguments" value="16"/>
<setting id="org.eclipse.jdt.core.compiler.source" value="1.7"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration.count_dependent" value="16|4|48"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_non_simple_local_variable_annotation" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants.count_dependent" value="16|5|48"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="100"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation.count_dependent" value="16|4|48"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package" value="1585"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="16"/>
<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_non_simple_type_annotation" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_field_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration"
value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments"
value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_generic_type_arguments" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment_new_line_at_start_of_html_paragraph" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comment_prefix" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_non_simple_parameter_annotation" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method" value="1585"/>
<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation.count_dependent"
value="16|5|80"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter.count_dependent"
value="1040|-1|1040"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package.count_dependent"
value="1585|-1|1585"/>
<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.force_if_else_statement_brace" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="3"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_non_simple_package_annotation" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression"
value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation.count_dependent"
value="16|-1|16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type" value="1585"/>
<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.7"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_new_anonymous_class" value="20"/>
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable.count_dependent"
value="1585|-1|1585"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field.count_dependent"
value="1585|-1|1585"/>
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration.count_dependent"
value="16|5|80"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
<setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant.count_dependent"
value="16|-1|16"/>
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="100"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header"
value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field" value="1585"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer.count_dependent"
value="16|5|80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.7"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header"
value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration.count_dependent"
value="16|4|48"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method.count_dependent"
value="1585|-1|1585"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression.count_dependent" value="16|-1|16"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_non_simple_member_annotation" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable" value="1585"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
<setting
id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call.count_dependent"
value="16|5|80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_generic_type_arguments.count_dependent"
value="16|-1|16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression.count_dependent"
value="16|5|80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration.count_dependent"
value="16|5|80"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations"
value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header"
value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_for_statement" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments"
value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
</profile>
</profiles>

View File

@ -3,8 +3,7 @@ package org.bdware.analysis;
import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.AbstractInsnNode;
public abstract class AnalysisResult { public abstract class AnalysisResult {
public AnalysisResult() { public AnalysisResult() {}
}
public abstract AnalysisResult merge(AbstractInsnNode insn); public abstract AnalysisResult merge(AbstractInsnNode insn);

View File

@ -110,8 +110,8 @@ public abstract class CFGraph {
public void printSelf() { public void printSelf() {
InsnPrinter printer = new InsnPrinter(Opcodes.ASM4, System.out); InsnPrinter printer = new InsnPrinter(Opcodes.ASM4, System.out);
printer.setLabelOrder(getLabelOrder()); printer.setLabelOrder(getLabelOrder());
LOGGER.info("isStatic: " + ((methodNode.access & Opcodes.ACC_STATIC) > 0) LOGGER.info("isStatic: " + ((methodNode.access & Opcodes.ACC_STATIC) > 0) + "\tMethod:"
+ "\tMethod:" + methodNode.name + " " + methodNode.desc); + methodNode.name + " " + methodNode.desc);
LOGGER.info(methodNode.maxLocals + " " + methodNode.maxStack); LOGGER.info(methodNode.maxLocals + " " + methodNode.maxStack);
StringBuilder log = new StringBuilder(); StringBuilder log = new StringBuilder();
for (BasicBlock bb : basicBlocks) { for (BasicBlock bb : basicBlocks) {
@ -171,21 +171,17 @@ public abstract class CFGraph {
/** /**
* Visits a zero operand instruction. * Visits a zero operand instruction.
* *
* @param opcode the opcode of the instruction to be visited. This opcode is * @param opcode the opcode of the instruction to be visited. This opcode is either NOP,
* either NOP, ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1, * ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4,
* ICONST_2, ICONST_3, ICONST_4, ICONST_5, LCONST_0, LCONST_1, * ICONST_5, LCONST_0, LCONST_1, FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1,
* FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD, * IALOAD, LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IASTORE, LASTORE,
* LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, * FASTORE, DASTORE, AASTORE, BASTORE, CASTORE, SASTORE, POP, POP2, DUP, DUP_X1,
* IASTORE, LASTORE, FASTORE, DASTORE, AASTORE, BASTORE, CASTORE, * DUP_X2, DUP2, DUP2_X1, DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB,
* SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, * DSUB, IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM, FREM, DREM,
* DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB, * INEG, LNEG, FNEG, DNEG, ISHL, LSHL, ISHR, LSHR, IUSHR, LUSHR, IAND, LAND, IOR,
* IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM, * LOR, IXOR, LXOR, I2L, I2F, I2D, L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B,
* FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL, ISHR, LSHR, * I2C, I2S, LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IRETURN, LRETURN, FRETURN, DRETURN,
* IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D, * ARETURN, RETURN, ARRAYLENGTH, ATHROW, MONITORENTER, or MONITOREXIT.
* L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S,
* LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IRETURN, LRETURN, FRETURN,
* DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW, MONITORENTER, or
* MONITOREXIT.
*/ */
public void visitInsn(int opcode) { public void visitInsn(int opcode) {
currBlock.add(currInsn); currBlock.add(currInsn);
@ -199,57 +195,56 @@ public abstract class CFGraph {
/** /**
* Visits an instruction with a single int operand. * Visits an instruction with a single int operand.
* *
* @param opcode the opcode of the instruction to be visited. This opcode is * @param opcode the opcode of the instruction to be visited. This opcode is either BIPUSH,
* either BIPUSH, SIPUSH or NEWARRAY. * SIPUSH or NEWARRAY.
* @param operand the operand of the instruction to be visited.<br> * @param operand the operand of the instruction to be visited.<br>
* When opcode is BIPUSH, operand value should be between * When opcode is BIPUSH, operand value should be between Byte.MIN_VALUE and
* Byte.MIN_VALUE and Byte.MAX_VALUE.<br> * Byte.MAX_VALUE.<br>
* When opcode is SIPUSH, operand value should be between * When opcode is SIPUSH, operand value should be between Short.MIN_VALUE and
* Short.MIN_VALUE and Short.MAX_VALUE.<br> * Short.MAX_VALUE.<br>
* When opcode is NEWARRAY, operand value should be one of * When opcode is NEWARRAY, operand value should be one of {@link Opcodes#T_BOOLEAN},
* {@link Opcodes#T_BOOLEAN}, {@link Opcodes#T_CHAR}, * {@link Opcodes#T_CHAR}, {@link Opcodes#T_FLOAT}, {@link Opcodes#T_DOUBLE},
* {@link Opcodes#T_FLOAT}, {@link Opcodes#T_DOUBLE}, * {@link Opcodes#T_BYTE}, {@link Opcodes#T_SHORT}, {@link Opcodes#T_INT} or
* {@link Opcodes#T_BYTE}, {@link Opcodes#T_SHORT}, * {@link Opcodes#T_LONG}.
* {@link Opcodes#T_INT} or {@link Opcodes#T_LONG}.
*/ */
public void visitIntInsn(int opcode, int operand) { public void visitIntInsn(int opcode, int operand) {
currBlock.add(currInsn); currBlock.add(currInsn);
} }
/** /**
* Visits a local variable instruction. A local variable instruction is an * Visits a local variable instruction. A local variable instruction is an instruction that
* instruction that loads or stores the value of a local variable. * loads or stores the value of a local variable.
* *
* @param opcode the opcode of the local variable instruction to be visited. * @param opcode the opcode of the local variable instruction to be visited. This opcode is
* This opcode is either ILOAD, LLOAD, FLOAD, DLOAD, ALOAD, * either ILOAD, LLOAD, FLOAD, DLOAD, ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE
* ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or RET. * or RET.
* @param var the operand of the instruction to be visited. This operand is * @param var the operand of the instruction to be visited. This operand is the index of a
* the index of a local variable. * local variable.
*/ */
public void visitVarInsn(int opcode, int var) { public void visitVarInsn(int opcode, int var) {
currBlock.add(currInsn); currBlock.add(currInsn);
} }
/** /**
* Visits a type instruction. A type instruction is an instruction that takes * Visits a type instruction. A type instruction is an instruction that takes the internal
* the internal name of a class as parameter. * name of a class as parameter.
* *
* @param opcode the opcode of the type instruction to be visited. This opcode * @param opcode the opcode of the type instruction to be visited. This opcode is either
* is either NEW, ANEWARRAY, CHECKCAST or INSTANCEOF. * NEW, ANEWARRAY, CHECKCAST or INSTANCEOF.
* @param type the operand of the instruction to be visited. This operand must * @param type the operand of the instruction to be visited. This operand must be the
* be the internal name of an object or array class (see * internal name of an object or array class (see {@link Type#getInternalName()
* {@link Type#getInternalName() getInternalName}). * getInternalName}).
*/ */
public void visitTypeInsn(int opcode, String type) { public void visitTypeInsn(int opcode, String type) {
currBlock.add(currInsn); currBlock.add(currInsn);
} }
/** /**
* Visits a field instruction. A field instruction is an instruction that loads * Visits a field instruction. A field instruction is an instruction that loads or stores
* or stores the value of a field of an object. * the value of a field of an object.
* *
* @param opcode the opcode of the type instruction to be visited. This opcode * @param opcode the opcode of the type instruction to be visited. This opcode is either
* is either GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD. * GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
* @param owner the internal name of the field's owner class (see * @param owner the internal name of the field's owner class (see
* {@link Type#getInternalName() getInternalName}). * {@link Type#getInternalName() getInternalName}).
* @param name the field's name. * @param name the field's name.
@ -260,12 +255,11 @@ public abstract class CFGraph {
} }
/** /**
* Visits a method instruction. A method instruction is an instruction that * Visits a method instruction. A method instruction is an instruction that invokes a
* invokes a method. * method.
* *
* @param opcode the opcode of the type instruction to be visited. This opcode * @param opcode the opcode of the type instruction to be visited. This opcode is either
* is either INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or * INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or INVOKEINTERFACE.
* INVOKEINTERFACE.
* @param owner the internal name of the method's owner class (see * @param owner the internal name of the method's owner class (see
* {@link Type#getInternalName() getInternalName}). * {@link Type#getInternalName() getInternalName}).
* @param name the method's name. * @param name the method's name.
@ -291,13 +285,13 @@ public abstract class CFGraph {
* @param name the method's name. * @param name the method's name.
* @param desc the method's descriptor (see {@link Type Type}). * @param desc the method's descriptor (see {@link Type Type}).
* @param bsm the bootstrap method. * @param bsm the bootstrap method.
* @param bsmArgs the bootstrap method constant arguments. Each argument must be * @param bsmArgs the bootstrap method constant arguments. Each argument must be an
* an {@link Integer}, {@link Float}, {@link Long}, * {@link Integer}, {@link Float}, {@link Long}, {@link Double}, {@link String},
* {@link Double}, {@link String}, {@link Type} or {@link Handle} * {@link Type} or {@link Handle} value. This method is allowed to modify the content
* value. This method is allowed to modify the content of the * of the array so a caller should expect that this array may change.
* array so a caller should expect that this array may change.
*/ */
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) { public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
Object... bsmArgs) {
// TODO add edges to try catch blocks! // TODO add edges to try catch blocks!
currBlock.add(currInsn); currBlock.add(currInsn);
@ -309,16 +303,14 @@ public abstract class CFGraph {
} }
/** /**
* Visits a jump instruction. A jump instruction is an instruction that may jump * Visits a jump instruction. A jump instruction is an instruction that may jump to another
* to another instruction. * instruction.
* *
* @param opcode the opcode of the type instruction to be visited. This opcode * @param opcode the opcode of the type instruction to be visited. This opcode is either
* is either IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ, * IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE,
* IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, * IF_ICMPGT, IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.
* IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL. * @param label the operand of the instruction to be visited. This operand is a label that
* @param label the operand of the instruction to be visited. This operand is a * designates the instruction to which the jump instruction may jump.
* label that designates the instruction to which the jump
* instruction may jump.
*/ */
public void visitJumpInsn(int opcode, Label label) { public void visitJumpInsn(int opcode, Label label) {
currBlock.add(currInsn); currBlock.add(currInsn);
@ -331,8 +323,7 @@ public abstract class CFGraph {
} }
/** /**
* Visits a label. A label designates the instruction that will be visited just * Visits a label. A label designates the instruction that will be visited just after it.
* after it.
* *
* @param label a {@link Label Label} object. * @param label a {@link Label Label} object.
*/ */
@ -349,10 +340,9 @@ public abstract class CFGraph {
} }
/** /**
* Visits a LDC instruction. Note that new constant types may be added in future * Visits a LDC instruction. Note that new constant types may be added in future versions of
* versions of the Java Virtual Machine. To easily detect new constant types, * the Java Virtual Machine. To easily detect new constant types, implementations of this
* implementations of this method should check for unexpected constant types, * method should check for unexpected constant types, like this:
* like this:
* *
* <pre> * <pre>
* if (cst instanceof Integer) { * if (cst instanceof Integer) {
@ -383,12 +373,11 @@ public abstract class CFGraph {
* } * }
* </pre> * </pre>
* *
* @param cst the constant to be loaded on the stack. This parameter must be a * @param cst the constant to be loaded on the stack. This parameter must be a non null
* non null {@link Integer}, a {@link Float}, a {@link Long}, a * {@link Integer}, a {@link Float}, a {@link Long}, a {@link Double}, a
* {@link Double}, a {@link String}, a {@link Type} of OBJECT or * {@link String}, a {@link Type} of OBJECT or ARRAY sort for <tt>.class</tt>
* ARRAY sort for <tt>.class</tt> constants, for classes whose * constants, for classes whose version is 49.0, a {@link Type} of METHOD sort or a
* version is 49.0, a {@link Type} of METHOD sort or a {@link Handle} * {@link Handle} for MethodType and MethodHandle constants, for classes whose
* for MethodType and MethodHandle constants, for classes whose
* version is 51.0. * version is 51.0.
*/ */
public void visitLdcInsn(Object cst) { public void visitLdcInsn(Object cst) {
@ -414,8 +403,8 @@ public abstract class CFGraph {
* @param min the minimum key value. * @param min the minimum key value.
* @param max the maximum key value. * @param max the maximum key value.
* @param dflt beginning of the default handler block. * @param dflt beginning of the default handler block.
* @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the * @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the beginning of
* beginning of the handler block for the <tt>min + i</tt> key. * the handler block for the <tt>min + i</tt> key.
*/ */
public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) { public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) {
currBlock.add(currInsn); currBlock.add(currInsn);
@ -428,8 +417,8 @@ public abstract class CFGraph {
* *
* @param dflt beginning of the default handler block. * @param dflt beginning of the default handler block.
* @param keys the values of the keys. * @param keys the values of the keys.
* @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the * @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the beginning of
* beginning of the handler block for the <tt>keys[i]</tt> key. * the handler block for the <tt>keys[i]</tt> key.
*/ */
public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) { public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
currBlock.add(currInsn); currBlock.add(currInsn);
@ -452,31 +441,29 @@ public abstract class CFGraph {
* *
* @param name the name of a local variable. * @param name the name of a local variable.
* @param desc the type descriptor of this local variable. * @param desc the type descriptor of this local variable.
* @param signature the type signature of this local variable. May be * @param signature the type signature of this local variable. May be <tt>null</tt> if the
* <tt>null</tt> if the local variable type does not use * local variable type does not use generic types.
* generic types. * @param start the first instruction corresponding to the scope of this local variable
* @param start the first instruction corresponding to the scope of this * (inclusive).
* local variable (inclusive). * @param end the last instruction corresponding to the scope of this local variable
* @param end the last instruction corresponding to the scope of this * (exclusive).
* local variable (exclusive).
* @param index the local variable's index. * @param index the local variable's index.
* @throws IllegalArgumentException if one of the labels has not already been * @throws IllegalArgumentException if one of the labels has not already been visited by
* visited by this visitor (by the * this visitor (by the {@link #visitLabel visitLabel} method).
* {@link #visitLabel visitLabel} method).
*/ */
public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) { public void visitLocalVariable(String name, String desc, String signature, Label start,
Label end, int index) {
currBlock.add(currInsn); currBlock.add(currInsn);
} }
/** /**
* Visits a line number declaration. * Visits a line number declaration.
* *
* @param line a line number. This number refers to the source file from which * @param line a line number. This number refers to the source file from which the class was
* the class was compiled. * compiled.
* @param start the first instruction corresponding to this line number. * @param start the first instruction corresponding to this line number.
* @throws IllegalArgumentException if <tt>start</tt> has not already been * @throws IllegalArgumentException if <tt>start</tt> has not already been visited by this
* visited by this visitor (by the * visitor (by the {@link #visitLabel visitLabel} method).
* {@link #visitLabel visitLabel} method).
*/ */
public void visitLineNumber(int line, Label start) { public void visitLineNumber(int line, Label start) {
currBlock.add(currInsn); currBlock.add(currInsn);
@ -557,7 +544,8 @@ public abstract class CFGraph {
} }
@Override @Override
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) { public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
Object... bsmArgs) {
addTryCatchNodes(); addTryCatchNodes();
} }

View File

@ -8,10 +8,6 @@ import java.util.List;
import org.objectweb.asm.Opcodes; import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.AbstractInsnNode;
import org.bdware.analysis.BasicBlock;
import org.bdware.analysis.CFGraph;
import org.bdware.analysis.InsnPrinter;
import org.bdware.analysis.OpInfo;
import org.bdware.analysis.taint.TaintBB; import org.bdware.analysis.taint.TaintBB;
import org.bdware.analysis.taint.TaintCFG; import org.bdware.analysis.taint.TaintCFG;

View File

@ -25,21 +25,17 @@ public class InsnPrinter extends MethodVisitor {
/** /**
* Visits a zero operand instruction. * Visits a zero operand instruction.
* *
* @param opcode the opcode of the instruction to be visited. This opcode is * @param opcode the opcode of the instruction to be visited. This opcode is either NOP,
* either NOP, ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1, * ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5,
* ICONST_2, ICONST_3, ICONST_4, ICONST_5, LCONST_0, LCONST_1, * LCONST_0, LCONST_1, FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD, LALOAD,
* FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD, * FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IASTORE, LASTORE, FASTORE, DASTORE,
* LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, * AASTORE, BASTORE, CASTORE, SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1,
* IASTORE, LASTORE, FASTORE, DASTORE, AASTORE, BASTORE, CASTORE, * DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB, IMUL, LMUL, FMUL, DMUL,
* SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, * IDIV, LDIV, FDIV, DDIV, IREM, LREM, FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL,
* DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB, * ISHR, LSHR, IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D, L2I, L2F,
* IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM, * L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S, LCMP, FCMPL, FCMPG, DCMPL, DCMPG,
* FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL, ISHR, LSHR, * IRETURN, LRETURN, FRETURN, DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW,
* IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D, * MONITORENTER, or MONITOREXIT.
* L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S,
* LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IRETURN, LRETURN, FRETURN,
* DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW, MONITORENTER, or
* MONITOREXIT.
*/ */
public void visitInsn(int opcode) { public void visitInsn(int opcode) {
ps.println(OpInfo.ops[opcode].toString()); ps.println(OpInfo.ops[opcode].toString());
@ -48,32 +44,31 @@ public class InsnPrinter extends MethodVisitor {
/** /**
* Visits an instruction with a single int operand. * Visits an instruction with a single int operand.
* *
* @param opcode the opcode of the instruction to be visited. This opcode is * @param opcode the opcode of the instruction to be visited. This opcode is either BIPUSH,
* either BIPUSH, SIPUSH or NEWARRAY. * SIPUSH or NEWARRAY.
* @param operand the operand of the instruction to be visited.<br> * @param operand the operand of the instruction to be visited.<br>
* When opcode is BIPUSH, operand value should be between * When opcode is BIPUSH, operand value should be between Byte.MIN_VALUE and
* Byte.MIN_VALUE and Byte.MAX_VALUE.<br> * Byte.MAX_VALUE.<br>
* When opcode is SIPUSH, operand value should be between * When opcode is SIPUSH, operand value should be between Short.MIN_VALUE and
* Short.MIN_VALUE and Short.MAX_VALUE.<br> * Short.MAX_VALUE.<br>
* When opcode is NEWARRAY, operand value should be one of * When opcode is NEWARRAY, operand value should be one of {@link Opcodes#T_BOOLEAN},
* {@link Opcodes#T_BOOLEAN}, {@link Opcodes#T_CHAR}, * {@link Opcodes#T_CHAR}, {@link Opcodes#T_FLOAT}, {@link Opcodes#T_DOUBLE},
* {@link Opcodes#T_FLOAT}, {@link Opcodes#T_DOUBLE}, * {@link Opcodes#T_BYTE}, {@link Opcodes#T_SHORT}, {@link Opcodes#T_INT} or
* {@link Opcodes#T_BYTE}, {@link Opcodes#T_SHORT}, * {@link Opcodes#T_LONG}.
* {@link Opcodes#T_INT} or {@link Opcodes#T_LONG}.
*/ */
public void visitIntInsn(int opcode, int operand) { public void visitIntInsn(int opcode, int operand) {
ps.println(OpInfo.ops[opcode].toString() + " " + operand); ps.println(OpInfo.ops[opcode].toString() + " " + operand);
} }
/** /**
* Visits a local variable instruction. A local variable instruction is an * Visits a local variable instruction. A local variable instruction is an instruction that
* instruction that loads or stores the value of a local variable. * loads or stores the value of a local variable.
* *
* @param opcode the opcode of the local variable instruction to be visited. * @param opcode the opcode of the local variable instruction to be visited. This opcode is
* This opcode is either ILOAD, LLOAD, FLOAD, DLOAD, ALOAD, * either ILOAD, LLOAD, FLOAD, DLOAD, ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or
* ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or RET. * RET.
* @param var the operand of the instruction to be visited. This operand is * @param var the operand of the instruction to be visited. This operand is the index of a local
* the index of a local variable. * variable.
*/ */
public void visitVarInsn(int opcode, int var) { public void visitVarInsn(int opcode, int var) {
ps.println(OpInfo.ops[opcode].toString() + " " + var); ps.println(OpInfo.ops[opcode].toString() + " " + var);
@ -81,14 +76,13 @@ public class InsnPrinter extends MethodVisitor {
} }
/** /**
* Visits a type instruction. A type instruction is an instruction that takes * Visits a type instruction. A type instruction is an instruction that takes the internal name
* the internal name of a class as parameter. * of a class as parameter.
* *
* @param opcode the opcode of the type instruction to be visited. This opcode * @param opcode the opcode of the type instruction to be visited. This opcode is either NEW,
* is either NEW, ANEWARRAY, CHECKCAST or INSTANCEOF. * ANEWARRAY, CHECKCAST or INSTANCEOF.
* @param type the operand of the instruction to be visited. This operand must * @param type the operand of the instruction to be visited. This operand must be the internal
* be the internal name of an object or array class (see * name of an object or array class (see {@link Type#getInternalName() getInternalName}).
* {@link Type#getInternalName() getInternalName}).
*/ */
public void visitTypeInsn(int opcode, String type) { public void visitTypeInsn(int opcode, String type) {
ps.println(OpInfo.ops[opcode].toString() + " " + type); ps.println(OpInfo.ops[opcode].toString() + " " + type);
@ -96,13 +90,13 @@ public class InsnPrinter extends MethodVisitor {
} }
/** /**
* Visits a field instruction. A field instruction is an instruction that loads * Visits a field instruction. A field instruction is an instruction that loads or stores the
* or stores the value of a field of an object. * value of a field of an object.
* *
* @param opcode the opcode of the type instruction to be visited. This opcode * @param opcode the opcode of the type instruction to be visited. This opcode is either
* is either GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD. * GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
* @param owner the internal name of the field's owner class (see * @param owner the internal name of the field's owner class (see {@link Type#getInternalName()
* {@link Type#getInternalName() getInternalName}). * getInternalName}).
* @param name the field's name. * @param name the field's name.
* @param desc the field's descriptor (see {@link Type Type}). * @param desc the field's descriptor (see {@link Type Type}).
*/ */
@ -112,14 +106,12 @@ public class InsnPrinter extends MethodVisitor {
} }
/** /**
* Visits a method instruction. A method instruction is an instruction that * Visits a method instruction. A method instruction is an instruction that invokes a method.
* invokes a method.
* *
* @param opcode the opcode of the type instruction to be visited. This opcode * @param opcode the opcode of the type instruction to be visited. This opcode is either
* is either INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or * INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or INVOKEINTERFACE.
* INVOKEINTERFACE. * @param owner the internal name of the method's owner class (see {@link Type#getInternalName()
* @param owner the internal name of the method's owner class (see * getInternalName}).
* {@link Type#getInternalName() getInternalName}).
* @param name the method's name. * @param name the method's name.
* @param desc the method's descriptor (see {@link Type Type}). * @param desc the method's descriptor (see {@link Type Type}).
*/ */
@ -134,15 +126,14 @@ public class InsnPrinter extends MethodVisitor {
* @param name the method's name. * @param name the method's name.
* @param desc the method's descriptor (see {@link Type Type}). * @param desc the method's descriptor (see {@link Type Type}).
* @param bsm the bootstrap method. * @param bsm the bootstrap method.
* @param bsmArgs the bootstrap method constant arguments. Each argument must be * @param bsmArgs the bootstrap method constant arguments. Each argument must be an
* an {@link Integer}, {@link Float}, {@link Long}, * {@link Integer}, {@link Float}, {@link Long}, {@link Double}, {@link String},
* {@link Double}, {@link String}, {@link Type} or {@link Handle} * {@link Type} or {@link Handle} value. This method is allowed to modify the content of
* value. This method is allowed to modify the content of the * the array so a caller should expect that this array may change.
* array so a caller should expect that this array may change.
*/ */
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) { public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
ps.println(OpInfo.INVOKEDYNAMIC.toString() + " " + name + " " + desc + " HANDLE:" + bsm.toString() + " " ps.println(OpInfo.INVOKEDYNAMIC.toString() + " " + name + " " + desc + " HANDLE:"
+ objs2Str(bsmArgs)); + bsm.toString() + " " + objs2Str(bsmArgs));
} }
@ -154,16 +145,14 @@ public class InsnPrinter extends MethodVisitor {
} }
/** /**
* Visits a jump instruction. A jump instruction is an instruction that may jump * Visits a jump instruction. A jump instruction is an instruction that may jump to another
* to another instruction. * instruction.
* *
* @param opcode the opcode of the type instruction to be visited. This opcode * @param opcode the opcode of the type instruction to be visited. This opcode is either IFEQ,
* is either IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ, * IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT,
* IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, * IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.
* IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL. * @param label the operand of the instruction to be visited. This operand is a label that
* @param label the operand of the instruction to be visited. This operand is a * designates the instruction to which the jump instruction may jump.
* label that designates the instruction to which the jump
* instruction may jump.
*/ */
public void visitJumpInsn(int opcode, Label label) { public void visitJumpInsn(int opcode, Label label) {
ps.println(OpInfo.ops[opcode].toString() + getLabelStr(label)); ps.println(OpInfo.ops[opcode].toString() + getLabelStr(label));
@ -171,8 +160,7 @@ public class InsnPrinter extends MethodVisitor {
} }
/** /**
* Visits a label. A label designates the instruction that will be visited just * Visits a label. A label designates the instruction that will be visited just after it.
* after it.
* *
* @param label a {@link Label Label} object. * @param label a {@link Label Label} object.
*/ */
@ -190,10 +178,9 @@ public class InsnPrinter extends MethodVisitor {
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
/** /**
* Visits a LDC instruction. Note that new constant types may be added in future * Visits a LDC instruction. Note that new constant types may be added in future versions of the
* versions of the Java Virtual Machine. To easily detect new constant types, * Java Virtual Machine. To easily detect new constant types, implementations of this method
* implementations of this method should check for unexpected constant types, * should check for unexpected constant types, like this:
* like this:
* *
* <pre> * <pre>
* if (cst instanceof Integer) { * if (cst instanceof Integer) {
@ -224,13 +211,11 @@ public class InsnPrinter extends MethodVisitor {
* } * }
* </pre> * </pre>
* *
* @param cst the constant to be loaded on the stack. This parameter must be a * @param cst the constant to be loaded on the stack. This parameter must be a non null
* non null {@link Integer}, a {@link Float}, a {@link Long}, a * {@link Integer}, a {@link Float}, a {@link Long}, a {@link Double}, a {@link String},
* {@link Double}, a {@link String}, a {@link Type} of OBJECT or * a {@link Type} of OBJECT or ARRAY sort for <tt>.class</tt> constants, for classes
* ARRAY sort for <tt>.class</tt> constants, for classes whose * whose version is 49.0, a {@link Type} of METHOD sort or a {@link Handle} for
* version is 49.0, a {@link Type} of METHOD sort or a {@link Handle} * MethodType and MethodHandle constants, for classes whose version is 51.0.
* for MethodType and MethodHandle constants, for classes whose
* version is 51.0.
*/ */
public void visitLdcInsn(Object cst) { public void visitLdcInsn(Object cst) {
ps.println("ldc " + cst); ps.println("ldc " + cst);
@ -252,11 +237,12 @@ public class InsnPrinter extends MethodVisitor {
* @param min the minimum key value. * @param min the minimum key value.
* @param max the maximum key value. * @param max the maximum key value.
* @param dflt beginning of the default handler block. * @param dflt beginning of the default handler block.
* @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the * @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the beginning of the
* beginning of the handler block for the <tt>min + i</tt> key. * handler block for the <tt>min + i</tt> key.
*/ */
public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) { public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) {
ps.println(OpInfo.TABLESWITCH.toString() + " labels:" + getLabelStr(dflt) + " " + convertLabels(labels)); ps.println(OpInfo.TABLESWITCH.toString() + " labels:" + getLabelStr(dflt) + " "
+ convertLabels(labels));
} }
@ -272,11 +258,12 @@ public class InsnPrinter extends MethodVisitor {
* *
* @param dflt beginning of the default handler block. * @param dflt beginning of the default handler block.
* @param keys the values of the keys. * @param keys the values of the keys.
* @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the * @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the beginning of the
* beginning of the handler block for the <tt>keys[i]</tt> key. * handler block for the <tt>keys[i]</tt> key.
*/ */
public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) { public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
ps.println(OpInfo.LOOKUPSWITCH.toString() + " labels:" + getLabelStr(dflt) + " " + convertLabels(labels)); ps.println(OpInfo.LOOKUPSWITCH.toString() + " labels:" + getLabelStr(dflt) + " "
+ convertLabels(labels));
} }

View File

@ -186,7 +186,8 @@ public enum OpInfo implements CFType {
INVOKEVIRTUAL(0xb6, "invokevirtual", kInstrInvoke | kInstrCanThrow, 0), // dynamic changing-- -- INVOKEVIRTUAL(0xb6, "invokevirtual", kInstrInvoke | kInstrCanThrow, 0), // dynamic changing-- --
INVOKESPECIAL(0xb7, "invokespecial", kInstrInvoke | kInstrCanThrow, 0), // dynamic changing-- -- INVOKESPECIAL(0xb7, "invokespecial", kInstrInvoke | kInstrCanThrow, 0), // dynamic changing-- --
INVOKESTATIC(0xb8, "invokestatic", kInstrInvoke | kInstrCanThrow, 0), // dynamic changing-- -- INVOKESTATIC(0xb8, "invokestatic", kInstrInvoke | kInstrCanThrow, 0), // dynamic changing-- --
INVOKEINTERFACE(0xb9, "invokeinterface", kInstrInvoke | kInstrCanThrow, 0), // dynamic changing-- -- INVOKEINTERFACE(0xb9, "invokeinterface", kInstrInvoke | kInstrCanThrow, 0), // dynamic
// changing-- --
INVOKEDYNAMIC(0xba, "invokedynamic", kInstrInvoke | kInstrCanThrow, 0), // dynamic changing-- -- INVOKEDYNAMIC(0xba, "invokedynamic", kInstrInvoke | kInstrCanThrow, 0), // dynamic changing-- --
NEW(0xbb, "new", kInstrCanContinue, 1), // -- NEW(0xbb, "new", kInstrCanContinue, 1), // --
NEWARRAY(0xbc, "newarray", kInstrCanContinue, 0), // -- NEWARRAY(0xbc, "newarray", kInstrCanContinue, 0), // --
@ -203,6 +204,7 @@ public enum OpInfo implements CFType {
IFNONNULL(0xc7, "ifnonnull", kInstrCanBranch, -1), // -- IFNONNULL(0xc7, "ifnonnull", kInstrCanBranch, -1), // --
GOTO_W(0xc8, "goto_w", kInstrCanBranch, 0), // -- GOTO_W(0xc8, "goto_w", kInstrCanBranch, 0), // --
JSR_W(0xc9, "jsr_w", kInstrCanContinue, 1);// ??-- JSR_W(0xc9, "jsr_w", kInstrCanContinue, 1);// ??--
public final static OpInfo ops[] = new OpInfo[256]; public final static OpInfo ops[] = new OpInfo[256];
static { static {
@ -219,8 +221,7 @@ public enum OpInfo implements CFType {
private String displayName; private String displayName;
private int opcode; private int opcode;
OpInfo() { OpInfo() {}
}
OpInfo(int opcode, String displayName, int branchType, int changStack) { OpInfo(int opcode, String displayName, int branchType, int changStack) {
flags = branchType; flags = branchType;

View File

@ -18,7 +18,8 @@ import org.objectweb.asm.tree.MethodNode;
import java.util.*; import java.util.*;
public class FieldSensitiveDynamicTaintAnalysis extends BreadthFirstSearch<TaintResult, TaintBB> { public class FieldSensitiveDynamicTaintAnalysis extends BreadthFirstSearch<TaintResult, TaintBB> {
private static final Logger LOGGER = LogManager.getLogger(FieldSensitiveDynamicTaintAnalysis.class); private static final Logger LOGGER =
LogManager.getLogger(FieldSensitiveDynamicTaintAnalysis.class);
public static boolean isDebug = false; public static boolean isDebug = false;
TaintCFG cfg; TaintCFG cfg;
TracedFile tf; TracedFile tf;

View File

@ -27,7 +27,8 @@ public class NaiveDynamicTaintAnalysis extends BreadthFirstSearch<TaintResult, T
String methodDesc = mn.desc; String methodDesc = mn.desc;
methodDesc = methodDesc.replaceAll("\\).*$", ")"); methodDesc = methodDesc.replaceAll("\\).*$", ")");
int pos = 2; int pos = 2;
if (methodDesc.split(";").length == 3) pos = 1; if (methodDesc.split(";").length == 3)
pos = 1;
// TODO add inputBlock! // TODO add inputBlock!
TaintBB b = (TaintBB) cfg.getBasicBlockAt(0); TaintBB b = (TaintBB) cfg.getBasicBlockAt(0);
b.preResult = new TaintResult(); b.preResult = new TaintResult();
@ -47,10 +48,7 @@ public class NaiveDynamicTaintAnalysis extends BreadthFirstSearch<TaintResult, T
setToAnalysis(toAnalysis); setToAnalysis(toAnalysis);
if (isDebug) { if (isDebug) {
System.out.println("===Method:" + cfg.getMethodNode().name + cfg.getMethodNode().desc); System.out.println("===Method:" + cfg.getMethodNode().name + cfg.getMethodNode().desc);
System.out.println( System.out.println("===Local:" + cfg.getMethodNode().maxLocals + " "
"===Local:"
+ cfg.getMethodNode().maxLocals
+ " "
+ cfg.getMethodNode().maxStack); + cfg.getMethodNode().maxStack);
} }
} }
@ -68,7 +66,8 @@ public class NaiveDynamicTaintAnalysis extends BreadthFirstSearch<TaintResult, T
AbstractInsnNode insn = t.lastInsn(); AbstractInsnNode insn = t.lastInsn();
if (insn != null) { if (insn != null) {
OpInfo info = null; OpInfo info = null;
if (insn.getOpcode() >= 0) info = OpInfo.ops[insn.getOpcode()]; if (insn.getOpcode() >= 0)
info = OpInfo.ops[insn.getOpcode()];
if (info == null) { if (info == null) {
subBlock.addAll(cfg.getSucBlocks(t)); subBlock.addAll(cfg.getSucBlocks(t));
} else if (info.canThrow()) { } else if (info.canThrow()) {
@ -104,9 +103,8 @@ public class NaiveDynamicTaintAnalysis extends BreadthFirstSearch<TaintResult, T
if (functionName.contains("traceif")) { if (functionName.contains("traceif")) {
traceIfNum = (int) invoke; traceIfNum = (int) invoke;
if (branchCount.get(functionGlobel).containsKey(traceIfNum)) { if (branchCount.get(functionGlobel).containsKey(traceIfNum)) {
branchCount branchCount.get(functionGlobel).put(traceIfNum,
.get(functionGlobel) branchCount.get(functionGlobel).get(traceIfNum) + 1);
.put(traceIfNum, branchCount.get(functionGlobel).get(traceIfNum) + 1);
} else { } else {
branchCount.get(functionGlobel).put(traceIfNum, 1); branchCount.get(functionGlobel).put(traceIfNum, 1);
} }

View File

@ -43,13 +43,13 @@ public class ProgramPoint {
JsonObject jo = JsonUtil.parseStringAsJsonObject(string); JsonObject jo = JsonUtil.parseStringAsJsonObject(string);
if (jo.get("traceMark") != null) { if (jo.get("traceMark") != null) {
if (jo.get("lval") != null) { if (jo.get("lval") != null) {
transaction.insert( transaction.insert(jo.get("traceMark").getAsInt(),
jo.get("traceMark").getAsInt(), jo.get("lval").getAsInt()); jo.get("lval").getAsInt());
transaction.insert( transaction.insert(jo.get("traceMark").getAsInt(),
jo.get("traceMark").getAsInt(), jo.get("rval").getAsInt()); jo.get("rval").getAsInt());
} else { } else {
transaction.insert( transaction.insert(jo.get("traceMark").getAsInt(),
jo.get("traceMark").getAsInt(), jo.get("val").getAsInt()); jo.get("val").getAsInt());
} }
} }
} }

View File

@ -21,16 +21,14 @@ public class FieldSensitiveTaintAnalysis extends BreadthFirstSearch<TaintResult,
this.cfg = cfg; this.cfg = cfg;
List<TaintBB> toAnalysis = new ArrayList<>(); List<TaintBB> toAnalysis = new ArrayList<>();
/* /*
* NaiveTaintBB<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> boolean inList NaiveTaintResult preResult NaiveTaintResult * NaiveTaintBB<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> boolean inList NaiveTaintResult preResult NaiveTaintResult sucResult
* sucResult
*/ */
TaintBB b = (TaintBB) cfg.getBasicBlockAt(0); TaintBB b = (TaintBB) cfg.getBasicBlockAt(0);
/* /*
* NaiveTaintResult<EFBFBD>еı<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Frame<TaintValue> frame TaintInterpreter interpreter * NaiveTaintResult<EFBFBD>еı<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Frame<TaintValue> frame TaintInterpreter interpreter TaintValue
* TaintValue ret InsnPrinter printer int nLocals int nStack * ret InsnPrinter printer int nLocals int nStack NaiveTaintResult<EFBFBD>е<EFBFBD><EFBFBD> TaintValue int size
* NaiveTaintResult<EFBFBD>е<EFBFBD><EFBFBD> TaintValue int size boolean isTainted * boolean isTainted TaintInterpreter() NaiveTaintResult currentResult Frame<EFBFBD>еı<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> V
* TaintInterpreter() NaiveTaintResult currentResult Frame<EFBFBD>еı<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> V returnValue * returnValue //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊvoid<EFBFBD><EFBFBD>Ϊnull V[] values //<EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> int locals
* //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊvoid<EFBFBD><EFBFBD>Ϊnull V[] values //<EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> int locals
* //<EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD> int top //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD> * //<EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD> int top //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD>
*/ */
b.preResult = new TaintResult(); b.preResult = new TaintResult();
@ -40,10 +38,9 @@ public class FieldSensitiveTaintAnalysis extends BreadthFirstSearch<TaintResult,
TaintResult.interpreter.setTaintBits(cfg.taintBits); TaintResult.interpreter.setTaintBits(cfg.taintBits);
b.preResult.frame.setLocal(arg, new TaintValue(1, cfg.taintBits.allocate("arg" + arg))); b.preResult.frame.setLocal(arg, new TaintValue(1, cfg.taintBits.allocate("arg" + arg)));
/* /*
* if (NaiveTaintResult.nLocals > 2) { b.preResult.frame.setLocal(0, new * if (NaiveTaintResult.nLocals > 2) { b.preResult.frame.setLocal(0, new TaintValue(1,
* TaintValue(1, cfg.taintBits.allocate("arg0"))); b.preResult.frame.setLocal(1, * cfg.taintBits.allocate("arg0"))); b.preResult.frame.setLocal(1, new TaintValue(1,
* new TaintValue(1, cfg.taintBits.allocate("arg1"))); * cfg.taintBits.allocate("arg1"))); b.preResult.frame.setLocal(2, new TaintValue(1,
* b.preResult.frame.setLocal(2, new TaintValue(1,
* cfg.taintBits.allocate("arg2"))); } * cfg.taintBits.allocate("arg2"))); }
*/ */
// .ret = TaintValue<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>size=1 // .ret = TaintValue<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>size=1
@ -54,8 +51,7 @@ public class FieldSensitiveTaintAnalysis extends BreadthFirstSearch<TaintResult,
b.setInList(true); b.setInList(true);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>BreadthFirstSearch<EFBFBD><EFBFBD><EFBFBD>еĺ<EFBFBD><EFBFBD><EFBFBD>setToAnalysis<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱBreadthFirstSearch<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>toAnalysisΪ<EFBFBD><EFBFBD>ǰ<EFBFBD>Ŀ<EFBFBD><EFBFBD>б<EFBFBD>ֻ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>B0 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>BreadthFirstSearch<EFBFBD><EFBFBD><EFBFBD>еĺ<EFBFBD><EFBFBD><EFBFBD>setToAnalysis<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱBreadthFirstSearch<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>toAnalysisΪ<EFBFBD><EFBFBD>ǰ<EFBFBD>Ŀ<EFBFBD><EFBFBD>б<EFBFBD>ֻ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>B0
/* /*
* BreadthFirstSearch<EFBFBD><EFBFBD><EFBFBD>еı<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Map<T, AnalysisResult> results; List<T> * BreadthFirstSearch<EFBFBD><EFBFBD><EFBFBD>еı<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Map<T, AnalysisResult> results; List<T> toAnalysis;
* toAnalysis;
*/ */
setToAnalysis(toAnalysis); setToAnalysis(toAnalysis);
if (isDebug) { if (isDebug) {

View File

@ -37,10 +37,7 @@ public class MultiSourceTaintAnalysis extends BreadthFirstSearch<TaintResult, Ta
setToAnalysis(toAnalysis); setToAnalysis(toAnalysis);
if (TaintConfig.isDebug) { if (TaintConfig.isDebug) {
System.out.println("===Method:" + cfg.getMethodNode().name + cfg.getMethodNode().desc); System.out.println("===Method:" + cfg.getMethodNode().name + cfg.getMethodNode().desc);
System.out.println( System.out.println("===Local:" + cfg.getMethodNode().maxLocals + " "
"===Local:"
+ cfg.getMethodNode().maxLocals
+ " "
+ cfg.getMethodNode().maxStack); + cfg.getMethodNode().maxStack);
} }
} }
@ -57,17 +54,11 @@ public class MultiSourceTaintAnalysis extends BreadthFirstSearch<TaintResult, Ta
for (BasicBlock bb : subBlock) { for (BasicBlock bb : subBlock) {
TaintBB ntbb = (TaintBB) bb; TaintBB ntbb = (TaintBB) bb;
if (TaintConfig.isDebug) if (TaintConfig.isDebug)
System.out.println( System.out.println("[MultiSoruceTaintAnalysis] B" + ntbb.blockID + " beforeMerge:"
"[MultiSoruceTaintAnalysis] B"
+ ntbb.blockID
+ " beforeMerge:"
+ ntbb.preResult.frame2Str()); + ntbb.preResult.frame2Str());
ntbb.preResult.mergeResult(t.sucResult); ntbb.preResult.mergeResult(t.sucResult);
if (TaintConfig.isDebug) if (TaintConfig.isDebug)
System.out.println( System.out.println("[MultiSoruceTaintAnalysis] B" + ntbb.blockID + " afterMerge:"
"[MultiSoruceTaintAnalysis] B"
+ ntbb.blockID
+ " afterMerge:"
+ ntbb.preResult.frame2Str()); + ntbb.preResult.frame2Str());
ret.add(ntbb); ret.add(ntbb);
@ -95,9 +86,10 @@ public class MultiSourceTaintAnalysis extends BreadthFirstSearch<TaintResult, Ta
} }
} }
} }
/*Step2: Traverse all the blocks, for each block, traverse all the depBlocks, /*
* for each depBlock, traverse all the sucBlocks, * Step2: Traverse all the blocks, for each block, traverse all the depBlocks, for each
* if all the sucBlocks are arrival from each block, then the block is dependency with the depBlock. * depBlock, traverse all the sucBlocks, if all the sucBlocks are arrival from each block,
* then the block is dependency with the depBlock.
*/ */
List<BasicBlock> blocks = cfg.getBlocks(); List<BasicBlock> blocks = cfg.getBlocks();
Map<Integer, List<Integer>> map = new HashMap<>(); Map<Integer, List<Integer>> map = new HashMap<>();
@ -108,9 +100,11 @@ public class MultiSourceTaintAnalysis extends BreadthFirstSearch<TaintResult, Ta
int sucSize = sucBlocks.size(); int sucSize = sucBlocks.size();
int count = 0; int count = 0;
for (BasicBlock sucBlock : sucBlocks) { for (BasicBlock sucBlock : sucBlocks) {
if (isArrival(cfg, sucBlock, bb)) count++; if (isArrival(cfg, sucBlock, bb))
count++;
} }
if (count > 0 && count != sucSize) list.add(id); if (count > 0 && count != sucSize)
list.add(id);
} }
map.put(bb.blockID, list); map.put(bb.blockID, list);
} }
@ -129,9 +123,7 @@ public class MultiSourceTaintAnalysis extends BreadthFirstSearch<TaintResult, Ta
} }
} }
/* /*
for(int i : entry.getValue()) * for(int i : entry.getValue()) System.out.print(i+ " "); System.out.println();
System.out.print(i+ " ");
System.out.println();
*/ */
} }
@ -141,7 +133,8 @@ public class MultiSourceTaintAnalysis extends BreadthFirstSearch<TaintResult, Ta
for (Map.Entry<Integer, List<Integer>> entry : returnMap.entrySet()) { for (Map.Entry<Integer, List<Integer>> entry : returnMap.entrySet()) {
List<Integer> listID = entry.getValue(); List<Integer> listID = entry.getValue();
for (Integer i : listID) { for (Integer i : listID) {
if (!lastBlockDep.contains(i)) lastBlockDep.add(i); if (!lastBlockDep.contains(i))
lastBlockDep.add(i);
} }
} }
returnMap.put(cfg.getBasicBlockSize() - 1, lastBlockDep); returnMap.put(cfg.getBasicBlockSize() - 1, lastBlockDep);
@ -149,13 +142,9 @@ public class MultiSourceTaintAnalysis extends BreadthFirstSearch<TaintResult, Ta
// TODO get value from branch block // TODO get value from branch block
/* /*
List<Integer> list = returnMap.get(cfg.getBasicBlockSize()-1); * List<Integer> list = returnMap.get(cfg.getBasicBlockSize()-1); for(int i : list) {
for(int i : list) { * System.out.println(i); TaintBB tb = (TaintBB) cfg.getBasicBlockAt(i);
System.out.println(i); * System.out.println("Test:"); tb.preResult.printResult(); }
TaintBB tb = (TaintBB) cfg.getBasicBlockAt(i);
System.out.println("Test:");
tb.preResult.printResult();
}
*/ */
return returnMap; return returnMap;
@ -164,20 +153,14 @@ public class MultiSourceTaintAnalysis extends BreadthFirstSearch<TaintResult, Ta
public static boolean isArrival(TaintCFG cfg, BasicBlock suc, BasicBlock bb) { public static boolean isArrival(TaintCFG cfg, BasicBlock suc, BasicBlock bb) {
// Test // Test
/* /*
if(suc.blockID == bb.blockID) * if(suc.blockID == bb.blockID) return true; if(suc.blockID == 7 && bb.blockID == 11)
return true; * return true; if(suc.blockID == 9 && bb.blockID == 11) return true; if(suc.blockID == 7 &&
if(suc.blockID == 7 && bb.blockID == 11) * bb.blockID == 12) return true; if(suc.blockID == 9 && bb.blockID == 12) return true;
return true; * return false;
if(suc.blockID == 9 && bb.blockID == 11)
return true;
if(suc.blockID == 7 && bb.blockID == 12)
return true;
if(suc.blockID == 9 && bb.blockID == 12)
return true;
return false;
*/ */
if (suc.blockID == bb.blockID) return true; if (suc.blockID == bb.blockID)
return true;
DirectGraphDFS dgDFS = new DirectGraphDFS(cfg, suc); DirectGraphDFS dgDFS = new DirectGraphDFS(cfg, suc);
return dgDFS.isArrival(bb); return dgDFS.isArrival(bb);
} }

View File

@ -33,10 +33,7 @@ public class NaiveTaintAnalysis extends BreadthFirstSearch<TaintResult, TaintBB>
setToAnalysis(toAnalysis); setToAnalysis(toAnalysis);
if (TaintConfig.isDebug) { if (TaintConfig.isDebug) {
System.out.println("===Method:" + cfg.getMethodNode().name + cfg.getMethodNode().desc); System.out.println("===Method:" + cfg.getMethodNode().name + cfg.getMethodNode().desc);
System.out.println( System.out.println("===Local:" + cfg.getMethodNode().maxLocals + " "
"===Local:"
+ cfg.getMethodNode().maxLocals
+ " "
+ cfg.getMethodNode().maxStack); + cfg.getMethodNode().maxStack);
} }
} }

View File

@ -7,7 +7,9 @@ import org.bdware.analysis.BasicBlock;
public abstract class BFS { public abstract class BFS {
protected List<BasicBlock> toAnalysis; protected List<BasicBlock> toAnalysis;
public abstract Collection<BasicBlock> getSuc(BasicBlock BB); public abstract Collection<BasicBlock> getSuc(BasicBlock BB);
public void analysis() { public void analysis() {
BasicBlock current = null; BasicBlock current = null;
for (int i = 0; i < toAnalysis.size(); i++) { for (int i = 0; i < toAnalysis.size(); i++) {
@ -24,6 +26,7 @@ public abstract class BFS {
} }
} }
} }
public void setToAnalysis(List<BasicBlock> l) { public void setToAnalysis(List<BasicBlock> l) {
toAnalysis = l; toAnalysis = l;
} }

View File

@ -15,7 +15,8 @@ public abstract class DFS {
// System.out.println("[start.blockID]" + start.blockID); // System.out.println("[start.blockID]" + start.blockID);
Set<BasicBlock> sucBlocks = getSuc(start); Set<BasicBlock> sucBlocks = getSuc(start);
for (BasicBlock bb : sucBlocks) { for (BasicBlock bb : sucBlocks) {
if (!marked[bb.blockID]) dfs(cfg, bb); if (!marked[bb.blockID])
dfs(cfg, bb);
} }
} }

View File

@ -62,8 +62,8 @@ public class Evaluates {
Set<HashMap<String, Long>> set = new HashSet<>(); Set<HashMap<String, Long>> set = new HashSet<>();
public void getGas(HashMap<String, Set<Map<Integer, HashMap<String, Integer>>>> branchCount) { public void getGas(HashMap<String, Set<Map<Integer, HashMap<String, Integer>>>> branchCount) {
for (Entry<String, Set<Map<Integer, HashMap<String, Integer>>>> varInsn : for (Entry<String, Set<Map<Integer, HashMap<String, Integer>>>> varInsn : branchCount
branchCount.entrySet()) { .entrySet()) {
sum = 0; sum = 0;
for (Map<Integer, HashMap<String, Integer>> m : varInsn.getValue()) { for (Map<Integer, HashMap<String, Integer>> m : varInsn.getValue()) {
blockGas(m); blockGas(m);
@ -84,8 +84,8 @@ public class Evaluates {
public static HashMap<String, Long> map = new HashMap<>(); public static HashMap<String, Long> map = new HashMap<>();
public void getInsnGas(Map<Integer, Set<Map<Integer, HashMap<String, Integer>>>> ppMap) { public void getInsnGas(Map<Integer, Set<Map<Integer, HashMap<String, Integer>>>> ppMap) {
for (Entry<Integer, Set<Map<Integer, HashMap<String, Integer>>>> varInsn : for (Entry<Integer, Set<Map<Integer, HashMap<String, Integer>>>> varInsn : ppMap
ppMap.entrySet()) { .entrySet()) {
sum = 0; sum = 0;
for (Map<Integer, HashMap<String, Integer>> m : varInsn.getValue()) { for (Map<Integer, HashMap<String, Integer>> m : varInsn.getValue()) {
blockGas(m); blockGas(m);

View File

@ -2,7 +2,8 @@ package org.bdware.analysis.gas;
public enum FeeSchedule { public enum FeeSchedule {
// BDaload(20L),BDstore(200L), // BDaload(20L),BDstore(200L),
BDgetMethod(10L), BDsetMethod(20L), BDnew(20L),BDcallUtil(30L), BDcallFuntion(40L), BDcall(10L), BDjump(15L), BDInsn(1L); BDgetMethod(10L), BDsetMethod(20L), BDnew(20L), BDcallUtil(30L), BDcallFuntion(40L), BDcall(
10L), BDjump(15L), BDInsn(1L);
long fee; long fee;

View File

@ -11,12 +11,8 @@ import java.util.Set;
import org.bdware.analysis.BasicBlock; import org.bdware.analysis.BasicBlock;
import org.bdware.analysis.CFGraph; import org.bdware.analysis.CFGraph;
import org.bdware.analysis.OpInfo; import org.bdware.analysis.OpInfo;
import org.bdware.analysis.gas.DFS;
import org.bdware.analysis.gas.FeeSchedule;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.Opcodes; import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.InvokeDynamicInsnNode; import org.objectweb.asm.tree.InvokeDynamicInsnNode;
import org.objectweb.asm.tree.JumpInsnNode; import org.objectweb.asm.tree.JumpInsnNode;
import org.objectweb.asm.tree.LabelNode; import org.objectweb.asm.tree.LabelNode;
@ -302,32 +298,32 @@ public class PPCount extends DFS {
if (function.contains("getProp")) { if (function.contains("getProp")) {
bdName = FeeSchedule.BDgetMethod.name(); bdName = FeeSchedule.BDgetMethod.name();
if (BlockInsn.get(globalBlockID).containsKey(bdName)) { if (BlockInsn.get(globalBlockID).containsKey(bdName)) {
BlockInsn.get(globalBlockID) BlockInsn.get(globalBlockID).put(bdName,
.put(bdName, BlockInsn.get(globalBlockID).get(bdName) + 1); BlockInsn.get(globalBlockID).get(bdName) + 1);
} else { } else {
BlockInsn.get(globalBlockID).put(bdName, 1); BlockInsn.get(globalBlockID).put(bdName, 1);
} }
} else if (function.contains("setProp")) { } else if (function.contains("setProp")) {
bdName = FeeSchedule.BDsetMethod.name(); bdName = FeeSchedule.BDsetMethod.name();
if (BlockInsn.get(globalBlockID).containsKey(bdName)) { if (BlockInsn.get(globalBlockID).containsKey(bdName)) {
BlockInsn.get(globalBlockID) BlockInsn.get(globalBlockID).put(bdName,
.put(bdName, BlockInsn.get(globalBlockID).get(bdName) + 1); BlockInsn.get(globalBlockID).get(bdName) + 1);
} else { } else {
BlockInsn.get(globalBlockID).put(bdName, 1); BlockInsn.get(globalBlockID).put(bdName, 1);
} }
} else if (function.contains("new")) { } else if (function.contains("new")) {
bdName = FeeSchedule.BDnew.name(); bdName = FeeSchedule.BDnew.name();
if (BlockInsn.get(globalBlockID).containsKey(bdName)) { if (BlockInsn.get(globalBlockID).containsKey(bdName)) {
BlockInsn.get(globalBlockID) BlockInsn.get(globalBlockID).put(bdName,
.put(bdName, BlockInsn.get(globalBlockID).get(bdName) + 1); BlockInsn.get(globalBlockID).get(bdName) + 1);
} else { } else {
BlockInsn.get(globalBlockID).put(bdName, 1); BlockInsn.get(globalBlockID).put(bdName, 1);
} }
} else if (function.contains("call") && functionName.split(":")[2].contains("Util")) { } else if (function.contains("call") && functionName.split(":")[2].contains("Util")) {
bdName = FeeSchedule.BDcallUtil.name(); bdName = FeeSchedule.BDcallUtil.name();
if (BlockInsn.get(globalBlockID).containsKey(bdName)) { if (BlockInsn.get(globalBlockID).containsKey(bdName)) {
BlockInsn.get(globalBlockID) BlockInsn.get(globalBlockID).put(bdName,
.put(bdName, BlockInsn.get(globalBlockID).get(bdName) + 1); BlockInsn.get(globalBlockID).get(bdName) + 1);
} else { } else {
BlockInsn.get(globalBlockID).put(bdName, 1); BlockInsn.get(globalBlockID).put(bdName, 1);
} }
@ -336,9 +332,7 @@ public class PPCount extends DFS {
String methName = functionName.split(":")[2]; String methName = functionName.split(":")[2];
bdName = FeeSchedule.BDcallFuntion.name(); bdName = FeeSchedule.BDcallFuntion.name();
if (BlockInsn.get(globalBlockID).containsKey(bdName)) { if (BlockInsn.get(globalBlockID).containsKey(bdName)) {
BlockInsn.get(globalBlockID) BlockInsn.get(globalBlockID).put(bdName + "," + methName,
.put(
bdName + "," + methName,
BlockInsn.get(globalBlockID).get(bdName + "," + methName) + 1); BlockInsn.get(globalBlockID).get(bdName + "," + methName) + 1);
System.out.println(" function " + functionName); System.out.println(" function " + functionName);
} else { } else {
@ -348,16 +342,16 @@ public class PPCount extends DFS {
} else if (function.contains("call")) { } else if (function.contains("call")) {
bdName = FeeSchedule.BDcall.name(); bdName = FeeSchedule.BDcall.name();
if (BlockInsn.get(globalBlockID).containsKey(bdName)) { if (BlockInsn.get(globalBlockID).containsKey(bdName)) {
BlockInsn.get(globalBlockID) BlockInsn.get(globalBlockID).put(bdName,
.put(bdName, BlockInsn.get(globalBlockID).get(bdName) + 1); BlockInsn.get(globalBlockID).get(bdName) + 1);
} else { } else {
BlockInsn.get(globalBlockID).put(bdName, 1); BlockInsn.get(globalBlockID).put(bdName, 1);
} }
} else if (functionName.contains("traceif")) { } else if (functionName.contains("traceif")) {
bdName = FeeSchedule.BDjump.name(); bdName = FeeSchedule.BDjump.name();
if (BlockInsn.get(globalBlockID).containsKey(bdName)) { if (BlockInsn.get(globalBlockID).containsKey(bdName)) {
BlockInsn.get(globalBlockID) BlockInsn.get(globalBlockID).put(bdName,
.put(bdName, BlockInsn.get(globalBlockID).get(bdName) + 1); BlockInsn.get(globalBlockID).get(bdName) + 1);
} else { } else {
BlockInsn.get(globalBlockID).put(bdName, 1); BlockInsn.get(globalBlockID).put(bdName, 1);
} }

View File

@ -99,7 +99,8 @@ public class HeapObject extends TaintValue {
retVal = heapObject.getProp(desc); retVal = heapObject.getProp(desc);
if (retVal != null) { if (retVal != null) {
if (TaintConfig.isDebug) if (TaintConfig.isDebug)
System.out.println("[HeapObject] get:" + desc + " taintVal:" + retVal); System.out.println(
"[HeapObject] get:" + desc + " taintVal:" + retVal);
return retVal; return retVal;
} else { } else {
if (TaintConfig.isDebug) if (TaintConfig.isDebug)
@ -113,13 +114,14 @@ public class HeapObject extends TaintValue {
} else if (isDynSet((InvokeDynamicInsnNode) insn)) { } else if (isDynSet((InvokeDynamicInsnNode) insn)) {
// TaintValue tv = values.get(0); // TaintValue tv = values.get(0);
if (TaintConfig.isDebug) if (TaintConfig.isDebug)
System.out.println("[HeapObject] set:" + desc + " taintVal:" + values.get(1)); System.out
.println("[HeapObject] set:" + desc + " taintVal:" + values.get(1));
TaintValue tval = values.get(0); TaintValue tval = values.get(0);
if (tval instanceof HeapObject) { if (tval instanceof HeapObject) {
HeapObject heapObject = (HeapObject) tval; HeapObject heapObject = (HeapObject) tval;
// heapObject.merge(values.get(1)); // heapObject.merge(values.get(1));
heapObject.setProp(desc, heapObject.setProp(desc, values.get(1) instanceof HeapObject ? values.get(1)
values.get(1) instanceof HeapObject ? values.get(1) : new HeapObject(values.get(1))); : new HeapObject(values.get(1)));
} else { } else {
HeapObject heapObject = new HeapObject(tval); HeapObject heapObject = new HeapObject(tval);
heapObject.merge(tval); heapObject.merge(tval);
@ -158,7 +160,8 @@ public class HeapObject extends TaintValue {
} }
private static boolean isGetScopeObject(MethodInsnNode insn) { private static boolean isGetScopeObject(MethodInsnNode insn) {
if (insn.owner.contains("wrp/jdk/nashorn/internal/runtime/ScriptFunction") && insn.name.equals("getScope")) if (insn.owner.contains("wrp/jdk/nashorn/internal/runtime/ScriptFunction")
&& insn.name.equals("getScope"))
return true; return true;
return false; return false;
} }

View File

@ -42,7 +42,8 @@ public class TaintBB extends BasicBlock implements AnalysisTarget {
TaintResult currentResult = sucResult; TaintResult currentResult = sucResult;
List<AbstractInsnNode> insns = getInsn(); List<AbstractInsnNode> insns = getInsn();
if (TaintConfig.isDebug) if (TaintConfig.isDebug)
System.out.println("[TaintBB] Enter B" + blockID + ":" + getResult() + " size:" + insns.size()); System.out.println(
"[TaintBB] Enter B" + blockID + ":" + getResult() + " size:" + insns.size());
for (int i = 0; i < insns.size(); i++) { for (int i = 0; i < insns.size(); i++) {
currentResult = (TaintResult) currentResult.merge(insns.get(i)); currentResult = (TaintResult) currentResult.merge(insns.get(i));
@ -50,7 +51,8 @@ public class TaintBB extends BasicBlock implements AnalysisTarget {
currentResult.mergeResult(oldSuc); currentResult.mergeResult(oldSuc);
if (TaintConfig.isDebug) if (TaintConfig.isDebug)
System.out.println("[TaintBB] Leave B" + blockID + ":" + getResult() + " size:" + insns.size()); System.out.println(
"[TaintBB] Leave B" + blockID + ":" + getResult() + " size:" + insns.size());
// already done. // already done.
return currentResult; return currentResult;
} }
@ -58,9 +60,11 @@ public class TaintBB extends BasicBlock implements AnalysisTarget {
public AbstractInsnNode lastInsn() { public AbstractInsnNode lastInsn() {
return list.get(list.size() - 1); return list.get(list.size() - 1);
} }
public AbstractInsnNode firstInsn() { public AbstractInsnNode firstInsn() {
return list.get(0); return list.get(0);
} }
public List<AbstractInsnNode> AllInsn() { public List<AbstractInsnNode> AllInsn() {
return list; return list;
} }

View File

@ -48,7 +48,8 @@ public class TaintCFG extends CFGraph {
public void printSelf() { public void printSelf() {
InsnPrinter printer = new InsnPrinter(Opcodes.ASM4, System.out); InsnPrinter printer = new InsnPrinter(Opcodes.ASM4, System.out);
printer.setLabelOrder(getLabelOrder()); printer.setLabelOrder(getLabelOrder());
System.out.println("======Method:" + getMethodNode().name + getMethodNode().desc + "======="); System.out
.println("======Method:" + getMethodNode().name + getMethodNode().desc + "=======");
System.out.println("=====TaintInfo: " + taintBits.taintInfo() + "==========="); System.out.println("=====TaintInfo: " + taintBits.taintInfo() + "===========");
for (BasicBlock bb : basicBlocks) { for (BasicBlock bb : basicBlocks) {
System.out.print("==B" + bb.blockID); System.out.print("==B" + bb.blockID);

View File

@ -52,12 +52,14 @@ public class TaintInterpreter extends Interpreter<TaintValue> {
} }
@Override @Override
public TaintValue copyOperation(AbstractInsnNode insn, TaintValue value) throws AnalyzerException { public TaintValue copyOperation(AbstractInsnNode insn, TaintValue value)
throws AnalyzerException {
return value; return value;
} }
@Override @Override
public TaintValue unaryOperation(AbstractInsnNode insn, TaintValue value) throws AnalyzerException { public TaintValue unaryOperation(AbstractInsnNode insn, TaintValue value)
throws AnalyzerException {
return value; return value;
} }
@ -65,12 +67,11 @@ public class TaintInterpreter extends Interpreter<TaintValue> {
public TaintValue binaryOperation(AbstractInsnNode insn, TaintValue value1, TaintValue value2) public TaintValue binaryOperation(AbstractInsnNode insn, TaintValue value1, TaintValue value2)
throws AnalyzerException { throws AnalyzerException {
/* /*
* IALOAD, LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IADD, LADD, * IALOAD, LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IADD, LADD, FADD, DADD,
* FADD, DADD, ISUB, LSUB, FSUB, DSUB, IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, * ISUB, LSUB, FSUB, DSUB, IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM, FREM,
* DDIV, IREM, LREM, FREM, DREM, ISHL, LSHL, ISHR, LSHR, IUSHR, LUSHR, IAND, * DREM, ISHL, LSHL, ISHR, LSHR, IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, LCMP,
* LAND, IOR, LOR, IXOR, LXOR, LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IF_ICMPEQ, * FCMPL, FCMPG, DCMPL, DCMPG, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT,
* IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE, * IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE, PUTFIELD
* PUTFIELD
*/ */
TaintValue ret = new TaintValue(1); TaintValue ret = new TaintValue(1);
ret.isTainted = value1.isTainted | value2.isTainted; ret.isTainted = value1.isTainted | value2.isTainted;
@ -100,19 +101,20 @@ public class TaintInterpreter extends Interpreter<TaintValue> {
} }
@Override @Override
public TaintValue ternaryOperation(AbstractInsnNode insn, TaintValue value1, TaintValue value2, TaintValue value3) public TaintValue ternaryOperation(AbstractInsnNode insn, TaintValue value1, TaintValue value2,
throws AnalyzerException { TaintValue value3) throws AnalyzerException {
// TODO // TODO
value1.isTainted |= value3.isTainted; value1.isTainted |= value3.isTainted;
return value1; return value1;
} }
@Override @Override
public TaintValue naryOperation(AbstractInsnNode insn, List<? extends TaintValue> values) throws AnalyzerException { public TaintValue naryOperation(AbstractInsnNode insn, List<? extends TaintValue> values)
throws AnalyzerException {
int size = 1; int size = 1;
/* /*
* INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC, INVOKEINTERFACE, MULTIANEWARRAY * INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC, INVOKEINTERFACE, MULTIANEWARRAY and
* and INVOKEDYNAMIC * INVOKEDYNAMIC
*/ */
String desc; String desc;
switch (insn.getOpcode()) { switch (insn.getOpcode()) {
@ -121,12 +123,14 @@ public class TaintInterpreter extends Interpreter<TaintValue> {
case Opcodes.INVOKESTATIC: case Opcodes.INVOKESTATIC:
case Opcodes.INVOKEINTERFACE: case Opcodes.INVOKEINTERFACE:
desc = ((MethodInsnNode) insn).desc; desc = ((MethodInsnNode) insn).desc;
if (desc != null && (desc.charAt(desc.length() - 1) == 'D' || desc.charAt(desc.length() - 1) == 'J')) if (desc != null && (desc.charAt(desc.length() - 1) == 'D'
|| desc.charAt(desc.length() - 1) == 'J'))
size = 2; size = 2;
break; break;
case Opcodes.INVOKEDYNAMIC: case Opcodes.INVOKEDYNAMIC:
desc = ((InvokeDynamicInsnNode) insn).desc; desc = ((InvokeDynamicInsnNode) insn).desc;
if (desc != null && (desc.charAt(desc.length() - 1) == 'D' || desc.charAt(desc.length() - 1) == 'J')) if (desc != null && (desc.charAt(desc.length() - 1) == 'D'
|| desc.charAt(desc.length() - 1) == 'J'))
size = 2; size = 2;
// Extra..Judgeffff x // Extra..Judgeffff x
@ -143,7 +147,8 @@ public class TaintInterpreter extends Interpreter<TaintValue> {
if (v != null) if (v != null)
ret.isTainted |= v.isTainted; ret.isTainted |= v.isTainted;
if (insn instanceof InvokeDynamicInsnNode) { if (insn instanceof InvokeDynamicInsnNode) {
long taint = (taintBits.getTaintValue(((InvokeDynamicInsnNode) insn).name + insn.hashCode())); long taint = (taintBits
.getTaintValue(((InvokeDynamicInsnNode) insn).name + insn.hashCode()));
if (taint > 0L) if (taint > 0L)
ret.isTainted |= taint; ret.isTainted |= taint;
@ -152,7 +157,8 @@ public class TaintInterpreter extends Interpreter<TaintValue> {
} }
@Override @Override
public void returnOperation(AbstractInsnNode insn, TaintValue value, TaintValue expected) throws AnalyzerException { public void returnOperation(AbstractInsnNode insn, TaintValue value, TaintValue expected)
throws AnalyzerException {
if (value instanceof HeapObject) { if (value instanceof HeapObject) {
currentResult.ret.isTainted |= ((HeapObject) value).wholeTaint(); currentResult.ret.isTainted |= ((HeapObject) value).wholeTaint();
} else if (value != null) } else if (value != null)

View File

@ -87,8 +87,8 @@ public class TaintResult extends AnalysisResult {
} }
/* /*
* private static boolean isTainted(TaintValue t1) { if (t1 != null && * private static boolean isTainted(TaintValue t1) { if (t1 != null && t1.isTainted) { return
* t1.isTainted) { return true; } return false; } * true; } return false; }
*/ */
private static boolean isTainted(TaintValue t1) { private static boolean isTainted(TaintValue t1) {
if (t1 != null && t1.isTainted != 0) { if (t1 != null && t1.isTainted != 0) {

View File

@ -1,38 +1,30 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm; package org.objectweb.asm;
/** /**
* A visitor to visit a Java annotation. The methods of this class must be * A visitor to visit a Java annotation. The methods of this class must be called in the following
* called in the following order: ( <tt>visit</tt> | <tt>visitEnum</tt> | * order: ( <tt>visit</tt> | <tt>visitEnum</tt> | <tt>visitAnnotation</tt> | <tt>visitArray</tt> )*
* <tt>visitAnnotation</tt> | <tt>visitArray</tt> )* <tt>visitEnd</tt>. * <tt>visitEnd</tt>.
* *
* @author Eric Bruneton * @author Eric Bruneton
* @author Eugene Kuleshov * @author Eugene Kuleshov
@ -40,23 +32,21 @@ package org.objectweb.asm;
public abstract class AnnotationVisitor { public abstract class AnnotationVisitor {
/** /**
* The ASM API version implemented by this visitor. The value of this field * The ASM API version implemented by this visitor. The value of this field must be one of
* must be one of {@link Opcodes#ASM4}. * {@link Opcodes#ASM4}.
*/ */
protected final int api; protected final int api;
/** /**
* The annotation visitor to which this visitor must delegate method calls. * The annotation visitor to which this visitor must delegate method calls. May be null.
* May be null.
*/ */
protected AnnotationVisitor av; protected AnnotationVisitor av;
/** /**
* Constructs a new {@link AnnotationVisitor}. * Constructs a new {@link AnnotationVisitor}.
* *
* @param api * @param api the ASM API version implemented by this visitor. Must be one of
* the ASM API version implemented by this visitor. Must be one * {@link Opcodes#ASM4}.
* of {@link Opcodes#ASM4}.
*/ */
public AnnotationVisitor(final int api) { public AnnotationVisitor(final int api) {
this(api, null); this(api, null);
@ -65,12 +55,10 @@ public abstract class AnnotationVisitor {
/** /**
* Constructs a new {@link AnnotationVisitor}. * Constructs a new {@link AnnotationVisitor}.
* *
* @param api * @param api the ASM API version implemented by this visitor. Must be one of
* the ASM API version implemented by this visitor. Must be one * {@link Opcodes#ASM4}.
* of {@link Opcodes#ASM4}. * @param av the annotation visitor to which this visitor must delegate method calls. May be
* @param av * null.
* the annotation visitor to which this visitor must delegate
* method calls. May be null.
*/ */
public AnnotationVisitor(final int api, final AnnotationVisitor av) { public AnnotationVisitor(final int api, final AnnotationVisitor av) {
if (api != Opcodes.ASM4) { if (api != Opcodes.ASM4) {
@ -83,17 +71,13 @@ public abstract class AnnotationVisitor {
/** /**
* Visits a primitive value of the annotation. * Visits a primitive value of the annotation.
* *
* @param name * @param name the value name.
* the value name. * @param value the actual value, whose type must be {@link Byte}, {@link Boolean},
* @param value * {@link Character}, {@link Short}, {@link Integer} , {@link Long}, {@link Float},
* the actual value, whose type must be {@link Byte}, * {@link Double}, {@link String} or {@link Type} or OBJECT or ARRAY sort. This value can
* {@link Boolean}, {@link Character}, {@link Short}, * also be an array of byte, boolean, short, char, int, long, float or double values
* {@link Integer} , {@link Long}, {@link Float}, {@link Double}, * (this is equivalent to using {@link #visitArray visitArray} and visiting each array
* {@link String} or {@link Type} or OBJECT or ARRAY sort. This * element in turn, but is more convenient).
* value can also be an array of byte, boolean, short, char, int,
* long, float or double values (this is equivalent to using
* {@link #visitArray visitArray} and visiting each array element
* in turn, but is more convenient).
*/ */
public void visit(String name, Object value) { public void visit(String name, Object value) {
if (av != null) { if (av != null) {
@ -104,12 +88,9 @@ public abstract class AnnotationVisitor {
/** /**
* Visits an enumeration value of the annotation. * Visits an enumeration value of the annotation.
* *
* @param name * @param name the value name.
* the value name. * @param desc the class descriptor of the enumeration class.
* @param desc * @param value the actual enumeration value.
* the class descriptor of the enumeration class.
* @param value
* the actual enumeration value.
*/ */
public void visitEnum(String name, String desc, String value) { public void visitEnum(String name, String desc, String value) {
if (av != null) { if (av != null) {
@ -120,15 +101,12 @@ public abstract class AnnotationVisitor {
/** /**
* Visits a nested annotation value of the annotation. * Visits a nested annotation value of the annotation.
* *
* @param name * @param name the value name.
* the value name. * @param desc the class descriptor of the nested annotation class.
* @param desc * @return a visitor to visit the actual nested annotation value, or <tt>null</tt> if this
* the class descriptor of the nested annotation class. * visitor is not interested in visiting this nested annotation. <i>The nested
* @return a visitor to visit the actual nested annotation value, or * annotation value must be fully visited before calling other methods on this
* <tt>null</tt> if this visitor is not interested in visiting this * annotation visitor</i>.
* nested annotation. <i>The nested annotation value must be fully
* visited before calling other methods on this annotation
* visitor</i>.
*/ */
public AnnotationVisitor visitAnnotation(String name, String desc) { public AnnotationVisitor visitAnnotation(String name, String desc) {
if (av != null) { if (av != null) {
@ -138,18 +116,15 @@ public abstract class AnnotationVisitor {
} }
/** /**
* Visits an array value of the annotation. Note that arrays of primitive * Visits an array value of the annotation. Note that arrays of primitive types (such as byte,
* types (such as byte, boolean, short, char, int, long, float or double) * boolean, short, char, int, long, float or double) can be passed as value to {@link #visit
* can be passed as value to {@link #visit visit}. This is what * visit}. This is what {@link ClassReader} does.
* {@link ClassReader} does.
* *
* @param name * @param name the value name.
* the value name. * @return a visitor to visit the actual array value elements, or <tt>null</tt> if this visitor
* @return a visitor to visit the actual array value elements, or * is not interested in visiting these values. The 'name' parameters passed to the
* <tt>null</tt> if this visitor is not interested in visiting these * methods of this visitor are ignored. <i>All the array values must be visited before
* values. The 'name' parameters passed to the methods of this * calling other methods on this annotation visitor</i>.
* visitor are ignored. <i>All the array values must be visited
* before calling other methods on this annotation visitor</i>.
*/ */
public AnnotationVisitor visitArray(String name) { public AnnotationVisitor visitArray(String name) {
if (av != null) { if (av != null) {

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm; package org.objectweb.asm;
@ -35,8 +27,7 @@ package org.objectweb.asm;
* @author Eric Bruneton * @author Eric Bruneton
* @author Eugene Kuleshov * @author Eugene Kuleshov
*/ */
final class AnnotationWriter extends AnnotationVisitor final class AnnotationWriter extends AnnotationVisitor {
{
/** /**
* The class writer to which this annotation must be added. * The class writer to which this annotation must be added.
@ -49,28 +40,24 @@ final class AnnotationWriter extends AnnotationVisitor
private int size; private int size;
/** /**
* <tt>true<tt> if values are named, <tt>false</tt> otherwise. Annotation * <tt>true<tt> if values are named, <tt>false</tt> otherwise. Annotation writers used for
* writers used for annotation default and annotation arrays use unnamed * annotation default and annotation arrays use unnamed values.
* values.
*/ */
private final boolean named; private final boolean named;
/** /**
* The annotation values in bytecode form. This byte vector only contains * The annotation values in bytecode form. This byte vector only contains the values themselves,
* the values themselves, i.e. the number of values must be stored as a * i.e. the number of values must be stored as a unsigned short just before these bytes.
* unsigned short just before these bytes.
*/ */
private final ByteVector bv; private final ByteVector bv;
/** /**
* The byte vector to be used to store the number of values of this * The byte vector to be used to store the number of values of this annotation. See {@link #bv}.
* annotation. See {@link #bv}.
*/ */
private final ByteVector parent; private final ByteVector parent;
/** /**
* Where the number of values of this annotation must be stored in * Where the number of values of this annotation must be stored in {@link #parent}.
* {@link #parent}.
*/ */
private final int offset; private final int offset;
@ -91,21 +78,14 @@ final class AnnotationWriter extends AnnotationVisitor
/** /**
* Constructs a new {@link AnnotationWriter}. * Constructs a new {@link AnnotationWriter}.
* *
* @param cw * @param cw the class writer to which this annotation must be added.
* the class writer to which this annotation must be added. * @param named <tt>true<tt> if values are named, <tt>false</tt> otherwise.
* @param named * @param bv where the annotation values must be stored.
* <tt>true<tt> if values are named, <tt>false</tt> otherwise. * @param parent where the number of annotation values must be stored.
* @param bv * @param offset where in <tt>parent</tt> the number of annotation values must be stored.
* where the annotation values must be stored.
* @param parent
* where the number of annotation values must be stored.
* @param offset
* where in <tt>parent</tt> the number of annotation values must
* be stored.
*/ */
AnnotationWriter(final ClassWriter cw, final boolean named, AnnotationWriter(final ClassWriter cw, final boolean named, final ByteVector bv,
final ByteVector bv, final ByteVector parent, final int offset) final ByteVector parent, final int offset) {
{
super(Opcodes.ASM4); super(Opcodes.ASM4);
this.cw = cw; this.cw = cw;
this.named = named; this.named = named;
@ -119,137 +99,92 @@ final class AnnotationWriter extends AnnotationVisitor
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
@Override @Override
public void visit(final String name, final Object value) public void visit(final String name, final Object value) {
{
++size; ++size;
if (named) if (named) {
{
bv.putShort(cw.newUTF8(name)); bv.putShort(cw.newUTF8(name));
} }
if (value instanceof String) if (value instanceof String) {
{
bv.put12('s', cw.newUTF8((String) value)); bv.put12('s', cw.newUTF8((String) value));
} } else if (value instanceof Byte) {
else if (value instanceof Byte)
{
bv.put12('B', cw.newInteger(((Byte) value).byteValue()).index); bv.put12('B', cw.newInteger(((Byte) value).byteValue()).index);
} } else if (value instanceof Boolean) {
else if (value instanceof Boolean)
{
int v = ((Boolean) value).booleanValue() ? 1 : 0; int v = ((Boolean) value).booleanValue() ? 1 : 0;
bv.put12('Z', cw.newInteger(v).index); bv.put12('Z', cw.newInteger(v).index);
} } else if (value instanceof Character) {
else if (value instanceof Character)
{
bv.put12('C', cw.newInteger(((Character) value).charValue()).index); bv.put12('C', cw.newInteger(((Character) value).charValue()).index);
} } else if (value instanceof Short) {
else if (value instanceof Short)
{
bv.put12('S', cw.newInteger(((Short) value).shortValue()).index); bv.put12('S', cw.newInteger(((Short) value).shortValue()).index);
} } else if (value instanceof Type) {
else if (value instanceof Type)
{
bv.put12('c', cw.newUTF8(((Type) value).getDescriptor())); bv.put12('c', cw.newUTF8(((Type) value).getDescriptor()));
} } else if (value instanceof byte[]) {
else if (value instanceof byte[])
{
byte[] v = (byte[]) value; byte[] v = (byte[]) value;
bv.put12('[', v.length); bv.put12('[', v.length);
for (int i = 0; i < v.length; i++) for (int i = 0; i < v.length; i++) {
{
bv.put12('B', cw.newInteger(v[i]).index); bv.put12('B', cw.newInteger(v[i]).index);
} }
} } else if (value instanceof boolean[]) {
else if (value instanceof boolean[])
{
boolean[] v = (boolean[]) value; boolean[] v = (boolean[]) value;
bv.put12('[', v.length); bv.put12('[', v.length);
for (int i = 0; i < v.length; i++) for (int i = 0; i < v.length; i++) {
{
bv.put12('Z', cw.newInteger(v[i] ? 1 : 0).index); bv.put12('Z', cw.newInteger(v[i] ? 1 : 0).index);
} }
} } else if (value instanceof short[]) {
else if (value instanceof short[])
{
short[] v = (short[]) value; short[] v = (short[]) value;
bv.put12('[', v.length); bv.put12('[', v.length);
for (int i = 0; i < v.length; i++) for (int i = 0; i < v.length; i++) {
{
bv.put12('S', cw.newInteger(v[i]).index); bv.put12('S', cw.newInteger(v[i]).index);
} }
} } else if (value instanceof char[]) {
else if (value instanceof char[])
{
char[] v = (char[]) value; char[] v = (char[]) value;
bv.put12('[', v.length); bv.put12('[', v.length);
for (int i = 0; i < v.length; i++) for (int i = 0; i < v.length; i++) {
{
bv.put12('C', cw.newInteger(v[i]).index); bv.put12('C', cw.newInteger(v[i]).index);
} }
} } else if (value instanceof int[]) {
else if (value instanceof int[])
{
int[] v = (int[]) value; int[] v = (int[]) value;
bv.put12('[', v.length); bv.put12('[', v.length);
for (int i = 0; i < v.length; i++) for (int i = 0; i < v.length; i++) {
{
bv.put12('I', cw.newInteger(v[i]).index); bv.put12('I', cw.newInteger(v[i]).index);
} }
} } else if (value instanceof long[]) {
else if (value instanceof long[])
{
long[] v = (long[]) value; long[] v = (long[]) value;
bv.put12('[', v.length); bv.put12('[', v.length);
for (int i = 0; i < v.length; i++) for (int i = 0; i < v.length; i++) {
{
bv.put12('J', cw.newLong(v[i]).index); bv.put12('J', cw.newLong(v[i]).index);
} }
} } else if (value instanceof float[]) {
else if (value instanceof float[])
{
float[] v = (float[]) value; float[] v = (float[]) value;
bv.put12('[', v.length); bv.put12('[', v.length);
for (int i = 0; i < v.length; i++) for (int i = 0; i < v.length; i++) {
{
bv.put12('F', cw.newFloat(v[i]).index); bv.put12('F', cw.newFloat(v[i]).index);
} }
} } else if (value instanceof double[]) {
else if (value instanceof double[])
{
double[] v = (double[]) value; double[] v = (double[]) value;
bv.put12('[', v.length); bv.put12('[', v.length);
for (int i = 0; i < v.length; i++) for (int i = 0; i < v.length; i++) {
{
bv.put12('D', cw.newDouble(v[i]).index); bv.put12('D', cw.newDouble(v[i]).index);
} }
} } else {
else
{
Item i = cw.newConstItem(value); Item i = cw.newConstItem(value);
bv.put12(".s.IFJDCS".charAt(i.type), i.index); bv.put12(".s.IFJDCS".charAt(i.type), i.index);
} }
} }
@Override @Override
public void visitEnum(final String name, final String desc, public void visitEnum(final String name, final String desc, final String value) {
final String value)
{
++size; ++size;
// TODO add by chq! &&name!=null; // TODO add by chq! &&name!=null;
if (named && name != null) if (named && name != null) {
{
bv.putShort(cw.newUTF8(name)); bv.putShort(cw.newUTF8(name));
} }
bv.put12('e', cw.newUTF8(desc)).putShort(cw.newUTF8(value)); bv.put12('e', cw.newUTF8(desc)).putShort(cw.newUTF8(value));
} }
@Override @Override
public AnnotationVisitor visitAnnotation(final String name, public AnnotationVisitor visitAnnotation(final String name, final String desc) {
final String desc)
{
++size; ++size;
if (named) if (named) {
{
bv.putShort(cw.newUTF8(name)); bv.putShort(cw.newUTF8(name));
} }
// write tag and type, and reserve space for values count // write tag and type, and reserve space for values count
@ -258,11 +193,9 @@ final class AnnotationWriter extends AnnotationVisitor
} }
@Override @Override
public AnnotationVisitor visitArray(final String name) public AnnotationVisitor visitArray(final String name) {
{
++size; ++size;
if (named) if (named) {
{
bv.putShort(cw.newUTF8(name)); bv.putShort(cw.newUTF8(name));
} }
// write tag, and reserve space for array size // write tag, and reserve space for array size
@ -271,10 +204,8 @@ final class AnnotationWriter extends AnnotationVisitor
} }
@Override @Override
public void visitEnd() public void visitEnd() {
{ if (parent != null) {
if (parent != null)
{
byte[] data = parent.data; byte[] data = parent.data;
data[offset] = (byte) (size >>> 8); data[offset] = (byte) (size >>> 8);
data[offset + 1] = (byte) size; data[offset + 1] = (byte) size;
@ -290,12 +221,10 @@ final class AnnotationWriter extends AnnotationVisitor
* *
* @return the size of this annotation writer list. * @return the size of this annotation writer list.
*/ */
int getSize() int getSize() {
{
int size = 0; int size = 0;
AnnotationWriter aw = this; AnnotationWriter aw = this;
while (aw != null) while (aw != null) {
{
size += aw.bv.length; size += aw.bv.length;
aw = aw.next; aw = aw.next;
} }
@ -303,20 +232,16 @@ final class AnnotationWriter extends AnnotationVisitor
} }
/** /**
* Puts the annotations of this annotation writer list into the given byte * Puts the annotations of this annotation writer list into the given byte vector.
* vector.
* *
* @param out * @param out where the annotations must be put.
* where the annotations must be put.
*/ */
void put(final ByteVector out) void put(final ByteVector out) {
{
int n = 0; int n = 0;
int size = 2; int size = 2;
AnnotationWriter aw = this; AnnotationWriter aw = this;
AnnotationWriter last = null; AnnotationWriter last = null;
while (aw != null) while (aw != null) {
{
++n; ++n;
size += aw.bv.length; size += aw.bv.length;
aw.visitEnd(); // in case user forgot to call visitEnd aw.visitEnd(); // in case user forgot to call visitEnd
@ -327,8 +252,7 @@ final class AnnotationWriter extends AnnotationVisitor
out.putInt(size); out.putInt(size);
out.putShort(n); out.putShort(n);
aw = last; aw = last;
while (aw != null) while (aw != null) {
{
out.putByteArray(aw.bv.data, 0, aw.bv.length); out.putByteArray(aw.bv.data, 0, aw.bv.length);
aw = aw.prev; aw = aw.prev;
} }
@ -337,29 +261,21 @@ final class AnnotationWriter extends AnnotationVisitor
/** /**
* Puts the given annotation lists into the given byte vector. * Puts the given annotation lists into the given byte vector.
* *
* @param panns * @param panns an array of annotation writer lists.
* an array of annotation writer lists. * @param off index of the first annotation to be written.
* @param off * @param out where the annotations must be put.
* index of the first annotation to be written.
* @param out
* where the annotations must be put.
*/ */
static void put(final AnnotationWriter[] panns, final int off, static void put(final AnnotationWriter[] panns, final int off, final ByteVector out) {
final ByteVector out)
{
int size = 1 + 2 * (panns.length - off); int size = 1 + 2 * (panns.length - off);
for (int i = off; i < panns.length; ++i) for (int i = off; i < panns.length; ++i) {
{
size += panns[i] == null ? 0 : panns[i].getSize(); size += panns[i] == null ? 0 : panns[i].getSize();
} }
out.putInt(size).putByte(panns.length - off); out.putInt(size).putByte(panns.length - off);
for (int i = off; i < panns.length; ++i) for (int i = off; i < panns.length; ++i) {
{
AnnotationWriter aw = panns[i]; AnnotationWriter aw = panns[i];
AnnotationWriter last = null; AnnotationWriter last = null;
int n = 0; int n = 0;
while (aw != null) while (aw != null) {
{
++n; ++n;
aw.visitEnd(); // in case user forgot to call visitEnd aw.visitEnd(); // in case user forgot to call visitEnd
aw.prev = last; aw.prev = last;
@ -368,8 +284,7 @@ final class AnnotationWriter extends AnnotationVisitor
} }
out.putShort(n); out.putShort(n);
aw = last; aw = last;
while (aw != null) while (aw != null) {
{
out.putByteArray(aw.bv.data, 0, aw.bv.length); out.putByteArray(aw.bv.data, 0, aw.bv.length);
aw = aw.prev; aw = aw.prev;
} }

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm; package org.objectweb.asm;
@ -55,16 +47,15 @@ public class Attribute {
/** /**
* Constructs a new empty attribute. * Constructs a new empty attribute.
* *
* @param type * @param type the type of the attribute.
* the type of the attribute.
*/ */
protected Attribute(final String type) { protected Attribute(final String type) {
this.type = type; this.type = type;
} }
/** /**
* Returns <tt>true</tt> if this type of attribute is unknown. The default * Returns <tt>true</tt> if this type of attribute is unknown. The default implementation of
* implementation of this method always returns <tt>true</tt>. * this method always returns <tt>true</tt>.
* *
* @return <tt>true</tt> if this type of attribute is unknown. * @return <tt>true</tt> if this type of attribute is unknown.
*/ */
@ -84,47 +75,36 @@ public class Attribute {
/** /**
* Returns the labels corresponding to this attribute. * Returns the labels corresponding to this attribute.
* *
* @return the labels corresponding to this attribute, or <tt>null</tt> if * @return the labels corresponding to this attribute, or <tt>null</tt> if this attribute is not
* this attribute is not a code attribute that contains labels. * a code attribute that contains labels.
*/ */
protected Label[] getLabels() { protected Label[] getLabels() {
return null; return null;
} }
/** /**
* Reads a {@link #type type} attribute. This method must return a * Reads a {@link #type type} attribute. This method must return a <i>new</i> {@link Attribute}
* <i>new</i> {@link Attribute} object, of type {@link #type type}, * object, of type {@link #type type}, corresponding to the <tt>len</tt> bytes starting at the
* corresponding to the <tt>len</tt> bytes starting at the given offset, in * given offset, in the given class reader.
* the given class reader.
* *
* @param cr * @param cr the class that contains the attribute to be read.
* the class that contains the attribute to be read. * @param off index of the first byte of the attribute's content in {@link ClassReader#b cr.b}.
* @param off * The 6 attribute header bytes, containing the type and the length of the attribute, are
* index of the first byte of the attribute's content in * not taken into account here.
* {@link ClassReader#b cr.b}. The 6 attribute header bytes, * @param len the length of the attribute's content.
* containing the type and the length of the attribute, are not * @param buf buffer to be used to call {@link ClassReader#readUTF8 readUTF8},
* taken into account here. * {@link ClassReader#readClass(int,char[]) readClass} or {@link ClassReader#readConst
* @param len * readConst}.
* the length of the attribute's content. * @param codeOff index of the first byte of code's attribute content in {@link ClassReader#b
* @param buf * cr.b}, or -1 if the attribute to be read is not a code attribute. The 6 attribute
* buffer to be used to call {@link ClassReader#readUTF8 * header bytes, containing the type and the length of the attribute, are not taken into
* readUTF8}, {@link ClassReader#readClass(int,char[]) readClass} * account here.
* or {@link ClassReader#readConst readConst}. * @param labels the labels of the method's code, or <tt>null</tt> if the attribute to be read
* @param codeOff * is not a code attribute.
* index of the first byte of code's attribute content in * @return a <i>new</i> {@link Attribute} object corresponding to the given bytes.
* {@link ClassReader#b cr.b}, or -1 if the attribute to be read
* is not a code attribute. The 6 attribute header bytes,
* containing the type and the length of the attribute, are not
* taken into account here.
* @param labels
* the labels of the method's code, or <tt>null</tt> if the
* attribute to be read is not a code attribute.
* @return a <i>new</i> {@link Attribute} object corresponding to the given
* bytes.
*/ */
protected Attribute read(final ClassReader cr, final int off, protected Attribute read(final ClassReader cr, final int off, final int len, final char[] buf,
final int len, final char[] buf, final int codeOff, final int codeOff, final Label[] labels) {
final Label[] labels) {
Attribute attr = new Attribute(type); Attribute attr = new Attribute(type);
attr.value = new byte[len]; attr.value = new byte[len];
System.arraycopy(cr.b, off, attr.value, 0, len); System.arraycopy(cr.b, off, attr.value, 0, len);
@ -134,30 +114,20 @@ public class Attribute {
/** /**
* Returns the byte array form of this attribute. * Returns the byte array form of this attribute.
* *
* @param cw * @param cw the class to which this attribute must be added. This parameter can be used to add
* the class to which this attribute must be added. This * to the constant pool of this class the items that corresponds to this attribute.
* parameter can be used to add to the constant pool of this * @param code the bytecode of the method corresponding to this code attribute, or <tt>null</tt>
* class the items that corresponds to this attribute. * if this attribute is not a code attributes.
* @param code * @param len the length of the bytecode of the method corresponding to this code attribute, or
* the bytecode of the method corresponding to this code * <tt>null</tt> if this attribute is not a code attribute.
* attribute, or <tt>null</tt> if this attribute is not a code * @param maxStack the maximum stack size of the method corresponding to this code attribute, or
* attributes. * -1 if this attribute is not a code attribute.
* @param len * @param maxLocals the maximum number of local variables of the method corresponding to this
* the length of the bytecode of the method corresponding to this * code attribute, or -1 if this attribute is not a code attribute.
* code attribute, or <tt>null</tt> if this attribute is not a
* code attribute.
* @param maxStack
* the maximum stack size of the method corresponding to this
* code attribute, or -1 if this attribute is not a code
* attribute.
* @param maxLocals
* the maximum number of local variables of the method
* corresponding to this code attribute, or -1 if this attribute
* is not a code attribute.
* @return the byte array form of this attribute. * @return the byte array form of this attribute.
*/ */
protected ByteVector write(final ClassWriter cw, final byte[] code, protected ByteVector write(final ClassWriter cw, final byte[] code, final int len,
final int len, final int maxStack, final int maxLocals) { final int maxStack, final int maxLocals) {
ByteVector v = new ByteVector(); ByteVector v = new ByteVector();
v.data = value; v.data = value;
v.length = value.length; v.length = value.length;
@ -182,30 +152,21 @@ public class Attribute {
/** /**
* Returns the size of all the attributes in this attribute list. * Returns the size of all the attributes in this attribute list.
* *
* @param cw * @param cw the class writer to be used to convert the attributes into byte arrays, with the
* the class writer to be used to convert the attributes into * {@link #write write} method.
* byte arrays, with the {@link #write write} method. * @param code the bytecode of the method corresponding to these code attributes, or
* @param code * <tt>null</tt> if these attributes are not code attributes.
* the bytecode of the method corresponding to these code * @param len the length of the bytecode of the method corresponding to these code attributes,
* attributes, or <tt>null</tt> if these attributes are not code * or <tt>null</tt> if these attributes are not code attributes.
* attributes. * @param maxStack the maximum stack size of the method corresponding to these code attributes,
* @param len * or -1 if these attributes are not code attributes.
* the length of the bytecode of the method corresponding to * @param maxLocals the maximum number of local variables of the method corresponding to these
* these code attributes, or <tt>null</tt> if these attributes * code attributes, or -1 if these attributes are not code attributes.
* are not code attributes. * @return the size of all the attributes in this attribute list. This size includes the size of
* @param maxStack * the attribute headers.
* the maximum stack size of the method corresponding to these
* code attributes, or -1 if these attributes are not code
* attributes.
* @param maxLocals
* the maximum number of local variables of the method
* corresponding to these code attributes, or -1 if these
* attributes are not code attributes.
* @return the size of all the attributes in this attribute list. This size
* includes the size of the attribute headers.
*/ */
final int getSize(final ClassWriter cw, final byte[] code, final int len, final int getSize(final ClassWriter cw, final byte[] code, final int len, final int maxStack,
final int maxStack, final int maxLocals) { final int maxLocals) {
Attribute attr = this; Attribute attr = this;
int size = 0; int size = 0;
while (attr != null) { while (attr != null) {
@ -217,33 +178,22 @@ public class Attribute {
} }
/** /**
* Writes all the attributes of this attribute list in the given byte * Writes all the attributes of this attribute list in the given byte vector.
* vector.
* *
* @param cw * @param cw the class writer to be used to convert the attributes into byte arrays, with the
* the class writer to be used to convert the attributes into * {@link #write write} method.
* byte arrays, with the {@link #write write} method. * @param code the bytecode of the method corresponding to these code attributes, or
* @param code * <tt>null</tt> if these attributes are not code attributes.
* the bytecode of the method corresponding to these code * @param len the length of the bytecode of the method corresponding to these code attributes,
* attributes, or <tt>null</tt> if these attributes are not code * or <tt>null</tt> if these attributes are not code attributes.
* attributes. * @param maxStack the maximum stack size of the method corresponding to these code attributes,
* @param len * or -1 if these attributes are not code attributes.
* the length of the bytecode of the method corresponding to * @param maxLocals the maximum number of local variables of the method corresponding to these
* these code attributes, or <tt>null</tt> if these attributes * code attributes, or -1 if these attributes are not code attributes.
* are not code attributes. * @param out where the attributes must be written.
* @param maxStack
* the maximum stack size of the method corresponding to these
* code attributes, or -1 if these attributes are not code
* attributes.
* @param maxLocals
* the maximum number of local variables of the method
* corresponding to these code attributes, or -1 if these
* attributes are not code attributes.
* @param out
* where the attributes must be written.
*/ */
final void put(final ClassWriter cw, final byte[] code, final int len, final void put(final ClassWriter cw, final byte[] code, final int len, final int maxStack,
final int maxStack, final int maxLocals, final ByteVector out) { final int maxLocals, final ByteVector out) {
Attribute attr = this; Attribute attr = this;
while (attr != null) { while (attr != null) {
ByteVector b = attr.write(cw, code, len, maxStack, maxLocals); ByteVector b = attr.write(cw, code, len, maxStack, maxLocals);

View File

@ -1,37 +1,29 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm; package org.objectweb.asm;
/** /**
* A dynamically extensible vector of bytes. This class is roughly equivalent to * A dynamically extensible vector of bytes. This class is roughly equivalent to a DataOutputStream
* a DataOutputStream on top of a ByteArrayOutputStream, but is more efficient. * on top of a ByteArrayOutputStream, but is more efficient.
* *
* @author Eric Bruneton * @author Eric Bruneton
*/ */
@ -48,30 +40,25 @@ public class ByteVector {
int length; int length;
/** /**
* Constructs a new {@link ByteVector ByteVector} with a default initial * Constructs a new {@link ByteVector ByteVector} with a default initial size.
* size.
*/ */
public ByteVector() { public ByteVector() {
data = new byte[64]; data = new byte[64];
} }
/** /**
* Constructs a new {@link ByteVector ByteVector} with the given initial * Constructs a new {@link ByteVector ByteVector} with the given initial size.
* size.
* *
* @param initialSize * @param initialSize the initial size of the byte vector to be constructed.
* the initial size of the byte vector to be constructed.
*/ */
public ByteVector(final int initialSize) { public ByteVector(final int initialSize) {
data = new byte[initialSize]; data = new byte[initialSize];
} }
/** /**
* Puts a byte into this byte vector. The byte vector is automatically * Puts a byte into this byte vector. The byte vector is automatically enlarged if necessary.
* enlarged if necessary.
* *
* @param b * @param b a byte.
* a byte.
* @return this byte vector. * @return this byte vector.
*/ */
public ByteVector putByte(final int b) { public ByteVector putByte(final int b) {
@ -85,13 +72,10 @@ public class ByteVector {
} }
/** /**
* Puts two bytes into this byte vector. The byte vector is automatically * Puts two bytes into this byte vector. The byte vector is automatically enlarged if necessary.
* enlarged if necessary.
* *
* @param b1 * @param b1 a byte.
* a byte. * @param b2 another byte.
* @param b2
* another byte.
* @return this byte vector. * @return this byte vector.
*/ */
ByteVector put11(final int b1, final int b2) { ByteVector put11(final int b1, final int b2) {
@ -107,11 +91,9 @@ public class ByteVector {
} }
/** /**
* Puts a short into this byte vector. The byte vector is automatically * Puts a short into this byte vector. The byte vector is automatically enlarged if necessary.
* enlarged if necessary.
* *
* @param s * @param s a short.
* a short.
* @return this byte vector. * @return this byte vector.
*/ */
public ByteVector putShort(final int s) { public ByteVector putShort(final int s) {
@ -127,13 +109,11 @@ public class ByteVector {
} }
/** /**
* Puts a byte and a short into this byte vector. The byte vector is * Puts a byte and a short into this byte vector. The byte vector is automatically enlarged if
* automatically enlarged if necessary. * necessary.
* *
* @param b * @param b a byte.
* a byte. * @param s a short.
* @param s
* a short.
* @return this byte vector. * @return this byte vector.
*/ */
ByteVector put12(final int b, final int s) { ByteVector put12(final int b, final int s) {
@ -150,11 +130,9 @@ public class ByteVector {
} }
/** /**
* Puts an int into this byte vector. The byte vector is automatically * Puts an int into this byte vector. The byte vector is automatically enlarged if necessary.
* enlarged if necessary.
* *
* @param i * @param i an int.
* an int.
* @return this byte vector. * @return this byte vector.
*/ */
public ByteVector putInt(final int i) { public ByteVector putInt(final int i) {
@ -172,11 +150,9 @@ public class ByteVector {
} }
/** /**
* Puts a long into this byte vector. The byte vector is automatically * Puts a long into this byte vector. The byte vector is automatically enlarged if necessary.
* enlarged if necessary.
* *
* @param l * @param l a long.
* a long.
* @return this byte vector. * @return this byte vector.
*/ */
public ByteVector putLong(final long l) { public ByteVector putLong(final long l) {
@ -200,11 +176,10 @@ public class ByteVector {
} }
/** /**
* Puts an UTF8 string into this byte vector. The byte vector is * Puts an UTF8 string into this byte vector. The byte vector is automatically enlarged if
* automatically enlarged if necessary. * necessary.
* *
* @param s * @param s a String whose UTF8 encoded length must be less than 65536.
* a String whose UTF8 encoded length must be less than 65536.
* @return this byte vector. * @return this byte vector.
*/ */
public ByteVector putUTF8(final String s) { public ByteVector putUTF8(final String s) {
@ -272,16 +247,13 @@ public class ByteVector {
} }
/** /**
* Puts an array of bytes into this byte vector. The byte vector is * Puts an array of bytes into this byte vector. The byte vector is automatically enlarged if
* automatically enlarged if necessary. * necessary.
* *
* @param b * @param b an array of bytes. May be <tt>null</tt> to put <tt>len</tt> null bytes into this
* an array of bytes. May be <tt>null</tt> to put <tt>len</tt> * byte vector.
* null bytes into this byte vector. * @param off index of the fist byte of b that must be copied.
* @param off * @param len number of bytes of b that must be copied.
* index of the fist byte of b that must be copied.
* @param len
* number of bytes of b that must be copied.
* @return this byte vector. * @return this byte vector.
*/ */
public ByteVector putByteArray(final byte[] b, final int off, final int len) { public ByteVector putByteArray(final byte[] b, final int off, final int len) {
@ -298,9 +270,7 @@ public class ByteVector {
/** /**
* Enlarge this byte vector so that it can receive n more bytes. * Enlarge this byte vector so that it can receive n more bytes.
* *
* @param size * @param size number of additional bytes that this byte vector should be able to receive.
* number of additional bytes that this byte vector should be
* able to receive.
*/ */
private void enlarge(final int size) { private void enlarge(final int size) {
int length1 = 2 * data.length; int length1 = 2 * data.length;

File diff suppressed because it is too large Load Diff

View File

@ -1,38 +1,29 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm; package org.objectweb.asm;
/** /**
* A visitor to visit a Java class. The methods of this class must be called in * A visitor to visit a Java class. The methods of this class must be called in the following order:
* the following order: <tt>visit</tt> [ <tt>visitSource</tt> ] [ * <tt>visit</tt> [ <tt>visitSource</tt> ] [ <tt>visitOuterClass</tt> ] ( <tt>visitAnnotation</tt> |
* <tt>visitOuterClass</tt> ] ( <tt>visitAnnotation</tt> |
* <tt>visitAttribute</tt> )* ( <tt>visitInnerClass</tt> | <tt>visitField</tt> | * <tt>visitAttribute</tt> )* ( <tt>visitInnerClass</tt> | <tt>visitField</tt> |
* <tt>visitMethod</tt> )* <tt>visitEnd</tt>. * <tt>visitMethod</tt> )* <tt>visitEnd</tt>.
* *
@ -41,23 +32,21 @@ package org.objectweb.asm;
public abstract class ClassVisitor { public abstract class ClassVisitor {
/** /**
* The ASM API version implemented by this visitor. The value of this field * The ASM API version implemented by this visitor. The value of this field must be one of
* must be one of {@link Opcodes#ASM4}. * {@link Opcodes#ASM4}.
*/ */
protected final int api; protected final int api;
/** /**
* The class visitor to which this visitor must delegate method calls. May * The class visitor to which this visitor must delegate method calls. May be null.
* be null.
*/ */
protected ClassVisitor cv; protected ClassVisitor cv;
/** /**
* Constructs a new {@link ClassVisitor}. * Constructs a new {@link ClassVisitor}.
* *
* @param api * @param api the ASM API version implemented by this visitor. Must be one of
* the ASM API version implemented by this visitor. Must be one * {@link Opcodes#ASM4}.
* of {@link Opcodes#ASM4}.
*/ */
public ClassVisitor(final int api) { public ClassVisitor(final int api) {
this(api, null); this(api, null);
@ -66,12 +55,9 @@ public abstract class ClassVisitor {
/** /**
* Constructs a new {@link ClassVisitor}. * Constructs a new {@link ClassVisitor}.
* *
* @param api * @param api the ASM API version implemented by this visitor. Must be one of
* the ASM API version implemented by this visitor. Must be one * {@link Opcodes#ASM4}.
* of {@link Opcodes#ASM4}. * @param cv the class visitor to which this visitor must delegate method calls. May be null.
* @param cv
* the class visitor to which this visitor must delegate method
* calls. May be null.
*/ */
public ClassVisitor(final int api, final ClassVisitor cv) { public ClassVisitor(final int api, final ClassVisitor cv) {
if (api != Opcodes.ASM4) { if (api != Opcodes.ASM4) {
@ -84,30 +70,21 @@ public abstract class ClassVisitor {
/** /**
* Visits the header of the class. * Visits the header of the class.
* *
* @param version * @param version the class version.
* the class version. * @param access the class's access flags (see {@link Opcodes}). This parameter also indicates
* @param access * if the class is deprecated.
* the class's access flags (see {@link Opcodes}). This parameter * @param name the internal name of the class (see {@link Type#getInternalName()
* also indicates if the class is deprecated. * getInternalName}).
* @param name * @param signature the signature of this class. May be <tt>null</tt> if the class is not a
* the internal name of the class (see * generic one, and does not extend or implement generic classes or interfaces.
* {@link Type#getInternalName() getInternalName}). * @param superName the internal of name of the super class (see {@link Type#getInternalName()
* @param signature * getInternalName}). For interfaces, the super class is {@link Object}. May be
* the signature of this class. May be <tt>null</tt> if the class
* is not a generic one, and does not extend or implement generic
* classes or interfaces.
* @param superName
* the internal of name of the super class (see
* {@link Type#getInternalName() getInternalName}). For
* interfaces, the super class is {@link Object}. May be
* <tt>null</tt>, but only for the {@link Object} class. * <tt>null</tt>, but only for the {@link Object} class.
* @param interfaces * @param interfaces the internal names of the class's interfaces (see
* the internal names of the class's interfaces (see * {@link Type#getInternalName() getInternalName}). May be <tt>null</tt>.
* {@link Type#getInternalName() getInternalName}). May be
* <tt>null</tt>.
*/ */
public void visit(int version, int access, String name, String signature, public void visit(int version, int access, String name, String signature, String superName,
String superName, String[] interfaces) { String[] interfaces) {
if (cv != null) { if (cv != null) {
cv.visit(version, access, name, signature, superName, interfaces); cv.visit(version, access, name, signature, superName, interfaces);
} }
@ -116,13 +93,10 @@ public abstract class ClassVisitor {
/** /**
* Visits the source of the class. * Visits the source of the class.
* *
* @param source * @param source the name of the source file from which the class was compiled. May be
* the name of the source file from which the class was compiled.
* May be <tt>null</tt>.
* @param debug
* additional debug information to compute the correspondance
* between source and compiled elements of the class. May be
* <tt>null</tt>. * <tt>null</tt>.
* @param debug additional debug information to compute the correspondance between source and
* compiled elements of the class. May be <tt>null</tt>.
*/ */
public void visitSource(String source, String debug) { public void visitSource(String source, String debug) {
if (cv != null) { if (cv != null) {
@ -131,19 +105,14 @@ public abstract class ClassVisitor {
} }
/** /**
* Visits the enclosing class of the class. This method must be called only * Visits the enclosing class of the class. This method must be called only if the class has an
* if the class has an enclosing class. * enclosing class.
* *
* @param owner * @param owner internal name of the enclosing class of the class.
* internal name of the enclosing class of the class. * @param name the name of the method that contains the class, or <tt>null</tt> if the class is
* @param name * not enclosed in a method of its enclosing class.
* the name of the method that contains the class, or * @param desc the descriptor of the method that contains the class, or <tt>null</tt> if the
* <tt>null</tt> if the class is not enclosed in a method of its * class is not enclosed in a method of its enclosing class.
* enclosing class.
* @param desc
* the descriptor of the method that contains the class, or
* <tt>null</tt> if the class is not enclosed in a method of its
* enclosing class.
*/ */
public void visitOuterClass(String owner, String name, String desc) { public void visitOuterClass(String owner, String name, String desc) {
if (cv != null) { if (cv != null) {
@ -154,12 +123,10 @@ public abstract class ClassVisitor {
/** /**
* Visits an annotation of the class. * Visits an annotation of the class.
* *
* @param desc * @param desc the class descriptor of the annotation class.
* the class descriptor of the annotation class. * @param visible <tt>true</tt> if the annotation is visible at runtime.
* @param visible * @return a visitor to visit the annotation values, or <tt>null</tt> if this visitor is not
* <tt>true</tt> if the annotation is visible at runtime. * interested in visiting this annotation.
* @return a visitor to visit the annotation values, or <tt>null</tt> if
* this visitor is not interested in visiting this annotation.
*/ */
public AnnotationVisitor visitAnnotation(String desc, boolean visible) { public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
if (cv != null) { if (cv != null) {
@ -171,8 +138,7 @@ public abstract class ClassVisitor {
/** /**
* Visits a non standard attribute of the class. * Visits a non standard attribute of the class.
* *
* @param attr * @param attr an attribute.
* an attribute.
*/ */
public void visitAttribute(Attribute attr) { public void visitAttribute(Attribute attr) {
if (cv != null) { if (cv != null) {
@ -181,25 +147,20 @@ public abstract class ClassVisitor {
} }
/** /**
* Visits information about an inner class. This inner class is not * Visits information about an inner class. This inner class is not necessarily a member of the
* necessarily a member of the class being visited. * class being visited.
* *
* @param name * @param name the internal name of an inner class (see {@link Type#getInternalName()
* the internal name of an inner class (see * getInternalName}).
* {@link Type#getInternalName() getInternalName}). * @param outerName the internal name of the class to which the inner class belongs (see
* @param outerName * {@link Type#getInternalName() getInternalName}). May be <tt>null</tt> for not member
* the internal name of the class to which the inner class * classes.
* belongs (see {@link Type#getInternalName() getInternalName}). * @param innerName the (simple) name of the inner class inside its enclosing class. May be
* May be <tt>null</tt> for not member classes. * <tt>null</tt> for anonymous inner classes.
* @param innerName * @param access the access flags of the inner class as originally declared in the enclosing
* the (simple) name of the inner class inside its enclosing * class.
* class. May be <tt>null</tt> for anonymous inner classes.
* @param access
* the access flags of the inner class as originally declared in
* the enclosing class.
*/ */
public void visitInnerClass(String name, String outerName, public void visitInnerClass(String name, String outerName, String innerName, int access) {
String innerName, int access) {
if (cv != null) { if (cv != null) {
cv.visitInnerClass(name, outerName, innerName, access); cv.visitInnerClass(name, outerName, innerName, access);
} }
@ -208,32 +169,23 @@ public abstract class ClassVisitor {
/** /**
* Visits a field of the class. * Visits a field of the class.
* *
* @param access * @param access the field's access flags (see {@link Opcodes}). This parameter also indicates
* the field's access flags (see {@link Opcodes}). This parameter * if the field is synthetic and/or deprecated.
* also indicates if the field is synthetic and/or deprecated. * @param name the field's name.
* @param name * @param desc the field's descriptor (see {@link Type Type}).
* the field's name. * @param signature the field's signature. May be <tt>null</tt> if the field's type does not use
* @param desc * generic types.
* the field's descriptor (see {@link Type Type}). * @param value the field's initial value. This parameter, which may be <tt>null</tt> if the
* @param signature * field does not have an initial value, must be an {@link Integer}, a {@link Float}, a
* the field's signature. May be <tt>null</tt> if the field's * {@link Long}, a {@link Double} or a {@link String} (for <tt>int</tt>, <tt>float</tt>,
* type does not use generic types. * <tt>long</tt> or <tt>String</tt> fields respectively). <i>This parameter is only used
* @param value * for static fields</i>. Its value is ignored for non static fields, which must be
* the field's initial value. This parameter, which may be * initialized through bytecode instructions in constructors or methods.
* <tt>null</tt> if the field does not have an initial value, * @return a visitor to visit field annotations and attributes, or <tt>null</tt> if this class
* must be an {@link Integer}, a {@link Float}, a {@link Long}, a * visitor is not interested in visiting these annotations and attributes.
* {@link Double} or a {@link String} (for <tt>int</tt>,
* <tt>float</tt>, <tt>long</tt> or <tt>String</tt> fields
* respectively). <i>This parameter is only used for static
* fields</i>. Its value is ignored for non static fields, which
* must be initialized through bytecode instructions in
* constructors or methods.
* @return a visitor to visit field annotations and attributes, or
* <tt>null</tt> if this class visitor is not interested in visiting
* these annotations and attributes.
*/ */
public FieldVisitor visitField(int access, String name, String desc, public FieldVisitor visitField(int access, String name, String desc, String signature,
String signature, Object value) { Object value) {
if (cv != null) { if (cv != null) {
return cv.visitField(access, name, desc, signature, value); return cv.visitField(access, name, desc, signature, value);
} }
@ -241,32 +193,23 @@ public abstract class ClassVisitor {
} }
/** /**
* Visits a method of the class. This method <i>must</i> return a new * Visits a method of the class. This method <i>must</i> return a new {@link MethodVisitor}
* {@link MethodVisitor} instance (or <tt>null</tt>) each time it is called, * instance (or <tt>null</tt>) each time it is called, i.e., it should not return a previously
* i.e., it should not return a previously returned visitor. * returned visitor.
* *
* @param access * @param access the method's access flags (see {@link Opcodes}). This parameter also indicates
* the method's access flags (see {@link Opcodes}). This * if the method is synthetic and/or deprecated.
* parameter also indicates if the method is synthetic and/or * @param name the method's name.
* deprecated. * @param desc the method's descriptor (see {@link Type Type}).
* @param name * @param signature the method's signature. May be <tt>null</tt> if the method parameters,
* the method's name. * return type and exceptions do not use generic types.
* @param desc * @param exceptions the internal names of the method's exception classes (see
* the method's descriptor (see {@link Type Type}). * {@link Type#getInternalName() getInternalName}). May be <tt>null</tt>.
* @param signature * @return an object to visit the byte code of the method, or <tt>null</tt> if this class
* the method's signature. May be <tt>null</tt> if the method * visitor is not interested in visiting the code of this method.
* parameters, return type and exceptions do not use generic
* types.
* @param exceptions
* the internal names of the method's exception classes (see
* {@link Type#getInternalName() getInternalName}). May be
* <tt>null</tt>.
* @return an object to visit the byte code of the method, or <tt>null</tt>
* if this class visitor is not interested in visiting the code of
* this method.
*/ */
public MethodVisitor visitMethod(int access, String name, String desc, public MethodVisitor visitMethod(int access, String name, String desc, String signature,
String signature, String[] exceptions) { String[] exceptions) {
if (cv != null) { if (cv != null) {
return cv.visitMethod(access, name, desc, signature, exceptions); return cv.visitMethod(access, name, desc, signature, exceptions);
} }
@ -274,9 +217,8 @@ public abstract class ClassVisitor {
} }
/** /**
* Visits the end of the class. This method, which is the last one to be * Visits the end of the class. This method, which is the last one to be called, is used to
* called, is used to inform the visitor that all the fields and methods of * inform the visitor that all the fields and methods of the class have been visited.
* the class have been visited.
*/ */
public void visitEnd() { public void visitEnd() {
if (cv != null) { if (cv != null) {

File diff suppressed because it is too large Load Diff

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm; package org.objectweb.asm;
@ -88,8 +80,8 @@ class Context {
int localCount; int localCount;
/** /**
* The number locals in the latest stack map frame that has been parsed, * The number locals in the latest stack map frame that has been parsed, minus the number of
* minus the number of locals in the previous frame. * locals in the previous frame.
*/ */
int localDiff; int localDiff;

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm; package org.objectweb.asm;
@ -42,23 +34,20 @@ class Edge {
static final int NORMAL = 0; static final int NORMAL = 0;
/** /**
* Denotes a control flow graph edge corresponding to an exception handler. * Denotes a control flow graph edge corresponding to an exception handler. More precisely any
* More precisely any {@link Edge} whose {@link #info} is strictly positive * {@link Edge} whose {@link #info} is strictly positive corresponds to an exception handler.
* corresponds to an exception handler. The actual value of {@link #info} is * The actual value of {@link #info} is the index, in the {@link ClassWriter} type table, of the
* the index, in the {@link ClassWriter} type table, of the exception that * exception that is catched.
* is catched.
*/ */
static final int EXCEPTION = 0x7FFFFFFF; static final int EXCEPTION = 0x7FFFFFFF;
/** /**
* Information about this control flow graph edge. If * Information about this control flow graph edge. If {@link ClassWriter#COMPUTE_MAXS} is used
* {@link ClassWriter#COMPUTE_MAXS} is used this field is the (relative) * this field is the (relative) stack size in the basic block from which this edge originates.
* stack size in the basic block from which this edge originates. This size * This size is equal to the stack size at the "jump" instruction to which this edge
* is equal to the stack size at the "jump" instruction to which this edge * corresponds, relatively to the stack size at the beginning of the originating basic block. If
* corresponds, relatively to the stack size at the beginning of the * {@link ClassWriter#COMPUTE_FRAMES} is used, this field is the kind of this control flow graph
* originating basic block. If {@link ClassWriter#COMPUTE_FRAMES} is used, * edge (i.e. NORMAL or EXCEPTION).
* this field is the kind of this control flow graph edge (i.e. NORMAL or
* EXCEPTION).
*/ */
int info; int info;
@ -68,8 +57,8 @@ class Edge {
Label successor; Label successor;
/** /**
* The next edge in the list of successors of the originating basic block. * The next edge in the list of successors of the originating basic block. See
* See {@link Label#successors successors}. * {@link Label#successors successors}.
*/ */
Edge next; Edge next;
} }

View File

@ -1,61 +1,50 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm; package org.objectweb.asm;
/** /**
* A visitor to visit a Java field. The methods of this class must be called in * A visitor to visit a Java field. The methods of this class must be called in the following order:
* the following order: ( <tt>visitAnnotation</tt> | <tt>visitAttribute</tt> )* * ( <tt>visitAnnotation</tt> | <tt>visitAttribute</tt> )* <tt>visitEnd</tt>.
* <tt>visitEnd</tt>.
* *
* @author Eric Bruneton * @author Eric Bruneton
*/ */
public abstract class FieldVisitor { public abstract class FieldVisitor {
/** /**
* The ASM API version implemented by this visitor. The value of this field * The ASM API version implemented by this visitor. The value of this field must be one of
* must be one of {@link Opcodes#ASM4}. * {@link Opcodes#ASM4}.
*/ */
protected final int api; protected final int api;
/** /**
* The field visitor to which this visitor must delegate method calls. May * The field visitor to which this visitor must delegate method calls. May be null.
* be null.
*/ */
protected FieldVisitor fv; protected FieldVisitor fv;
/** /**
* Constructs a new {@link FieldVisitor}. * Constructs a new {@link FieldVisitor}.
* *
* @param api * @param api the ASM API version implemented by this visitor. Must be one of
* the ASM API version implemented by this visitor. Must be one * {@link Opcodes#ASM4}.
* of {@link Opcodes#ASM4}.
*/ */
public FieldVisitor(final int api) { public FieldVisitor(final int api) {
this(api, null); this(api, null);
@ -64,12 +53,9 @@ public abstract class FieldVisitor {
/** /**
* Constructs a new {@link FieldVisitor}. * Constructs a new {@link FieldVisitor}.
* *
* @param api * @param api the ASM API version implemented by this visitor. Must be one of
* the ASM API version implemented by this visitor. Must be one * {@link Opcodes#ASM4}.
* of {@link Opcodes#ASM4}. * @param fv the field visitor to which this visitor must delegate method calls. May be null.
* @param fv
* the field visitor to which this visitor must delegate method
* calls. May be null.
*/ */
public FieldVisitor(final int api, final FieldVisitor fv) { public FieldVisitor(final int api, final FieldVisitor fv) {
if (api != Opcodes.ASM4) { if (api != Opcodes.ASM4) {
@ -82,12 +68,10 @@ public abstract class FieldVisitor {
/** /**
* Visits an annotation of the field. * Visits an annotation of the field.
* *
* @param desc * @param desc the class descriptor of the annotation class.
* the class descriptor of the annotation class. * @param visible <tt>true</tt> if the annotation is visible at runtime.
* @param visible * @return a visitor to visit the annotation values, or <tt>null</tt> if this visitor is not
* <tt>true</tt> if the annotation is visible at runtime. * interested in visiting this annotation.
* @return a visitor to visit the annotation values, or <tt>null</tt> if
* this visitor is not interested in visiting this annotation.
*/ */
public AnnotationVisitor visitAnnotation(String desc, boolean visible) { public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
if (fv != null) { if (fv != null) {
@ -99,8 +83,7 @@ public abstract class FieldVisitor {
/** /**
* Visits a non standard attribute of the field. * Visits a non standard attribute of the field.
* *
* @param attr * @param attr an attribute.
* an attribute.
*/ */
public void visitAttribute(Attribute attr) { public void visitAttribute(Attribute attr) {
if (fv != null) { if (fv != null) {
@ -109,9 +92,8 @@ public abstract class FieldVisitor {
} }
/** /**
* Visits the end of the field. This method, which is the last one to be * Visits the end of the field. This method, which is the last one to be called, is used to
* called, is used to inform the visitor that all the annotations and * inform the visitor that all the annotations and attributes of the field have been visited.
* attributes of the field have been visited.
*/ */
public void visitEnd() { public void visitEnd() {
if (fv != null) { if (fv != null) {

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm; package org.objectweb.asm;
@ -47,26 +39,22 @@ final class FieldWriter extends FieldVisitor {
private final int access; private final int access;
/** /**
* The index of the constant pool item that contains the name of this * The index of the constant pool item that contains the name of this method.
* method.
*/ */
private final int name; private final int name;
/** /**
* The index of the constant pool item that contains the descriptor of this * The index of the constant pool item that contains the descriptor of this field.
* field.
*/ */
private final int desc; private final int desc;
/** /**
* The index of the constant pool item that contains the signature of this * The index of the constant pool item that contains the signature of this field.
* field.
*/ */
private int signature; private int signature;
/** /**
* The index of the constant pool item that contains the constant value of * The index of the constant pool item that contains the constant value of this field.
* this field.
*/ */
private int value; private int value;
@ -92,21 +80,15 @@ final class FieldWriter extends FieldVisitor {
/** /**
* Constructs a new {@link FieldWriter}. * Constructs a new {@link FieldWriter}.
* *
* @param cw * @param cw the class writer to which this field must be added.
* the class writer to which this field must be added. * @param access the field's access flags (see {@link Opcodes}).
* @param access * @param name the field's name.
* the field's access flags (see {@link Opcodes}). * @param desc the field's descriptor (see {@link Type}).
* @param name * @param signature the field's signature. May be <tt>null</tt>.
* the field's name. * @param value the field's constant value. May be <tt>null</tt>.
* @param desc
* the field's descriptor (see {@link Type}).
* @param signature
* the field's signature. May be <tt>null</tt>.
* @param value
* the field's constant value. May be <tt>null</tt>.
*/ */
FieldWriter(final ClassWriter cw, final int access, final String name, FieldWriter(final ClassWriter cw, final int access, final String name, final String desc,
final String desc, final String signature, final Object value) { final String signature, final Object value) {
super(Opcodes.ASM4); super(Opcodes.ASM4);
if (cw.firstField == null) { if (cw.firstField == null) {
cw.firstField = this; cw.firstField = this;
@ -131,8 +113,7 @@ final class FieldWriter extends FieldVisitor {
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
@Override @Override
public AnnotationVisitor visitAnnotation(final String desc, public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
final boolean visible) {
if (!ClassReader.ANNOTATIONS) { if (!ClassReader.ANNOTATIONS) {
return null; return null;
} }
@ -157,8 +138,7 @@ final class FieldWriter extends FieldVisitor {
} }
@Override @Override
public void visitEnd() { public void visitEnd() {}
}
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// Utility methods // Utility methods
@ -207,8 +187,7 @@ final class FieldWriter extends FieldVisitor {
/** /**
* Puts the content of this field into the given byte vector. * Puts the content of this field into the given byte vector.
* *
* @param out * @param out where the content of this field must be put.
* where the content of this field must be put.
*/ */
void put(final ByteVector out) { void put(final ByteVector out) {
final int FACTOR = ClassWriter.TO_ACC_SYNTHETIC; final int FACTOR = ClassWriter.TO_ACC_SYNTHETIC;

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm; package org.objectweb.asm;
@ -37,61 +29,51 @@ package org.objectweb.asm;
final class Frame { final class Frame {
/* /*
* Frames are computed in a two steps process: during the visit of each * Frames are computed in a two steps process: during the visit of each instruction, the state
* instruction, the state of the frame at the end of current basic block is * of the frame at the end of current basic block is updated by simulating the action of the
* updated by simulating the action of the instruction on the previous state * instruction on the previous state of this so called "output frame". In visitMaxs, a fix point
* of this so called "output frame". In visitMaxs, a fix point algorithm is * algorithm is used to compute the "input frame" of each basic block, i.e. the stack map frame
* used to compute the "input frame" of each basic block, i.e. the stack map * at the beginning of the basic block, starting from the input frame of the first basic block
* frame at the beginning of the basic block, starting from the input frame * (which is computed from the method descriptor), and by using the previously computed output
* of the first basic block (which is computed from the method descriptor), * frames to compute the input state of the other blocks.
* and by using the previously computed output frames to compute the input
* state of the other blocks.
* *
* All output and input frames are stored as arrays of integers. Reference * All output and input frames are stored as arrays of integers. Reference and array types are
* and array types are represented by an index into a type table (which is * represented by an index into a type table (which is not the same as the constant pool of the
* not the same as the constant pool of the class, in order to avoid adding * class, in order to avoid adding unnecessary constants in the pool - not all computed frames
* unnecessary constants in the pool - not all computed frames will end up * will end up being stored in the stack map table). This allows very fast type comparisons.
* being stored in the stack map table). This allows very fast type
* comparisons.
* *
* Output stack map frames are computed relatively to the input frame of the * Output stack map frames are computed relatively to the input frame of the basic block, which
* basic block, which is not yet known when output frames are computed. It * is not yet known when output frames are computed. It is therefore necessary to be able to
* is therefore necessary to be able to represent abstract types such as * represent abstract types such as "the type at position x in the input frame locals" or "the
* "the type at position x in the input frame locals" or "the type at * type at position x from the top of the input frame stack" or even "the type at position x in
* position x from the top of the input frame stack" or even "the type at * the input frame, with y more (or less) array dimensions". This explains the rather
* position x in the input frame, with y more (or less) array dimensions". * complicated type format used in output frames.
* This explains the rather complicated type format used in output frames.
* *
* This format is the following: DIM KIND VALUE (4, 4 and 24 bits). DIM is a * This format is the following: DIM KIND VALUE (4, 4 and 24 bits). DIM is a signed number of
* signed number of array dimensions (from -8 to 7). KIND is either BASE, * array dimensions (from -8 to 7). KIND is either BASE, LOCAL or STACK. BASE is used for types
* LOCAL or STACK. BASE is used for types that are not relative to the input * that are not relative to the input frame. LOCAL is used for types that are relative to the
* frame. LOCAL is used for types that are relative to the input local * input local variable types. STACK is used for types that are relative to the input stack
* variable types. STACK is used for types that are relative to the input * types. VALUE depends on KIND. For LOCAL types, it is an index in the input local variable
* stack types. VALUE depends on KIND. For LOCAL types, it is an index in * types. For STACK types, it is a position relatively to the top of input frame stack. For BASE
* the input local variable types. For STACK types, it is a position * types, it is either one of the constants defined in FrameVisitor, or for OBJECT and
* relatively to the top of input frame stack. For BASE types, it is either
* one of the constants defined in FrameVisitor, or for OBJECT and
* UNINITIALIZED types, a tag and an index in the type table. * UNINITIALIZED types, a tag and an index in the type table.
* *
* Output frames can contain types of any kind and with a positive or * Output frames can contain types of any kind and with a positive or negative dimension (and
* negative dimension (and even unassigned types, represented by 0 - which * even unassigned types, represented by 0 - which does not correspond to any valid type value).
* does not correspond to any valid type value). Input frames can only * Input frames can only contain BASE types of positive or null dimension. In all cases the type
* contain BASE types of positive or null dimension. In all cases the type * table contains only internal type names (array type descriptors are forbidden - dimensions
* table contains only internal type names (array type descriptors are * must be represented through the DIM field).
* forbidden - dimensions must be represented through the DIM field).
* *
* The LONG and DOUBLE types are always represented by using two slots (LONG * The LONG and DOUBLE types are always represented by using two slots (LONG + TOP or DOUBLE +
* + TOP or DOUBLE + TOP), for local variable types as well as in the * TOP), for local variable types as well as in the operand stack. This is necessary to be able
* operand stack. This is necessary to be able to simulate DUPx_y * to simulate DUPx_y instructions, whose effect would be dependent on the actual type values if
* instructions, whose effect would be dependent on the actual type values * types were always represented by a single slot in the stack (and this is not possible, since
* if types were always represented by a single slot in the stack (and this * actual type values are not always known - cf LOCAL and STACK type kinds).
* is not possible, since actual type values are not always known - cf LOCAL
* and STACK type kinds).
*/ */
/** /**
* Mask to get the dimension of a frame type. This dimension is a signed * Mask to get the dimension of a frame type. This dimension is a signed integer between -8 and
* integer between -8 and 7. * 7.
*/ */
static final int DIM = 0xF0000000; static final int DIM = 0xF0000000;
@ -115,11 +97,10 @@ final class Frame {
static final int KIND = 0xF000000; static final int KIND = 0xF000000;
/** /**
* Flag used for LOCAL and STACK types. Indicates that if this type happens * Flag used for LOCAL and STACK types. Indicates that if this type happens to be a long or
* to be a long or double type (during the computations of input frames), * double type (during the computations of input frames), then it must be set to TOP because the
* then it must be set to TOP because the second word of this value has been * second word of this value has been reused to store other data in the basic block. Hence the
* reused to store other data in the basic block. Hence the first word no * first word no longer stores a valid long or double value.
* longer stores a valid long or double value.
*/ */
static final int TOP_IF_LONG_OR_DOUBLE = 0x800000; static final int TOP_IF_LONG_OR_DOUBLE = 0x800000;
@ -144,28 +125,27 @@ final class Frame {
static final int BASE = 0x1000000; static final int BASE = 0x1000000;
/** /**
* Base kind of the base reference types. The BASE_VALUE of such types is an * Base kind of the base reference types. The BASE_VALUE of such types is an index into the type
* index into the type table. * table.
*/ */
static final int OBJECT = BASE | 0x700000; static final int OBJECT = BASE | 0x700000;
/** /**
* Base kind of the uninitialized base types. The BASE_VALUE of such types * Base kind of the uninitialized base types. The BASE_VALUE of such types in an index into the
* in an index into the type table (the Item at that index contains both an * type table (the Item at that index contains both an instruction offset and an internal class
* instruction offset and an internal class name). * name).
*/ */
static final int UNINITIALIZED = BASE | 0x800000; static final int UNINITIALIZED = BASE | 0x800000;
/** /**
* Kind of the types that are relative to the local variable types of an * Kind of the types that are relative to the local variable types of an input stack map frame.
* input stack map frame. The value of such types is a local variable index. * The value of such types is a local variable index.
*/ */
private static final int LOCAL = 0x2000000; private static final int LOCAL = 0x2000000;
/** /**
* Kind of the the types that are relative to the stack of an input stack * Kind of the the types that are relative to the stack of an input stack map frame. The value
* map frame. The value of such types is a position relatively to the top of * of such types is a position relatively to the top of this stack.
* this stack.
*/ */
private static final int STACK = 0x3000000; private static final int STACK = 0x3000000;
@ -225,9 +205,9 @@ final class Frame {
static final int UNINITIALIZED_THIS = BASE | 6; static final int UNINITIALIZED_THIS = BASE | 6;
/** /**
* The stack size variation corresponding to each JVM instruction. This * The stack size variation corresponding to each JVM instruction. This stack variation is equal
* stack variation is equal to the size of the values produced by an * to the size of the values produced by an instruction, minus the size of the values consumed
* instruction, minus the size of the values consumed by this instruction. * by this instruction.
*/ */
static final int[] SIZE; static final int[] SIZE;
@ -461,8 +441,7 @@ final class Frame {
} }
/** /**
* The label (i.e. basic block) to which these input and output stack map * The label (i.e. basic block) to which these input and output stack map frames correspond.
* frames correspond.
*/ */
Label owner; Label owner;
@ -487,14 +466,14 @@ final class Frame {
private int[] outputStack; private int[] outputStack;
/** /**
* Relative size of the output stack. The exact semantics of this field * Relative size of the output stack. The exact semantics of this field depends on the algorithm
* depends on the algorithm that is used. * that is used.
* *
* When only the maximum stack size is computed, this field is the size of * When only the maximum stack size is computed, this field is the size of the output stack
* the output stack relatively to the top of the input stack. * relatively to the top of the input stack.
* *
* When the stack map frames are completely computed, this field is the * When the stack map frames are completely computed, this field is the actual number of types
* actual number of types in {@link #outputStack}. * in {@link #outputStack}.
*/ */
private int outputStackTop; private int outputStackTop;
@ -506,25 +485,22 @@ final class Frame {
private int initializationCount; private int initializationCount;
/** /**
* The types that are initialized in the basic block. A constructor * The types that are initialized in the basic block. A constructor invocation on an
* invocation on an UNINITIALIZED or UNINITIALIZED_THIS type must replace * UNINITIALIZED or UNINITIALIZED_THIS type must replace <i>every occurence</i> of this type in
* <i>every occurence</i> of this type in the local variables and in the * the local variables and in the operand stack. This cannot be done during the first phase of
* operand stack. This cannot be done during the first phase of the * the algorithm since, during this phase, the local variables and the operand stack are not
* algorithm since, during this phase, the local variables and the operand * completely computed. It is therefore necessary to store the types on which constructors are
* stack are not completely computed. It is therefore necessary to store the * invoked in the basic block, in order to do this replacement during the second phase of the
* types on which constructors are invoked in the basic block, in order to * algorithm, where the frames are fully computed. Note that this array can contain types that
* do this replacement during the second phase of the algorithm, where the * are relative to input locals or to the input stack (see below for the description of the
* frames are fully computed. Note that this array can contain types that * algorithm).
* are relative to input locals or to the input stack (see below for the
* description of the algorithm).
*/ */
private int[] initializations; private int[] initializations;
/** /**
* Returns the output frame local variable type at the given index. * Returns the output frame local variable type at the given index.
* *
* @param local * @param local the index of the local that must be returned.
* the index of the local that must be returned.
* @return the output frame local variable type at the given index. * @return the output frame local variable type at the given index.
*/ */
private int get(final int local) { private int get(final int local) {
@ -546,10 +522,8 @@ final class Frame {
/** /**
* Sets the output frame local variable type at the given index. * Sets the output frame local variable type at the given index.
* *
* @param local * @param local the index of the local that must be set.
* the index of the local that must be set. * @param type the value of the local that must be set.
* @param type
* the value of the local that must be set.
*/ */
private void set(final int local, final int type) { private void set(final int local, final int type) {
// creates and/or resizes the output local variables array if necessary // creates and/or resizes the output local variables array if necessary
@ -569,8 +543,7 @@ final class Frame {
/** /**
* Pushes a new type onto the output frame stack. * Pushes a new type onto the output frame stack.
* *
* @param type * @param type the type that must be pushed.
* the type that must be pushed.
*/ */
private void push(final int type) { private void push(final int type) {
// creates and/or resizes the output stack array if necessary // creates and/or resizes the output stack array if necessary
@ -595,12 +568,9 @@ final class Frame {
/** /**
* Pushes a new type onto the output frame stack. * Pushes a new type onto the output frame stack.
* *
* @param cw * @param cw the ClassWriter to which this label belongs.
* the ClassWriter to which this label belongs. * @param desc the descriptor of the type to be pushed. Can also be a method descriptor (in this
* @param desc * case this method pushes its return type onto the output frame stack).
* the descriptor of the type to be pushed. Can also be a method
* descriptor (in this case this method pushes its return type
* onto the output frame stack).
*/ */
private void push(final ClassWriter cw, final String desc) { private void push(final ClassWriter cw, final String desc) {
int type = type(cw, desc); int type = type(cw, desc);
@ -615,10 +585,8 @@ final class Frame {
/** /**
* Returns the int encoding of the given type. * Returns the int encoding of the given type.
* *
* @param cw * @param cw the ClassWriter to which this label belongs.
* the ClassWriter to which this label belongs. * @param desc a type descriptor.
* @param desc
* a type descriptor.
* @return the int encoding of the given type. * @return the int encoding of the given type.
*/ */
private static int type(final ClassWriter cw, final String desc) { private static int type(final ClassWriter cw, final String desc) {
@ -703,8 +671,7 @@ final class Frame {
/** /**
* Pops the given number of types from the output frame stack. * Pops the given number of types from the output frame stack.
* *
* @param elements * @param elements the number of types that must be popped.
* the number of types that must be popped.
*/ */
private void pop(final int elements) { private void pop(final int elements) {
if (outputStackTop >= elements) { if (outputStackTop >= elements) {
@ -721,10 +688,8 @@ final class Frame {
/** /**
* Pops a type from the output frame stack. * Pops a type from the output frame stack.
* *
* @param desc * @param desc the descriptor of the type to be popped. Can also be a method descriptor (in this
* the descriptor of the type to be popped. Can also be a method * case this method pops the types corresponding to the method arguments).
* descriptor (in this case this method pops the types
* corresponding to the method arguments).
*/ */
private void pop(final String desc) { private void pop(final String desc) {
char c = desc.charAt(0); char c = desc.charAt(0);
@ -738,11 +703,9 @@ final class Frame {
} }
/** /**
* Adds a new type to the list of types on which a constructor is invoked in * Adds a new type to the list of types on which a constructor is invoked in the basic block.
* the basic block.
* *
* @param var * @param var a type on a which a constructor is invoked.
* a type on a which a constructor is invoked.
*/ */
private void init(final int var) { private void init(final int var) {
// creates and/or resizes the initializations array if necessary // creates and/or resizes the initializations array if necessary
@ -760,15 +723,13 @@ final class Frame {
} }
/** /**
* Replaces the given type with the appropriate type if it is one of the * Replaces the given type with the appropriate type if it is one of the types on which a
* types on which a constructor is invoked in the basic block. * constructor is invoked in the basic block.
* *
* @param cw * @param cw the ClassWriter to which this label belongs.
* the ClassWriter to which this label belongs. * @param t a type
* @param t * @return t or, if t is one of the types on which a constructor is invoked in the basic block,
* a type * the type corresponding to this constructor.
* @return t or, if t is one of the types on which a constructor is invoked
* in the basic block, the type corresponding to this constructor.
*/ */
private int init(final ClassWriter cw, final int t) { private int init(final ClassWriter cw, final int t) {
int s; int s;
@ -797,20 +758,15 @@ final class Frame {
} }
/** /**
* Initializes the input frame of the first basic block from the method * Initializes the input frame of the first basic block from the method descriptor.
* descriptor.
* *
* @param cw * @param cw the ClassWriter to which this label belongs.
* the ClassWriter to which this label belongs. * @param access the access flags of the method to which this label belongs.
* @param access * @param args the formal parameter types of this method.
* the access flags of the method to which this label belongs. * @param maxLocals the maximum number of local variables of this method.
* @param args
* the formal parameter types of this method.
* @param maxLocals
* the maximum number of local variables of this method.
*/ */
void initInputFrame(final ClassWriter cw, final int access, void initInputFrame(final ClassWriter cw, final int access, final Type[] args,
final Type[] args, final int maxLocals) { final int maxLocals) {
inputLocals = new int[maxLocals]; inputLocals = new int[maxLocals];
inputStack = new int[0]; inputStack = new int[0];
int i = 0; int i = 0;
@ -836,17 +792,12 @@ final class Frame {
/** /**
* Simulates the action of the given instruction on the output stack frame. * Simulates the action of the given instruction on the output stack frame.
* *
* @param opcode * @param opcode the opcode of the instruction.
* the opcode of the instruction. * @param arg the operand of the instruction, if any.
* @param arg * @param cw the class writer to which this label belongs.
* the operand of the instruction, if any. * @param item the operand of the instructions, if any.
* @param cw
* the class writer to which this label belongs.
* @param item
* the operand of the instructions, if any.
*/ */
void execute(final int opcode, final int arg, final ClassWriter cw, void execute(final int opcode, final int arg, final ClassWriter cw, final Item item) {
final Item item) {
int t1, t2, t3, t4; int t1, t2, t3, t4;
switch (opcode) { switch (opcode) {
case Opcodes.NOP: case Opcodes.NOP:
@ -1175,8 +1126,7 @@ final class Frame {
break; break;
case Opcodes.JSR: case Opcodes.JSR:
case Opcodes.RET: case Opcodes.RET:
throw new RuntimeException( throw new RuntimeException("JSR/RET are not supported with computeFrames option");
"JSR/RET are not supported with computeFrames option");
case Opcodes.GETSTATIC: case Opcodes.GETSTATIC:
push(cw, item.strVal3); push(cw, item.strVal3);
break; break;
@ -1198,8 +1148,7 @@ final class Frame {
pop(item.strVal3); pop(item.strVal3);
if (opcode != Opcodes.INVOKESTATIC) { if (opcode != Opcodes.INVOKESTATIC) {
t1 = pop(); t1 = pop();
if (opcode == Opcodes.INVOKESPECIAL if (opcode == Opcodes.INVOKESPECIAL && item.strVal2.charAt(0) == '<') {
&& item.strVal2.charAt(0) == '<') {
init(t1); init(t1);
} }
} }
@ -1269,19 +1218,16 @@ final class Frame {
} }
/** /**
* Merges the input frame of the given basic block with the input and output * Merges the input frame of the given basic block with the input and output frames of this
* frames of this basic block. Returns <tt>true</tt> if the input frame of * basic block. Returns <tt>true</tt> if the input frame of the given label has been changed by
* the given label has been changed by this operation. * this operation.
* *
* @param cw * @param cw the ClassWriter to which this label belongs.
* the ClassWriter to which this label belongs. * @param frame the basic block whose input frame must be updated.
* @param frame * @param edge the kind of the {@link Edge} between this label and 'label'. See
* the basic block whose input frame must be updated. * {@link Edge#info}.
* @param edge * @return <tt>true</tt> if the input frame of the given label has been changed by this
* the kind of the {@link Edge} between this label and 'label'. * operation.
* See {@link Edge#info}.
* @return <tt>true</tt> if the input frame of the given label has been
* changed by this operation.
*/ */
boolean merge(final ClassWriter cw, final Frame frame, final int edge) { boolean merge(final ClassWriter cw, final Frame frame, final int edge) {
boolean changed = false; boolean changed = false;
@ -1310,8 +1256,7 @@ final class Frame {
} else { } else {
t = dim + inputStack[nStack - (s & VALUE)]; t = dim + inputStack[nStack - (s & VALUE)];
} }
if ((s & TOP_IF_LONG_OR_DOUBLE) != 0 if ((s & TOP_IF_LONG_OR_DOUBLE) != 0 && (t == LONG || t == DOUBLE)) {
&& (t == LONG || t == DOUBLE)) {
t = TOP; t = TOP;
} }
} }
@ -1363,8 +1308,7 @@ final class Frame {
} else { } else {
t = dim + inputStack[nStack - (s & VALUE)]; t = dim + inputStack[nStack - (s & VALUE)];
} }
if ((s & TOP_IF_LONG_OR_DOUBLE) != 0 if ((s & TOP_IF_LONG_OR_DOUBLE) != 0 && (t == LONG || t == DOUBLE)) {
&& (t == LONG || t == DOUBLE)) {
t = TOP; t = TOP;
} }
} }
@ -1377,23 +1321,16 @@ final class Frame {
} }
/** /**
* Merges the type at the given index in the given type array with the given * Merges the type at the given index in the given type array with the given type. Returns
* type. Returns <tt>true</tt> if the type array has been modified by this * <tt>true</tt> if the type array has been modified by this operation.
* operation.
* *
* @param cw * @param cw the ClassWriter to which this label belongs.
* the ClassWriter to which this label belongs. * @param t the type with which the type array element must be merged.
* @param t * @param types an array of types.
* the type with which the type array element must be merged. * @param index the index of the type that must be merged in 'types'.
* @param types * @return <tt>true</tt> if the type array has been modified by this operation.
* an array of types.
* @param index
* the index of the type that must be merged in 'types'.
* @return <tt>true</tt> if the type array has been modified by this
* operation.
*/ */
private static boolean merge(final ClassWriter cw, int t, private static boolean merge(final ClassWriter cw, int t, final int[] types, final int index) {
final int[] types, final int index) {
int u = types[index]; int u = types[index];
if (u == t) { if (u == t) {
// if the types are equal, merge(u,t)=u, so there is no change // if the types are equal, merge(u,t)=u, so there is no change
@ -1421,8 +1358,7 @@ final class Frame {
// if t is also a reference type, and if u and t have the // if t is also a reference type, and if u and t have the
// same dimension merge(u,t) = dim(t) | common parent of the // same dimension merge(u,t) = dim(t) | common parent of the
// element types of u and t // element types of u and t
v = (t & DIM) | OBJECT v = (t & DIM) | OBJECT | cw.getMergedType(t & BASE_VALUE, u & BASE_VALUE);
| cw.getMergedType(t & BASE_VALUE, u & BASE_VALUE);
} else { } else {
// if u and t are array types, but not with the same element // if u and t are array types, but not with the same element
// type, merge(u,t)=java/lang/Object // type, merge(u,t)=java/lang/Object

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm; package org.objectweb.asm;
@ -39,9 +31,8 @@ package org.objectweb.asm;
public final class Handle { public final class Handle {
/** /**
* The kind of field or method designated by this Handle. Should be * The kind of field or method designated by this Handle. Should be {@link Opcodes#H_GETFIELD},
* {@link Opcodes#H_GETFIELD}, {@link Opcodes#H_GETSTATIC}, * {@link Opcodes#H_GETSTATIC}, {@link Opcodes#H_PUTFIELD}, {@link Opcodes#H_PUTSTATIC},
* {@link Opcodes#H_PUTFIELD}, {@link Opcodes#H_PUTSTATIC},
* {@link Opcodes#H_INVOKEVIRTUAL}, {@link Opcodes#H_INVOKESTATIC}, * {@link Opcodes#H_INVOKEVIRTUAL}, {@link Opcodes#H_INVOKESTATIC},
* {@link Opcodes#H_INVOKESPECIAL}, {@link Opcodes#H_NEWINVOKESPECIAL} or * {@link Opcodes#H_INVOKESPECIAL}, {@link Opcodes#H_NEWINVOKESPECIAL} or
* {@link Opcodes#H_INVOKEINTERFACE}. * {@link Opcodes#H_INVOKEINTERFACE}.
@ -49,8 +40,7 @@ public final class Handle {
final int tag; final int tag;
/** /**
* The internal name of the class that owns the field or method designated * The internal name of the class that owns the field or method designated by this handle.
* by this handle.
*/ */
final String owner; final String owner;
@ -67,23 +57,15 @@ public final class Handle {
/** /**
* Constructs a new field or method handle. * Constructs a new field or method handle.
* *
* @param tag * @param tag the kind of field or method designated by this Handle. Must be
* the kind of field or method designated by this Handle. Must be * {@link Opcodes#H_GETFIELD}, {@link Opcodes#H_GETSTATIC}, {@link Opcodes#H_PUTFIELD},
* {@link Opcodes#H_GETFIELD}, {@link Opcodes#H_GETSTATIC}, * {@link Opcodes#H_PUTSTATIC}, {@link Opcodes#H_INVOKEVIRTUAL},
* {@link Opcodes#H_PUTFIELD}, {@link Opcodes#H_PUTSTATIC}, * {@link Opcodes#H_INVOKESTATIC}, {@link Opcodes#H_INVOKESPECIAL},
* {@link Opcodes#H_INVOKEVIRTUAL}, * {@link Opcodes#H_NEWINVOKESPECIAL} or {@link Opcodes#H_INVOKEINTERFACE}.
* {@link Opcodes#H_INVOKESTATIC}, * @param owner the internal name of the class that owns the field or method designated by this
* {@link Opcodes#H_INVOKESPECIAL},
* {@link Opcodes#H_NEWINVOKESPECIAL} or
* {@link Opcodes#H_INVOKEINTERFACE}.
* @param owner
* the internal name of the class that owns the field or method
* designated by this handle.
* @param name
* the name of the field or method designated by this handle.
* @param desc
* the descriptor of the field or method designated by this
* handle. * handle.
* @param name the name of the field or method designated by this handle.
* @param desc the descriptor of the field or method designated by this handle.
*/ */
public Handle(int tag, String owner, String name, String desc) { public Handle(int tag, String owner, String name, String desc) {
this.tag = tag; this.tag = tag;
@ -95,23 +77,21 @@ public final class Handle {
/** /**
* Returns the kind of field or method designated by this handle. * Returns the kind of field or method designated by this handle.
* *
* @return {@link Opcodes#H_GETFIELD}, {@link Opcodes#H_GETSTATIC}, * @return {@link Opcodes#H_GETFIELD}, {@link Opcodes#H_GETSTATIC}, {@link Opcodes#H_PUTFIELD},
* {@link Opcodes#H_PUTFIELD}, {@link Opcodes#H_PUTSTATIC}, * {@link Opcodes#H_PUTSTATIC}, {@link Opcodes#H_INVOKEVIRTUAL},
* {@link Opcodes#H_INVOKEVIRTUAL}, {@link Opcodes#H_INVOKESTATIC}, * {@link Opcodes#H_INVOKESTATIC}, {@link Opcodes#H_INVOKESPECIAL},
* {@link Opcodes#H_INVOKESPECIAL}, * {@link Opcodes#H_NEWINVOKESPECIAL} or {@link Opcodes#H_INVOKEINTERFACE}.
* {@link Opcodes#H_NEWINVOKESPECIAL} or
* {@link Opcodes#H_INVOKEINTERFACE}.
*/ */
public int getTag() { public int getTag() {
return tag; return tag;
} }
/** /**
* Returns the internal name of the class that owns the field or method * Returns the internal name of the class that owns the field or method designated by this
* designated by this handle. * handle.
* *
* @return the internal name of the class that owns the field or method * @return the internal name of the class that owns the field or method designated by this
* designated by this handle. * handle.
*/ */
public String getOwner() { public String getOwner() {
return owner; return owner;
@ -144,8 +124,7 @@ public final class Handle {
return false; return false;
} }
Handle h = (Handle) obj; Handle h = (Handle) obj;
return tag == h.tag && owner.equals(h.owner) && name.equals(h.name) return tag == h.tag && owner.equals(h.owner) && name.equals(h.name) && desc.equals(h.desc);
&& desc.equals(h.desc);
} }
@Override @Override
@ -154,8 +133,7 @@ public final class Handle {
} }
/** /**
* Returns the textual representation of this handle. The textual * Returns the textual representation of this handle. The textual representation is:
* representation is:
* *
* <pre> * <pre>
* owner '.' name desc ' ' '(' tag ')' * owner '.' name desc ' ' '(' tag ')'

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm; package org.objectweb.asm;
@ -52,14 +44,14 @@ class Handler {
Label handler; Label handler;
/** /**
* Internal name of the type of exceptions handled by this handler, or * Internal name of the type of exceptions handled by this handler, or <tt>null</tt> to catch
* <tt>null</tt> to catch any exceptions. * any exceptions.
*/ */
String desc; String desc;
/** /**
* Constant pool index of the internal name of the type of exceptions * Constant pool index of the internal name of the type of exceptions handled by this handler,
* handled by this handler, or 0 to catch any exceptions. * or 0 to catch any exceptions.
*/ */
int type; int type;
@ -69,15 +61,11 @@ class Handler {
Handler next; Handler next;
/** /**
* Removes the range between start and end from the given exception * Removes the range between start and end from the given exception handlers.
* handlers.
* *
* @param h * @param h an exception handler list.
* an exception handler list. * @param start the start of the range to be removed.
* @param start * @param end the end of the range to be removed. Maybe null.
* the start of the range to be removed.
* @param end
* the end of the range to be removed. Maybe null.
* @return the exception handler list with the start-end range removed. * @return the exception handler list with the start-end range removed.
*/ */
static Handler remove(Handler h, Label start, Label end) { static Handler remove(Handler h, Label start, Label end) {

View File

@ -1,37 +1,29 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm; package org.objectweb.asm;
/** /**
* A constant pool item. Constant pool items can be created with the 'newXXX' * A constant pool item. Constant pool items can be created with the 'newXXX' methods in the
* methods in the {@link ClassWriter} class. * {@link ClassWriter} class.
* *
* @author Eric Bruneton * @author Eric Bruneton
*/ */
@ -43,25 +35,21 @@ final class Item {
int index; int index;
/** /**
* Type of this constant pool item. A single class is used to represent all * Type of this constant pool item. A single class is used to represent all constant pool item
* constant pool item types, in order to minimize the bytecode size of this * types, in order to minimize the bytecode size of this package. The value of this field is one
* package. The value of this field is one of {@link ClassWriter#INT}, * of {@link ClassWriter#INT}, {@link ClassWriter#LONG}, {@link ClassWriter#FLOAT},
* {@link ClassWriter#LONG}, {@link ClassWriter#FLOAT}, * {@link ClassWriter#DOUBLE}, {@link ClassWriter#UTF8}, {@link ClassWriter#STR},
* {@link ClassWriter#DOUBLE}, {@link ClassWriter#UTF8}, * {@link ClassWriter#CLASS}, {@link ClassWriter#NAME_TYPE}, {@link ClassWriter#FIELD},
* {@link ClassWriter#STR}, {@link ClassWriter#CLASS}, * {@link ClassWriter#METH}, {@link ClassWriter#IMETH}, {@link ClassWriter#MTYPE},
* {@link ClassWriter#NAME_TYPE}, {@link ClassWriter#FIELD}, * {@link ClassWriter#INDY}.
* {@link ClassWriter#METH}, {@link ClassWriter#IMETH},
* {@link ClassWriter#MTYPE}, {@link ClassWriter#INDY}.
* *
* MethodHandle constant 9 variations are stored using a range of 9 values * MethodHandle constant 9 variations are stored using a range of 9 values from
* from {@link ClassWriter#HANDLE_BASE} + 1 to * {@link ClassWriter#HANDLE_BASE} + 1 to {@link ClassWriter#HANDLE_BASE} + 9.
* {@link ClassWriter#HANDLE_BASE} + 9.
* *
* Special Item types are used for Items that are stored in the ClassWriter * Special Item types are used for Items that are stored in the ClassWriter
* {@link ClassWriter#typeTable}, instead of the constant pool, in order to * {@link ClassWriter#typeTable}, instead of the constant pool, in order to avoid clashes with
* avoid clashes with normal constant pool items in the ClassWriter constant * normal constant pool items in the ClassWriter constant pool's hash table. These special item
* pool's hash table. These special item types are * types are {@link ClassWriter#TYPE_NORMAL}, {@link ClassWriter#TYPE_UNINIT} and
* {@link ClassWriter#TYPE_NORMAL}, {@link ClassWriter#TYPE_UNINIT} and
* {@link ClassWriter#TYPE_MERGED}. * {@link ClassWriter#TYPE_MERGED}.
*/ */
int type; int type;
@ -77,20 +65,17 @@ final class Item {
long longVal; long longVal;
/** /**
* First part of the value of this item, for items that do not hold a * First part of the value of this item, for items that do not hold a primitive value.
* primitive value.
*/ */
String strVal1; String strVal1;
/** /**
* Second part of the value of this item, for items that do not hold a * Second part of the value of this item, for items that do not hold a primitive value.
* primitive value.
*/ */
String strVal2; String strVal2;
/** /**
* Third part of the value of this item, for items that do not hold a * Third part of the value of this item, for items that do not hold a primitive value.
* primitive value.
*/ */
String strVal3; String strVal3;
@ -100,23 +85,20 @@ final class Item {
int hashCode; int hashCode;
/** /**
* Link to another constant pool item, used for collision lists in the * Link to another constant pool item, used for collision lists in the constant pool's hash
* constant pool's hash table. * table.
*/ */
Item next; Item next;
/** /**
* Constructs an uninitialized {@link Item}. * Constructs an uninitialized {@link Item}.
*/ */
Item() { Item() {}
}
/** /**
* Constructs an uninitialized {@link Item} for constant pool element at * Constructs an uninitialized {@link Item} for constant pool element at given position.
* given position.
* *
* @param index * @param index index of the item to be constructed.
* index of the item to be constructed.
*/ */
Item(final int index) { Item(final int index) {
this.index = index; this.index = index;
@ -125,10 +107,8 @@ final class Item {
/** /**
* Constructs a copy of the given item. * Constructs a copy of the given item.
* *
* @param index * @param index index of the item to be constructed.
* index of the item to be constructed. * @param i the item that must be copied into the item to be constructed.
* @param i
* the item that must be copied into the item to be constructed.
*/ */
Item(final int index, final Item i) { Item(final int index, final Item i) {
this.index = index; this.index = index;
@ -144,8 +124,7 @@ final class Item {
/** /**
* Sets this item to an integer item. * Sets this item to an integer item.
* *
* @param intVal * @param intVal the value of this item.
* the value of this item.
*/ */
void set(final int intVal) { void set(final int intVal) {
this.type = ClassWriter.INT; this.type = ClassWriter.INT;
@ -156,8 +135,7 @@ final class Item {
/** /**
* Sets this item to a long item. * Sets this item to a long item.
* *
* @param longVal * @param longVal the value of this item.
* the value of this item.
*/ */
void set(final long longVal) { void set(final long longVal) {
this.type = ClassWriter.LONG; this.type = ClassWriter.LONG;
@ -168,8 +146,7 @@ final class Item {
/** /**
* Sets this item to a float item. * Sets this item to a float item.
* *
* @param floatVal * @param floatVal the value of this item.
* the value of this item.
*/ */
void set(final float floatVal) { void set(final float floatVal) {
this.type = ClassWriter.FLOAT; this.type = ClassWriter.FLOAT;
@ -180,8 +157,7 @@ final class Item {
/** /**
* Sets this item to a double item. * Sets this item to a double item.
* *
* @param doubleVal * @param doubleVal the value of this item.
* the value of this item.
*/ */
void set(final double doubleVal) { void set(final double doubleVal) {
this.type = ClassWriter.DOUBLE; this.type = ClassWriter.DOUBLE;
@ -192,17 +168,12 @@ final class Item {
/** /**
* Sets this item to an item that do not hold a primitive value. * Sets this item to an item that do not hold a primitive value.
* *
* @param type * @param type the type of this item.
* the type of this item. * @param strVal1 first part of the value of this item.
* @param strVal1 * @param strVal2 second part of the value of this item.
* first part of the value of this item. * @param strVal3 third part of the value of this item.
* @param strVal2
* second part of the value of this item.
* @param strVal3
* third part of the value of this item.
*/ */
void set(final int type, final String strVal1, final String strVal2, void set(final int type, final String strVal1, final String strVal2, final String strVal3) {
final String strVal3) {
this.type = type; this.type = type;
this.strVal1 = strVal1; this.strVal1 = strVal1;
this.strVal2 = strVal2; this.strVal2 = strVal2;
@ -216,8 +187,7 @@ final class Item {
hashCode = 0x7FFFFFFF & (type + strVal1.hashCode()); hashCode = 0x7FFFFFFF & (type + strVal1.hashCode());
return; return;
case ClassWriter.NAME_TYPE: { case ClassWriter.NAME_TYPE: {
hashCode = 0x7FFFFFFF & (type + strVal1.hashCode() hashCode = 0x7FFFFFFF & (type + strVal1.hashCode() * strVal2.hashCode());
* strVal2.hashCode());
return; return;
} }
// ClassWriter.FIELD: // ClassWriter.FIELD:
@ -225,39 +195,33 @@ final class Item {
// ClassWriter.IMETH: // ClassWriter.IMETH:
// ClassWriter.HANDLE_BASE + 1..9 // ClassWriter.HANDLE_BASE + 1..9
default: default:
hashCode = 0x7FFFFFFF & (type + strVal1.hashCode() hashCode = 0x7FFFFFFF
* strVal2.hashCode() * strVal3.hashCode()); & (type + strVal1.hashCode() * strVal2.hashCode() * strVal3.hashCode());
} }
} }
/** /**
* Sets the item to an InvokeDynamic item. * Sets the item to an InvokeDynamic item.
* *
* @param name * @param name invokedynamic's name.
* invokedynamic's name. * @param desc invokedynamic's desc.
* @param desc * @param bsmIndex zero based index into the class attribute BootrapMethods.
* invokedynamic's desc.
* @param bsmIndex
* zero based index into the class attribute BootrapMethods.
*/ */
void set(String name, String desc, int bsmIndex) { void set(String name, String desc, int bsmIndex) {
this.type = ClassWriter.INDY; this.type = ClassWriter.INDY;
this.longVal = bsmIndex; this.longVal = bsmIndex;
this.strVal1 = name; this.strVal1 = name;
this.strVal2 = desc; this.strVal2 = desc;
this.hashCode = 0x7FFFFFFF & (ClassWriter.INDY + bsmIndex this.hashCode = 0x7FFFFFFF
* strVal1.hashCode() * strVal2.hashCode()); & (ClassWriter.INDY + bsmIndex * strVal1.hashCode() * strVal2.hashCode());
} }
/** /**
* Sets the item to a BootstrapMethod item. * Sets the item to a BootstrapMethod item.
* *
* @param position * @param position position in byte in the class attribute BootrapMethods.
* position in byte in the class attribute BootrapMethods. * @param hashCode hashcode of the item. This hashcode is processed from the hashcode of the
* @param hashCode * bootstrap method and the hashcode of all bootstrap arguments.
* hashcode of the item. This hashcode is processed from the
* hashcode of the bootstrap method and the hashcode of all
* bootstrap arguments.
*/ */
void set(int position, int hashCode) { void set(int position, int hashCode) {
this.type = ClassWriter.BSM; this.type = ClassWriter.BSM;
@ -266,14 +230,11 @@ final class Item {
} }
/** /**
* Indicates if the given item is equal to this one. <i>This method assumes * Indicates if the given item is equal to this one. <i>This method assumes that the two items
* that the two items have the same {@link #type}</i>. * have the same {@link #type}</i>.
* *
* @param i * @param i the item to be compared to this one. Both items must have the same {@link #type}.
* the item to be compared to this one. Both items must have the * @return <tt>true</tt> if the given item if equal to this one, <tt>false</tt> otherwise.
* same {@link #type}.
* @return <tt>true</tt> if the given item if equal to this one,
* <tt>false</tt> otherwise.
*/ */
boolean isEqualTo(final Item i) { boolean isEqualTo(final Item i) {
switch (type) { switch (type) {

View File

@ -1,50 +1,40 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm; package org.objectweb.asm;
/** /**
* A label represents a position in the bytecode of a method. Labels are used * A label represents a position in the bytecode of a method. Labels are used for jump, goto, and
* for jump, goto, and switch instructions, and for try catch blocks. A label * switch instructions, and for try catch blocks. A label designates the <i>instruction</i> that is
* designates the <i>instruction</i> that is just after. Note however that there * just after. Note however that there can be other elements between a label and the instruction it
* can be other elements between a label and the instruction it designates (such * designates (such as other labels, stack map frames, line numbers, etc.).
* as other labels, stack map frames, line numbers, etc.).
* *
* @author Eric Bruneton * @author Eric Bruneton
*/ */
public class Label { public class Label {
/** /**
* Indicates if this label is only used for debug attributes. Such a label * Indicates if this label is only used for debug attributes. Such a label is not the start of a
* is not the start of a basic block, the target of a jump instruction, or * basic block, the target of a jump instruction, or an exception handler. It can be safely
* an exception handler. It can be safely ignored in control flow graph * ignored in control flow graph analysis algorithms (for optimization purposes).
* analysis algorithms (for optimization purposes).
*/ */
static final int DEBUG = 1; static final int DEBUG = 1;
@ -59,14 +49,14 @@ public class Label {
static final int RESIZED = 4; static final int RESIZED = 4;
/** /**
* Indicates if this basic block has been pushed in the basic block stack. * Indicates if this basic block has been pushed in the basic block stack. See
* See {@link MethodWriter#visitMaxs visitMaxs}. * {@link MethodWriter#visitMaxs visitMaxs}.
*/ */
static final int PUSHED = 8; static final int PUSHED = 8;
/** /**
* Indicates if this label is the target of a jump instruction, or the start * Indicates if this label is the target of a jump instruction, or the start of an exception
* of an exception handler. * handler.
*/ */
static final int TARGET = 16; static final int TARGET = 16;
@ -96,21 +86,20 @@ public class Label {
static final int SUBROUTINE = 512; static final int SUBROUTINE = 512;
/** /**
* Indicates if this subroutine basic block has been visited by a * Indicates if this subroutine basic block has been visited by a visitSubroutine(null, ...)
* visitSubroutine(null, ...) call. * call.
*/ */
static final int VISITED = 1024; static final int VISITED = 1024;
/** /**
* Indicates if this subroutine basic block has been visited by a * Indicates if this subroutine basic block has been visited by a visitSubroutine(!null, ...)
* visitSubroutine(!null, ...) call. * call.
*/ */
static final int VISITED2 = 2048; static final int VISITED2 = 2048;
/** /**
* Field used to associate user information to a label. Warning: this field * Field used to associate user information to a label. Warning: this field is used by the ASM
* is used by the ASM tree package. In order to use it with the ASM tree * tree package. In order to use it with the ASM tree package you must override the
* package you must override the
* {@link org.objectweb.asm.tree.MethodNode#getLabelNode} method. * {@link org.objectweb.asm.tree.MethodNode#getLabelNode} method.
*/ */
public Object info; public Object info;
@ -146,100 +135,89 @@ public class Label {
private int referenceCount; private int referenceCount;
/** /**
* Informations about forward references. Each forward reference is * Informations about forward references. Each forward reference is described by two consecutive
* described by two consecutive integers in this array: the first one is the * integers in this array: the first one is the position of the first byte of the bytecode
* position of the first byte of the bytecode instruction that contains the * instruction that contains the forward reference, while the second is the position of the
* forward reference, while the second is the position of the first byte of * first byte of the forward reference itself. In fact the sign of the first integer indicates
* the forward reference itself. In fact the sign of the first integer * if this reference uses 2 or 4 bytes, and its absolute value gives the position of the
* indicates if this reference uses 2 or 4 bytes, and its absolute value * bytecode instruction. This array is also used as a bitset to store the subroutines to which a
* gives the position of the bytecode instruction. This array is also used * basic block belongs. This information is needed in {@linked MethodWriter#visitMaxs}, after
* as a bitset to store the subroutines to which a basic block belongs. This * all forward references have been resolved. Hence the same array can be used for both purposes
* information is needed in {@linked MethodWriter#visitMaxs}, after all * without problems.
* forward references have been resolved. Hence the same array can be used
* for both purposes without problems.
*/ */
private int[] srcAndRefPositions; private int[] srcAndRefPositions;
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
/* /*
* Fields for the control flow and data flow graph analysis algorithms (used * Fields for the control flow and data flow graph analysis algorithms (used to compute the
* to compute the maximum stack size or the stack map frames). A control * maximum stack size or the stack map frames). A control flow graph contains one node per
* flow graph contains one node per "basic block", and one edge per "jump" * "basic block", and one edge per "jump" from one basic block to another. Each node (i.e., each
* from one basic block to another. Each node (i.e., each basic block) is * basic block) is represented by the Label object that corresponds to the first instruction of
* represented by the Label object that corresponds to the first instruction * this basic block. Each node also stores the list of its successors in the graph, as a linked
* of this basic block. Each node also stores the list of its successors in * list of Edge objects.
* the graph, as a linked list of Edge objects.
* *
* The control flow analysis algorithms used to compute the maximum stack * The control flow analysis algorithms used to compute the maximum stack size or the stack map
* size or the stack map frames are similar and use two steps. The first * frames are similar and use two steps. The first step, during the visit of each instruction,
* step, during the visit of each instruction, builds information about the * builds information about the state of the local variables and the operand stack at the end of
* state of the local variables and the operand stack at the end of each * each basic block, called the "output frame", <i>relatively</i> to the frame state at the
* basic block, called the "output frame", <i>relatively</i> to the frame * beginning of the basic block, which is called the "input frame", and which is <i>unknown</i>
* state at the beginning of the basic block, which is called the "input * during this step. The second step, in {@link MethodWriter#visitMaxs}, is a fix point
* frame", and which is <i>unknown</i> during this step. The second step, in * algorithm that computes information about the input frame of each basic block, from the input
* {@link MethodWriter#visitMaxs}, is a fix point algorithm that computes * state of the first basic block (known from the method signature), and by the using the
* information about the input frame of each basic block, from the input * previously computed relative output frames.
* state of the first basic block (known from the method signature), and by
* the using the previously computed relative output frames.
* *
* The algorithm used to compute the maximum stack size only computes the * The algorithm used to compute the maximum stack size only computes the relative output and
* relative output and absolute input stack heights, while the algorithm * absolute input stack heights, while the algorithm used to compute stack map frames computes
* used to compute stack map frames computes relative output frames and * relative output frames and absolute input frames.
* absolute input frames.
*/ */
/** /**
* Start of the output stack relatively to the input stack. The exact * Start of the output stack relatively to the input stack. The exact semantics of this field
* semantics of this field depends on the algorithm that is used. * depends on the algorithm that is used.
* *
* When only the maximum stack size is computed, this field is the number of * When only the maximum stack size is computed, this field is the number of elements in the
* elements in the input stack. * input stack.
* *
* When the stack map frames are completely computed, this field is the * When the stack map frames are completely computed, this field is the offset of the first
* offset of the first output stack element relatively to the top of the * output stack element relatively to the top of the input stack. This offset is always negative
* input stack. This offset is always negative or null. A null offset means * or null. A null offset means that the output stack must be appended to the input stack. A -n
* that the output stack must be appended to the input stack. A -n offset * offset means that the first n output stack elements must replace the top n input stack
* means that the first n output stack elements must replace the top n input * elements, and that the other elements must be appended to the input stack.
* stack elements, and that the other elements must be appended to the input
* stack.
*/ */
int inputStackTop; int inputStackTop;
/** /**
* Maximum height reached by the output stack, relatively to the top of the * Maximum height reached by the output stack, relatively to the top of the input stack. This
* input stack. This maximum is always positive or null. * maximum is always positive or null.
*/ */
int outputStackMax; int outputStackMax;
/** /**
* Information about the input and output stack map frames of this basic * Information about the input and output stack map frames of this basic block. This field is
* block. This field is only used when {@link ClassWriter#COMPUTE_FRAMES} * only used when {@link ClassWriter#COMPUTE_FRAMES} option is used.
* option is used.
*/ */
Frame frame; Frame frame;
/** /**
* The successor of this label, in the order they are visited. This linked * The successor of this label, in the order they are visited. This linked list does not include
* list does not include labels used for debug info only. If * labels used for debug info only. If {@link ClassWriter#COMPUTE_FRAMES} option is used then,
* {@link ClassWriter#COMPUTE_FRAMES} option is used then, in addition, it * in addition, it does not contain successive labels that denote the same bytecode position (in
* does not contain successive labels that denote the same bytecode position * this case only the first label appears in this list).
* (in this case only the first label appears in this list).
*/ */
Label successor; Label successor;
/** /**
* The successors of this node in the control flow graph. These successors * The successors of this node in the control flow graph. These successors are stored in a
* are stored in a linked list of {@link Edge Edge} objects, linked to each * linked list of {@link Edge Edge} objects, linked to each other by their {@link Edge#next}
* other by their {@link Edge#next} field. * field.
*/ */
Edge successors; Edge successors;
/** /**
* The next basic block in the basic block stack. This stack is used in the * The next basic block in the basic block stack. This stack is used in the main loop of the fix
* main loop of the fix point algorithm used in the second step of the * point algorithm used in the second step of the control flow analysis algorithms. It is also
* control flow analysis algorithms. It is also used in * used in {@link #visitSubroutine} to avoid using a recursive method.
* {@link #visitSubroutine} to avoid using a recursive method.
* *
* @see MethodWriter#visitMaxs * @see MethodWriter#visitMaxs
*/ */
@ -252,49 +230,39 @@ public class Label {
/** /**
* Constructs a new label. * Constructs a new label.
*/ */
public Label() { public Label() {}
}
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// Methods to compute offsets and to manage forward references // Methods to compute offsets and to manage forward references
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
/** /**
* Returns the offset corresponding to this label. This offset is computed * Returns the offset corresponding to this label. This offset is computed from the start of the
* from the start of the method's bytecode. <i>This method is intended for * method's bytecode. <i>This method is intended for {@link Attribute} sub classes, and is
* {@link Attribute} sub classes, and is normally not needed by class * normally not needed by class generators or adapters.</i>
* generators or adapters.</i>
* *
* @return the offset corresponding to this label. * @return the offset corresponding to this label.
* @throws IllegalStateException * @throws IllegalStateException if this label is not resolved yet.
* if this label is not resolved yet.
*/ */
public int getOffset() { public int getOffset() {
if ((status & RESOLVED) == 0) { if ((status & RESOLVED) == 0) {
throw new IllegalStateException( throw new IllegalStateException("Label offset position has not been resolved yet");
"Label offset position has not been resolved yet");
} }
return position; return position;
} }
/** /**
* Puts a reference to this label in the bytecode of a method. If the * Puts a reference to this label in the bytecode of a method. If the position of the label is
* position of the label is known, the offset is computed and written * known, the offset is computed and written directly. Otherwise, a null offset is written and a
* directly. Otherwise, a null offset is written and a new forward reference * new forward reference is declared for this label.
* is declared for this label.
* *
* @param owner * @param owner the code writer that calls this method.
* the code writer that calls this method. * @param out the bytecode of the method.
* @param out * @param source the position of first byte of the bytecode instruction that contains this
* the bytecode of the method. * label.
* @param source * @param wideOffset <tt>true</tt> if the reference must be stored in 4 bytes, or <tt>false</tt>
* the position of first byte of the bytecode instruction that * if it must be stored with 2 bytes.
* contains this label. * @throws IllegalArgumentException if this label has not been created by the given code writer.
* @param wideOffset
* <tt>true</tt> if the reference must be stored in 4 bytes, or
* <tt>false</tt> if it must be stored with 2 bytes.
* @throws IllegalArgumentException
* if this label has not been created by the given code writer.
*/ */
void put(final MethodWriter owner, final ByteVector out, final int source, void put(final MethodWriter owner, final ByteVector out, final int source,
final boolean wideOffset) { final boolean wideOffset) {
@ -316,27 +284,22 @@ public class Label {
} }
/** /**
* Adds a forward reference to this label. This method must be called only * Adds a forward reference to this label. This method must be called only for a true forward
* for a true forward reference, i.e. only if this label is not resolved * reference, i.e. only if this label is not resolved yet. For backward references, the offset
* yet. For backward references, the offset of the reference can be, and * of the reference can be, and must be, computed and stored directly.
* must be, computed and stored directly.
* *
* @param sourcePosition * @param sourcePosition the position of the referencing instruction. This position will be used
* the position of the referencing instruction. This position * to compute the offset of this forward reference.
* will be used to compute the offset of this forward reference. * @param referencePosition the position where the offset for this forward reference must be
* @param referencePosition * stored.
* the position where the offset for this forward reference must
* be stored.
*/ */
private void addReference(final int sourcePosition, private void addReference(final int sourcePosition, final int referencePosition) {
final int referencePosition) {
if (srcAndRefPositions == null) { if (srcAndRefPositions == null) {
srcAndRefPositions = new int[6]; srcAndRefPositions = new int[6];
} }
if (referenceCount >= srcAndRefPositions.length) { if (referenceCount >= srcAndRefPositions.length) {
int[] a = new int[srcAndRefPositions.length + 6]; int[] a = new int[srcAndRefPositions.length + 6];
System.arraycopy(srcAndRefPositions, 0, a, 0, System.arraycopy(srcAndRefPositions, 0, a, 0, srcAndRefPositions.length);
srcAndRefPositions.length);
srcAndRefPositions = a; srcAndRefPositions = a;
} }
srcAndRefPositions[referenceCount++] = sourcePosition; srcAndRefPositions[referenceCount++] = sourcePosition;
@ -344,30 +307,23 @@ public class Label {
} }
/** /**
* Resolves all forward references to this label. This method must be called * Resolves all forward references to this label. This method must be called when this label is
* when this label is added to the bytecode of the method, i.e. when its * added to the bytecode of the method, i.e. when its position becomes known. This method fills
* position becomes known. This method fills in the blanks that where left * in the blanks that where left in the bytecode by each forward reference previously added to
* in the bytecode by each forward reference previously added to this label. * this label.
* *
* @param owner * @param owner the code writer that calls this method.
* the code writer that calls this method. * @param position the position of this label in the bytecode.
* @param position * @param data the bytecode of the method.
* the position of this label in the bytecode. * @return <tt>true</tt> if a blank that was left for this label was to small to store the
* @param data * offset. In such a case the corresponding jump instruction is replaced with a pseudo
* the bytecode of the method. * instruction (using unused opcodes) using an unsigned two bytes offset. These pseudo
* @return <tt>true</tt> if a blank that was left for this label was to * instructions will need to be replaced with true instructions with wider offsets (4
* small to store the offset. In such a case the corresponding jump * bytes instead of 2). This is done in {@link MethodWriter#resizeInstructions}.
* instruction is replaced with a pseudo instruction (using unused * @throws IllegalArgumentException if this label has already been resolved, or if it has not
* opcodes) using an unsigned two bytes offset. These pseudo
* instructions will need to be replaced with true instructions with
* wider offsets (4 bytes instead of 2). This is done in
* {@link MethodWriter#resizeInstructions}.
* @throws IllegalArgumentException
* if this label has already been resolved, or if it has not
* been created by the given code writer. * been created by the given code writer.
*/ */
boolean resolve(final MethodWriter owner, final int position, boolean resolve(final MethodWriter owner, final int position, final byte[] data) {
final byte[] data) {
boolean needUpdate = false; boolean needUpdate = false;
this.status |= RESOLVED; this.status |= RESOLVED;
this.position = position; this.position = position;
@ -380,13 +336,11 @@ public class Label {
offset = position - source; offset = position - source;
if (offset < Short.MIN_VALUE || offset > Short.MAX_VALUE) { if (offset < Short.MIN_VALUE || offset > Short.MAX_VALUE) {
/* /*
* changes the opcode of the jump instruction, in order to * changes the opcode of the jump instruction, in order to be able to find it
* be able to find it later (see resizeInstructions in * later (see resizeInstructions in MethodWriter). These temporary opcodes are
* MethodWriter). These temporary opcodes are similar to * similar to jump instruction opcodes, except that the 2 bytes offset is
* jump instruction opcodes, except that the 2 bytes offset * unsigned (and can therefore represent values from 0 to 65535, which is
* is unsigned (and can therefore represent values from 0 to * sufficient since the size of a method is limited to 65535 bytes).
* 65535, which is sufficient since the size of a method is
* limited to 65535 bytes).
*/ */
int opcode = data[reference - 1] & 0xFF; int opcode = data[reference - 1] & 0xFF;
if (opcode <= Opcodes.JSR) { if (opcode <= Opcodes.JSR) {
@ -412,10 +366,9 @@ public class Label {
} }
/** /**
* Returns the first label of the series to which this label belongs. For an * Returns the first label of the series to which this label belongs. For an isolated label or
* isolated label or for the first label in a series of successive labels, * for the first label in a series of successive labels, this method returns the label itself.
* this method returns the label itself. For other labels it returns the * For other labels it returns the first label of the series.
* first label of the series.
* *
* @return the first label of the series to which this label belongs. * @return the first label of the series to which this label belongs.
*/ */
@ -430,8 +383,7 @@ public class Label {
/** /**
* Returns true is this basic block belongs to the given subroutine. * Returns true is this basic block belongs to the given subroutine.
* *
* @param id * @param id a subroutine id.
* a subroutine id.
* @return true is this basic block belongs to the given subroutine. * @return true is this basic block belongs to the given subroutine.
*/ */
boolean inSubroutine(final long id) { boolean inSubroutine(final long id) {
@ -442,13 +394,10 @@ public class Label {
} }
/** /**
* Returns true if this basic block and the given one belong to a common * Returns true if this basic block and the given one belong to a common subroutine.
* subroutine.
* *
* @param block * @param block another basic block.
* another basic block. * @return true if this basic block and the given one belong to a common subroutine.
* @return true if this basic block and the given one belong to a common
* subroutine.
*/ */
boolean inSameSubroutine(final Label block) { boolean inSameSubroutine(final Label block) {
if ((status & VISITED) == 0 || (block.status & VISITED) == 0) { if ((status & VISITED) == 0 || (block.status & VISITED) == 0) {
@ -465,10 +414,8 @@ public class Label {
/** /**
* Marks this basic block as belonging to the given subroutine. * Marks this basic block as belonging to the given subroutine.
* *
* @param id * @param id a subroutine id.
* a subroutine id. * @param nbSubroutines the total number of subroutines in the method.
* @param nbSubroutines
* the total number of subroutines in the method.
*/ */
void addToSubroutine(final long id, final int nbSubroutines) { void addToSubroutine(final long id, final int nbSubroutines) {
if ((status & VISITED) == 0) { if ((status & VISITED) == 0) {
@ -479,19 +426,14 @@ public class Label {
} }
/** /**
* Finds the basic blocks that belong to a given subroutine, and marks these * Finds the basic blocks that belong to a given subroutine, and marks these blocks as belonging
* blocks as belonging to this subroutine. This method follows the control * to this subroutine. This method follows the control flow graph to find all the blocks that
* flow graph to find all the blocks that are reachable from the current * are reachable from the current block WITHOUT following any JSR target.
* block WITHOUT following any JSR target.
* *
* @param JSR * @param JSR a JSR block that jumps to this subroutine. If this JSR is not null it is added to
* a JSR block that jumps to this subroutine. If this JSR is not * the successor of the RET blocks found in the subroutine.
* null it is added to the successor of the RET blocks found in * @param id the id of this subroutine.
* the subroutine. * @param nbSubroutines the total number of subroutines in the method.
* @param id
* the id of this subroutine.
* @param nbSubroutines
* the total number of subroutines in the method.
*/ */
void visitSubroutine(final Label JSR, final long id, final int nbSubroutines) { void visitSubroutine(final Label JSR, final long id, final int nbSubroutines) {
// user managed stack of labels, to avoid using a recursive method // user managed stack of labels, to avoid using a recursive method

View File

@ -1,71 +1,58 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm; package org.objectweb.asm;
/** /**
* A visitor to visit a Java method. The methods of this class must be called in * A visitor to visit a Java method. The methods of this class must be called in the following
* the following order: [ <tt>visitAnnotationDefault</tt> ] ( * order: [ <tt>visitAnnotationDefault</tt> ] ( <tt>visitAnnotation</tt> |
* <tt>visitAnnotation</tt> | <tt>visitParameterAnnotation</tt> | * <tt>visitParameterAnnotation</tt> | <tt>visitAttribute</tt> )* [ <tt>visitCode</tt> (
* <tt>visitAttribute</tt> )* [ <tt>visitCode</tt> ( <tt>visitFrame</tt> | * <tt>visitFrame</tt> | <tt>visit</tt><i>X</i>Insn</tt> | <tt>visitLabel</tt> |
* <tt>visit</tt><i>X</i>Insn</tt> | <tt>visitLabel</tt> | * <tt>visitTryCatchBlock</tt> | <tt>visitLocalVariable</tt> | <tt>visitLineNumber</tt> )*
* <tt>visitTryCatchBlock</tt> | <tt>visitLocalVariable</tt> | * <tt>visitMaxs</tt> ] <tt>visitEnd</tt>. In addition, the <tt>visit</tt><i>X</i>Insn</tt> and
* <tt>visitLineNumber</tt> )* <tt>visitMaxs</tt> ] <tt>visitEnd</tt>. In * <tt>visitLabel</tt> methods must be called in the sequential order of the bytecode instructions
* addition, the <tt>visit</tt><i>X</i>Insn</tt> and <tt>visitLabel</tt> methods * of the visited code, <tt>visitTryCatchBlock</tt> must be called <i>before</i> the labels passed
* must be called in the sequential order of the bytecode instructions of the * as arguments have been visited, and the <tt>visitLocalVariable</tt> and <tt>visitLineNumber</tt>
* visited code, <tt>visitTryCatchBlock</tt> must be called <i>before</i> the * methods must be called <i>after</i> the labels passed as arguments have been visited.
* labels passed as arguments have been visited, and the
* <tt>visitLocalVariable</tt> and <tt>visitLineNumber</tt> methods must be
* called <i>after</i> the labels passed as arguments have been visited.
* *
* @author Eric Bruneton * @author Eric Bruneton
*/ */
public abstract class MethodVisitor { public abstract class MethodVisitor {
/** /**
* The ASM API version implemented by this visitor. The value of this field * The ASM API version implemented by this visitor. The value of this field must be one of
* must be one of {@link Opcodes#ASM4}. * {@link Opcodes#ASM4}.
*/ */
protected final int api; protected final int api;
/** /**
* The method visitor to which this visitor must delegate method calls. May * The method visitor to which this visitor must delegate method calls. May be null.
* be null.
*/ */
protected MethodVisitor mv; protected MethodVisitor mv;
/** /**
* Constructs a new {@link MethodVisitor}. * Constructs a new {@link MethodVisitor}.
* *
* @param api * @param api the ASM API version implemented by this visitor. Must be one of
* the ASM API version implemented by this visitor. Must be one * {@link Opcodes#ASM4}.
* of {@link Opcodes#ASM4}.
*/ */
public MethodVisitor(final int api) { public MethodVisitor(final int api) {
this(api, null); this(api, null);
@ -74,12 +61,9 @@ public abstract class MethodVisitor {
/** /**
* Constructs a new {@link MethodVisitor}. * Constructs a new {@link MethodVisitor}.
* *
* @param api * @param api the ASM API version implemented by this visitor. Must be one of
* the ASM API version implemented by this visitor. Must be one * {@link Opcodes#ASM4}.
* of {@link Opcodes#ASM4}. * @param mv the method visitor to which this visitor must delegate method calls. May be null.
* @param mv
* the method visitor to which this visitor must delegate method
* calls. May be null.
*/ */
public MethodVisitor(final int api, final MethodVisitor mv) { public MethodVisitor(final int api, final MethodVisitor mv) {
if (api != Opcodes.ASM4) { if (api != Opcodes.ASM4) {
@ -96,12 +80,11 @@ public abstract class MethodVisitor {
/** /**
* Visits the default value of this annotation interface method. * Visits the default value of this annotation interface method.
* *
* @return a visitor to the visit the actual default value of this * @return a visitor to the visit the actual default value of this annotation interface method,
* annotation interface method, or <tt>null</tt> if this visitor is * or <tt>null</tt> if this visitor is not interested in visiting this default value.
* not interested in visiting this default value. The 'name' * The 'name' parameters passed to the methods of this annotation visitor are ignored.
* parameters passed to the methods of this annotation visitor are * Moreover, exacly one visit method must be called on this annotation visitor, followed
* ignored. Moreover, exacly one visit method must be called on this * by visitEnd.
* annotation visitor, followed by visitEnd.
*/ */
public AnnotationVisitor visitAnnotationDefault() { public AnnotationVisitor visitAnnotationDefault() {
if (mv != null) { if (mv != null) {
@ -113,12 +96,10 @@ public abstract class MethodVisitor {
/** /**
* Visits an annotation of this method. * Visits an annotation of this method.
* *
* @param desc * @param desc the class descriptor of the annotation class.
* the class descriptor of the annotation class. * @param visible <tt>true</tt> if the annotation is visible at runtime.
* @param visible * @return a visitor to visit the annotation values, or <tt>null</tt> if this visitor is not
* <tt>true</tt> if the annotation is visible at runtime. * interested in visiting this annotation.
* @return a visitor to visit the annotation values, or <tt>null</tt> if
* this visitor is not interested in visiting this annotation.
*/ */
public AnnotationVisitor visitAnnotation(String desc, boolean visible) { public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
if (mv != null) { if (mv != null) {
@ -130,17 +111,13 @@ public abstract class MethodVisitor {
/** /**
* Visits an annotation of a parameter this method. * Visits an annotation of a parameter this method.
* *
* @param parameter * @param parameter the parameter index.
* the parameter index. * @param desc the class descriptor of the annotation class.
* @param desc * @param visible <tt>true</tt> if the annotation is visible at runtime.
* the class descriptor of the annotation class. * @return a visitor to visit the annotation values, or <tt>null</tt> if this visitor is not
* @param visible * interested in visiting this annotation.
* <tt>true</tt> if the annotation is visible at runtime.
* @return a visitor to visit the annotation values, or <tt>null</tt> if
* this visitor is not interested in visiting this annotation.
*/ */
public AnnotationVisitor visitParameterAnnotation(int parameter, public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) {
String desc, boolean visible) {
if (mv != null) { if (mv != null) {
return mv.visitParameterAnnotation(parameter, desc, visible); return mv.visitParameterAnnotation(parameter, desc, visible);
} }
@ -150,8 +127,7 @@ public abstract class MethodVisitor {
/** /**
* Visits a non standard attribute of this method. * Visits a non standard attribute of this method.
* *
* @param attr * @param attr an attribute.
* an attribute.
*/ */
public void visitAttribute(Attribute attr) { public void visitAttribute(Attribute attr) {
if (mv != null) { if (mv != null) {
@ -169,80 +145,63 @@ public abstract class MethodVisitor {
} }
/** /**
* Visits the current state of the local variables and operand stack * Visits the current state of the local variables and operand stack elements. This method
* elements. This method must(*) be called <i>just before</i> any * must(*) be called <i>just before</i> any instruction <b>i</b> that follows an unconditional
* instruction <b>i</b> that follows an unconditional branch instruction * branch instruction such as GOTO or THROW, that is the target of a jump instruction, or that
* such as GOTO or THROW, that is the target of a jump instruction, or that * starts an exception handler block. The visited types must describe the values of the local
* starts an exception handler block. The visited types must describe the * variables and of the operand stack elements <i>just before</i> <b>i</b> is executed.<br>
* values of the local variables and of the operand stack elements <i>just
* before</i> <b>i</b> is executed.<br>
* <br> * <br>
* (*) this is mandatory only for classes whose version is greater than or * (*) this is mandatory only for classes whose version is greater than or equal to
* equal to {@link Opcodes#V1_6 V1_6}. <br> * {@link Opcodes#V1_6 V1_6}. <br>
* <br> * <br>
* The frames of a method must be given either in expanded form, or in * The frames of a method must be given either in expanded form, or in compressed form (all
* compressed form (all frames must use the same format, i.e. you must not * frames must use the same format, i.e. you must not mix expanded and compressed frames within
* mix expanded and compressed frames within a single method): * a single method):
* <ul> * <ul>
* <li>In expanded form, all frames must have the F_NEW type.</li> * <li>In expanded form, all frames must have the F_NEW type.</li>
* <li>In compressed form, frames are basically "deltas" from the state of * <li>In compressed form, frames are basically "deltas" from the state of the previous frame:
* the previous frame:
* <ul> * <ul>
* <li>{@link Opcodes#F_SAME} representing frame with exactly the same * <li>{@link Opcodes#F_SAME} representing frame with exactly the same locals as the previous
* locals as the previous frame and with the empty stack.</li> * frame and with the empty stack.</li>
* <li>{@link Opcodes#F_SAME1} representing frame with exactly the same * <li>{@link Opcodes#F_SAME1} representing frame with exactly the same locals as the previous
* locals as the previous frame and with single value on the stack ( * frame and with single value on the stack ( <code>nStack</code> is 1 and <code>stack[0]</code>
* <code>nStack</code> is 1 and <code>stack[0]</code> contains value for the * contains value for the type of the stack item).</li>
* type of the stack item).</li> * <li>{@link Opcodes#F_APPEND} representing frame with current locals are the same as the
* <li>{@link Opcodes#F_APPEND} representing frame with current locals are * locals in the previous frame, except that additional locals are defined (<code>nLocal</code>
* the same as the locals in the previous frame, except that additional * is 1, 2 or 3 and <code>local</code> elements contains values representing added types).</li>
* locals are defined (<code>nLocal</code> is 1, 2 or 3 and * <li>{@link Opcodes#F_CHOP} representing frame with current locals are the same as the locals
* <code>local</code> elements contains values representing added types).</li> * in the previous frame, except that the last 1-3 locals are absent and with the empty stack
* <li>{@link Opcodes#F_CHOP} representing frame with current locals are the * (<code>nLocals</code> is 1, 2 or 3).</li>
* same as the locals in the previous frame, except that the last 1-3 locals
* are absent and with the empty stack (<code>nLocals</code> is 1, 2 or 3).</li>
* <li>{@link Opcodes#F_FULL} representing complete frame data.</li></li> * <li>{@link Opcodes#F_FULL} representing complete frame data.</li></li>
* </ul> * </ul>
* </ul> <br> * </ul>
* In both cases the first frame, corresponding to the method's parameters * <br>
* and access flags, is implicit and must not be visited. Also, it is * In both cases the first frame, corresponding to the method's parameters and access flags, is
* illegal to visit two or more frames for the same code location (i.e., at * implicit and must not be visited. Also, it is illegal to visit two or more frames for the
* least one instruction must be visited between two calls to visitFrame). * same code location (i.e., at least one instruction must be visited between two calls to
* visitFrame).
* *
* @param type * @param type the type of this stack map frame. Must be {@link Opcodes#F_NEW} for expanded
* the type of this stack map frame. Must be * frames, or {@link Opcodes#F_FULL}, {@link Opcodes#F_APPEND}, {@link Opcodes#F_CHOP},
* {@link Opcodes#F_NEW} for expanded frames, or * {@link Opcodes#F_SAME} or {@link Opcodes#F_APPEND}, {@link Opcodes#F_SAME1} for
* {@link Opcodes#F_FULL}, {@link Opcodes#F_APPEND},
* {@link Opcodes#F_CHOP}, {@link Opcodes#F_SAME} or
* {@link Opcodes#F_APPEND}, {@link Opcodes#F_SAME1} for
* compressed frames. * compressed frames.
* @param nLocal * @param nLocal the number of local variables in the visited frame.
* the number of local variables in the visited frame. * @param local the local variable types in this frame. This array must not be modified.
* @param local * Primitive types are represented by {@link Opcodes#TOP}, {@link Opcodes#INTEGER},
* the local variable types in this frame. This array must not be
* modified. Primitive types are represented by
* {@link Opcodes#TOP}, {@link Opcodes#INTEGER},
* {@link Opcodes#FLOAT}, {@link Opcodes#LONG}, * {@link Opcodes#FLOAT}, {@link Opcodes#LONG},
* {@link Opcodes#DOUBLE},{@link Opcodes#NULL} or * {@link Opcodes#DOUBLE},{@link Opcodes#NULL} or {@link Opcodes#UNINITIALIZED_THIS}
* {@link Opcodes#UNINITIALIZED_THIS} (long and double are * (long and double are represented by a single element). Reference types are represented
* represented by a single element). Reference types are * by String objects (representing internal names), and uninitialized types by Label
* represented by String objects (representing internal names), * objects (this label designates the NEW instruction that created this uninitialized
* and uninitialized types by Label objects (this label
* designates the NEW instruction that created this uninitialized
* value). * value).
* @param nStack * @param nStack the number of operand stack elements in the visited frame.
* the number of operand stack elements in the visited frame. * @param stack the operand stack types in this frame. This array must not be modified. Its
* @param stack * content has the same format as the "local" array.
* the operand stack types in this frame. This array must not be * @throws IllegalStateException if a frame is visited just after another one, without any
* modified. Its content has the same format as the "local" * instruction between the two (unless this frame is a Opcodes#F_SAME frame, in which
* array. * case it is silently ignored).
* @throws IllegalStateException
* if a frame is visited just after another one, without any
* instruction between the two (unless this frame is a
* Opcodes#F_SAME frame, in which case it is silently ignored).
*/ */
public void visitFrame(int type, int nLocal, Object[] local, int nStack, public void visitFrame(int type, int nLocal, Object[] local, int nStack, Object[] stack) {
Object[] stack) {
if (mv != null) { if (mv != null) {
mv.visitFrame(type, nLocal, local, nStack, stack); mv.visitFrame(type, nLocal, local, nStack, stack);
} }
@ -255,22 +214,17 @@ public abstract class MethodVisitor {
/** /**
* Visits a zero operand instruction. * Visits a zero operand instruction.
* *
* @param opcode * @param opcode the opcode of the instruction to be visited. This opcode is either NOP,
* the opcode of the instruction to be visited. This opcode is * ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5,
* either NOP, ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1, * LCONST_0, LCONST_1, FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD, LALOAD,
* ICONST_2, ICONST_3, ICONST_4, ICONST_5, LCONST_0, LCONST_1, * FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IASTORE, LASTORE, FASTORE, DASTORE,
* FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD, * AASTORE, BASTORE, CASTORE, SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1,
* LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, * DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB, IMUL, LMUL, FMUL, DMUL,
* IASTORE, LASTORE, FASTORE, DASTORE, AASTORE, BASTORE, CASTORE, * IDIV, LDIV, FDIV, DDIV, IREM, LREM, FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL,
* SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, * ISHR, LSHR, IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D, L2I, L2F,
* DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB, * L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S, LCMP, FCMPL, FCMPG, DCMPL, DCMPG,
* IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM, * IRETURN, LRETURN, FRETURN, DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW,
* FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL, ISHR, LSHR, * MONITORENTER, or MONITOREXIT.
* IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D,
* L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S,
* LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IRETURN, LRETURN, FRETURN,
* DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW, MONITORENTER,
* or MONITOREXIT.
*/ */
public void visitInsn(int opcode) { public void visitInsn(int opcode) {
if (mv != null) { if (mv != null) {
@ -281,20 +235,17 @@ public abstract class MethodVisitor {
/** /**
* Visits an instruction with a single int operand. * Visits an instruction with a single int operand.
* *
* @param opcode * @param opcode the opcode of the instruction to be visited. This opcode is either BIPUSH,
* the opcode of the instruction to be visited. This opcode is * SIPUSH or NEWARRAY.
* either BIPUSH, SIPUSH or NEWARRAY. * @param operand the operand of the instruction to be visited.<br>
* @param operand * When opcode is BIPUSH, operand value should be between Byte.MIN_VALUE and
* the operand of the instruction to be visited.<br> * Byte.MAX_VALUE.<br>
* When opcode is BIPUSH, operand value should be between * When opcode is SIPUSH, operand value should be between Short.MIN_VALUE and
* Byte.MIN_VALUE and Byte.MAX_VALUE.<br> * Short.MAX_VALUE.<br>
* When opcode is SIPUSH, operand value should be between * When opcode is NEWARRAY, operand value should be one of {@link Opcodes#T_BOOLEAN},
* Short.MIN_VALUE and Short.MAX_VALUE.<br> * {@link Opcodes#T_CHAR}, {@link Opcodes#T_FLOAT}, {@link Opcodes#T_DOUBLE},
* When opcode is NEWARRAY, operand value should be one of * {@link Opcodes#T_BYTE}, {@link Opcodes#T_SHORT}, {@link Opcodes#T_INT} or
* {@link Opcodes#T_BOOLEAN}, {@link Opcodes#T_CHAR}, * {@link Opcodes#T_LONG}.
* {@link Opcodes#T_FLOAT}, {@link Opcodes#T_DOUBLE},
* {@link Opcodes#T_BYTE}, {@link Opcodes#T_SHORT},
* {@link Opcodes#T_INT} or {@link Opcodes#T_LONG}.
*/ */
public void visitIntInsn(int opcode, int operand) { public void visitIntInsn(int opcode, int operand) {
if (mv != null) { if (mv != null) {
@ -303,16 +254,14 @@ public abstract class MethodVisitor {
} }
/** /**
* Visits a local variable instruction. A local variable instruction is an * Visits a local variable instruction. A local variable instruction is an instruction that
* instruction that loads or stores the value of a local variable. * loads or stores the value of a local variable.
* *
* @param opcode * @param opcode the opcode of the local variable instruction to be visited. This opcode is
* the opcode of the local variable instruction to be visited. * either ILOAD, LLOAD, FLOAD, DLOAD, ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or
* This opcode is either ILOAD, LLOAD, FLOAD, DLOAD, ALOAD, * RET.
* ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or RET. * @param var the operand of the instruction to be visited. This operand is the index of a local
* @param var * variable.
* the operand of the instruction to be visited. This operand is
* the index of a local variable.
*/ */
public void visitVarInsn(int opcode, int var) { public void visitVarInsn(int opcode, int var) {
if (mv != null) { if (mv != null) {
@ -321,16 +270,13 @@ public abstract class MethodVisitor {
} }
/** /**
* Visits a type instruction. A type instruction is an instruction that * Visits a type instruction. A type instruction is an instruction that takes the internal name
* takes the internal name of a class as parameter. * of a class as parameter.
* *
* @param opcode * @param opcode the opcode of the type instruction to be visited. This opcode is either NEW,
* the opcode of the type instruction to be visited. This opcode * ANEWARRAY, CHECKCAST or INSTANCEOF.
* is either NEW, ANEWARRAY, CHECKCAST or INSTANCEOF. * @param type the operand of the instruction to be visited. This operand must be the internal
* @param type * name of an object or array class (see {@link Type#getInternalName() getInternalName}).
* the operand of the instruction to be visited. This operand
* must be the internal name of an object or array class (see
* {@link Type#getInternalName() getInternalName}).
*/ */
public void visitTypeInsn(int opcode, String type) { public void visitTypeInsn(int opcode, String type) {
if (mv != null) { if (mv != null) {
@ -339,45 +285,33 @@ public abstract class MethodVisitor {
} }
/** /**
* Visits a field instruction. A field instruction is an instruction that * Visits a field instruction. A field instruction is an instruction that loads or stores the
* loads or stores the value of a field of an object. * value of a field of an object.
* *
* @param opcode * @param opcode the opcode of the type instruction to be visited. This opcode is either
* the opcode of the type instruction to be visited. This opcode * GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
* is either GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD. * @param owner the internal name of the field's owner class (see {@link Type#getInternalName()
* @param owner * getInternalName}).
* the internal name of the field's owner class (see * @param name the field's name.
* {@link Type#getInternalName() getInternalName}). * @param desc the field's descriptor (see {@link Type Type}).
* @param name
* the field's name.
* @param desc
* the field's descriptor (see {@link Type Type}).
*/ */
public void visitFieldInsn(int opcode, String owner, String name, public void visitFieldInsn(int opcode, String owner, String name, String desc) {
String desc) {
if (mv != null) { if (mv != null) {
mv.visitFieldInsn(opcode, owner, name, desc); mv.visitFieldInsn(opcode, owner, name, desc);
} }
} }
/** /**
* Visits a method instruction. A method instruction is an instruction that * Visits a method instruction. A method instruction is an instruction that invokes a method.
* invokes a method.
* *
* @param opcode * @param opcode the opcode of the type instruction to be visited. This opcode is either
* the opcode of the type instruction to be visited. This opcode * INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or INVOKEINTERFACE.
* is either INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or * @param owner the internal name of the method's owner class (see {@link Type#getInternalName()
* INVOKEINTERFACE. * getInternalName}).
* @param owner * @param name the method's name.
* the internal name of the method's owner class (see * @param desc the method's descriptor (see {@link Type Type}).
* {@link Type#getInternalName() getInternalName}).
* @param name
* the method's name.
* @param desc
* the method's descriptor (see {@link Type Type}).
*/ */
public void visitMethodInsn(int opcode, String owner, String name, public void visitMethodInsn(int opcode, String owner, String name, String desc) {
String desc) {
if (mv != null) { if (mv != null) {
mv.visitMethodInsn(opcode, owner, name, desc); mv.visitMethodInsn(opcode, owner, name, desc);
} }
@ -386,39 +320,29 @@ public abstract class MethodVisitor {
/** /**
* Visits an invokedynamic instruction. * Visits an invokedynamic instruction.
* *
* @param name * @param name the method's name.
* the method's name. * @param desc the method's descriptor (see {@link Type Type}).
* @param desc * @param bsm the bootstrap method.
* the method's descriptor (see {@link Type Type}). * @param bsmArgs the bootstrap method constant arguments. Each argument must be an
* @param bsm * {@link Integer}, {@link Float}, {@link Long}, {@link Double}, {@link String},
* the bootstrap method. * {@link Type} or {@link Handle} value. This method is allowed to modify the content of
* @param bsmArgs * the array so a caller should expect that this array may change.
* the bootstrap method constant arguments. Each argument must be
* an {@link Integer}, {@link Float}, {@link Long},
* {@link Double}, {@link String}, {@link Type} or {@link Handle}
* value. This method is allowed to modify the content of the
* array so a caller should expect that this array may change.
*/ */
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
Object... bsmArgs) {
if (mv != null) { if (mv != null) {
mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs); mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
} }
} }
/** /**
* Visits a jump instruction. A jump instruction is an instruction that may * Visits a jump instruction. A jump instruction is an instruction that may jump to another
* jump to another instruction. * instruction.
* *
* @param opcode * @param opcode the opcode of the type instruction to be visited. This opcode is either IFEQ,
* the opcode of the type instruction to be visited. This opcode * IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT,
* is either IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ, * IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.
* IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, * @param label the operand of the instruction to be visited. This operand is a label that
* IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL. * designates the instruction to which the jump instruction may jump.
* @param label
* the operand of the instruction to be visited. This operand is
* a label that designates the instruction to which the jump
* instruction may jump.
*/ */
public void visitJumpInsn(int opcode, Label label) { public void visitJumpInsn(int opcode, Label label) {
if (mv != null) { if (mv != null) {
@ -427,11 +351,9 @@ public abstract class MethodVisitor {
} }
/** /**
* Visits a label. A label designates the instruction that will be visited * Visits a label. A label designates the instruction that will be visited just after it.
* just after it.
* *
* @param label * @param label a {@link Label Label} object.
* a {@link Label Label} object.
*/ */
public void visitLabel(Label label) { public void visitLabel(Label label) {
if (mv != null) { if (mv != null) {
@ -444,10 +366,9 @@ public abstract class MethodVisitor {
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
/** /**
* Visits a LDC instruction. Note that new constant types may be added in * Visits a LDC instruction. Note that new constant types may be added in future versions of the
* future versions of the Java Virtual Machine. To easily detect new * Java Virtual Machine. To easily detect new constant types, implementations of this method
* constant types, implementations of this method should check for * should check for unexpected constant types, like this:
* unexpected constant types, like this:
* *
* <pre> * <pre>
* if (cst instanceof Integer) { * if (cst instanceof Integer) {
@ -478,14 +399,11 @@ public abstract class MethodVisitor {
* } * }
* </pre> * </pre>
* *
* @param cst * @param cst the constant to be loaded on the stack. This parameter must be a non null
* the constant to be loaded on the stack. This parameter must be * {@link Integer}, a {@link Float}, a {@link Long}, a {@link Double}, a {@link String},
* a non null {@link Integer}, a {@link Float}, a {@link Long}, a * a {@link Type} of OBJECT or ARRAY sort for <tt>.class</tt> constants, for classes
* {@link Double}, a {@link String}, a {@link Type} of OBJECT or * whose version is 49.0, a {@link Type} of METHOD sort or a {@link Handle} for
* ARRAY sort for <tt>.class</tt> constants, for classes whose * MethodType and MethodHandle constants, for classes whose version is 51.0.
* version is 49.0, a {@link Type} of METHOD sort or a
* {@link Handle} for MethodType and MethodHandle constants, for
* classes whose version is 51.0.
*/ */
public void visitLdcInsn(Object cst) { public void visitLdcInsn(Object cst) {
if (mv != null) { if (mv != null) {
@ -496,10 +414,8 @@ public abstract class MethodVisitor {
/** /**
* Visits an IINC instruction. * Visits an IINC instruction.
* *
* @param var * @param var index of the local variable to be incremented.
* index of the local variable to be incremented. * @param increment amount to increment the local variable by.
* @param increment
* amount to increment the local variable by.
*/ */
public void visitIincInsn(int var, int increment) { public void visitIincInsn(int var, int increment) {
if (mv != null) { if (mv != null) {
@ -510,18 +426,13 @@ public abstract class MethodVisitor {
/** /**
* Visits a TABLESWITCH instruction. * Visits a TABLESWITCH instruction.
* *
* @param min * @param min the minimum key value.
* the minimum key value. * @param max the maximum key value.
* @param max * @param dflt beginning of the default handler block.
* the maximum key value. * @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the beginning of the
* @param dflt * handler block for the <tt>min + i</tt> key.
* beginning of the default handler block.
* @param labels
* beginnings of the handler blocks. <tt>labels[i]</tt> is the
* beginning of the handler block for the <tt>min + i</tt> key.
*/ */
public void visitTableSwitchInsn(int min, int max, Label dflt, public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) {
Label... labels) {
if (mv != null) { if (mv != null) {
mv.visitTableSwitchInsn(min, max, dflt, labels); mv.visitTableSwitchInsn(min, max, dflt, labels);
} }
@ -530,13 +441,10 @@ public abstract class MethodVisitor {
/** /**
* Visits a LOOKUPSWITCH instruction. * Visits a LOOKUPSWITCH instruction.
* *
* @param dflt * @param dflt beginning of the default handler block.
* beginning of the default handler block. * @param keys the values of the keys.
* @param keys * @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the beginning of the
* the values of the keys. * handler block for the <tt>keys[i]</tt> key.
* @param labels
* beginnings of the handler blocks. <tt>labels[i]</tt> is the
* beginning of the handler block for the <tt>keys[i]</tt> key.
*/ */
public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) { public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
if (mv != null) { if (mv != null) {
@ -547,10 +455,8 @@ public abstract class MethodVisitor {
/** /**
* Visits a MULTIANEWARRAY instruction. * Visits a MULTIANEWARRAY instruction.
* *
* @param desc * @param desc an array type descriptor (see {@link Type Type}).
* an array type descriptor (see {@link Type Type}). * @param dims number of dimensions of the array to allocate.
* @param dims
* number of dimensions of the array to allocate.
*/ */
public void visitMultiANewArrayInsn(String desc, int dims) { public void visitMultiANewArrayInsn(String desc, int dims) {
if (mv != null) { if (mv != null) {
@ -565,22 +471,15 @@ public abstract class MethodVisitor {
/** /**
* Visits a try catch block. * Visits a try catch block.
* *
* @param start * @param start beginning of the exception handler's scope (inclusive).
* beginning of the exception handler's scope (inclusive). * @param end end of the exception handler's scope (exclusive).
* @param end * @param handler beginning of the exception handler's code.
* end of the exception handler's scope (exclusive). * @param type internal name of the type of exceptions handled by the handler, or <tt>null</tt>
* @param handler * to catch any exceptions (for "finally" blocks).
* beginning of the exception handler's code. * @throws IllegalArgumentException if one of the labels has already been visited by this
* @param type * visitor (by the {@link #visitLabel visitLabel} method).
* internal name of the type of exceptions handled by the
* handler, or <tt>null</tt> to catch any exceptions (for
* "finally" blocks).
* @throws IllegalArgumentException
* if one of the labels has already been visited by this visitor
* (by the {@link #visitLabel visitLabel} method).
*/ */
public void visitTryCatchBlock(Label start, Label end, Label handler, public void visitTryCatchBlock(Label start, Label end, Label handler, String type) {
String type) {
if (mv != null) { if (mv != null) {
mv.visitTryCatchBlock(start, end, handler, type); mv.visitTryCatchBlock(start, end, handler, type);
} }
@ -589,28 +488,20 @@ public abstract class MethodVisitor {
/** /**
* Visits a local variable declaration. * Visits a local variable declaration.
* *
* @param name * @param name the name of a local variable.
* the name of a local variable. * @param desc the type descriptor of this local variable.
* @param desc * @param signature the type signature of this local variable. May be <tt>null</tt> if the local
* the type descriptor of this local variable. * variable type does not use generic types.
* @param signature * @param start the first instruction corresponding to the scope of this local variable
* the type signature of this local variable. May be * (inclusive).
* <tt>null</tt> if the local variable type does not use generic * @param end the last instruction corresponding to the scope of this local variable
* types. * (exclusive).
* @param start * @param index the local variable's index.
* the first instruction corresponding to the scope of this local * @throws IllegalArgumentException if one of the labels has not already been visited by this
* variable (inclusive).
* @param end
* the last instruction corresponding to the scope of this local
* variable (exclusive).
* @param index
* the local variable's index.
* @throws IllegalArgumentException
* if one of the labels has not already been visited by this
* visitor (by the {@link #visitLabel visitLabel} method). * visitor (by the {@link #visitLabel visitLabel} method).
*/ */
public void visitLocalVariable(String name, String desc, String signature, public void visitLocalVariable(String name, String desc, String signature, Label start,
Label start, Label end, int index) { Label end, int index) {
if (mv != null) { if (mv != null) {
mv.visitLocalVariable(name, desc, signature, start, end, index); mv.visitLocalVariable(name, desc, signature, start, end, index);
} }
@ -619,13 +510,10 @@ public abstract class MethodVisitor {
/** /**
* Visits a line number declaration. * Visits a line number declaration.
* *
* @param line * @param line a line number. This number refers to the source file from which the class was
* a line number. This number refers to the source file from * compiled.
* which the class was compiled. * @param start the first instruction corresponding to this line number.
* @param start * @throws IllegalArgumentException if <tt>start</tt> has not already been visited by this
* the first instruction corresponding to this line number.
* @throws IllegalArgumentException
* if <tt>start</tt> has not already been visited by this
* visitor (by the {@link #visitLabel visitLabel} method). * visitor (by the {@link #visitLabel visitLabel} method).
*/ */
public void visitLineNumber(int line, Label start) { public void visitLineNumber(int line, Label start) {
@ -635,13 +523,10 @@ public abstract class MethodVisitor {
} }
/** /**
* Visits the maximum stack size and the maximum number of local variables * Visits the maximum stack size and the maximum number of local variables of the method.
* of the method.
* *
* @param maxStack * @param maxStack maximum stack size of the method.
* maximum stack size of the method. * @param maxLocals maximum number of local variables for the method.
* @param maxLocals
* maximum number of local variables for the method.
*/ */
public void visitMaxs(int maxStack, int maxLocals) { public void visitMaxs(int maxStack, int maxLocals) {
if (mv != null) { if (mv != null) {
@ -650,9 +535,8 @@ public abstract class MethodVisitor {
} }
/** /**
* Visits the end of the method. This method, which is the last one to be * Visits the end of the method. This method, which is the last one to be called, is used to
* called, is used to inform the visitor that all the annotations and * inform the visitor that all the annotations and attributes of the method have been visited.
* attributes of the method have been visited.
*/ */
public void visitEnd() { public void visitEnd() {
if (mv != null) { if (mv != null) {

File diff suppressed because it is too large Load Diff

View File

@ -1,42 +1,32 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm; package org.objectweb.asm;
/** /**
* Defines the JVM opcodes, access flags and array type codes. This interface * Defines the JVM opcodes, access flags and array type codes. This interface does not define all
* does not define all the JVM opcodes because some opcodes are automatically * the JVM opcodes because some opcodes are automatically handled. For example, the xLOAD and xSTORE
* handled. For example, the xLOAD and xSTORE opcodes are automatically replaced * opcodes are automatically replaced by xLOAD_n and xSTORE_n opcodes when possible. The xLOAD_n and
* by xLOAD_n and xSTORE_n opcodes when possible. The xLOAD_n and xSTORE_n * xSTORE_n opcodes are therefore not defined in this interface. Likewise for LDC, automatically
* opcodes are therefore not defined in this interface. Likewise for LDC, * replaced by LDC_W or LDC2_W when necessary, WIDE, GOTO_W and JSR_W.
* automatically replaced by LDC_W or LDC2_W when necessary, WIDE, GOTO_W and
* JSR_W.
* *
* @author Eric Bruneton * @author Eric Bruneton
* @author Eugene Kuleshov * @author Eugene Kuleshov
@ -120,28 +110,26 @@ public interface Opcodes {
int F_FULL = 0; int F_FULL = 0;
/** /**
* Represents a compressed frame where locals are the same as the locals in * Represents a compressed frame where locals are the same as the locals in the previous frame,
* the previous frame, except that additional 1-3 locals are defined, and * except that additional 1-3 locals are defined, and with an empty stack.
* with an empty stack.
*/ */
int F_APPEND = 1; int F_APPEND = 1;
/** /**
* Represents a compressed frame where locals are the same as the locals in * Represents a compressed frame where locals are the same as the locals in the previous frame,
* the previous frame, except that the last 1-3 locals are absent and with * except that the last 1-3 locals are absent and with an empty stack.
* an empty stack.
*/ */
int F_CHOP = 2; int F_CHOP = 2;
/** /**
* Represents a compressed frame with exactly the same locals as the * Represents a compressed frame with exactly the same locals as the previous frame and with an
* previous frame and with an empty stack. * empty stack.
*/ */
int F_SAME = 3; int F_SAME = 3;
/** /**
* Represents a compressed frame with exactly the same locals as the * Represents a compressed frame with exactly the same locals as the previous frame and with a
* previous frame and with a single value on the stack. * single value on the stack.
*/ */
int F_SAME1 = 4; int F_SAME1 = 4;

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm; package org.objectweb.asm;
@ -33,8 +25,8 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.Method; import java.lang.reflect.Method;
/** /**
* A Java field or method type. This class can be used to make it easier to * A Java field or method type. This class can be used to make it easier to manipulate type and
* manipulate type and method descriptors. * method descriptors.
* *
* @author Eric Bruneton * @author Eric Bruneton
* @author Chris Nokleberg * @author Chris Nokleberg
@ -104,56 +96,56 @@ public class Type {
/** /**
* The <tt>void</tt> type. * The <tt>void</tt> type.
*/ */
public static final Type VOID_TYPE = new Type(VOID, null, ('V' << 24) public static final Type VOID_TYPE =
| (5 << 16) | (0 << 8) | 0, 1); new Type(VOID, null, ('V' << 24) | (5 << 16) | (0 << 8) | 0, 1);
/** /**
* The <tt>boolean</tt> type. * The <tt>boolean</tt> type.
*/ */
public static final Type BOOLEAN_TYPE = new Type(BOOLEAN, null, ('Z' << 24) public static final Type BOOLEAN_TYPE =
| (0 << 16) | (5 << 8) | 1, 1); new Type(BOOLEAN, null, ('Z' << 24) | (0 << 16) | (5 << 8) | 1, 1);
/** /**
* The <tt>char</tt> type. * The <tt>char</tt> type.
*/ */
public static final Type CHAR_TYPE = new Type(CHAR, null, ('C' << 24) public static final Type CHAR_TYPE =
| (0 << 16) | (6 << 8) | 1, 1); new Type(CHAR, null, ('C' << 24) | (0 << 16) | (6 << 8) | 1, 1);
/** /**
* The <tt>byte</tt> type. * The <tt>byte</tt> type.
*/ */
public static final Type BYTE_TYPE = new Type(BYTE, null, ('B' << 24) public static final Type BYTE_TYPE =
| (0 << 16) | (5 << 8) | 1, 1); new Type(BYTE, null, ('B' << 24) | (0 << 16) | (5 << 8) | 1, 1);
/** /**
* The <tt>short</tt> type. * The <tt>short</tt> type.
*/ */
public static final Type SHORT_TYPE = new Type(SHORT, null, ('S' << 24) public static final Type SHORT_TYPE =
| (0 << 16) | (7 << 8) | 1, 1); new Type(SHORT, null, ('S' << 24) | (0 << 16) | (7 << 8) | 1, 1);
/** /**
* The <tt>int</tt> type. * The <tt>int</tt> type.
*/ */
public static final Type INT_TYPE = new Type(INT, null, ('I' << 24) public static final Type INT_TYPE =
| (0 << 16) | (0 << 8) | 1, 1); new Type(INT, null, ('I' << 24) | (0 << 16) | (0 << 8) | 1, 1);
/** /**
* The <tt>float</tt> type. * The <tt>float</tt> type.
*/ */
public static final Type FLOAT_TYPE = new Type(FLOAT, null, ('F' << 24) public static final Type FLOAT_TYPE =
| (2 << 16) | (2 << 8) | 1, 1); new Type(FLOAT, null, ('F' << 24) | (2 << 16) | (2 << 8) | 1, 1);
/** /**
* The <tt>long</tt> type. * The <tt>long</tt> type.
*/ */
public static final Type LONG_TYPE = new Type(LONG, null, ('J' << 24) public static final Type LONG_TYPE =
| (1 << 16) | (1 << 8) | 2, 1); new Type(LONG, null, ('J' << 24) | (1 << 16) | (1 << 8) | 2, 1);
/** /**
* The <tt>double</tt> type. * The <tt>double</tt> type.
*/ */
public static final Type DOUBLE_TYPE = new Type(DOUBLE, null, ('D' << 24) public static final Type DOUBLE_TYPE =
| (3 << 16) | (3 << 8) | 2, 1); new Type(DOUBLE, null, ('D' << 24) | (3 << 16) | (3 << 8) | 2, 1);
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// Fields // Fields
@ -165,16 +157,16 @@ public class Type {
private final int sort; private final int sort;
/** /**
* A buffer containing the internal name of this Java type. This field is * A buffer containing the internal name of this Java type. This field is only used for
* only used for reference types. * reference types.
*/ */
private final char[] buf; private final char[] buf;
/** /**
* The offset of the internal name of this Java type in {@link #buf buf} or, * The offset of the internal name of this Java type in {@link #buf buf} or, for primitive
* for primitive types, the size, descriptor and getOpcode offsets for this * types, the size, descriptor and getOpcode offsets for this type (byte 0 contains the size,
* type (byte 0 contains the size, byte 1 the descriptor, byte 2 the offset * byte 1 the descriptor, byte 2 the offset for IALOAD or IASTORE, byte 3 the offset for all
* for IALOAD or IASTORE, byte 3 the offset for all other instructions). * other instructions).
*/ */
private final int off; private final int off;
@ -190,14 +182,10 @@ public class Type {
/** /**
* Constructs a reference type. * Constructs a reference type.
* *
* @param sort * @param sort the sort of the reference type to be constructed.
* the sort of the reference type to be constructed. * @param buf a buffer containing the descriptor of the previous type.
* @param buf * @param off the offset of this descriptor in the previous buffer.
* a buffer containing the descriptor of the previous type. * @param len the length of this descriptor.
* @param off
* the offset of this descriptor in the previous buffer.
* @param len
* the length of this descriptor.
*/ */
private Type(final int sort, final char[] buf, final int off, final int len) { private Type(final int sort, final char[] buf, final int off, final int len) {
this.sort = sort; this.sort = sort;
@ -209,8 +197,7 @@ public class Type {
/** /**
* Returns the Java type corresponding to the given type descriptor. * Returns the Java type corresponding to the given type descriptor.
* *
* @param typeDescriptor * @param typeDescriptor a field or method type descriptor.
* a field or method type descriptor.
* @return the Java type corresponding to the given type descriptor. * @return the Java type corresponding to the given type descriptor.
*/ */
public static Type getType(final String typeDescriptor) { public static Type getType(final String typeDescriptor) {
@ -220,8 +207,7 @@ public class Type {
/** /**
* Returns the Java type corresponding to the given internal name. * Returns the Java type corresponding to the given internal name.
* *
* @param internalName * @param internalName an internal name.
* an internal name.
* @return the Java type corresponding to the given internal name. * @return the Java type corresponding to the given internal name.
*/ */
public static Type getObjectType(final String internalName) { public static Type getObjectType(final String internalName) {
@ -230,11 +216,10 @@ public class Type {
} }
/** /**
* Returns the Java type corresponding to the given method descriptor. * Returns the Java type corresponding to the given method descriptor. Equivalent to
* Equivalent to <code>Type.getType(methodDescriptor)</code>. * <code>Type.getType(methodDescriptor)</code>.
* *
* @param methodDescriptor * @param methodDescriptor a method descriptor.
* a method descriptor.
* @return the Java type corresponding to the given method descriptor. * @return the Java type corresponding to the given method descriptor.
*/ */
public static Type getMethodType(final String methodDescriptor) { public static Type getMethodType(final String methodDescriptor) {
@ -242,26 +227,20 @@ public class Type {
} }
/** /**
* Returns the Java method type corresponding to the given argument and * Returns the Java method type corresponding to the given argument and return types.
* return types.
* *
* @param returnType * @param returnType the return type of the method.
* the return type of the method. * @param argumentTypes the argument types of the method.
* @param argumentTypes * @return the Java type corresponding to the given argument and return types.
* the argument types of the method.
* @return the Java type corresponding to the given argument and return
* types.
*/ */
public static Type getMethodType(final Type returnType, public static Type getMethodType(final Type returnType, final Type... argumentTypes) {
final Type... argumentTypes) {
return getType(getMethodDescriptor(returnType, argumentTypes)); return getType(getMethodDescriptor(returnType, argumentTypes));
} }
/** /**
* Returns the Java type corresponding to the given class. * Returns the Java type corresponding to the given class.
* *
* @param c * @param c a class.
* a class.
* @return the Java type corresponding to the given class. * @return the Java type corresponding to the given class.
*/ */
public static Type getType(final Class<?> c) { public static Type getType(final Class<?> c) {
@ -293,8 +272,7 @@ public class Type {
/** /**
* Returns the Java method type corresponding to the given constructor. * Returns the Java method type corresponding to the given constructor.
* *
* @param c * @param c a {@link Constructor Constructor} object.
* a {@link Constructor Constructor} object.
* @return the Java method type corresponding to the given constructor. * @return the Java method type corresponding to the given constructor.
*/ */
public static Type getType(final Constructor<?> c) { public static Type getType(final Constructor<?> c) {
@ -304,8 +282,7 @@ public class Type {
/** /**
* Returns the Java method type corresponding to the given method. * Returns the Java method type corresponding to the given method.
* *
* @param m * @param m a {@link Method Method} object.
* a {@link Method Method} object.
* @return the Java method type corresponding to the given method. * @return the Java method type corresponding to the given method.
*/ */
public static Type getType(final Method m) { public static Type getType(final Method m) {
@ -313,13 +290,10 @@ public class Type {
} }
/** /**
* Returns the Java types corresponding to the argument types of the given * Returns the Java types corresponding to the argument types of the given method descriptor.
* method descriptor.
* *
* @param methodDescriptor * @param methodDescriptor a method descriptor.
* a method descriptor. * @return the Java types corresponding to the argument types of the given method descriptor.
* @return the Java types corresponding to the argument types of the given
* method descriptor.
*/ */
public static Type[] getArgumentTypes(final String methodDescriptor) { public static Type[] getArgumentTypes(final String methodDescriptor) {
char[] buf = methodDescriptor.toCharArray(); char[] buf = methodDescriptor.toCharArray();
@ -349,13 +323,10 @@ public class Type {
} }
/** /**
* Returns the Java types corresponding to the argument types of the given * Returns the Java types corresponding to the argument types of the given method.
* method.
* *
* @param method * @param method a method.
* a method. * @return the Java types corresponding to the argument types of the given method.
* @return the Java types corresponding to the argument types of the given
* method.
*/ */
public static Type[] getArgumentTypes(final Method method) { public static Type[] getArgumentTypes(final Method method) {
Class<?>[] classes = method.getParameterTypes(); Class<?>[] classes = method.getParameterTypes();
@ -367,13 +338,10 @@ public class Type {
} }
/** /**
* Returns the Java type corresponding to the return type of the given * Returns the Java type corresponding to the return type of the given method descriptor.
* method descriptor.
* *
* @param methodDescriptor * @param methodDescriptor a method descriptor.
* a method descriptor. * @return the Java type corresponding to the return type of the given method descriptor.
* @return the Java type corresponding to the return type of the given
* method descriptor.
*/ */
public static Type getReturnType(final String methodDescriptor) { public static Type getReturnType(final String methodDescriptor) {
char[] buf = methodDescriptor.toCharArray(); char[] buf = methodDescriptor.toCharArray();
@ -381,13 +349,10 @@ public class Type {
} }
/** /**
* Returns the Java type corresponding to the return type of the given * Returns the Java type corresponding to the return type of the given method.
* method.
* *
* @param method * @param method a method.
* a method. * @return the Java type corresponding to the return type of the given method.
* @return the Java type corresponding to the return type of the given
* method.
*/ */
public static Type getReturnType(final Method method) { public static Type getReturnType(final Method method) {
return getType(method.getReturnType()); return getType(method.getReturnType());
@ -396,13 +361,11 @@ public class Type {
/** /**
* Computes the size of the arguments and of the return value of a method. * Computes the size of the arguments and of the return value of a method.
* *
* @param desc * @param desc the descriptor of a method.
* the descriptor of a method. * @return the size of the arguments of the method (plus one for the implicit this argument),
* @return the size of the arguments of the method (plus one for the * argSize, and the size of its return value, retSize, packed into a single int i =
* implicit this argument), argSize, and the size of its return * <tt>(argSize << 2) | retSize</tt> (argSize is therefore equal to <tt>i >> 2</tt>, and
* value, retSize, packed into a single int i = * retSize to <tt>i & 0x03</tt>).
* <tt>(argSize << 2) | retSize</tt> (argSize is therefore equal to
* <tt>i >> 2</tt>, and retSize to <tt>i & 0x03</tt>).
*/ */
public static int getArgumentsAndReturnSizes(final String desc) { public static int getArgumentsAndReturnSizes(final String desc) {
int n = 1; int n = 1;
@ -411,8 +374,7 @@ public class Type {
char car = desc.charAt(c++); char car = desc.charAt(c++);
if (car == ')') { if (car == ')') {
car = desc.charAt(c); car = desc.charAt(c);
return n << 2 return n << 2 | (car == 'V' ? 0 : (car == 'D' || car == 'J' ? 2 : 1));
| (car == 'V' ? 0 : (car == 'D' || car == 'J' ? 2 : 1));
} else if (car == 'L') { } else if (car == 'L') {
while (desc.charAt(c++) != ';') { while (desc.charAt(c++) != ';') {
} }
@ -433,14 +395,11 @@ public class Type {
} }
/** /**
* Returns the Java type corresponding to the given type descriptor. For * Returns the Java type corresponding to the given type descriptor. For method descriptors, buf
* method descriptors, buf is supposed to contain nothing more than the * is supposed to contain nothing more than the descriptor itself.
* descriptor itself.
* *
* @param buf * @param buf a buffer containing a type descriptor.
* a buffer containing a type descriptor. * @param off the offset of this descriptor in the previous buffer.
* @param off
* the offset of this descriptor in the previous buffer.
* @return the Java type corresponding to the given type descriptor. * @return the Java type corresponding to the given type descriptor.
*/ */
private static Type getType(final char[] buf, final int off) { private static Type getType(final char[] buf, final int off) {
@ -495,19 +454,18 @@ public class Type {
/** /**
* Returns the sort of this Java type. * Returns the sort of this Java type.
* *
* @return {@link #VOID VOID}, {@link #BOOLEAN BOOLEAN}, {@link #CHAR CHAR}, * @return {@link #VOID VOID}, {@link #BOOLEAN BOOLEAN}, {@link #CHAR CHAR}, {@link #BYTE BYTE},
* {@link #BYTE BYTE}, {@link #SHORT SHORT}, {@link #INT INT}, * {@link #SHORT SHORT}, {@link #INT INT}, {@link #FLOAT FLOAT}, {@link #LONG LONG},
* {@link #FLOAT FLOAT}, {@link #LONG LONG}, {@link #DOUBLE DOUBLE}, * {@link #DOUBLE DOUBLE}, {@link #ARRAY ARRAY}, {@link #OBJECT OBJECT} or
* {@link #ARRAY ARRAY}, {@link #OBJECT OBJECT} or {@link #METHOD * {@link #METHOD METHOD}.
* METHOD}.
*/ */
public int getSort() { public int getSort() {
return sort; return sort;
} }
/** /**
* Returns the number of dimensions of this array type. This method should * Returns the number of dimensions of this array type. This method should only be used for an
* only be used for an array type. * array type.
* *
* @return the number of dimensions of this array type. * @return the number of dimensions of this array type.
*/ */
@ -520,8 +478,8 @@ public class Type {
} }
/** /**
* Returns the type of the elements of this array type. This method should * Returns the type of the elements of this array type. This method should only be used for an
* only be used for an array type. * array type.
* *
* @return Returns the type of the elements of this array type. * @return Returns the type of the elements of this array type.
*/ */
@ -530,8 +488,8 @@ public class Type {
} }
/** /**
* Returns the binary name of the class corresponding to this type. This * Returns the binary name of the class corresponding to this type. This method must not be used
* method must not be used on method types. * on method types.
* *
* @return the binary name of the class corresponding to this type. * @return the binary name of the class corresponding to this type.
*/ */
@ -569,10 +527,9 @@ public class Type {
} }
/** /**
* Returns the internal name of the class corresponding to this object or * Returns the internal name of the class corresponding to this object or array type. The
* array type. The internal name of a class is its fully qualified name (as * internal name of a class is its fully qualified name (as returned by Class.getName(), where
* returned by Class.getName(), where '.' are replaced by '/'. This method * '.' are replaced by '/'. This method should only be used for an object or array type.
* should only be used for an object or array type.
* *
* @return the internal name of the class corresponding to this object type. * @return the internal name of the class corresponding to this object type.
*/ */
@ -581,8 +538,8 @@ public class Type {
} }
/** /**
* Returns the argument types of methods of this type. This method should * Returns the argument types of methods of this type. This method should only be used for
* only be used for method types. * method types.
* *
* @return the argument types of methods of this type. * @return the argument types of methods of this type.
*/ */
@ -591,8 +548,8 @@ public class Type {
} }
/** /**
* Returns the return type of methods of this type. This method should only * Returns the return type of methods of this type. This method should only be used for method
* be used for method types. * types.
* *
* @return the return type of methods of this type. * @return the return type of methods of this type.
*/ */
@ -601,14 +558,13 @@ public class Type {
} }
/** /**
* Returns the size of the arguments and of the return value of methods of * Returns the size of the arguments and of the return value of methods of this type. This
* this type. This method should only be used for method types. * method should only be used for method types.
* *
* @return the size of the arguments (plus one for the implicit this * @return the size of the arguments (plus one for the implicit this argument), argSize, and the
* argument), argSize, and the size of the return value, retSize, * size of the return value, retSize, packed into a single int i =
* packed into a single int i = <tt>(argSize << 2) | retSize</tt> * <tt>(argSize << 2) | retSize</tt> (argSize is therefore equal to <tt>i >> 2</tt>, and
* (argSize is therefore equal to <tt>i >> 2</tt>, and retSize to * retSize to <tt>i & 0x03</tt>).
* <tt>i & 0x03</tt>).
*/ */
public int getArgumentsAndReturnSizes() { public int getArgumentsAndReturnSizes() {
return getArgumentsAndReturnSizes(getDescriptor()); return getArgumentsAndReturnSizes(getDescriptor());
@ -630,18 +586,13 @@ public class Type {
} }
/** /**
* Returns the descriptor corresponding to the given argument and return * Returns the descriptor corresponding to the given argument and return types.
* types.
* *
* @param returnType * @param returnType the return type of the method.
* the return type of the method. * @param argumentTypes the argument types of the method.
* @param argumentTypes * @return the descriptor corresponding to the given argument and return types.
* the argument types of the method.
* @return the descriptor corresponding to the given argument and return
* types.
*/ */
public static String getMethodDescriptor(final Type returnType, public static String getMethodDescriptor(final Type returnType, final Type... argumentTypes) {
final Type... argumentTypes) {
StringBuffer buf = new StringBuffer(); StringBuffer buf = new StringBuffer();
buf.append('('); buf.append('(');
for (int i = 0; i < argumentTypes.length; ++i) { for (int i = 0; i < argumentTypes.length; ++i) {
@ -653,11 +604,9 @@ public class Type {
} }
/** /**
* Appends the descriptor corresponding to this Java type to the given * Appends the descriptor corresponding to this Java type to the given string buffer.
* string buffer.
* *
* @param buf * @param buf the string buffer to which the descriptor must be appended.
* the string buffer to which the descriptor must be appended.
*/ */
private void getDescriptor(final StringBuffer buf) { private void getDescriptor(final StringBuffer buf) {
if (this.buf == null) { if (this.buf == null) {
@ -679,12 +628,10 @@ public class Type {
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
/** /**
* Returns the internal name of the given class. The internal name of a * Returns the internal name of the given class. The internal name of a class is its fully
* class is its fully qualified name, as returned by Class.getName(), where * qualified name, as returned by Class.getName(), where '.' are replaced by '/'.
* '.' are replaced by '/'.
* *
* @param c * @param c an object or array class.
* an object or array class.
* @return the internal name of the given class. * @return the internal name of the given class.
*/ */
public static String getInternalName(final Class<?> c) { public static String getInternalName(final Class<?> c) {
@ -694,8 +641,7 @@ public class Type {
/** /**
* Returns the descriptor corresponding to the given Java type. * Returns the descriptor corresponding to the given Java type.
* *
* @param c * @param c an object class, a primitive class or an array class.
* an object class, a primitive class or an array class.
* @return the descriptor corresponding to the given class. * @return the descriptor corresponding to the given class.
*/ */
public static String getDescriptor(final Class<?> c) { public static String getDescriptor(final Class<?> c) {
@ -707,8 +653,7 @@ public class Type {
/** /**
* Returns the descriptor corresponding to the given constructor. * Returns the descriptor corresponding to the given constructor.
* *
* @param c * @param c a {@link Constructor Constructor} object.
* a {@link Constructor Constructor} object.
* @return the descriptor of the given constructor. * @return the descriptor of the given constructor.
*/ */
public static String getConstructorDescriptor(final Constructor<?> c) { public static String getConstructorDescriptor(final Constructor<?> c) {
@ -724,8 +669,7 @@ public class Type {
/** /**
* Returns the descriptor corresponding to the given method. * Returns the descriptor corresponding to the given method.
* *
* @param m * @param m a {@link Method Method} object.
* a {@link Method Method} object.
* @return the descriptor of the given method. * @return the descriptor of the given method.
*/ */
public static String getMethodDescriptor(final Method m) { public static String getMethodDescriptor(final Method m) {
@ -743,10 +687,8 @@ public class Type {
/** /**
* Appends the descriptor of the given class to the given string buffer. * Appends the descriptor of the given class to the given string buffer.
* *
* @param buf * @param buf the string buffer to which the descriptor must be appended.
* the string buffer to which the descriptor must be appended. * @param c the class whose descriptor must be computed.
* @param c
* the class whose descriptor must be computed.
*/ */
private static void getDescriptor(final StringBuffer buf, final Class<?> c) { private static void getDescriptor(final StringBuffer buf, final Class<?> c) {
Class<?> d = c; Class<?> d = c;
@ -796,11 +738,10 @@ public class Type {
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
/** /**
* Returns the size of values of this type. This method must not be used for * Returns the size of values of this type. This method must not be used for method types.
* method types.
* *
* @return the size of values of this type, i.e., 2 for <tt>long</tt> and * @return the size of values of this type, i.e., 2 for <tt>long</tt> and <tt>double</tt>, 0 for
* <tt>double</tt>, 0 for <tt>void</tt> and 1 otherwise. * <tt>void</tt> and 1 otherwise.
*/ */
public int getSize() { public int getSize() {
// the size is in byte 0 of 'off' for primitive types (buf == null) // the size is in byte 0 of 'off' for primitive types (buf == null)
@ -808,16 +749,15 @@ public class Type {
} }
/** /**
* Returns a JVM instruction opcode adapted to this Java type. This method * Returns a JVM instruction opcode adapted to this Java type. This method must not be used for
* must not be used for method types. * method types.
* *
* @param opcode * @param opcode a JVM instruction opcode. This opcode must be one of ILOAD, ISTORE, IALOAD,
* a JVM instruction opcode. This opcode must be one of ILOAD, * IASTORE, IADD, ISUB, IMUL, IDIV, IREM, INEG, ISHL, ISHR, IUSHR, IAND, IOR, IXOR and
* ISTORE, IALOAD, IASTORE, IADD, ISUB, IMUL, IDIV, IREM, INEG, * IRETURN.
* ISHL, ISHR, IUSHR, IAND, IOR, IXOR and IRETURN. * @return an opcode that is similar to the given opcode, but adapted to this Java type. For
* @return an opcode that is similar to the given opcode, but adapted to * example, if this type is <tt>float</tt> and <tt>opcode</tt> is IRETURN, this method
* this Java type. For example, if this type is <tt>float</tt> and * returns FRETURN.
* <tt>opcode</tt> is IRETURN, this method returns FRETURN.
*/ */
public int getOpcode(final int opcode) { public int getOpcode(final int opcode) {
if (opcode == Opcodes.IALOAD || opcode == Opcodes.IASTORE) { if (opcode == Opcodes.IALOAD || opcode == Opcodes.IASTORE) {
@ -838,8 +778,7 @@ public class Type {
/** /**
* Tests if the given object is equal to this type. * Tests if the given object is equal to this type.
* *
* @param o * @param o the object to be compared to this type.
* the object to be compared to this type.
* @return <tt>true</tt> if the given object is equal to this type. * @return <tt>true</tt> if the given object is equal to this type.
*/ */
@Override @Override

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.commons; package org.objectweb.asm.commons;
@ -41,17 +33,17 @@ import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type; import org.objectweb.asm.Type;
/** /**
* A {@link org.objectweb.asm.MethodVisitor} to insert before, after and around * A {@link org.objectweb.asm.MethodVisitor} to insert before, after and around advices in methods
* advices in methods and constructors. * and constructors.
* <p> * <p>
* The behavior for constructors is like this: * The behavior for constructors is like this:
* <ol> * <ol>
* *
* <li>as long as the INVOKESPECIAL for the object initialization has not been * <li>as long as the INVOKESPECIAL for the object initialization has not been reached, every
* reached, every bytecode instruction is dispatched in the ctor code visitor</li> * bytecode instruction is dispatched in the ctor code visitor</li>
* *
* <li>when this one is reached, it is only added in the ctor code visitor and a * <li>when this one is reached, it is only added in the ctor code visitor and a JP invoke is
* JP invoke is added</li> * added</li>
* *
* <li>after that, only the other code visitor receives the instructions</li> * <li>after that, only the other code visitor receives the instructions</li>
* *
@ -81,20 +73,15 @@ public abstract class AdviceAdapter extends GeneratorAdapter implements Opcodes
/** /**
* Creates a new {@link AdviceAdapter}. * Creates a new {@link AdviceAdapter}.
* *
* @param api * @param api the ASM API version implemented by this visitor. Must be one of
* the ASM API version implemented by this visitor. Must be one * {@link Opcodes#ASM4}.
* of {@link Opcodes#ASM4}. * @param mv the method visitor to which this adapter delegates calls.
* @param mv * @param access the method's access flags (see {@link Opcodes}).
* the method visitor to which this adapter delegates calls. * @param name the method's name.
* @param access * @param desc the method's descriptor (see {@link Type Type}).
* the method's access flags (see {@link Opcodes}).
* @param name
* the method's name.
* @param desc
* the method's descriptor (see {@link Type Type}).
*/ */
protected AdviceAdapter(final int api, final MethodVisitor mv, protected AdviceAdapter(final int api, final MethodVisitor mv, final int access,
final int access, final String name, final String desc) { final String name, final String desc) {
super(api, mv, access, name, desc); super(api, mv, access, name, desc);
methodAccess = access; methodAccess = access;
methodDesc = desc; methodDesc = desc;
@ -339,8 +326,8 @@ public abstract class AdviceAdapter extends GeneratorAdapter implements Opcodes
} }
@Override @Override
public void visitFieldInsn(final int opcode, final String owner, public void visitFieldInsn(final int opcode, final String owner, final String name,
final String name, final String desc) { final String desc) {
mv.visitFieldInsn(opcode, owner, name, desc); mv.visitFieldInsn(opcode, owner, name, desc);
if (constructor) { if (constructor) {
char c = desc.charAt(0); char c = desc.charAt(0);
@ -414,8 +401,8 @@ public abstract class AdviceAdapter extends GeneratorAdapter implements Opcodes
} }
@Override @Override
public void visitMethodInsn(final int opcode, final String owner, public void visitMethodInsn(final int opcode, final String owner, final String name,
final String name, final String desc) { final String desc) {
mv.visitMethodInsn(opcode, owner, name, desc); mv.visitMethodInsn(opcode, owner, name, desc);
if (constructor) { if (constructor) {
Type[] types = Type.getArgumentTypes(desc); Type[] types = Type.getArgumentTypes(desc);
@ -455,8 +442,7 @@ public abstract class AdviceAdapter extends GeneratorAdapter implements Opcodes
} }
@Override @Override
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
Object... bsmArgs) {
mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs); mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
if (constructor) { if (constructor) {
Type[] types = Type.getArgumentTypes(desc); Type[] types = Type.getArgumentTypes(desc);
@ -512,8 +498,7 @@ public abstract class AdviceAdapter extends GeneratorAdapter implements Opcodes
} }
@Override @Override
public void visitLookupSwitchInsn(final Label dflt, final int[] keys, public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Label[] labels) {
final Label[] labels) {
mv.visitLookupSwitchInsn(dflt, keys, labels); mv.visitLookupSwitchInsn(dflt, keys, labels);
if (constructor) { if (constructor) {
popValue(); popValue();
@ -522,8 +507,8 @@ public abstract class AdviceAdapter extends GeneratorAdapter implements Opcodes
} }
@Override @Override
public void visitTableSwitchInsn(final int min, final int max, public void visitTableSwitchInsn(final int min, final int max, final Label dflt,
final Label dflt, final Label... labels) { final Label... labels) {
mv.visitTableSwitchInsn(min, max, dflt, labels); mv.visitTableSwitchInsn(min, max, dflt, labels);
if (constructor) { if (constructor) {
popValue(); popValue();
@ -532,8 +517,7 @@ public abstract class AdviceAdapter extends GeneratorAdapter implements Opcodes
} }
@Override @Override
public void visitTryCatchBlock(Label start, Label end, Label handler, public void visitTryCatchBlock(Label start, Label end, Label handler, String type) {
String type) {
super.visitTryCatchBlock(start, end, handler, type); super.visitTryCatchBlock(start, end, handler, type);
if (constructor && !branches.containsKey(handler)) { if (constructor && !branches.containsKey(handler)) {
List<Object> stackFrame = new ArrayList<Object>(); List<Object> stackFrame = new ArrayList<Object>();
@ -569,20 +553,18 @@ public abstract class AdviceAdapter extends GeneratorAdapter implements Opcodes
} }
/** /**
* Called at the beginning of the method or after super class class call in * Called at the beginning of the method or after super class class call in the constructor.
* the constructor. <br> * <br>
* <br> * <br>
* *
* <i>Custom code can use or change all the local variables, but should not * <i>Custom code can use or change all the local variables, but should not change state of the
* change state of the stack.</i> * stack.</i>
*/ */
protected void onMethodEnter() { protected void onMethodEnter() {}
}
/** /**
* Called before explicit exit from the method using either return or throw. * Called before explicit exit from the method using either return or throw. Top element on the
* Top element on the stack contains the return value or exception instance. * stack contains the return value or exception instance. For example:
* For example:
* *
* <pre> * <pre>
* public void onMethodExit(int opcode) { * public void onMethodExit(int opcode) {
@ -610,16 +592,13 @@ public abstract class AdviceAdapter extends GeneratorAdapter implements Opcodes
* <br> * <br>
* <br> * <br>
* *
* <i>Custom code can use or change all the local variables, but should not * <i>Custom code can use or change all the local variables, but should not change state of the
* change state of the stack.</i> * stack.</i>
* *
* @param opcode * @param opcode one of the RETURN, IRETURN, FRETURN, ARETURN, LRETURN, DRETURN or ATHROW
* one of the RETURN, IRETURN, FRETURN, ARETURN, LRETURN, DRETURN
* or ATHROW
* *
*/ */
protected void onMethodExit(int opcode) { protected void onMethodExit(int opcode) {}
}
// TODO onException, onMethodCall // TODO onException, onMethodCall
} }

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.commons; package org.objectweb.asm.commons;
@ -42,65 +34,55 @@ import org.objectweb.asm.Type;
/** /**
* A {@link MethodVisitor} that keeps track of stack map frame changes between * A {@link MethodVisitor} that keeps track of stack map frame changes between
* {@link #visitFrame(int, int, Object[], int, Object[]) visitFrame} calls. This * {@link #visitFrame(int, int, Object[], int, Object[]) visitFrame} calls. This adapter must be
* adapter must be used with the * used with the {@link org.objectweb.asm.ClassReader#EXPAND_FRAMES} option. Each visit<i>X</i>
* {@link org.objectweb.asm.ClassReader#EXPAND_FRAMES} option. Each * instruction delegates to the next visitor in the chain, if any, and then simulates the effect of
* visit<i>X</i> instruction delegates to the next visitor in the chain, if any, * this instruction on the stack map frame, represented by {@link #locals} and {@link #stack}. The
* and then simulates the effect of this instruction on the stack map frame, * next visitor in the chain can get the state of the stack map frame <i>before</i> each instruction
* represented by {@link #locals} and {@link #stack}. The next visitor in the * by reading the value of these fields in its visit<i>X</i> methods (this requires a reference to
* chain can get the state of the stack map frame <i>before</i> each instruction * the AnalyzerAdapter that is before it in the chain). If this adapter is used with a class that
* by reading the value of these fields in its visit<i>X</i> methods (this * does not contain stack map table attributes (i.e., pre Java 6 classes) then this adapter may not
* requires a reference to the AnalyzerAdapter that is before it in the chain). * be able to compute the stack map frame for each instruction. In this case no exception is thrown
* If this adapter is used with a class that does not contain stack map table * but the {@link #locals} and {@link #stack} fields will be null for these instructions.
* attributes (i.e., pre Java 6 classes) then this adapter may not be able to
* compute the stack map frame for each instruction. In this case no exception
* is thrown but the {@link #locals} and {@link #stack} fields will be null for
* these instructions.
* *
* @author Eric Bruneton * @author Eric Bruneton
*/ */
public class AnalyzerAdapter extends MethodVisitor { public class AnalyzerAdapter extends MethodVisitor {
/** /**
* <code>List</code> of the local variable slots for current execution * <code>List</code> of the local variable slots for current execution frame. Primitive types
* frame. Primitive types are represented by {@link Opcodes#TOP}, * are represented by {@link Opcodes#TOP}, {@link Opcodes#INTEGER}, {@link Opcodes#FLOAT},
* {@link Opcodes#INTEGER}, {@link Opcodes#FLOAT}, {@link Opcodes#LONG}, * {@link Opcodes#LONG}, {@link Opcodes#DOUBLE},{@link Opcodes#NULL} or
* {@link Opcodes#DOUBLE},{@link Opcodes#NULL} or * {@link Opcodes#UNINITIALIZED_THIS} (long and double are represented by two elements, the
* {@link Opcodes#UNINITIALIZED_THIS} (long and double are represented by * second one being TOP). Reference types are represented by String objects (representing
* two elements, the second one being TOP). Reference types are represented * internal names), and uninitialized types by Label objects (this label designates the NEW
* by String objects (representing internal names), and uninitialized types * instruction that created this uninitialized value). This field is <tt>null</tt> for
* by Label objects (this label designates the NEW instruction that created * unreachable instructions.
* this uninitialized value). This field is <tt>null</tt> for unreachable
* instructions.
*/ */
public List<Object> locals; public List<Object> locals;
/** /**
* <code>List</code> of the operand stack slots for current execution frame. * <code>List</code> of the operand stack slots for current execution frame. Primitive types are
* Primitive types are represented by {@link Opcodes#TOP}, * represented by {@link Opcodes#TOP}, {@link Opcodes#INTEGER}, {@link Opcodes#FLOAT},
* {@link Opcodes#INTEGER}, {@link Opcodes#FLOAT}, {@link Opcodes#LONG}, * {@link Opcodes#LONG}, {@link Opcodes#DOUBLE},{@link Opcodes#NULL} or
* {@link Opcodes#DOUBLE},{@link Opcodes#NULL} or * {@link Opcodes#UNINITIALIZED_THIS} (long and double are represented by two elements, the
* {@link Opcodes#UNINITIALIZED_THIS} (long and double are represented by * second one being TOP). Reference types are represented by String objects (representing
* two elements, the second one being TOP). Reference types are represented * internal names), and uninitialized types by Label objects (this label designates the NEW
* by String objects (representing internal names), and uninitialized types * instruction that created this uninitialized value). This field is <tt>null</tt> for
* by Label objects (this label designates the NEW instruction that created * unreachable instructions.
* this uninitialized value). This field is <tt>null</tt> for unreachable
* instructions.
*/ */
public List<Object> stack; public List<Object> stack;
/** /**
* The labels that designate the next instruction to be visited. May be * The labels that designate the next instruction to be visited. May be <tt>null</tt>.
* <tt>null</tt>.
*/ */
private List<Label> labels; private List<Label> labels;
/** /**
* Information about uninitialized types in the current execution frame. * Information about uninitialized types in the current execution frame. This map associates
* This map associates internal names to Label objects. Each label * internal names to Label objects. Each label designates a NEW instruction that created the
* designates a NEW instruction that created the currently uninitialized * currently uninitialized types, and the associated internal name represents the NEW operand,
* types, and the associated internal name represents the NEW operand, i.e. * i.e. the final, initialized type value.
* the final, initialized type value.
*/ */
public Map<Object, Object> uninitializedTypes; public Map<Object, Object> uninitializedTypes;
@ -120,49 +102,34 @@ public class AnalyzerAdapter extends MethodVisitor {
private String owner; private String owner;
/** /**
* Creates a new {@link AnalyzerAdapter}. <i>Subclasses must not use this * Creates a new {@link AnalyzerAdapter}. <i>Subclasses must not use this constructor</i>.
* constructor</i>. Instead, they must use the * Instead, they must use the
* {@link #AnalyzerAdapter(int, String, int, String, String, MethodVisitor)} * {@link #AnalyzerAdapter(int, String, int, String, String, MethodVisitor)} version.
* version.
* *
* @param owner * @param owner the owner's class name.
* the owner's class name. * @param access the method's access flags (see {@link Opcodes}).
* @param access * @param name the method's name.
* the method's access flags (see {@link Opcodes}). * @param desc the method's descriptor (see {@link Type Type}).
* @param name * @param mv the method visitor to which this adapter delegates calls. May be <tt>null</tt>.
* the method's name.
* @param desc
* the method's descriptor (see {@link Type Type}).
* @param mv
* the method visitor to which this adapter delegates calls. May
* be <tt>null</tt>.
*/ */
public AnalyzerAdapter(final String owner, final int access, public AnalyzerAdapter(final String owner, final int access, final String name,
final String name, final String desc, final MethodVisitor mv) { final String desc, final MethodVisitor mv) {
this(Opcodes.ASM4, owner, access, name, desc, mv); this(Opcodes.ASM4, owner, access, name, desc, mv);
} }
/** /**
* Creates a new {@link AnalyzerAdapter}. * Creates a new {@link AnalyzerAdapter}.
* *
* @param api * @param api the ASM API version implemented by this visitor. Must be one of
* the ASM API version implemented by this visitor. Must be one * {@link Opcodes#ASM4}.
* of {@link Opcodes#ASM4}. * @param owner the owner's class name.
* @param owner * @param access the method's access flags (see {@link Opcodes}).
* the owner's class name. * @param name the method's name.
* @param access * @param desc the method's descriptor (see {@link Type Type}).
* the method's access flags (see {@link Opcodes}). * @param mv the method visitor to which this adapter delegates calls. May be <tt>null</tt>.
* @param name
* the method's name.
* @param desc
* the method's descriptor (see {@link Type Type}).
* @param mv
* the method visitor to which this adapter delegates calls. May
* be <tt>null</tt>.
*/ */
protected AnalyzerAdapter(final int api, final String owner, protected AnalyzerAdapter(final int api, final String owner, final int access,
final int access, final String name, final String desc, final String name, final String desc, final MethodVisitor mv) {
final MethodVisitor mv) {
super(api, mv); super(api, mv);
this.owner = owner; this.owner = owner;
locals = new ArrayList<Object>(); locals = new ArrayList<Object>();
@ -209,8 +176,8 @@ public class AnalyzerAdapter extends MethodVisitor {
} }
@Override @Override
public void visitFrame(final int type, final int nLocal, public void visitFrame(final int type, final int nLocal, final Object[] local, final int nStack,
final Object[] local, final int nStack, final Object[] stack) { final Object[] stack) {
if (type != Opcodes.F_NEW) { // uncompressed frame if (type != Opcodes.F_NEW) { // uncompressed frame
throw new IllegalStateException( throw new IllegalStateException(
"ClassReader.accept() should be called with EXPAND_FRAMES flag"); "ClassReader.accept() should be called with EXPAND_FRAMES flag");
@ -249,8 +216,7 @@ public class AnalyzerAdapter extends MethodVisitor {
mv.visitInsn(opcode); mv.visitInsn(opcode);
} }
execute(opcode, 0, null); execute(opcode, 0, null);
if ((opcode >= Opcodes.IRETURN && opcode <= Opcodes.RETURN) if ((opcode >= Opcodes.IRETURN && opcode <= Opcodes.RETURN) || opcode == Opcodes.ATHROW) {
|| opcode == Opcodes.ATHROW) {
this.locals = null; this.locals = null;
this.stack = null; this.stack = null;
} }
@ -294,8 +260,8 @@ public class AnalyzerAdapter extends MethodVisitor {
} }
@Override @Override
public void visitFieldInsn(final int opcode, final String owner, public void visitFieldInsn(final int opcode, final String owner, final String name,
final String name, final String desc) { final String desc) {
if (mv != null) { if (mv != null) {
mv.visitFieldInsn(opcode, owner, name, desc); mv.visitFieldInsn(opcode, owner, name, desc);
} }
@ -303,8 +269,8 @@ public class AnalyzerAdapter extends MethodVisitor {
} }
@Override @Override
public void visitMethodInsn(final int opcode, final String owner, public void visitMethodInsn(final int opcode, final String owner, final String name,
final String name, final String desc) { final String desc) {
if (mv != null) { if (mv != null) {
mv.visitMethodInsn(opcode, owner, name, desc); mv.visitMethodInsn(opcode, owner, name, desc);
} }
@ -339,8 +305,7 @@ public class AnalyzerAdapter extends MethodVisitor {
} }
@Override @Override
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
Object... bsmArgs) {
if (mv != null) { if (mv != null) {
mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs); mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
} }
@ -423,8 +388,8 @@ public class AnalyzerAdapter extends MethodVisitor {
} }
@Override @Override
public void visitTableSwitchInsn(final int min, final int max, public void visitTableSwitchInsn(final int min, final int max, final Label dflt,
final Label dflt, final Label... labels) { final Label... labels) {
if (mv != null) { if (mv != null) {
mv.visitTableSwitchInsn(min, max, dflt, labels); mv.visitTableSwitchInsn(min, max, dflt, labels);
} }
@ -434,8 +399,7 @@ public class AnalyzerAdapter extends MethodVisitor {
} }
@Override @Override
public void visitLookupSwitchInsn(final Label dflt, final int[] keys, public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Label[] labels) {
final Label[] labels) {
if (mv != null) { if (mv != null) {
mv.visitLookupSwitchInsn(dflt, keys, labels); mv.visitLookupSwitchInsn(dflt, keys, labels);
} }

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.commons; package org.objectweb.asm.commons;
@ -111,8 +103,8 @@ public class CodeSizeEvaluator extends MethodVisitor implements Opcodes {
} }
@Override @Override
public void visitFieldInsn(final int opcode, final String owner, public void visitFieldInsn(final int opcode, final String owner, final String name,
final String name, final String desc) { final String desc) {
minSize += 3; minSize += 3;
maxSize += 3; maxSize += 3;
if (mv != null) { if (mv != null) {
@ -121,8 +113,8 @@ public class CodeSizeEvaluator extends MethodVisitor implements Opcodes {
} }
@Override @Override
public void visitMethodInsn(final int opcode, final String owner, public void visitMethodInsn(final int opcode, final String owner, final String name,
final String name, final String desc) { final String desc) {
if (opcode == INVOKEINTERFACE) { if (opcode == INVOKEINTERFACE) {
minSize += 5; minSize += 5;
maxSize += 5; maxSize += 5;
@ -136,8 +128,7 @@ public class CodeSizeEvaluator extends MethodVisitor implements Opcodes {
} }
@Override @Override
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
Object... bsmArgs) {
minSize += 5; minSize += 5;
maxSize += 5; maxSize += 5;
if (mv != null) { if (mv != null) {
@ -187,8 +178,8 @@ public class CodeSizeEvaluator extends MethodVisitor implements Opcodes {
} }
@Override @Override
public void visitTableSwitchInsn(final int min, final int max, public void visitTableSwitchInsn(final int min, final int max, final Label dflt,
final Label dflt, final Label... labels) { final Label... labels) {
minSize += 13 + labels.length * 4; minSize += 13 + labels.length * 4;
maxSize += 16 + labels.length * 4; maxSize += 16 + labels.length * 4;
if (mv != null) { if (mv != null) {
@ -197,8 +188,7 @@ public class CodeSizeEvaluator extends MethodVisitor implements Opcodes {
} }
@Override @Override
public void visitLookupSwitchInsn(final Label dflt, final int[] keys, public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Label[] labels) {
final Label[] labels) {
minSize += 9 + keys.length * 8; minSize += 9 + keys.length * 8;
maxSize += 12 + keys.length * 8; maxSize += 12 + keys.length * 8;
if (mv != null) { if (mv != null) {

File diff suppressed because it is too large Load Diff

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.commons; package org.objectweb.asm.commons;
@ -37,8 +29,7 @@ import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type; import org.objectweb.asm.Type;
/** /**
* A {@link MethodVisitor} providing a more detailed API to generate and * A {@link MethodVisitor} providing a more detailed API to generate and transform instructions.
* transform instructions.
* *
* @author Eric Bruneton * @author Eric Bruneton
*/ */
@ -47,12 +38,10 @@ public class InstructionAdapter extends MethodVisitor {
public final static Type OBJECT_TYPE = Type.getType("Ljava/lang/Object;"); public final static Type OBJECT_TYPE = Type.getType("Ljava/lang/Object;");
/** /**
* Creates a new {@link InstructionAdapter}. <i>Subclasses must not use this * Creates a new {@link InstructionAdapter}. <i>Subclasses must not use this constructor</i>.
* constructor</i>. Instead, they must use the * Instead, they must use the {@link #InstructionAdapter(int, MethodVisitor)} version.
* {@link #InstructionAdapter(int, MethodVisitor)} version.
* *
* @param mv * @param mv the method visitor to which this adapter delegates calls.
* the method visitor to which this adapter delegates calls.
*/ */
public InstructionAdapter(final MethodVisitor mv) { public InstructionAdapter(final MethodVisitor mv) {
this(Opcodes.ASM4, mv); this(Opcodes.ASM4, mv);
@ -61,11 +50,9 @@ public class InstructionAdapter extends MethodVisitor {
/** /**
* Creates a new {@link InstructionAdapter}. * Creates a new {@link InstructionAdapter}.
* *
* @param api * @param api the ASM API version implemented by this visitor. Must be one of
* the ASM API version implemented by this visitor. Must be one * {@link Opcodes#ASM4}.
* of {@link Opcodes#ASM4}. * @param mv the method visitor to which this adapter delegates calls.
* @param mv
* the method visitor to which this adapter delegates calls.
*/ */
protected InstructionAdapter(final int api, final MethodVisitor mv) { protected InstructionAdapter(final int api, final MethodVisitor mv) {
super(api, mv); super(api, mv);
@ -487,8 +474,8 @@ public class InstructionAdapter extends MethodVisitor {
} }
@Override @Override
public void visitFieldInsn(final int opcode, final String owner, public void visitFieldInsn(final int opcode, final String owner, final String name,
final String name, final String desc) { final String desc) {
switch (opcode) { switch (opcode) {
case Opcodes.GETSTATIC: case Opcodes.GETSTATIC:
getstatic(owner, name, desc); getstatic(owner, name, desc);
@ -508,8 +495,8 @@ public class InstructionAdapter extends MethodVisitor {
} }
@Override @Override
public void visitMethodInsn(final int opcode, final String owner, public void visitMethodInsn(final int opcode, final String owner, final String name,
final String name, final String desc) { final String desc) {
switch (opcode) { switch (opcode) {
case Opcodes.INVOKESPECIAL: case Opcodes.INVOKESPECIAL:
invokespecial(owner, name, desc); invokespecial(owner, name, desc);
@ -529,8 +516,7 @@ public class InstructionAdapter extends MethodVisitor {
} }
@Override @Override
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
Object... bsmArgs) {
invokedynamic(name, desc, bsm, bsmArgs); invokedynamic(name, desc, bsm, bsmArgs);
} }
@ -644,14 +630,13 @@ public class InstructionAdapter extends MethodVisitor {
} }
@Override @Override
public void visitTableSwitchInsn(final int min, final int max, public void visitTableSwitchInsn(final int min, final int max, final Label dflt,
final Label dflt, final Label... labels) { final Label... labels) {
tableswitch(min, max, dflt, labels); tableswitch(min, max, dflt, labels);
} }
@Override @Override
public void visitLookupSwitchInsn(final Label dflt, final int[] keys, public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Label[] labels) {
final Label[] labels) {
lookupswitch(dflt, keys, labels); lookupswitch(dflt, keys, labels);
} }
@ -951,13 +936,11 @@ public class InstructionAdapter extends MethodVisitor {
mv.visitVarInsn(Opcodes.RET, var); mv.visitVarInsn(Opcodes.RET, var);
} }
public void tableswitch(final int min, final int max, final Label dflt, public void tableswitch(final int min, final int max, final Label dflt, final Label... labels) {
final Label... labels) {
mv.visitTableSwitchInsn(min, max, dflt, labels); mv.visitTableSwitchInsn(min, max, dflt, labels);
} }
public void lookupswitch(final Label dflt, final int[] keys, public void lookupswitch(final Label dflt, final int[] keys, final Label[] labels) {
final Label[] labels) {
mv.visitLookupSwitchInsn(dflt, keys, labels); mv.visitLookupSwitchInsn(dflt, keys, labels);
} }
@ -965,48 +948,39 @@ public class InstructionAdapter extends MethodVisitor {
mv.visitInsn(t.getOpcode(Opcodes.IRETURN)); mv.visitInsn(t.getOpcode(Opcodes.IRETURN));
} }
public void getstatic(final String owner, final String name, public void getstatic(final String owner, final String name, final String desc) {
final String desc) {
mv.visitFieldInsn(Opcodes.GETSTATIC, owner, name, desc); mv.visitFieldInsn(Opcodes.GETSTATIC, owner, name, desc);
} }
public void putstatic(final String owner, final String name, public void putstatic(final String owner, final String name, final String desc) {
final String desc) {
mv.visitFieldInsn(Opcodes.PUTSTATIC, owner, name, desc); mv.visitFieldInsn(Opcodes.PUTSTATIC, owner, name, desc);
} }
public void getfield(final String owner, final String name, public void getfield(final String owner, final String name, final String desc) {
final String desc) {
mv.visitFieldInsn(Opcodes.GETFIELD, owner, name, desc); mv.visitFieldInsn(Opcodes.GETFIELD, owner, name, desc);
} }
public void putfield(final String owner, final String name, public void putfield(final String owner, final String name, final String desc) {
final String desc) {
mv.visitFieldInsn(Opcodes.PUTFIELD, owner, name, desc); mv.visitFieldInsn(Opcodes.PUTFIELD, owner, name, desc);
} }
public void invokevirtual(final String owner, final String name, public void invokevirtual(final String owner, final String name, final String desc) {
final String desc) {
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, owner, name, desc); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, owner, name, desc);
} }
public void invokespecial(final String owner, final String name, public void invokespecial(final String owner, final String name, final String desc) {
final String desc) {
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, owner, name, desc); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, owner, name, desc);
} }
public void invokestatic(final String owner, final String name, public void invokestatic(final String owner, final String name, final String desc) {
final String desc) {
mv.visitMethodInsn(Opcodes.INVOKESTATIC, owner, name, desc); mv.visitMethodInsn(Opcodes.INVOKESTATIC, owner, name, desc);
} }
public void invokeinterface(final String owner, final String name, public void invokeinterface(final String owner, final String name, final String desc) {
final String desc) {
mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, owner, name, desc); mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, owner, name, desc);
} }
public void invokedynamic(String name, String desc, Handle bsm, public void invokedynamic(String name, String desc, Handle bsm, Object[] bsmArgs) {
Object[] bsmArgs) {
mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs); mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
} }

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.commons; package org.objectweb.asm.commons;
@ -55,8 +47,8 @@ import org.objectweb.asm.tree.TableSwitchInsnNode;
import org.objectweb.asm.tree.TryCatchBlockNode; import org.objectweb.asm.tree.TryCatchBlockNode;
/** /**
* A {@link org.objectweb.asm.MethodVisitor} that removes JSR instructions and * A {@link org.objectweb.asm.MethodVisitor} that removes JSR instructions and inlines the
* inlines the referenced subroutines. * referenced subroutines.
* *
* <b>Explanation of how it works</b> TODO * <b>Explanation of how it works</b> TODO
* *
@ -72,82 +64,61 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
private final Map<LabelNode, BitSet> subroutineHeads = new HashMap<LabelNode, BitSet>(); private final Map<LabelNode, BitSet> subroutineHeads = new HashMap<LabelNode, BitSet>();
/** /**
* This subroutine instance denotes the line of execution that is not * This subroutine instance denotes the line of execution that is not contained within any
* contained within any subroutine; i.e., the "subroutine" that is executing * subroutine; i.e., the "subroutine" that is executing when a method first begins.
* when a method first begins.
*/ */
private final BitSet mainSubroutine = new BitSet(); private final BitSet mainSubroutine = new BitSet();
/** /**
* This BitSet contains the index of every instruction that belongs to more * This BitSet contains the index of every instruction that belongs to more than one subroutine.
* than one subroutine. This should not happen often. * This should not happen often.
*/ */
final BitSet dualCitizens = new BitSet(); final BitSet dualCitizens = new BitSet();
/** /**
* Creates a new JSRInliner. <i>Subclasses must not use this * Creates a new JSRInliner. <i>Subclasses must not use this constructor</i>. Instead, they must
* constructor</i>. Instead, they must use the * use the {@link #JSRInlinerAdapter(int, MethodVisitor, int, String, String, String, String[])}
* {@link #JSRInlinerAdapter(int, MethodVisitor, int, String, String, String, String[])}
* version. * version.
* *
* @param mv * @param mv the <code>MethodVisitor</code> to send the resulting inlined method code to (use
* the <code>MethodVisitor</code> to send the resulting inlined * <code>null</code> for none).
* method code to (use <code>null</code> for none). * @param access the method's access flags (see {@link Opcodes}). This parameter also indicates
* @param access * if the method is synthetic and/or deprecated.
* the method's access flags (see {@link Opcodes}). This * @param name the method's name.
* parameter also indicates if the method is synthetic and/or * @param desc the method's descriptor (see {@link Type}).
* deprecated. * @param signature the method's signature. May be <tt>null</tt>.
* @param name * @param exceptions the internal names of the method's exception classes (see
* the method's name. * {@link Type#getInternalName() getInternalName}). May be <tt>null</tt>.
* @param desc
* the method's descriptor (see {@link Type}).
* @param signature
* the method's signature. May be <tt>null</tt>.
* @param exceptions
* the internal names of the method's exception classes (see
* {@link Type#getInternalName() getInternalName}). May be
* <tt>null</tt>.
*/ */
public JSRInlinerAdapter(final MethodVisitor mv, final int access, public JSRInlinerAdapter(final MethodVisitor mv, final int access, final String name,
final String name, final String desc, final String signature, final String desc, final String signature, final String[] exceptions) {
final String[] exceptions) {
this(Opcodes.ASM4, mv, access, name, desc, signature, exceptions); this(Opcodes.ASM4, mv, access, name, desc, signature, exceptions);
} }
/** /**
* Creates a new JSRInliner. * Creates a new JSRInliner.
* *
* @param api * @param api the ASM API version implemented by this visitor. Must be one of
* the ASM API version implemented by this visitor. Must be one * {@link Opcodes#ASM4}.
* of {@link Opcodes#ASM4}. * @param mv the <code>MethodVisitor</code> to send the resulting inlined method code to (use
* @param mv * <code>null</code> for none).
* the <code>MethodVisitor</code> to send the resulting inlined * @param access the method's access flags (see {@link Opcodes}). This parameter also indicates
* method code to (use <code>null</code> for none). * if the method is synthetic and/or deprecated.
* @param access * @param name the method's name.
* the method's access flags (see {@link Opcodes}). This * @param desc the method's descriptor (see {@link Type}).
* parameter also indicates if the method is synthetic and/or * @param signature the method's signature. May be <tt>null</tt>.
* deprecated. * @param exceptions the internal names of the method's exception classes (see
* @param name * {@link Type#getInternalName() getInternalName}). May be <tt>null</tt>.
* the method's name.
* @param desc
* the method's descriptor (see {@link Type}).
* @param signature
* the method's signature. May be <tt>null</tt>.
* @param exceptions
* the internal names of the method's exception classes (see
* {@link Type#getInternalName() getInternalName}). May be
* <tt>null</tt>.
*/ */
protected JSRInlinerAdapter(final int api, final MethodVisitor mv, protected JSRInlinerAdapter(final int api, final MethodVisitor mv, final int access,
final int access, final String name, final String desc, final String name, final String desc, final String signature,
final String signature, final String[] exceptions) { final String[] exceptions) {
super(api, access, name, desc, signature, exceptions); super(api, access, name, desc, signature, exceptions);
this.mv = mv; this.mv = mv;
} }
/** /**
* Detects a JSR instruction and sets a flag to indicate we will need to do * Detects a JSR instruction and sets a flag to indicate we will need to do inlining.
* inlining.
*/ */
@Override @Override
public void visitJumpInsn(final int opcode, final Label lbl) { public void visitJumpInsn(final int opcode, final Label lbl) {
@ -159,8 +130,8 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
} }
/** /**
* If any JSRs were seen, triggers the inlining process. Otherwise, forwards * If any JSRs were seen, triggers the inlining process. Otherwise, forwards the byte codes
* the byte codes untouched. * untouched.
*/ */
@Override @Override
public void visitEnd() { public void visitEnd() {
@ -184,8 +155,8 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
} }
/** /**
* Walks the method and determines which internal subroutine(s), if any, * Walks the method and determines which internal subroutine(s), if any, each instruction is a
* each instruction is a method of. * method of.
*/ */
private void markSubroutines() { private void markSubroutines() {
BitSet anyvisited = new BitSet(); BitSet anyvisited = new BitSet();
@ -196,8 +167,8 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
// Go through the head of each subroutine and find any nodes reachable // Go through the head of each subroutine and find any nodes reachable
// to that subroutine without following any JSR links. // to that subroutine without following any JSR links.
for (Iterator<Map.Entry<LabelNode, BitSet>> it = subroutineHeads for (Iterator<Map.Entry<LabelNode, BitSet>> it = subroutineHeads.entrySet().iterator(); it
.entrySet().iterator(); it.hasNext();) { .hasNext();) {
Map.Entry<LabelNode, BitSet> entry = it.next(); Map.Entry<LabelNode, BitSet> entry = it.next();
LabelNode lab = entry.getKey(); LabelNode lab = entry.getKey();
BitSet sub = entry.getValue(); BitSet sub = entry.getValue();
@ -207,23 +178,18 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
} }
/** /**
* Performs a depth first search walking the normal byte code path starting * Performs a depth first search walking the normal byte code path starting at
* at <code>index</code>, and adding each instruction encountered into the * <code>index</code>, and adding each instruction encountered into the subroutine
* subroutine <code>sub</code>. After this walk is complete, iterates over * <code>sub</code>. After this walk is complete, iterates over the exception handlers to ensure
* the exception handlers to ensure that we also include those byte codes * that we also include those byte codes which are reachable through an exception that may be
* which are reachable through an exception that may be thrown during the * thrown during the execution of the subroutine. Invoked from <code>markSubroutines()</code>.
* execution of the subroutine. Invoked from <code>markSubroutines()</code>.
* *
* @param sub * @param sub the subroutine whose instructions must be computed.
* the subroutine whose instructions must be computed. * @param index an instruction of this subroutine.
* @param index * @param anyvisited indexes of the already visited instructions, i.e. marked as part of this
* an instruction of this subroutine. * subroutine or any previously computed subroutine.
* @param anyvisited
* indexes of the already visited instructions, i.e. marked as
* part of this subroutine or any previously computed subroutine.
*/ */
private void markSubroutineWalk(final BitSet sub, final int index, private void markSubroutineWalk(final BitSet sub, final int index, final BitSet anyvisited) {
final BitSet anyvisited) {
if (LOGGING) { if (LOGGING) {
log("markSubroutineWalk: sub=" + sub + " index=" + index); log("markSubroutineWalk: sub=" + sub + " index=" + index);
} }
@ -235,8 +201,7 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
boolean loop = true; boolean loop = true;
while (loop) { while (loop) {
loop = false; loop = false;
for (Iterator<TryCatchBlockNode> it = tryCatchBlocks.iterator(); it for (Iterator<TryCatchBlockNode> it = tryCatchBlocks.iterator(); it.hasNext();) {
.hasNext();) {
TryCatchBlockNode trycatch = it.next(); TryCatchBlockNode trycatch = it.next();
if (LOGGING) { if (LOGGING) {
@ -255,9 +220,8 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
int nextbit = sub.nextSetBit(startindex); int nextbit = sub.nextSetBit(startindex);
if (nextbit != -1 && nextbit < endindex) { if (nextbit != -1 && nextbit < endindex) {
if (LOGGING) { if (LOGGING) {
log("Adding exception handler: " + startindex + '-' log("Adding exception handler: " + startindex + '-' + endindex + " due to "
+ endindex + " due to " + nextbit + " handler " + nextbit + " handler " + handlerindex);
+ handlerindex);
} }
markSubroutineWalkDFS(sub, handlerindex, anyvisited); markSubroutineWalkDFS(sub, handlerindex, anyvisited);
loop = true; loop = true;
@ -267,20 +231,15 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
} }
/** /**
* Performs a simple DFS of the instructions, assigning each to the * Performs a simple DFS of the instructions, assigning each to the subroutine <code>sub</code>.
* subroutine <code>sub</code>. Starts from <code>index</code>. Invoked only * Starts from <code>index</code>. Invoked only by <code>markSubroutineWalk()</code>.
* by <code>markSubroutineWalk()</code>.
* *
* @param sub * @param sub the subroutine whose instructions must be computed.
* the subroutine whose instructions must be computed. * @param index an instruction of this subroutine.
* @param index * @param anyvisited indexes of the already visited instructions, i.e. marked as part of this
* an instruction of this subroutine. * subroutine or any previously computed subroutine.
* @param anyvisited
* indexes of the already visited instructions, i.e. marked as
* part of this subroutine or any previously computed subroutine.
*/ */
private void markSubroutineWalkDFS(final BitSet sub, int index, private void markSubroutineWalkDFS(final BitSet sub, int index, final BitSet anyvisited) {
final BitSet anyvisited) {
while (true) { while (true) {
AbstractInsnNode node = instructions.get(index); AbstractInsnNode node = instructions.get(index);
@ -299,8 +258,7 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
} }
anyvisited.set(index); anyvisited.set(index);
if (node.getType() == AbstractInsnNode.JUMP_INSN if (node.getType() == AbstractInsnNode.JUMP_INSN && node.getOpcode() != JSR) {
&& node.getOpcode() != JSR) {
// we do not follow recursively called subroutines here; but any // we do not follow recursively called subroutines here; but any
// other sort of branch we do follow // other sort of branch we do follow
JumpInsnNode jnode = (JumpInsnNode) node; JumpInsnNode jnode = (JumpInsnNode) node;
@ -343,8 +301,8 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
case RETURN: case RETURN:
case ATHROW: case ATHROW:
/* /*
* note: this either returns from this subroutine, or a parent * note: this either returns from this subroutine, or a parent subroutine which
* subroutine which invoked it * invoked it
*/ */
return; return;
} }
@ -367,8 +325,8 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
} }
/** /**
* Creates the new instructions, inlining each instantiation of each * Creates the new instructions, inlining each instantiation of each subroutine until the code
* subroutine until the code is fully elaborated. * is fully elaborated.
*/ */
private void emitCode() { private void emitCode() {
LinkedList<Instantiation> worklist = new LinkedList<Instantiation>(); LinkedList<Instantiation> worklist = new LinkedList<Instantiation>();
@ -383,8 +341,7 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
List<LocalVariableNode> newLocalVariables = new ArrayList<LocalVariableNode>(); List<LocalVariableNode> newLocalVariables = new ArrayList<LocalVariableNode>();
while (!worklist.isEmpty()) { while (!worklist.isEmpty()) {
Instantiation inst = worklist.removeFirst(); Instantiation inst = worklist.removeFirst();
emitSubroutine(inst, worklist, newInstructions, newTryCatchBlocks, emitSubroutine(inst, worklist, newInstructions, newTryCatchBlocks, newLocalVariables);
newLocalVariables);
} }
instructions = newInstructions; instructions = newInstructions;
tryCatchBlocks = newTryCatchBlocks; tryCatchBlocks = newTryCatchBlocks;
@ -392,25 +349,18 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
} }
/** /**
* Emits one instantiation of one subroutine, specified by * Emits one instantiation of one subroutine, specified by <code>instant</code>. May add new
* <code>instant</code>. May add new instantiations that are invoked by this * instantiations that are invoked by this one to the <code>worklist</code> parameter, and new
* one to the <code>worklist</code> parameter, and new try/catch blocks to * try/catch blocks to <code>newTryCatchBlocks</code>.
* <code>newTryCatchBlocks</code>.
* *
* @param instant * @param instant the instantiation that must be performed.
* the instantiation that must be performed. * @param worklist list of the instantiations that remain to be done.
* @param worklist * @param newInstructions the instruction list to which the instantiated code must be appended.
* list of the instantiations that remain to be done. * @param newTryCatchBlocks the exception handler list to which the instantiated handlers must
* @param newInstructions * be appended.
* the instruction list to which the instantiated code must be
* appended.
* @param newTryCatchBlocks
* the exception handler list to which the instantiated handlers
* must be appended.
*/ */
private void emitSubroutine(final Instantiation instant, private void emitSubroutine(final Instantiation instant, final List<Instantiation> worklist,
final List<Instantiation> worklist, final InsnList newInstructions, final InsnList newInstructions, final List<TryCatchBlockNode> newTryCatchBlocks,
final List<TryCatchBlockNode> newTryCatchBlocks,
final List<LocalVariableNode> newLocalVariables) { final List<LocalVariableNode> newLocalVariables) {
LabelNode duplbl = null; LabelNode duplbl = null;
@ -476,8 +426,8 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
// This is only possible if the mainSubroutine owns a RET // This is only possible if the mainSubroutine owns a RET
// instruction, which should never happen for verifiable // instruction, which should never happen for verifiable
// code. // code.
throw new RuntimeException("Instruction #" + i throw new RuntimeException(
+ " is a RET not owned by any subroutine"); "Instruction #" + i + " is a RET not owned by any subroutine");
} }
newInstructions.add(new JumpInsnNode(GOTO, retlabel)); newInstructions.add(new JumpInsnNode(GOTO, retlabel));
} else if (insn.getOpcode() == JSR) { } else if (insn.getOpcode() == JSR) {
@ -508,14 +458,13 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
} }
// Emit try/catch blocks that are relevant to this method. // Emit try/catch blocks that are relevant to this method.
for (Iterator<TryCatchBlockNode> it = tryCatchBlocks.iterator(); it for (Iterator<TryCatchBlockNode> it = tryCatchBlocks.iterator(); it.hasNext();) {
.hasNext();) {
TryCatchBlockNode trycatch = it.next(); TryCatchBlockNode trycatch = it.next();
if (LOGGING) { if (LOGGING) {
// TODO use of default toString(). // TODO use of default toString().
log("try catch block original labels=" + trycatch.start + '-' log("try catch block original labels=" + trycatch.start + '-' + trycatch.end + "->"
+ trycatch.end + "->" + trycatch.handler); + trycatch.handler);
} }
final LabelNode start = instant.rangeLabel(trycatch.start); final LabelNode start = instant.rangeLabel(trycatch.start);
@ -533,20 +482,17 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
if (LOGGING) { if (LOGGING) {
// TODO use of default toString(). // TODO use of default toString().
log(" try catch block new labels=" + start + '-' + end + "->" log(" try catch block new labels=" + start + '-' + end + "->" + handler);
+ handler);
} }
if (start == null || end == null || handler == null) { if (start == null || end == null || handler == null) {
throw new RuntimeException("Internal error!"); throw new RuntimeException("Internal error!");
} }
newTryCatchBlocks.add(new TryCatchBlockNode(start, end, handler, newTryCatchBlocks.add(new TryCatchBlockNode(start, end, handler, trycatch.type));
trycatch.type));
} }
for (Iterator<LocalVariableNode> it = localVariables.iterator(); it for (Iterator<LocalVariableNode> it = localVariables.iterator(); it.hasNext();) {
.hasNext();) {
LocalVariableNode lvnode = it.next(); LocalVariableNode lvnode = it.next();
if (LOGGING) { if (LOGGING) {
log("local var " + lvnode.name); log("local var " + lvnode.name);
@ -559,8 +505,8 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
} }
continue; continue;
} }
newLocalVariables.add(new LocalVariableNode(lvnode.name, newLocalVariables.add(new LocalVariableNode(lvnode.name, lvnode.desc, lvnode.signature,
lvnode.desc, lvnode.signature, start, end, lvnode.index)); start, end, lvnode.index));
} }
} }
@ -569,18 +515,16 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
} }
/** /**
* A class that represents an instantiation of a subroutine. Each * A class that represents an instantiation of a subroutine. Each instantiation has an associate
* instantiation has an associate "stack" --- which is a listing of those * "stack" --- which is a listing of those instantiations that were active when this particular
* instantiations that were active when this particular instance of this * instance of this subroutine was invoked. Each instantiation also has a map from the original
* subroutine was invoked. Each instantiation also has a map from the * labels of the program to the labels appropriate for this instantiation, and finally a label
* original labels of the program to the labels appropriate for this * to return to.
* instantiation, and finally a label to return to.
*/ */
private class Instantiation extends AbstractMap<LabelNode, LabelNode> { private class Instantiation extends AbstractMap<LabelNode, LabelNode> {
/** /**
* Previous instantiations; the stack must be statically predictable to * Previous instantiations; the stack must be statically predictable to be inlinable.
* be inlinable.
*/ */
final Instantiation previous; final Instantiation previous;
@ -590,15 +534,13 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
public final BitSet subroutine; public final BitSet subroutine;
/** /**
* This table maps Labels from the original source to Labels pointing at * This table maps Labels from the original source to Labels pointing at code specific to
* code specific to this instantiation, for use in remapping try/catch * this instantiation, for use in remapping try/catch blocks,as well as gotos.
* blocks,as well as gotos.
* *
* Note that in the presence of dual citizens instructions, that is, * Note that in the presence of dual citizens instructions, that is, instructions which
* instructions which belong to more than one subroutine due to the * belong to more than one subroutine due to the merging of control flow without a RET
* merging of control flow without a RET instruction, we will map the * instruction, we will map the target label of a GOTO to the label used by the
* target label of a GOTO to the label used by the instantiation lowest * instantiation lowest on the stack. This avoids code duplication during inlining in most
* on the stack. This avoids code duplication during inlining in most
* cases. * cases.
* *
* @see #findOwner(int) * @see #findOwner(int)
@ -660,27 +602,23 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
} }
/** /**
* Returns the "owner" of a particular instruction relative to this * Returns the "owner" of a particular instruction relative to this instantiation: the owner
* instantiation: the owner referes to the Instantiation which will emit * referes to the Instantiation which will emit the version of this instruction that we will
* the version of this instruction that we will execute. * execute.
* *
* Typically, the return value is either <code>this</code> or * Typically, the return value is either <code>this</code> or <code>null</code>.
* <code>null</code>. <code>this</code> indicates that this * <code>this</code> indicates that this instantiation will generate the version of this
* instantiation will generate the version of this instruction that we * instruction that we will execute, and <code>null</code> indicates that this instantiation
* will execute, and <code>null</code> indicates that this instantiation
* never executes the given instruction. * never executes the given instruction.
* *
* Sometimes, however, an instruction can belong to multiple * Sometimes, however, an instruction can belong to multiple subroutines; this is called a
* subroutines; this is called a "dual citizen" instruction (though it * "dual citizen" instruction (though it may belong to more than 2 subroutines), and occurs
* may belong to more than 2 subroutines), and occurs when multiple * when multiple subroutines branch to common points of control. In this case, the owner is
* subroutines branch to common points of control. In this case, the * the subroutine that appears lowest on the stack, and which also owns the instruction in
* owner is the subroutine that appears lowest on the stack, and which * question.
* also owns the instruction in question.
* *
* @param i * @param i the index of the instruction in the original code
* the index of the instruction in the original code * @return the "owner" of a particular instruction relative to this instantiation.
* @return the "owner" of a particular instruction relative to this
* instantiation.
*/ */
public Instantiation findOwner(final int i) { public Instantiation findOwner(final int i) {
if (!subroutine.get(i)) { if (!subroutine.get(i)) {
@ -699,13 +637,11 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
} }
/** /**
* Looks up the label <code>l</code> in the <code>gotoTable</code>, thus * Looks up the label <code>l</code> in the <code>gotoTable</code>, thus translating it from
* translating it from a Label in the original code, to a Label in the * a Label in the original code, to a Label in the inlined code that is appropriate for use
* inlined code that is appropriate for use by an instruction that * by an instruction that branched to the original label.
* branched to the original label.
* *
* @param l * @param l The label we will be translating
* The label we will be translating
* @return a label for use by a branch instruction in the inlined code * @return a label for use by a branch instruction in the inlined code
* @see #rangeLabel * @see #rangeLabel
*/ */
@ -717,15 +653,12 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
} }
/** /**
* Looks up the label <code>l</code> in the <code>rangeTable</code>, * Looks up the label <code>l</code> in the <code>rangeTable</code>, thus translating it
* thus translating it from a Label in the original code, to a Label in * from a Label in the original code, to a Label in the inlined code that is appropriate for
* the inlined code that is appropriate for use by an try/catch or * use by an try/catch or variable use annotation.
* variable use annotation.
* *
* @param l * @param l The label we will be translating
* The label we will be translating * @return a label for use by a try/catch or variable annotation in the original code
* @return a label for use by a try/catch or variable annotation in the
* original code
* @see #rangeTable * @see #rangeTable
*/ */
public LabelNode rangeLabel(final LabelNode l) { public LabelNode rangeLabel(final LabelNode l) {

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.commons; package org.objectweb.asm.commons;
@ -35,12 +27,11 @@ import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type; import org.objectweb.asm.Type;
/** /**
* A {@link MethodVisitor} that renumbers local variables in their order of * A {@link MethodVisitor} that renumbers local variables in their order of appearance. This adapter
* appearance. This adapter allows one to easily add new local variables to a * allows one to easily add new local variables to a method. It may be used by inheriting from this
* method. It may be used by inheriting from this class, but the preferred way * class, but the preferred way of using it is via delegation: the next visitor in the chain can
* of using it is via delegation: the next visitor in the chain can indeed add * indeed add new locals when needed by calling {@link #newLocal} on this adapter (this requires a
* new locals when needed by calling {@link #newLocal} on this adapter (this * reference back to this {@link LocalVariablesSorter}).
* requires a reference back to this {@link LocalVariablesSorter}).
* *
* @author Chris Nokleberg * @author Chris Nokleberg
* @author Eugene Kuleshov * @author Eugene Kuleshov
@ -48,13 +39,12 @@ import org.objectweb.asm.Type;
*/ */
public class LocalVariablesSorter extends MethodVisitor { public class LocalVariablesSorter extends MethodVisitor {
private static final Type OBJECT_TYPE = Type private static final Type OBJECT_TYPE = Type.getObjectType("java/lang/Object");
.getObjectType("java/lang/Object");
/** /**
* Mapping from old to new local variable indexes. A local variable at index * Mapping from old to new local variable indexes. A local variable at index i of size 1 is
* i of size 1 is remapped to 'mapping[2*i]', while a local variable at * remapped to 'mapping[2*i]', while a local variable at index i of size 2 is remapped to
* index i of size 2 is remapped to 'mapping[2*i+1]'. * 'mapping[2*i+1]'.
*/ */
private int[] mapping = new int[40]; private int[] mapping = new int[40];
@ -79,37 +69,29 @@ public class LocalVariablesSorter extends MethodVisitor {
private boolean changed; private boolean changed;
/** /**
* Creates a new {@link LocalVariablesSorter}. <i>Subclasses must not use * Creates a new {@link LocalVariablesSorter}. <i>Subclasses must not use this constructor</i>.
* this constructor</i>. Instead, they must use the * Instead, they must use the {@link #LocalVariablesSorter(int, int, String, MethodVisitor)}
* {@link #LocalVariablesSorter(int, int, String, MethodVisitor)} version. * version.
* *
* @param access * @param access access flags of the adapted method.
* access flags of the adapted method. * @param desc the method's descriptor (see {@link Type Type}).
* @param desc * @param mv the method visitor to which this adapter delegates calls.
* the method's descriptor (see {@link Type Type}).
* @param mv
* the method visitor to which this adapter delegates calls.
*/ */
public LocalVariablesSorter(final int access, final String desc, public LocalVariablesSorter(final int access, final String desc, final MethodVisitor mv) {
final MethodVisitor mv) {
this(Opcodes.ASM4, access, desc, mv); this(Opcodes.ASM4, access, desc, mv);
} }
/** /**
* Creates a new {@link LocalVariablesSorter}. * Creates a new {@link LocalVariablesSorter}.
* *
* @param api * @param api the ASM API version implemented by this visitor. Must be one of
* the ASM API version implemented by this visitor. Must be one * {@link Opcodes#ASM4}.
* of {@link Opcodes#ASM4}. * @param access access flags of the adapted method.
* @param access * @param desc the method's descriptor (see {@link Type Type}).
* access flags of the adapted method. * @param mv the method visitor to which this adapter delegates calls.
* @param desc
* the method's descriptor (see {@link Type Type}).
* @param mv
* the method visitor to which this adapter delegates calls.
*/ */
protected LocalVariablesSorter(final int api, final int access, protected LocalVariablesSorter(final int api, final int access, final String desc,
final String desc, final MethodVisitor mv) { final MethodVisitor mv) {
super(api, mv); super(api, mv);
Type[] args = Type.getArgumentTypes(desc); Type[] args = Type.getArgumentTypes(desc);
nextLocal = (Opcodes.ACC_STATIC & access) == 0 ? 1 : 0; nextLocal = (Opcodes.ACC_STATIC & access) == 0 ? 1 : 0;
@ -164,16 +146,15 @@ public class LocalVariablesSorter extends MethodVisitor {
} }
@Override @Override
public void visitLocalVariable(final String name, final String desc, public void visitLocalVariable(final String name, final String desc, final String signature,
final String signature, final Label start, final Label end, final Label start, final Label end, final int index) {
final int index) {
int newIndex = remap(index, Type.getType(desc)); int newIndex = remap(index, Type.getType(desc));
mv.visitLocalVariable(name, desc, signature, start, end, newIndex); mv.visitLocalVariable(name, desc, signature, start, end, newIndex);
} }
@Override @Override
public void visitFrame(final int type, final int nLocal, public void visitFrame(final int type, final int nLocal, final Object[] local, final int nStack,
final Object[] local, final int nStack, final Object[] stack) { final Object[] stack) {
if (type != Opcodes.F_NEW) { // uncompressed frame if (type != Opcodes.F_NEW) { // uncompressed frame
throw new IllegalStateException( throw new IllegalStateException(
"ClassReader.accept() should be called with EXPAND_FRAMES flag"); "ClassReader.accept() should be called with EXPAND_FRAMES flag");
@ -245,8 +226,7 @@ public class LocalVariablesSorter extends MethodVisitor {
/** /**
* Creates a new local variable of the given type. * Creates a new local variable of the given type.
* *
* @param type * @param type the type of the local variable to be created.
* the type of the local variable to be created.
* @return the identifier of the newly created local variable. * @return the identifier of the newly created local variable.
*/ */
public int newLocal(final Type type) { public int newLocal(final Type type) {
@ -284,39 +264,30 @@ public class LocalVariablesSorter extends MethodVisitor {
} }
/** /**
* Notifies subclasses that a new stack map frame is being visited. The * Notifies subclasses that a new stack map frame is being visited. The array argument contains
* array argument contains the stack map frame types corresponding to the * the stack map frame types corresponding to the local variables added with {@link #newLocal}.
* local variables added with {@link #newLocal}. This method can update * This method can update these types in place for the stack map frame being visited. The
* these types in place for the stack map frame being visited. The default * default implementation of this method does nothing, i.e. a local variable added with
* implementation of this method does nothing, i.e. a local variable added * {@link #newLocal} will have the same type in all stack map frames. But this behavior is not
* with {@link #newLocal} will have the same type in all stack map frames. * always the desired one, for instance if a local variable is added in the middle of a
* But this behavior is not always the desired one, for instance if a local * try/catch block: the frame for the exception handler should have a TOP type for this new
* variable is added in the middle of a try/catch block: the frame for the * local.
* exception handler should have a TOP type for this new local.
* *
* @param newLocals * @param newLocals the stack map frame types corresponding to the local variables added with
* the stack map frame types corresponding to the local variables * {@link #newLocal} (and null for the others). The format of this array is the same as
* added with {@link #newLocal} (and null for the others). The * in {@link MethodVisitor#visitFrame}, except that long and double types use two slots.
* format of this array is the same as in * The types for the current stack map frame must be updated in place in this array.
* {@link MethodVisitor#visitFrame}, except that long and double
* types use two slots. The types for the current stack map frame
* must be updated in place in this array.
*/ */
protected void updateNewLocals(Object[] newLocals) { protected void updateNewLocals(Object[] newLocals) {}
}
/** /**
* Notifies subclasses that a local variable has been added or remapped. The * Notifies subclasses that a local variable has been added or remapped. The default
* default implementation of this method does nothing. * implementation of this method does nothing.
* *
* @param local * @param local a local variable identifier, as returned by {@link #newLocal newLocal()}.
* a local variable identifier, as returned by {@link #newLocal * @param type the type of the value being stored in the local variable.
* newLocal()}.
* @param type
* the type of the value being stored in the local variable.
*/ */
protected void setLocalType(final int local, final Type type) { protected void setLocalType(final int local, final Type type) {}
}
private void setFrameLocal(final int local, final Object type) { private void setFrameLocal(final int local, final Object type) {
int l = newLocals.length; int l = newLocals.length;

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.commons; package org.objectweb.asm.commons;
@ -74,10 +66,8 @@ public class Method {
/** /**
* Creates a new {@link Method}. * Creates a new {@link Method}.
* *
* @param name * @param name the method's name.
* the method's name. * @param desc the method's descriptor.
* @param desc
* the method's descriptor.
*/ */
public Method(final String name, final String desc) { public Method(final String name, final String desc) {
this.name = name; this.name = name;
@ -87,25 +77,19 @@ public class Method {
/** /**
* Creates a new {@link Method}. * Creates a new {@link Method}.
* *
* @param name * @param name the method's name.
* the method's name. * @param returnType the method's return type.
* @param returnType * @param argumentTypes the method's argument types.
* the method's return type.
* @param argumentTypes
* the method's argument types.
*/ */
public Method(final String name, final Type returnType, public Method(final String name, final Type returnType, final Type[] argumentTypes) {
final Type[] argumentTypes) {
this(name, Type.getMethodDescriptor(returnType, argumentTypes)); this(name, Type.getMethodDescriptor(returnType, argumentTypes));
} }
/** /**
* Creates a new {@link Method}. * Creates a new {@link Method}.
* *
* @param m * @param m a java.lang.reflect method descriptor
* a java.lang.reflect method descriptor * @return a {@link Method} corresponding to the given Java method declaration.
* @return a {@link Method} corresponding to the given Java method
* declaration.
*/ */
public static Method getMethod(java.lang.reflect.Method m) { public static Method getMethod(java.lang.reflect.Method m) {
return new Method(m.getName(), Type.getMethodDescriptor(m)); return new Method(m.getName(), Type.getMethodDescriptor(m));
@ -114,60 +98,43 @@ public class Method {
/** /**
* Creates a new {@link Method}. * Creates a new {@link Method}.
* *
* @param c * @param c a java.lang.reflect constructor descriptor
* a java.lang.reflect constructor descriptor * @return a {@link Method} corresponding to the given Java constructor declaration.
* @return a {@link Method} corresponding to the given Java constructor
* declaration.
*/ */
public static Method getMethod(java.lang.reflect.Constructor<?> c) { public static Method getMethod(java.lang.reflect.Constructor<?> c) {
return new Method("<init>", Type.getConstructorDescriptor(c)); return new Method("<init>", Type.getConstructorDescriptor(c));
} }
/** /**
* Returns a {@link Method} corresponding to the given Java method * Returns a {@link Method} corresponding to the given Java method declaration.
* declaration.
* *
* @param method * @param method a Java method declaration, without argument names, of the form "returnType name
* a Java method declaration, without argument names, of the form * (argumentType1, ... argumentTypeN)", where the types are in plain Java (e.g. "int",
* "returnType name (argumentType1, ... argumentTypeN)", where * "float", "java.util.List", ...). Classes of the java.lang package can be specified by
* the types are in plain Java (e.g. "int", "float", * their unqualified name; all other classes names must be fully qualified.
* "java.util.List", ...). Classes of the java.lang package can * @return a {@link Method} corresponding to the given Java method declaration.
* be specified by their unqualified name; all other classes * @throws IllegalArgumentException if <code>method</code> could not get parsed.
* names must be fully qualified.
* @return a {@link Method} corresponding to the given Java method
* declaration.
* @throws IllegalArgumentException
* if <code>method</code> could not get parsed.
*/ */
public static Method getMethod(final String method) public static Method getMethod(final String method) throws IllegalArgumentException {
throws IllegalArgumentException {
return getMethod(method, false); return getMethod(method, false);
} }
/** /**
* Returns a {@link Method} corresponding to the given Java method * Returns a {@link Method} corresponding to the given Java method declaration.
* declaration.
* *
* @param method * @param method a Java method declaration, without argument names, of the form "returnType name
* a Java method declaration, without argument names, of the form * (argumentType1, ... argumentTypeN)", where the types are in plain Java (e.g. "int",
* "returnType name (argumentType1, ... argumentTypeN)", where * "float", "java.util.List", ...). Classes of the java.lang package may be specified by
* the types are in plain Java (e.g. "int", "float", * their unqualified name, depending on the defaultPackage argument; all other classes
* "java.util.List", ...). Classes of the java.lang package may * names must be fully qualified.
* be specified by their unqualified name, depending on the * @param defaultPackage true if unqualified class names belong to the default package, or false
* defaultPackage argument; all other classes names must be fully * if they correspond to java.lang classes. For instance "Object" means "Object" if this
* qualified. * option is true, or "java.lang.Object" otherwise.
* @param defaultPackage * @return a {@link Method} corresponding to the given Java method declaration.
* true if unqualified class names belong to the default package, * @throws IllegalArgumentException if <code>method</code> could not get parsed.
* or false if they correspond to java.lang classes. For instance
* "Object" means "Object" if this option is true, or
* "java.lang.Object" otherwise.
* @return a {@link Method} corresponding to the given Java method
* declaration.
* @throws IllegalArgumentException
* if <code>method</code> could not get parsed.
*/ */
public static Method getMethod(final String method, public static Method getMethod(final String method, final boolean defaultPackage)
final boolean defaultPackage) throws IllegalArgumentException { throws IllegalArgumentException {
int space = method.indexOf(' '); int space = method.indexOf(' ');
int start = method.indexOf('(', space) + 1; int start = method.indexOf('(', space) + 1;
int end = method.indexOf(')', start); int end = method.indexOf(')', start);

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.commons; package org.objectweb.asm.commons;
@ -37,8 +29,7 @@ import org.objectweb.asm.signature.SignatureVisitor;
import org.objectweb.asm.signature.SignatureWriter; import org.objectweb.asm.signature.SignatureWriter;
/** /**
* A class responsible for remapping types and names. Subclasses can override * A class responsible for remapping types and names. Subclasses can override the following methods:
* the following methods:
* *
* <ul> * <ul>
* <li>{@link #map(String)} - map type</li> * <li>{@link #map(String)} - map type</li>
@ -137,8 +128,8 @@ public abstract class Remapper {
} }
if (value instanceof Handle) { if (value instanceof Handle) {
Handle h = (Handle) value; Handle h = (Handle) value;
return new Handle(h.getTag(), mapType(h.getOwner()), mapMethodName( return new Handle(h.getTag(), mapType(h.getOwner()),
h.getOwner(), h.getName(), h.getDesc()), mapMethodName(h.getOwner(), h.getName(), h.getDesc()),
mapMethodDesc(h.getDesc())); mapMethodDesc(h.getDesc()));
} }
return value; return value;
@ -146,10 +137,8 @@ public abstract class Remapper {
/** /**
* *
* @param typeSignature * @param typeSignature true if signature is a FieldTypeSignature, such as the signature
* true if signature is a FieldTypeSignature, such as the * parameter of the ClassVisitor.visitField or MethodVisitor.visitLocalVariable methods
* signature parameter of the ClassVisitor.visitField or
* MethodVisitor.visitLocalVariable methods
*/ */
public String mapSignature(String signature, boolean typeSignature) { public String mapSignature(String signature, boolean typeSignature) {
if (signature == null) { if (signature == null) {
@ -166,20 +155,16 @@ public abstract class Remapper {
return w.toString(); return w.toString();
} }
protected SignatureVisitor createRemappingSignatureAdapter( protected SignatureVisitor createRemappingSignatureAdapter(SignatureVisitor v) {
SignatureVisitor v) {
return new RemappingSignatureAdapter(v, this); return new RemappingSignatureAdapter(v, this);
} }
/** /**
* Map method name to the new name. Subclasses can override. * Map method name to the new name. Subclasses can override.
* *
* @param owner * @param owner owner of the method.
* owner of the method. * @param name name of the method.
* @param name * @param desc descriptor of the method.
* name of the method.
* @param desc
* descriptor of the method.
* @return new name of the method * @return new name of the method
*/ */
public String mapMethodName(String owner, String name, String desc) { public String mapMethodName(String owner, String name, String desc) {
@ -189,10 +174,8 @@ public abstract class Remapper {
/** /**
* Map invokedynamic method name to the new name. Subclasses can override. * Map invokedynamic method name to the new name. Subclasses can override.
* *
* @param name * @param name name of the invokedynamic.
* name of the invokedynamic. * @param desc descriptor of the invokedynamic.
* @param desc
* descriptor of the invokedynamic.
* @return new invokdynamic name. * @return new invokdynamic name.
*/ */
public String mapInvokeDynamicMethodName(String name, String desc) { public String mapInvokeDynamicMethodName(String name, String desc) {
@ -202,12 +185,9 @@ public abstract class Remapper {
/** /**
* Map field name to the new name. Subclasses can override. * Map field name to the new name. Subclasses can override.
* *
* @param owner * @param owner owner of the field.
* owner of the field. * @param name name of the field
* @param name * @param desc descriptor of the field
* name of the field
* @param desc
* descriptor of the field
* @return new name of the field. * @return new name of the field.
*/ */
public String mapFieldName(String owner, String name, String desc) { public String mapFieldName(String owner, String name, String desc) {

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.commons; package org.objectweb.asm.commons;
@ -42,13 +34,12 @@ public class RemappingAnnotationAdapter extends AnnotationVisitor {
protected final Remapper remapper; protected final Remapper remapper;
public RemappingAnnotationAdapter(final AnnotationVisitor av, public RemappingAnnotationAdapter(final AnnotationVisitor av, final Remapper remapper) {
final Remapper remapper) {
this(Opcodes.ASM4, av, remapper); this(Opcodes.ASM4, av, remapper);
} }
protected RemappingAnnotationAdapter(final int api, protected RemappingAnnotationAdapter(final int api, final AnnotationVisitor av,
final AnnotationVisitor av, final Remapper remapper) { final Remapper remapper) {
super(api, av); super(api, av);
this.remapper = remapper; this.remapper = remapper;
} }
@ -66,14 +57,12 @@ public class RemappingAnnotationAdapter extends AnnotationVisitor {
@Override @Override
public AnnotationVisitor visitAnnotation(String name, String desc) { public AnnotationVisitor visitAnnotation(String name, String desc) {
AnnotationVisitor v = av.visitAnnotation(name, remapper.mapDesc(desc)); AnnotationVisitor v = av.visitAnnotation(name, remapper.mapDesc(desc));
return v == null ? null : (v == av ? this return v == null ? null : (v == av ? this : new RemappingAnnotationAdapter(v, remapper));
: new RemappingAnnotationAdapter(v, remapper));
} }
@Override @Override
public AnnotationVisitor visitArray(String name) { public AnnotationVisitor visitArray(String name) {
AnnotationVisitor v = av.visitArray(name); AnnotationVisitor v = av.visitArray(name);
return v == null ? null : (v == av ? this return v == null ? null : (v == av ? this : new RemappingAnnotationAdapter(v, remapper));
: new RemappingAnnotationAdapter(v, remapper));
} }
} }

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.commons; package org.objectweb.asm.commons;
@ -51,18 +43,17 @@ public class RemappingClassAdapter extends ClassVisitor {
this(Opcodes.ASM4, cv, remapper); this(Opcodes.ASM4, cv, remapper);
} }
protected RemappingClassAdapter(final int api, final ClassVisitor cv, protected RemappingClassAdapter(final int api, final ClassVisitor cv, final Remapper remapper) {
final Remapper remapper) {
super(api, cv); super(api, cv);
this.remapper = remapper; this.remapper = remapper;
} }
@Override @Override
public void visit(int version, int access, String name, String signature, public void visit(int version, int access, String name, String signature, String superName,
String superName, String[] interfaces) { String[] interfaces) {
this.className = name; this.className = name;
super.visit(version, access, remapper.mapType(name), remapper super.visit(version, access, remapper.mapType(name),
.mapSignature(signature, false), remapper.mapType(superName), remapper.mapSignature(signature, false), remapper.mapType(superName),
interfaces == null ? null : remapper.mapTypes(interfaces)); interfaces == null ? null : remapper.mapTypes(interfaces));
} }
@ -74,39 +65,35 @@ public class RemappingClassAdapter extends ClassVisitor {
} }
@Override @Override
public FieldVisitor visitField(int access, String name, String desc, public FieldVisitor visitField(int access, String name, String desc, String signature,
String signature, Object value) { Object value) {
FieldVisitor fv = super.visitField(access, FieldVisitor fv = super.visitField(access, remapper.mapFieldName(className, name, desc),
remapper.mapFieldName(className, name, desc),
remapper.mapDesc(desc), remapper.mapSignature(signature, true), remapper.mapDesc(desc), remapper.mapSignature(signature, true),
remapper.mapValue(value)); remapper.mapValue(value));
return fv == null ? null : createRemappingFieldAdapter(fv); return fv == null ? null : createRemappingFieldAdapter(fv);
} }
@Override @Override
public MethodVisitor visitMethod(int access, String name, String desc, public MethodVisitor visitMethod(int access, String name, String desc, String signature,
String signature, String[] exceptions) { String[] exceptions) {
String newDesc = remapper.mapMethodDesc(desc); String newDesc = remapper.mapMethodDesc(desc);
MethodVisitor mv = super.visitMethod(access, remapper.mapMethodName( MethodVisitor mv = super.visitMethod(access, remapper.mapMethodName(className, name, desc),
className, name, desc), newDesc, remapper.mapSignature( newDesc, remapper.mapSignature(signature, false),
signature, false),
exceptions == null ? null : remapper.mapTypes(exceptions)); exceptions == null ? null : remapper.mapTypes(exceptions));
return mv == null ? null : createRemappingMethodAdapter(access, return mv == null ? null : createRemappingMethodAdapter(access, newDesc, mv);
newDesc, mv);
} }
@Override @Override
public void visitInnerClass(String name, String outerName, public void visitInnerClass(String name, String outerName, String innerName, int access) {
String innerName, int access) {
// TODO should innerName be changed? // TODO should innerName be changed?
super.visitInnerClass(remapper.mapType(name), outerName == null ? null super.visitInnerClass(remapper.mapType(name),
: remapper.mapType(outerName), innerName, access); outerName == null ? null : remapper.mapType(outerName), innerName, access);
} }
@Override @Override
public void visitOuterClass(String owner, String name, String desc) { public void visitOuterClass(String owner, String name, String desc) {
super.visitOuterClass(remapper.mapType(owner), name == null ? null super.visitOuterClass(remapper.mapType(owner),
: remapper.mapMethodName(owner, name, desc), name == null ? null : remapper.mapMethodName(owner, name, desc),
desc == null ? null : remapper.mapMethodDesc(desc)); desc == null ? null : remapper.mapMethodDesc(desc));
} }
@ -114,13 +101,12 @@ public class RemappingClassAdapter extends ClassVisitor {
return new RemappingFieldAdapter(fv, remapper); return new RemappingFieldAdapter(fv, remapper);
} }
protected MethodVisitor createRemappingMethodAdapter(int access, protected MethodVisitor createRemappingMethodAdapter(int access, String newDesc,
String newDesc, MethodVisitor mv) { MethodVisitor mv) {
return new RemappingMethodAdapter(access, newDesc, mv, remapper); return new RemappingMethodAdapter(access, newDesc, mv, remapper);
} }
protected AnnotationVisitor createRemappingAnnotationAdapter( protected AnnotationVisitor createRemappingAnnotationAdapter(AnnotationVisitor av) {
AnnotationVisitor av) {
return new RemappingAnnotationAdapter(av, remapper); return new RemappingAnnotationAdapter(av, remapper);
} }
} }

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.commons; package org.objectweb.asm.commons;
@ -47,16 +39,14 @@ public class RemappingFieldAdapter extends FieldVisitor {
this(Opcodes.ASM4, fv, remapper); this(Opcodes.ASM4, fv, remapper);
} }
protected RemappingFieldAdapter(final int api, final FieldVisitor fv, protected RemappingFieldAdapter(final int api, final FieldVisitor fv, final Remapper remapper) {
final Remapper remapper) {
super(api, fv); super(api, fv);
this.remapper = remapper; this.remapper = remapper;
} }
@Override @Override
public AnnotationVisitor visitAnnotation(String desc, boolean visible) { public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
AnnotationVisitor av = fv.visitAnnotation(remapper.mapDesc(desc), AnnotationVisitor av = fv.visitAnnotation(remapper.mapDesc(desc), visible);
visible);
return av == null ? null : new RemappingAnnotationAdapter(av, remapper); return av == null ? null : new RemappingAnnotationAdapter(av, remapper);
} }
} }

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.commons; package org.objectweb.asm.commons;
@ -45,13 +37,13 @@ public class RemappingMethodAdapter extends LocalVariablesSorter {
protected final Remapper remapper; protected final Remapper remapper;
public RemappingMethodAdapter(final int access, final String desc, public RemappingMethodAdapter(final int access, final String desc, final MethodVisitor mv,
final MethodVisitor mv, final Remapper remapper) { final Remapper remapper) {
this(Opcodes.ASM4, access, desc, mv, remapper); this(Opcodes.ASM4, access, desc, mv, remapper);
} }
protected RemappingMethodAdapter(final int api, final int access, protected RemappingMethodAdapter(final int api, final int access, final String desc,
final String desc, final MethodVisitor mv, final Remapper remapper) { final MethodVisitor mv, final Remapper remapper) {
super(api, access, desc, mv); super(api, access, desc, mv);
this.remapper = remapper; this.remapper = remapper;
} }
@ -64,22 +56,19 @@ public class RemappingMethodAdapter extends LocalVariablesSorter {
@Override @Override
public AnnotationVisitor visitAnnotation(String desc, boolean visible) { public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
AnnotationVisitor av = mv.visitAnnotation(remapper.mapDesc(desc), AnnotationVisitor av = mv.visitAnnotation(remapper.mapDesc(desc), visible);
visible);
return av == null ? av : new RemappingAnnotationAdapter(av, remapper); return av == null ? av : new RemappingAnnotationAdapter(av, remapper);
} }
@Override @Override
public AnnotationVisitor visitParameterAnnotation(int parameter, public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) {
String desc, boolean visible) { AnnotationVisitor av =
AnnotationVisitor av = mv.visitParameterAnnotation(parameter, mv.visitParameterAnnotation(parameter, remapper.mapDesc(desc), visible);
remapper.mapDesc(desc), visible);
return av == null ? av : new RemappingAnnotationAdapter(av, remapper); return av == null ? av : new RemappingAnnotationAdapter(av, remapper);
} }
@Override @Override
public void visitFrame(int type, int nLocal, Object[] local, int nStack, public void visitFrame(int type, int nLocal, Object[] local, int nStack, Object[] stack) {
Object[] stack) {
super.visitFrame(type, nLocal, remapEntries(nLocal, local), nStack, super.visitFrame(type, nLocal, remapEntries(nLocal, local), nStack,
remapEntries(nStack, stack)); remapEntries(nStack, stack));
} }
@ -93,8 +82,7 @@ public class RemappingMethodAdapter extends LocalVariablesSorter {
} }
do { do {
Object t = entries[i]; Object t = entries[i];
newEntries[i++] = t instanceof String ? remapper newEntries[i++] = t instanceof String ? remapper.mapType((String) t) : t;
.mapType((String) t) : t;
} while (i < n); } while (i < n);
return newEntries; return newEntries;
} }
@ -103,31 +91,24 @@ public class RemappingMethodAdapter extends LocalVariablesSorter {
} }
@Override @Override
public void visitFieldInsn(int opcode, String owner, String name, public void visitFieldInsn(int opcode, String owner, String name, String desc) {
String desc) {
super.visitFieldInsn(opcode, remapper.mapType(owner), super.visitFieldInsn(opcode, remapper.mapType(owner),
remapper.mapFieldName(owner, name, desc), remapper.mapFieldName(owner, name, desc), remapper.mapDesc(desc));
remapper.mapDesc(desc));
} }
@Override @Override
public void visitMethodInsn(int opcode, String owner, String name, public void visitMethodInsn(int opcode, String owner, String name, String desc) {
String desc) {
super.visitMethodInsn(opcode, remapper.mapType(owner), super.visitMethodInsn(opcode, remapper.mapType(owner),
remapper.mapMethodName(owner, name, desc), remapper.mapMethodName(owner, name, desc), remapper.mapMethodDesc(desc));
remapper.mapMethodDesc(desc));
} }
@Override @Override
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
Object... bsmArgs) {
for (int i = 0; i < bsmArgs.length; i++) { for (int i = 0; i < bsmArgs.length; i++) {
bsmArgs[i] = remapper.mapValue(bsmArgs[i]); bsmArgs[i] = remapper.mapValue(bsmArgs[i]);
} }
super.visitInvokeDynamicInsn( super.visitInvokeDynamicInsn(remapper.mapInvokeDynamicMethodName(name, desc),
remapper.mapInvokeDynamicMethodName(name, desc), remapper.mapMethodDesc(desc), (Handle) remapper.mapValue(bsm), bsmArgs);
remapper.mapMethodDesc(desc), (Handle) remapper.mapValue(bsm),
bsmArgs);
} }
@Override @Override
@ -146,15 +127,13 @@ public class RemappingMethodAdapter extends LocalVariablesSorter {
} }
@Override @Override
public void visitTryCatchBlock(Label start, Label end, Label handler, public void visitTryCatchBlock(Label start, Label end, Label handler, String type) {
String type) { super.visitTryCatchBlock(start, end, handler, type == null ? null : remapper.mapType(type));
super.visitTryCatchBlock(start, end, handler, type == null ? null
: remapper.mapType(type));
} }
@Override @Override
public void visitLocalVariable(String name, String desc, String signature, public void visitLocalVariable(String name, String desc, String signature, Label start,
Label start, Label end, int index) { Label end, int index) {
super.visitLocalVariable(name, remapper.mapDesc(desc), super.visitLocalVariable(name, remapper.mapDesc(desc),
remapper.mapSignature(signature, true), start, end, index); remapper.mapSignature(signature, true), start, end, index);
} }

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.commons; package org.objectweb.asm.commons;
@ -46,13 +38,12 @@ public class RemappingSignatureAdapter extends SignatureVisitor {
private String className; private String className;
public RemappingSignatureAdapter(final SignatureVisitor v, public RemappingSignatureAdapter(final SignatureVisitor v, final Remapper remapper) {
final Remapper remapper) {
this(Opcodes.ASM4, v, remapper); this(Opcodes.ASM4, v, remapper);
} }
protected RemappingSignatureAdapter(final int api, protected RemappingSignatureAdapter(final int api, final SignatureVisitor v,
final SignatureVisitor v, final Remapper remapper) { final Remapper remapper) {
super(api); super(api);
this.v = v; this.v = v;
this.remapper = remapper; this.remapper = remapper;
@ -69,8 +60,8 @@ public class RemappingSignatureAdapter extends SignatureVisitor {
String remappedOuter = remapper.mapType(className) + '$'; String remappedOuter = remapper.mapType(className) + '$';
className = className + '$' + name; className = className + '$' + name;
String remappedName = remapper.mapType(className); String remappedName = remapper.mapType(className);
int index = remappedName.startsWith(remappedOuter) ? remappedOuter int index = remappedName.startsWith(remappedOuter) ? remappedOuter.length()
.length() : remappedName.lastIndexOf('$') + 1; : remappedName.lastIndexOf('$') + 1;
v.visitInnerClassType(remappedName.substring(index)); v.visitInnerClassType(remappedName.substring(index));
} }

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.commons; package org.objectweb.asm.commons;
@ -44,8 +36,8 @@ import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
/** /**
* A {@link ClassVisitor} that adds a serial version unique identifier to a * A {@link ClassVisitor} that adds a serial version unique identifier to a class if missing. Here
* class if missing. Here is typical usage of this class: * is typical usage of this class:
* *
* <pre> * <pre>
* ClassWriter cw = new ClassWriter(...); * ClassWriter cw = new ClassWriter(...);
@ -54,8 +46,8 @@ import java.util.Collection;
* new ClassReader(orginalClass).accept(ca, false); * new ClassReader(orginalClass).accept(ca, false);
* </pre> * </pre>
* <p> * <p>
* The SVUID algorithm can be found <a href= * The SVUID algorithm can be found
* "http://java.sun.com/j2se/1.4.2/docs/guide/serialization/spec/class.html" * <a href= "http://java.sun.com/j2se/1.4.2/docs/guide/serialization/spec/class.html"
* >http://java.sun.com/j2se/1.4.2/docs/guide/serialization/spec/class.html</a>: * >http://java.sun.com/j2se/1.4.2/docs/guide/serialization/spec/class.html</a>:
* *
* <pre> * <pre>
@ -113,8 +105,7 @@ import java.util.Collection;
public class SerialVersionUIDAdder extends ClassVisitor { public class SerialVersionUIDAdder extends ClassVisitor {
/** /**
* Collection of fields. (except private static and private transient * Collection of fields. (except private static and private transient fields)
* fields)
*/ */
private final Collection<Item> svuidFields; private final Collection<Item> svuidFields;
/** /**
@ -151,12 +142,10 @@ public class SerialVersionUIDAdder extends ClassVisitor {
private boolean hasStaticInitializer; private boolean hasStaticInitializer;
/** /**
* Creates a new {@link SerialVersionUIDAdder}. <i>Subclasses must not use * Creates a new {@link SerialVersionUIDAdder}. <i>Subclasses must not use this constructor</i>.
* this constructor</i>. Instead, they must use the * Instead, they must use the {@link #SerialVersionUIDAdder(int, ClassVisitor)} version.
* {@link #SerialVersionUIDAdder(int, ClassVisitor)} version.
* *
* @param cv a {@link ClassVisitor} to which this visitor will delegate * @param cv a {@link ClassVisitor} to which this visitor will delegate calls.
* calls.
*/ */
public SerialVersionUIDAdder(final ClassVisitor cv) { public SerialVersionUIDAdder(final ClassVisitor cv) {
this(Opcodes.ASM4, cv); this(Opcodes.ASM4, cv);
@ -165,10 +154,9 @@ public class SerialVersionUIDAdder extends ClassVisitor {
/** /**
* Creates a new {@link SerialVersionUIDAdder}. * Creates a new {@link SerialVersionUIDAdder}.
* *
* @param api the ASM API version implemented by this visitor. Must be one * @param api the ASM API version implemented by this visitor. Must be one of
* of {@link Opcodes#ASM4}. * {@link Opcodes#ASM4}.
* @param cv a {@link ClassVisitor} to which this visitor will delegate * @param cv a {@link ClassVisitor} to which this visitor will delegate calls.
* calls.
*/ */
protected SerialVersionUIDAdder(final int api, final ClassVisitor cv) { protected SerialVersionUIDAdder(final int api, final ClassVisitor cv) {
super(api, cv); super(api, cv);
@ -189,27 +177,25 @@ public class SerialVersionUIDAdder extends ClassVisitor {
* @param dotted a <code>boolean</code> value * @param dotted a <code>boolean</code> value
* @throws IOException if an error occurs * @throws IOException if an error occurs
*/ */
private static void writeItems(final Collection<Item> itemCollection, private static void writeItems(final Collection<Item> itemCollection, final DataOutput dos,
final DataOutput dos, final boolean dotted) throws IOException { final boolean dotted) throws IOException {
int size = itemCollection.size(); int size = itemCollection.size();
Item[] items = itemCollection.toArray(new Item[size]); Item[] items = itemCollection.toArray(new Item[size]);
Arrays.sort(items); Arrays.sort(items);
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
dos.writeUTF(items[i].name); dos.writeUTF(items[i].name);
dos.writeInt(items[i].access); dos.writeInt(items[i].access);
dos.writeUTF(dotted ? items[i].desc.replace('/', '.') dos.writeUTF(dotted ? items[i].desc.replace('/', '.') : items[i].desc);
: items[i].desc);
} }
} }
/* /*
* Visit class header and get class name, access , and interfaces * Visit class header and get class name, access , and interfaces information (step 1,2, and 3)
* information (step 1,2, and 3) for SVUID computation. * for SVUID computation.
*/ */
@Override @Override
public void visit(final int version, final int access, final String name, public void visit(final int version, final int access, final String name,
final String signature, final String superName, final String signature, final String superName, final String[] interfaces) {
final String[] interfaces) {
computeSVUID = (access & Opcodes.ACC_INTERFACE) == 0; computeSVUID = (access & Opcodes.ACC_INTERFACE) == 0;
if (computeSVUID) { if (computeSVUID) {
@ -222,27 +208,23 @@ public class SerialVersionUIDAdder extends ClassVisitor {
} }
/* /*
* Visit the methods and get constructor and method information (step 5 and * Visit the methods and get constructor and method information (step 5 and 7). Also determine
* 7). Also determine if there is a class initializer (step 6). * if there is a class initializer (step 6).
*/ */
@Override @Override
public MethodVisitor visitMethod(final int access, final String name, public MethodVisitor visitMethod(final int access, final String name, final String desc,
final String desc, final String signature, final String[] exceptions) { final String signature, final String[] exceptions) {
if (computeSVUID) { if (computeSVUID) {
if ("<clinit>".equals(name)) { if ("<clinit>".equals(name)) {
hasStaticInitializer = true; hasStaticInitializer = true;
} }
/* /*
* Remembers non private constructors and methods for SVUID * Remembers non private constructors and methods for SVUID computation For constructor
* computation For constructor and method modifiers, only the * and method modifiers, only the ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC,
* ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, * ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT and ACC_STRICT flags are used.
* ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT and ACC_STRICT flags
* are used.
*/ */
int mods = access int mods = access & (Opcodes.ACC_PUBLIC | Opcodes.ACC_PRIVATE | Opcodes.ACC_PROTECTED
& (Opcodes.ACC_PUBLIC | Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC | Opcodes.ACC_FINAL | Opcodes.ACC_SYNCHRONIZED
| Opcodes.ACC_PROTECTED | Opcodes.ACC_STATIC
| Opcodes.ACC_FINAL | Opcodes.ACC_SYNCHRONIZED
| Opcodes.ACC_NATIVE | Opcodes.ACC_ABSTRACT | Opcodes.ACC_STRICT); | Opcodes.ACC_NATIVE | Opcodes.ACC_ABSTRACT | Opcodes.ACC_STRICT);
// all non private methods // all non private methods
@ -259,12 +241,12 @@ public class SerialVersionUIDAdder extends ClassVisitor {
} }
/* /*
* Gets class field information for step 4 of the algorithm. Also determines * Gets class field information for step 4 of the algorithm. Also determines if the class
* if the class already has a SVUID. * already has a SVUID.
*/ */
@Override @Override
public FieldVisitor visitField(final int access, final String name, public FieldVisitor visitField(final int access, final String name, final String desc,
final String desc, final String signature, final Object value) { final String signature, final Object value) {
if (computeSVUID) { if (computeSVUID) {
if ("serialVersionUID".equals(name)) { if ("serialVersionUID".equals(name)) {
// since the class already has SVUID, we won't be computing it. // since the class already has SVUID, we won't be computing it.
@ -272,17 +254,15 @@ public class SerialVersionUIDAdder extends ClassVisitor {
hasSVUID = true; hasSVUID = true;
} }
/* /*
* Remember field for SVUID computation For field modifiers, only * Remember field for SVUID computation For field modifiers, only the ACC_PUBLIC,
* the ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, * ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_VOLATILE, and ACC_TRANSIENT
* ACC_FINAL, ACC_VOLATILE, and ACC_TRANSIENT flags are used when * flags are used when computing serialVersionUID values.
* computing serialVersionUID values.
*/ */
if ((access & Opcodes.ACC_PRIVATE) == 0 if ((access & Opcodes.ACC_PRIVATE) == 0
|| (access & (Opcodes.ACC_STATIC | Opcodes.ACC_TRANSIENT)) == 0) { || (access & (Opcodes.ACC_STATIC | Opcodes.ACC_TRANSIENT)) == 0) {
int mods = access int mods = access & (Opcodes.ACC_PUBLIC | Opcodes.ACC_PRIVATE
& (Opcodes.ACC_PUBLIC | Opcodes.ACC_PRIVATE | Opcodes.ACC_PROTECTED | Opcodes.ACC_STATIC | Opcodes.ACC_FINAL
| Opcodes.ACC_PROTECTED | Opcodes.ACC_STATIC | Opcodes.ACC_VOLATILE | Opcodes.ACC_TRANSIENT);
| Opcodes.ACC_FINAL | Opcodes.ACC_VOLATILE | Opcodes.ACC_TRANSIENT);
svuidFields.add(new Item(name, mods, desc)); svuidFields.add(new Item(name, mods, desc));
} }
} }
@ -291,15 +271,14 @@ public class SerialVersionUIDAdder extends ClassVisitor {
} }
/** /**
* Handle a bizarre special case. Nested classes (static classes declared * Handle a bizarre special case. Nested classes (static classes declared inside another class)
* inside another class) that are protected have their access bit set to * that are protected have their access bit set to public in their class files to deal with some
* public in their class files to deal with some odd reflection situation. * odd reflection situation. Our SVUID computation must do as the JVM does and ignore access
* Our SVUID computation must do as the JVM does and ignore access bits in * bits in the class file in favor of the access bits InnerClass attribute.
* the class file in favor of the access bits InnerClass attribute.
*/ */
@Override @Override
public void visitInnerClass(final String aname, final String outerName, public void visitInnerClass(final String aname, final String outerName, final String innerName,
final String innerName, final int attr_access) { final int attr_access) {
if ((name != null) && name.equals(aname)) { if ((name != null) && name.equals(aname)) {
this.access = attr_access; this.access = attr_access;
} }
@ -320,8 +299,7 @@ public class SerialVersionUIDAdder extends ClassVisitor {
try { try {
addSVUID(computeSVUID()); addSVUID(computeSVUID());
} catch (Throwable e) { } catch (Throwable e) {
throw new RuntimeException("Error while computing SVUID for " throw new RuntimeException("Error while computing SVUID for " + name, e);
+ name, e);
} }
} }
@ -329,8 +307,8 @@ public class SerialVersionUIDAdder extends ClassVisitor {
} }
/** /**
* Returns true if the class already has a SVUID field. The result of this * Returns true if the class already has a SVUID field. The result of this method is only valid
* method is only valid when visitEnd is or has been called. * when visitEnd is or has been called.
* *
* @return true if the class already has a SVUID field. * @return true if the class already has a SVUID field.
*/ */
@ -339,8 +317,8 @@ public class SerialVersionUIDAdder extends ClassVisitor {
} }
protected void addSVUID(long svuid) { protected void addSVUID(long svuid) {
FieldVisitor fv = super.visitField(Opcodes.ACC_FINAL FieldVisitor fv = super.visitField(Opcodes.ACC_FINAL + Opcodes.ACC_STATIC,
+ Opcodes.ACC_STATIC, "serialVersionUID", "J", null, svuid); "serialVersionUID", "J", null, svuid);
if (null != fv) { if (null != fv) {
fv.visitEnd(); fv.visitEnd();
} }
@ -369,13 +347,11 @@ public class SerialVersionUIDAdder extends ClassVisitor {
/* /*
* 2. The class modifiers written as a 32-bit integer. * 2. The class modifiers written as a 32-bit integer.
*/ */
dos.writeInt(access dos.writeInt(access & (Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL | Opcodes.ACC_INTERFACE
& (Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL | Opcodes.ACC_ABSTRACT));
| Opcodes.ACC_INTERFACE | Opcodes.ACC_ABSTRACT));
/* /*
* 3. The name of each interface sorted by name written using UTF * 3. The name of each interface sorted by name written using UTF encoding.
* encoding.
*/ */
Arrays.sort(interfaces); Arrays.sort(interfaces);
for (String anInterface : interfaces) { for (String anInterface : interfaces) {
@ -383,24 +359,22 @@ public class SerialVersionUIDAdder extends ClassVisitor {
} }
/* /*
* 4. For each field of the class sorted by field name (except * 4. For each field of the class sorted by field name (except private static and
* private static and private transient fields): * private transient fields):
* *
* 1. The name of the field in UTF encoding. 2. The modifiers of the * 1. The name of the field in UTF encoding. 2. The modifiers of the field written as a
* field written as a 32-bit integer. 3. The descriptor of the field * 32-bit integer. 3. The descriptor of the field in UTF encoding
* in UTF encoding
* *
* Note that field signatures are not dot separated. Method and * Note that field signatures are not dot separated. Method and constructor signatures
* constructor signatures are dot separated. Go figure... * are dot separated. Go figure...
*/ */
writeItems(svuidFields, dos, false); writeItems(svuidFields, dos, false);
/* /*
* 5. If a class initializer exists, write out the following: 1. The * 5. If a class initializer exists, write out the following: 1. The name of the method,
* name of the method, <clinit>, in UTF encoding. 2. The modifier of * <clinit>, in UTF encoding. 2. The modifier of the method,
* the method, java.lang.reflect.Modifier.STATIC, written as a * java.lang.reflect.Modifier.STATIC, written as a 32-bit integer. 3. The descriptor of
* 32-bit integer. 3. The descriptor of the method, ()V, in UTF * the method, ()V, in UTF encoding.
* encoding.
*/ */
if (hasStaticInitializer) { if (hasStaticInitializer) {
dos.writeUTF("<clinit>"); dos.writeUTF("<clinit>");
@ -409,42 +383,37 @@ public class SerialVersionUIDAdder extends ClassVisitor {
} // if.. } // if..
/* /*
* 6. For each non-private constructor sorted by method name and * 6. For each non-private constructor sorted by method name and signature: 1. The name
* signature: 1. The name of the method, <init>, in UTF encoding. 2. * of the method, <init>, in UTF encoding. 2. The modifiers of the method written as a
* The modifiers of the method written as a 32-bit integer. 3. The * 32-bit integer. 3. The descriptor of the method in UTF encoding.
* descriptor of the method in UTF encoding.
*/ */
writeItems(svuidConstructors, dos, true); writeItems(svuidConstructors, dos, true);
/* /*
* 7. For each non-private method sorted by method name and * 7. For each non-private method sorted by method name and signature: 1. The name of
* signature: 1. The name of the method in UTF encoding. 2. The * the method in UTF encoding. 2. The modifiers of the method written as a 32-bit
* modifiers of the method written as a 32-bit integer. 3. The * integer. 3. The descriptor of the method in UTF encoding.
* descriptor of the method in UTF encoding.
*/ */
writeItems(svuidMethods, dos, true); writeItems(svuidMethods, dos, true);
dos.flush(); dos.flush();
/* /*
* 8. The SHA-1 algorithm is executed on the stream of bytes * 8. The SHA-1 algorithm is executed on the stream of bytes produced by
* produced by DataOutputStream and produces five 32-bit values * DataOutputStream and produces five 32-bit values sha[0..4].
* sha[0..4].
*/ */
byte[] hashBytes = computeSHAdigest(bos.toByteArray()); byte[] hashBytes = computeSHAdigest(bos.toByteArray());
/* /*
* 9. The hash value is assembled from the first and second 32-bit * 9. The hash value is assembled from the first and second 32-bit values of the SHA-1
* values of the SHA-1 message digest. If the result of the message * message digest. If the result of the message digest, the five 32-bit words H0 H1 H2
* digest, the five 32-bit words H0 H1 H2 H3 H4, is in an array of * H3 H4, is in an array of five int values named sha, the hash value would be computed
* five int values named sha, the hash value would be computed as * as follows:
* follows:
* *
* long hash = ((sha[0] >>> 24) & 0xFF) | ((sha[0] >>> 16) & 0xFF) * long hash = ((sha[0] >>> 24) & 0xFF) | ((sha[0] >>> 16) & 0xFF) << 8 | ((sha[0] >>>
* << 8 | ((sha[0] >>> 8) & 0xFF) << 16 | ((sha[0] >>> 0) & 0xFF) << * 8) & 0xFF) << 16 | ((sha[0] >>> 0) & 0xFF) << 24 | ((sha[1] >>> 24) & 0xFF) << 32 |
* 24 | ((sha[1] >>> 24) & 0xFF) << 32 | ((sha[1] >>> 16) & 0xFF) << * ((sha[1] >>> 16) & 0xFF) << 40 | ((sha[1] >>> 8) & 0xFF) << 48 | ((sha[1] >>> 0) &
* 40 | ((sha[1] >>> 8) & 0xFF) << 48 | ((sha[1] >>> 0) & 0xFF) << * 0xFF) << 56;
* 56;
*/ */
for (int i = Math.min(hashBytes.length, 8) - 1; i >= 0; i--) { for (int i = Math.min(hashBytes.length, 8) - 1; i >= 0; i--) {
svuid = (svuid << 8) | (hashBytes[i] & 0xFF); svuid = (svuid << 8) | (hashBytes[i] & 0xFF);

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.commons; package org.objectweb.asm.commons;

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.commons; package org.objectweb.asm.commons;
@ -52,23 +44,21 @@ public class StaticInitMerger extends ClassVisitor {
this(Opcodes.ASM4, prefix, cv); this(Opcodes.ASM4, prefix, cv);
} }
protected StaticInitMerger(final int api, final String prefix, protected StaticInitMerger(final int api, final String prefix, final ClassVisitor cv) {
final ClassVisitor cv) {
super(api, cv); super(api, cv);
this.prefix = prefix; this.prefix = prefix;
} }
@Override @Override
public void visit(final int version, final int access, final String name, public void visit(final int version, final int access, final String name,
final String signature, final String superName, final String signature, final String superName, final String[] interfaces) {
final String[] interfaces) {
cv.visit(version, access, name, signature, superName, interfaces); cv.visit(version, access, name, signature, superName, interfaces);
this.name = name; this.name = name;
} }
@Override @Override
public MethodVisitor visitMethod(final int access, final String name, public MethodVisitor visitMethod(final int access, final String name, final String desc,
final String desc, final String signature, final String[] exceptions) { final String signature, final String[] exceptions) {
MethodVisitor mv; MethodVisitor mv;
if ("<clinit>".equals(name)) { if ("<clinit>".equals(name)) {
int a = Opcodes.ACC_PRIVATE + Opcodes.ACC_STATIC; int a = Opcodes.ACC_PRIVATE + Opcodes.ACC_STATIC;

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.commons; package org.objectweb.asm.commons;
@ -43,10 +35,8 @@ public interface TableSwitchGenerator {
/** /**
* Generates the code for a switch case. * Generates the code for a switch case.
* *
* @param key * @param key the switch case key.
* the switch case key. * @param end a label that corresponds to the end of the switch statement.
* @param end
* a label that corresponds to the end of the switch statement.
*/ */
void generateCase(int key, Label end); void generateCase(int key, Label end);

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.commons; package org.objectweb.asm.commons;
@ -39,30 +31,27 @@ import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.TryCatchBlockNode; import org.objectweb.asm.tree.TryCatchBlockNode;
/** /**
* A {@link MethodVisitor} adapter to sort the exception handlers. The handlers * A {@link MethodVisitor} adapter to sort the exception handlers. The handlers are sorted in a
* are sorted in a method innermost-to-outermost. This allows the programmer to * method innermost-to-outermost. This allows the programmer to add handlers without worrying about
* add handlers without worrying about ordering them correctly with respect to * ordering them correctly with respect to existing, in-code handlers.
* existing, in-code handlers.
* *
* Behavior is only defined for properly-nested handlers. If any "try" blocks * Behavior is only defined for properly-nested handlers. If any "try" blocks overlap (something
* overlap (something that isn't possible in Java code) then this may not do * that isn't possible in Java code) then this may not do what you want. In fact, this adapter just
* what you want. In fact, this adapter just sorts by the length of the "try" * sorts by the length of the "try" block, taking advantage of the fact that a given try block must
* block, taking advantage of the fact that a given try block must be larger * be larger than any block it contains).
* than any block it contains).
* *
* @author Adrian Sampson * @author Adrian Sampson
*/ */
public class TryCatchBlockSorter extends MethodNode { public class TryCatchBlockSorter extends MethodNode {
public TryCatchBlockSorter(final MethodVisitor mv, final int access, public TryCatchBlockSorter(final MethodVisitor mv, final int access, final String name,
final String name, final String desc, final String signature, final String desc, final String signature, final String[] exceptions) {
final String[] exceptions) {
this(Opcodes.ASM4, mv, access, name, desc, signature, exceptions); this(Opcodes.ASM4, mv, access, name, desc, signature, exceptions);
} }
protected TryCatchBlockSorter(final int api, final MethodVisitor mv, protected TryCatchBlockSorter(final int api, final MethodVisitor mv, final int access,
final int access, final String name, final String desc, final String name, final String desc, final String signature,
final String signature, final String[] exceptions) { final String[] exceptions) {
super(api, access, name, desc, signature, exceptions); super(api, access, name, desc, signature, exceptions);
this.mv = mv; this.mv = mv;
} }

View File

@ -1,37 +1,28 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.signature; package org.objectweb.asm.signature;
/** /**
* A type signature parser to make a signature visitor visit an existing * A type signature parser to make a signature visitor visit an existing signature.
* signature.
* *
* @author Thomas Hallgren * @author Thomas Hallgren
* @author Eric Bruneton * @author Eric Bruneton
@ -46,8 +37,7 @@ public class SignatureReader {
/** /**
* Constructs a {@link SignatureReader} for the given signature. * Constructs a {@link SignatureReader} for the given signature.
* *
* @param signature * @param signature A <i>ClassSignature</i>, <i>MethodTypeSignature</i>, or
* A <i>ClassSignature</i>, <i>MethodTypeSignature</i>, or
* <i>FieldTypeSignature</i>. * <i>FieldTypeSignature</i>.
*/ */
public SignatureReader(final String signature) { public SignatureReader(final String signature) {
@ -55,19 +45,15 @@ public class SignatureReader {
} }
/** /**
* Makes the given visitor visit the signature of this * Makes the given visitor visit the signature of this {@link SignatureReader}. This signature
* {@link SignatureReader}. This signature is the one specified in the * is the one specified in the constructor (see {@link #SignatureReader(String)
* constructor (see {@link #SignatureReader(String) SignatureReader}). This * SignatureReader}). This method is intended to be called on a {@link SignatureReader} that was
* method is intended to be called on a {@link SignatureReader} that was * created using a <i>ClassSignature</i> (such as the <code>signature</code> parameter of the
* created using a <i>ClassSignature</i> (such as the <code>signature</code> * {@link org.objectweb.asm.ClassVisitor#visit ClassVisitor.visit} method) or a
* parameter of the {@link org.objectweb.asm.ClassVisitor#visit * <i>MethodTypeSignature</i> (such as the <code>signature</code> parameter of the
* ClassVisitor.visit} method) or a <i>MethodTypeSignature</i> (such as the * {@link org.objectweb.asm.ClassVisitor#visitMethod ClassVisitor.visitMethod} method).
* <code>signature</code> parameter of the
* {@link org.objectweb.asm.ClassVisitor#visitMethod
* ClassVisitor.visitMethod} method).
* *
* @param v * @param v the visitor that must visit this signature.
* the visitor that must visit this signature.
*/ */
public void accept(final SignatureVisitor v) { public void accept(final SignatureVisitor v) {
String signature = this.signature; String signature = this.signature;
@ -113,18 +99,15 @@ public class SignatureReader {
} }
/** /**
* Makes the given visitor visit the signature of this * Makes the given visitor visit the signature of this {@link SignatureReader}. This signature
* {@link SignatureReader}. This signature is the one specified in the * is the one specified in the constructor (see {@link #SignatureReader(String)
* constructor (see {@link #SignatureReader(String) SignatureReader}). This * SignatureReader}). This method is intended to be called on a {@link SignatureReader} that was
* method is intended to be called on a {@link SignatureReader} that was * created using a <i>FieldTypeSignature</i>, such as the <code>signature</code> parameter of
* created using a <i>FieldTypeSignature</i>, such as the * the {@link org.objectweb.asm.ClassVisitor#visitField ClassVisitor.visitField} or
* <code>signature</code> parameter of the * {@link org.objectweb.asm.MethodVisitor#visitLocalVariable MethodVisitor.visitLocalVariable}
* {@link org.objectweb.asm.ClassVisitor#visitField ClassVisitor.visitField} * methods.
* or {@link org.objectweb.asm.MethodVisitor#visitLocalVariable
* MethodVisitor.visitLocalVariable} methods.
* *
* @param v * @param v the visitor that must visit this signature.
* the visitor that must visit this signature.
*/ */
public void acceptType(final SignatureVisitor v) { public void acceptType(final SignatureVisitor v) {
parseType(this.signature, 0, v); parseType(this.signature, 0, v);
@ -133,16 +116,12 @@ public class SignatureReader {
/** /**
* Parses a field type signature and makes the given visitor visit it. * Parses a field type signature and makes the given visitor visit it.
* *
* @param signature * @param signature a string containing the signature that must be parsed.
* a string containing the signature that must be parsed. * @param pos index of the first character of the signature to parsed.
* @param pos * @param v the visitor that must visit this signature.
* index of the first character of the signature to parsed.
* @param v
* the visitor that must visit this signature.
* @return the index of the first character after the parsed signature. * @return the index of the first character after the parsed signature.
*/ */
private static int parseType(final String signature, int pos, private static int parseType(final String signature, int pos, final SignatureVisitor v) {
final SignatureVisitor v) {
char c; char c;
int start, end; int start, end;
boolean visited, inner; boolean visited, inner;
@ -212,12 +191,10 @@ public class SignatureReader {
break; break;
case '+': case '+':
case '-': case '-':
pos = parseType(signature, pos + 1, pos = parseType(signature, pos + 1, v.visitTypeArgument(c));
v.visitTypeArgument(c));
break; break;
default: default:
pos = parseType(signature, pos, pos = parseType(signature, pos, v.visitTypeArgument('='));
v.visitTypeArgument('='));
break; break;
} }
} }

View File

@ -1,54 +1,41 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.signature; package org.objectweb.asm.signature;
import org.objectweb.asm.Opcodes; import org.objectweb.asm.Opcodes;
/** /**
* A visitor to visit a generic signature. The methods of this interface must be * A visitor to visit a generic signature. The methods of this interface must be called in one of
* called in one of the three following orders (the last one is the only valid * the three following orders (the last one is the only valid order for a {@link SignatureVisitor}
* order for a {@link SignatureVisitor} that is returned by a method of this * that is returned by a method of this interface):
* interface):
* <ul> * <ul>
* <li><i>ClassSignature</i> = ( <tt>visitFormalTypeParameter</tt> * <li><i>ClassSignature</i> = ( <tt>visitFormalTypeParameter</tt> <tt>visitClassBound</tt>?
* <tt>visitClassBound</tt>? <tt>visitInterfaceBound</tt>* )* ( * <tt>visitInterfaceBound</tt>* )* ( <tt>visitSuperClass</tt> <tt>visitInterface</tt>* )</li>
* <tt>visitSuperClass</tt> <tt>visitInterface</tt>* )</li> * <li><i>MethodSignature</i> = ( <tt>visitFormalTypeParameter</tt> <tt>visitClassBound</tt>?
* <li><i>MethodSignature</i> = ( <tt>visitFormalTypeParameter</tt> * <tt>visitInterfaceBound</tt>* )* ( <tt>visitParameterType</tt>* <tt>visitReturnType</tt>
* <tt>visitClassBound</tt>? <tt>visitInterfaceBound</tt>* )* (
* <tt>visitParameterType</tt>* <tt>visitReturnType</tt>
* <tt>visitExceptionType</tt>* )</li> * <tt>visitExceptionType</tt>* )</li>
* <li><i>TypeSignature</i> = <tt>visitBaseType</tt> | * <li><i>TypeSignature</i> = <tt>visitBaseType</tt> | <tt>visitTypeVariable</tt> |
* <tt>visitTypeVariable</tt> | <tt>visitArrayType</tt> | ( * <tt>visitArrayType</tt> | ( <tt>visitClassType</tt> <tt>visitTypeArgument</tt>* (
* <tt>visitClassType</tt> <tt>visitTypeArgument</tt>* ( * <tt>visitInnerClassType</tt> <tt>visitTypeArgument</tt>* )* <tt>visitEnd</tt> ) )</li>
* <tt>visitInnerClassType</tt> <tt>visitTypeArgument</tt>* )* <tt>visitEnd</tt>
* ) )</li>
* </ul> * </ul>
* *
* @author Thomas Hallgren * @author Thomas Hallgren
@ -72,17 +59,16 @@ public abstract class SignatureVisitor {
public final static char INSTANCEOF = '='; public final static char INSTANCEOF = '=';
/** /**
* The ASM API version implemented by this visitor. The value of this field * The ASM API version implemented by this visitor. The value of this field must be one of
* must be one of {@link Opcodes#ASM4}. * {@link Opcodes#ASM4}.
*/ */
protected final int api; protected final int api;
/** /**
* Constructs a new {@link SignatureVisitor}. * Constructs a new {@link SignatureVisitor}.
* *
* @param api * @param api the ASM API version implemented by this visitor. Must be one of
* the ASM API version implemented by this visitor. Must be one * {@link Opcodes#ASM4}.
* of {@link Opcodes#ASM4}.
*/ */
public SignatureVisitor(final int api) { public SignatureVisitor(final int api) {
this.api = api; this.api = api;
@ -91,11 +77,9 @@ public abstract class SignatureVisitor {
/** /**
* Visits a formal type parameter. * Visits a formal type parameter.
* *
* @param name * @param name the name of the formal parameter.
* the name of the formal parameter.
*/ */
public void visitFormalTypeParameter(String name) { public void visitFormalTypeParameter(String name) {}
}
/** /**
* Visits the class bound of the last visited formal type parameter. * Visits the class bound of the last visited formal type parameter.
@ -118,8 +102,7 @@ public abstract class SignatureVisitor {
/** /**
* Visits the type of the super class. * Visits the type of the super class.
* *
* @return a non null visitor to visit the signature of the super class * @return a non null visitor to visit the signature of the super class type.
* type.
*/ */
public SignatureVisitor visitSuperclass() { public SignatureVisitor visitSuperclass() {
return this; return this;
@ -164,63 +147,49 @@ public abstract class SignatureVisitor {
/** /**
* Visits a signature corresponding to a primitive type. * Visits a signature corresponding to a primitive type.
* *
* @param descriptor * @param descriptor the descriptor of the primitive type, or 'V' for <tt>void</tt> .
* the descriptor of the primitive type, or 'V' for <tt>void</tt>
* .
*/ */
public void visitBaseType(char descriptor) { public void visitBaseType(char descriptor) {}
}
/** /**
* Visits a signature corresponding to a type variable. * Visits a signature corresponding to a type variable.
* *
* @param name * @param name the name of the type variable.
* the name of the type variable.
*/ */
public void visitTypeVariable(String name) { public void visitTypeVariable(String name) {}
}
/** /**
* Visits a signature corresponding to an array type. * Visits a signature corresponding to an array type.
* *
* @return a non null visitor to visit the signature of the array element * @return a non null visitor to visit the signature of the array element type.
* type.
*/ */
public SignatureVisitor visitArrayType() { public SignatureVisitor visitArrayType() {
return this; return this;
} }
/** /**
* Starts the visit of a signature corresponding to a class or interface * Starts the visit of a signature corresponding to a class or interface type.
* type.
* *
* @param name * @param name the internal name of the class or interface.
* the internal name of the class or interface.
*/ */
public void visitClassType(String name) { public void visitClassType(String name) {}
}
/** /**
* Visits an inner class. * Visits an inner class.
* *
* @param name * @param name the local name of the inner class in its enclosing class.
* the local name of the inner class in its enclosing class.
*/ */
public void visitInnerClassType(String name) { public void visitInnerClassType(String name) {}
}
/** /**
* Visits an unbounded type argument of the last visited class or inner * Visits an unbounded type argument of the last visited class or inner class type.
* class type.
*/ */
public void visitTypeArgument() { public void visitTypeArgument() {}
}
/** /**
* Visits a type argument of the last visited class or inner class type. * Visits a type argument of the last visited class or inner class type.
* *
* @param wildcard * @param wildcard '+', '-' or '='.
* '+', '-' or '='.
* @return a non null visitor to visit the signature of the type argument. * @return a non null visitor to visit the signature of the type argument.
*/ */
public SignatureVisitor visitTypeArgument(char wildcard) { public SignatureVisitor visitTypeArgument(char wildcard) {
@ -230,6 +199,5 @@ public abstract class SignatureVisitor {
/** /**
* Ends the visit of a signature corresponding to a class or interface type. * Ends the visit of a signature corresponding to a class or interface type.
*/ */
public void visitEnd() { public void visitEnd() {}
}
} }

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.signature; package org.objectweb.asm.signature;
@ -55,10 +47,9 @@ public class SignatureWriter extends SignatureVisitor {
private boolean hasParameters; private boolean hasParameters;
/** /**
* Stack used to keep track of class types that have arguments. Each element * Stack used to keep track of class types that have arguments. Each element of this stack is a
* of this stack is a boolean encoded in one bit. The top of the stack is * boolean encoded in one bit. The top of the stack is the lowest order bit. Pushing false = *2,
* the lowest order bit. Pushing false = *2, pushing true = *2+1, popping = * pushing true = *2+1, popping = /2.
* /2.
*/ */
private int argumentStack; private int argumentStack;

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -35,8 +27,8 @@ import java.util.Map;
import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.MethodVisitor;
/** /**
* A node that represents a bytecode instruction. <i>An instruction can appear * A node that represents a bytecode instruction. <i>An instruction can appear at most once in at
* at most once in at most one {@link InsnList} at a time</i>. * most one {@link InsnList} at a time</i>.
* *
* @author Eric Bruneton * @author Eric Bruneton
*/ */
@ -138,18 +130,16 @@ public abstract class AbstractInsnNode {
AbstractInsnNode next; AbstractInsnNode next;
/** /**
* Index of this instruction in the list to which it belongs. The value of * Index of this instruction in the list to which it belongs. The value of this field is correct
* this field is correct only when {@link InsnList#cache} is not null. A * only when {@link InsnList#cache} is not null. A value of -1 indicates that this instruction
* value of -1 indicates that this instruction does not belong to any * does not belong to any {@link InsnList}.
* {@link InsnList}.
*/ */
int index; int index;
/** /**
* Constructs a new {@link AbstractInsnNode}. * Constructs a new {@link AbstractInsnNode}.
* *
* @param opcode * @param opcode the opcode of the instruction to be constructed.
* the opcode of the instruction to be constructed.
*/ */
protected AbstractInsnNode(final int opcode) { protected AbstractInsnNode(final int opcode) {
this.opcode = opcode; this.opcode = opcode;
@ -168,28 +158,25 @@ public abstract class AbstractInsnNode {
/** /**
* Returns the type of this instruction. * Returns the type of this instruction.
* *
* @return the type of this instruction, i.e. one the constants defined in * @return the type of this instruction, i.e. one the constants defined in this class.
* this class.
*/ */
public abstract int getType(); public abstract int getType();
/** /**
* Returns the previous instruction in the list to which this instruction * Returns the previous instruction in the list to which this instruction belongs, if any.
* belongs, if any.
* *
* @return the previous instruction in the list to which this instruction * @return the previous instruction in the list to which this instruction belongs, if any. May
* belongs, if any. May be <tt>null</tt>. * be <tt>null</tt>.
*/ */
public AbstractInsnNode getPrevious() { public AbstractInsnNode getPrevious() {
return prev; return prev;
} }
/** /**
* Returns the next instruction in the list to which this instruction * Returns the next instruction in the list to which this instruction belongs, if any.
* belongs, if any.
* *
* @return the next instruction in the list to which this instruction * @return the next instruction in the list to which this instruction belongs, if any. May be
* belongs, if any. May be <tt>null</tt>. * <tt>null</tt>.
*/ */
public AbstractInsnNode getNext() { public AbstractInsnNode getNext() {
return next; return next;
@ -198,47 +185,38 @@ public abstract class AbstractInsnNode {
/** /**
* Makes the given code visitor visit this instruction. * Makes the given code visitor visit this instruction.
* *
* @param cv * @param cv a code visitor.
* a code visitor.
*/ */
public abstract void accept(final MethodVisitor cv); public abstract void accept(final MethodVisitor cv);
/** /**
* Returns a copy of this instruction. * Returns a copy of this instruction.
* *
* @param labels * @param labels a map from LabelNodes to cloned LabelNodes.
* a map from LabelNodes to cloned LabelNodes. * @return a copy of this instruction. The returned instruction does not belong to any
* @return a copy of this instruction. The returned instruction does not * {@link InsnList}.
* belong to any {@link InsnList}.
*/ */
public abstract AbstractInsnNode clone( public abstract AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels);
final Map<LabelNode, LabelNode> labels);
/** /**
* Returns the clone of the given label. * Returns the clone of the given label.
* *
* @param label * @param label a label.
* a label. * @param map a map from LabelNodes to cloned LabelNodes.
* @param map
* a map from LabelNodes to cloned LabelNodes.
* @return the clone of the given label. * @return the clone of the given label.
*/ */
static LabelNode clone(final LabelNode label, static LabelNode clone(final LabelNode label, final Map<LabelNode, LabelNode> map) {
final Map<LabelNode, LabelNode> map) {
return map.get(label); return map.get(label);
} }
/** /**
* Returns the clones of the given labels. * Returns the clones of the given labels.
* *
* @param labels * @param labels a list of labels.
* a list of labels. * @param map a map from LabelNodes to cloned LabelNodes.
* @param map
* a map from LabelNodes to cloned LabelNodes.
* @return the clones of the given labels. * @return the clones of the given labels.
*/ */
static LabelNode[] clone(final List<LabelNode> labels, static LabelNode[] clone(final List<LabelNode> labels, final Map<LabelNode, LabelNode> map) {
final Map<LabelNode, LabelNode> map) {
LabelNode[] clones = new LabelNode[labels.size()]; LabelNode[] clones = new LabelNode[labels.size()];
for (int i = 0; i < clones.length; ++i) { for (int i = 0; i < clones.length; ++i) {
clones[i] = map.get(labels.get(i)); clones[i] = map.get(labels.get(i));

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -42,8 +34,7 @@ import org.objectweb.asm.Opcodes;
* *
* @author Eric Bruneton * @author Eric Bruneton
*/ */
public class AnnotationNode extends AnnotationVisitor public class AnnotationNode extends AnnotationVisitor {
{
/** /**
* The class descriptor of the annotation class. * The class descriptor of the annotation class.
@ -51,42 +42,34 @@ public class AnnotationNode extends AnnotationVisitor
public String desc; public String desc;
/** /**
* The name value pairs of this annotation. Each name value pair is stored * The name value pairs of this annotation. Each name value pair is stored as two consecutive
* as two consecutive elements in the list. The name is a {@link String}, * elements in the list. The name is a {@link String}, and the value may be a {@link Byte},
* and the value may be a {@link Byte}, {@link Boolean}, {@link Character}, * {@link Boolean}, {@link Character}, {@link Short}, {@link Integer}, {@link Long},
* {@link Short}, {@link Integer}, {@link Long}, {@link Float}, * {@link Float}, {@link Double}, {@link String} or {@link org.objectweb.asm.Type}, or an two
* {@link Double}, {@link String} or {@link org.objectweb.asm.Type}, or an * elements String array (for enumeration values), a {@link AnnotationNode}, or a {@link List}
* two elements String array (for enumeration values), a * of values of one of the preceding types. The list may be <tt>null</tt> if there is no name
* {@link AnnotationNode}, or a {@link List} of values of one of the * value pair.
* preceding types. The list may be <tt>null</tt> if there is no name value
* pair.
*/ */
public List<Object> values; public List<Object> values;
/** /**
* Constructs a new {@link AnnotationNode}. <i>Subclasses must not use this * Constructs a new {@link AnnotationNode}. <i>Subclasses must not use this constructor</i>.
* constructor</i>. Instead, they must use the * Instead, they must use the {@link #AnnotationNode(int, String)} version.
* {@link #AnnotationNode(int, String)} version.
* *
* @param desc * @param desc the class descriptor of the annotation class.
* the class descriptor of the annotation class.
*/ */
public AnnotationNode(final String desc) public AnnotationNode(final String desc) {
{
this(Opcodes.ASM4, desc); this(Opcodes.ASM4, desc);
} }
/** /**
* Constructs a new {@link AnnotationNode}. * Constructs a new {@link AnnotationNode}.
* *
* @param api * @param api the ASM API version implemented by this visitor. Must be one of
* the ASM API version implemented by this visitor. Must be one * {@link Opcodes#ASM4}.
* of {@link Opcodes#ASM4}. * @param desc the class descriptor of the annotation class.
* @param desc
* the class descriptor of the annotation class.
*/ */
public AnnotationNode(final int api, final String desc) public AnnotationNode(final int api, final String desc) {
{
super(api); super(api);
this.desc = desc; this.desc = desc;
} }
@ -94,11 +77,9 @@ public class AnnotationNode extends AnnotationVisitor
/** /**
* Constructs a new {@link AnnotationNode} to visit an array value. * Constructs a new {@link AnnotationNode} to visit an array value.
* *
* @param values * @param values where the visited values must be stored.
* where the visited values must be stored.
*/ */
AnnotationNode(final List<Object> values) AnnotationNode(final List<Object> values) {
{
super(Opcodes.ASM4); super(Opcodes.ASM4);
this.values = values; this.values = values;
} }
@ -108,14 +89,11 @@ public class AnnotationNode extends AnnotationVisitor
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
@Override @Override
public void visit(final String name, final Object value) public void visit(final String name, final Object value) {
{ if (values == null) {
if (values == null)
{
values = new ArrayList<Object>(this.desc != null ? 2 : 1); values = new ArrayList<Object>(this.desc != null ? 2 : 1);
} }
if (this.desc != null) if (this.desc != null) {
{
values.add(name); values.add(name);
} }
// else // else
@ -127,31 +105,22 @@ public class AnnotationNode extends AnnotationVisitor
} }
@Override @Override
public void visitEnum(final String name, final String desc, public void visitEnum(final String name, final String desc, final String value) {
final String value) if (values == null) {
{
if (values == null)
{
values = new ArrayList<Object>(this.desc != null ? 2 : 1); values = new ArrayList<Object>(this.desc != null ? 2 : 1);
} }
if (this.desc != null) if (this.desc != null) {
{
values.add(name); values.add(name);
} }
values.add(new String[] values.add(new String[] {desc, value});
{ desc, value });
} }
@Override @Override
public AnnotationVisitor visitAnnotation(final String name, public AnnotationVisitor visitAnnotation(final String name, final String desc) {
final String desc) if (values == null) {
{
if (values == null)
{
values = new ArrayList<Object>(this.desc != null ? 2 : 1); values = new ArrayList<Object>(this.desc != null ? 2 : 1);
} }
if (this.desc != null) if (this.desc != null) {
{
values.add(name); values.add(name);
} }
AnnotationNode annotation = new AnnotationNode(desc); AnnotationNode annotation = new AnnotationNode(desc);
@ -160,14 +129,11 @@ public class AnnotationNode extends AnnotationVisitor
} }
@Override @Override
public AnnotationVisitor visitArray(final String name) public AnnotationVisitor visitArray(final String name) {
{ if (values == null) {
if (values == null)
{
values = new ArrayList<Object>(this.desc != null ? 2 : 1); values = new ArrayList<Object>(this.desc != null ? 2 : 1);
} }
if (this.desc != null) if (this.desc != null) {
{
values.add(name); values.add(name);
} }
List<Object> array = new ArrayList<Object>(); List<Object> array = new ArrayList<Object>();
@ -176,54 +142,39 @@ public class AnnotationNode extends AnnotationVisitor
} }
@Override @Override
public void visitEnd() public void visitEnd() {}
{
}
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// Accept methods // Accept methods
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
/** /**
* Checks that this annotation node is compatible with the given ASM API * Checks that this annotation node is compatible with the given ASM API version. This methods
* version. This methods checks that this node, and all its nodes * checks that this node, and all its nodes recursively, do not contain elements that were
* recursively, do not contain elements that were introduced in more recent * introduced in more recent versions of the ASM API than the given version.
* versions of the ASM API than the given version.
* *
* @param api * @param api an ASM API version. Must be one of {@link Opcodes#ASM4}.
* an ASM API version. Must be one of {@link Opcodes#ASM4}.
*/ */
public void check(final int api) public void check(final int api) {
{
// nothing to do // nothing to do
} }
/** /**
* Makes the given visitor visit this annotation. * Makes the given visitor visit this annotation.
* *
* @param av * @param av an annotation visitor. Maybe <tt>null</tt>.
* an annotation visitor. Maybe <tt>null</tt>.
*/ */
public void accept(final AnnotationVisitor av) public void accept(final AnnotationVisitor av) {
{ if (av != null) {
if (av != null) if (values != null) {
{ for (int i = 0; i < values.size(); i += 2) {
if (values != null) if (values.get(i) == null) {
{ System.out.println("[AnnotationNode] name is null!!!!!");
for (int i = 0; i < values.size(); i += 2)
{
if (values.get(i) == null)
{
System.out
.println("[AnnotationNode] name is null!!!!!");
// DelayLogger.logValue(values); // DelayLogger.logValue(values);
System.out.flush(); System.out.flush();
try try {
{
Thread.sleep(2000); Thread.sleep(2000);
} } catch (InterruptedException e) {
catch (InterruptedException e)
{
// TODO Auto-generated catch block // TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
} }
@ -240,40 +191,26 @@ public class AnnotationNode extends AnnotationVisitor
/** /**
* Makes the given visitor visit a given annotation value. * Makes the given visitor visit a given annotation value.
* *
* @param av * @param av an annotation visitor. Maybe <tt>null</tt>.
* an annotation visitor. Maybe <tt>null</tt>. * @param name the value name.
* @param name * @param value the actual value.
* the value name.
* @param value
* the actual value.
*/ */
static void accept(final AnnotationVisitor av, final String name, static void accept(final AnnotationVisitor av, final String name, final Object value) {
final Object value) if (av != null) {
{ if (value instanceof String[]) {
if (av != null)
{
if (value instanceof String[])
{
String[] typeconst = (String[]) value; String[] typeconst = (String[]) value;
av.visitEnum(name, typeconst[0], typeconst[1]); av.visitEnum(name, typeconst[0], typeconst[1]);
} } else if (value instanceof AnnotationNode) {
else if (value instanceof AnnotationNode)
{
AnnotationNode an = (AnnotationNode) value; AnnotationNode an = (AnnotationNode) value;
an.accept(av.visitAnnotation(name, an.desc)); an.accept(av.visitAnnotation(name, an.desc));
} } else if (value instanceof List) {
else if (value instanceof List)
{
AnnotationVisitor v = av.visitArray(name); AnnotationVisitor v = av.visitArray(name);
List<?> array = (List<?>) value; List<?> array = (List<?>) value;
for (int j = 0; j < array.size(); ++j) for (int j = 0; j < array.size(); ++j) {
{
accept(v, null, array.get(j)); accept(v, null, array.get(j));
} }
v.visitEnd(); v.visitEnd();
} } else {
else
{
av.visit(name, value); av.visit(name, value);
} }
} }

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -53,14 +45,14 @@ public class ClassNode extends ClassVisitor {
public int version; public int version;
/** /**
* The class's access flags (see {@link org.objectweb.asm.Opcodes}). This * The class's access flags (see {@link org.objectweb.asm.Opcodes}). This field also indicates
* field also indicates if the class is deprecated. * if the class is deprecated.
*/ */
public int access; public int access;
/** /**
* The internal name of the class (see * The internal name of the class (see {@link org.objectweb.asm.Type#getInternalName()
* {@link org.objectweb.asm.Type#getInternalName() getInternalName}). * getInternalName}).
*/ */
public String name; public String name;
@ -70,53 +62,50 @@ public class ClassNode extends ClassVisitor {
public String signature; public String signature;
/** /**
* The internal of name of the super class (see * The internal of name of the super class (see {@link org.objectweb.asm.Type#getInternalName()
* {@link org.objectweb.asm.Type#getInternalName() getInternalName}). For * getInternalName}). For interfaces, the super class is {@link Object}. May be <tt>null</tt>,
* interfaces, the super class is {@link Object}. May be <tt>null</tt>, but * but only for the {@link Object} class.
* only for the {@link Object} class.
*/ */
public String superName; public String superName;
/** /**
* The internal names of the class's interfaces (see * The internal names of the class's interfaces (see
* {@link org.objectweb.asm.Type#getInternalName() getInternalName}). This * {@link org.objectweb.asm.Type#getInternalName() getInternalName}). This list is a list of
* list is a list of {@link String} objects. * {@link String} objects.
*/ */
public List<String> interfaces; public List<String> interfaces;
/** /**
* The name of the source file from which this class was compiled. May be * The name of the source file from which this class was compiled. May be <tt>null</tt>.
* <tt>null</tt>.
*/ */
public String sourceFile; public String sourceFile;
/** /**
* Debug information to compute the correspondence between source and * Debug information to compute the correspondence between source and compiled elements of the
* compiled elements of the class. May be <tt>null</tt>. * class. May be <tt>null</tt>.
*/ */
public String sourceDebug; public String sourceDebug;
/** /**
* The internal name of the enclosing class of the class. May be * The internal name of the enclosing class of the class. May be <tt>null</tt>.
* <tt>null</tt>.
*/ */
public String outerClass; public String outerClass;
/** /**
* The name of the method that contains the class, or <tt>null</tt> if the * The name of the method that contains the class, or <tt>null</tt> if the class is not enclosed
* class is not enclosed in a method. * in a method.
*/ */
public String outerMethod; public String outerMethod;
/** /**
* The descriptor of the method that contains the class, or <tt>null</tt> if * The descriptor of the method that contains the class, or <tt>null</tt> if the class is not
* the class is not enclosed in a method. * enclosed in a method.
*/ */
public String outerMethodDesc; public String outerMethodDesc;
/** /**
* The runtime visible annotations of this class. This list is a list of * The runtime visible annotations of this class. This list is a list of {@link AnnotationNode}
* {@link AnnotationNode} objects. May be <tt>null</tt>. * objects. May be <tt>null</tt>.
* *
* @associates org.objectweb.asm.tree.AnnotationNode * @associates org.objectweb.asm.tree.AnnotationNode
* @label visible * @label visible
@ -133,41 +122,38 @@ public class ClassNode extends ClassVisitor {
public List<AnnotationNode> invisibleAnnotations; public List<AnnotationNode> invisibleAnnotations;
/** /**
* The non standard attributes of this class. This list is a list of * The non standard attributes of this class. This list is a list of {@link Attribute} objects.
* {@link Attribute} objects. May be <tt>null</tt>. * May be <tt>null</tt>.
* *
* @associates org.objectweb.asm.Attribute * @associates org.objectweb.asm.Attribute
*/ */
public List<Attribute> attrs; public List<Attribute> attrs;
/** /**
* Informations about the inner classes of this class. This list is a list * Informations about the inner classes of this class. This list is a list of
* of {@link InnerClassNode} objects. * {@link InnerClassNode} objects.
* *
* @associates org.objectweb.asm.tree.InnerClassNode * @associates org.objectweb.asm.tree.InnerClassNode
*/ */
public List<InnerClassNode> innerClasses; public List<InnerClassNode> innerClasses;
/** /**
* The fields of this class. This list is a list of {@link FieldNode} * The fields of this class. This list is a list of {@link FieldNode} objects.
* objects.
* *
* @associates org.objectweb.asm.tree.FieldNode * @associates org.objectweb.asm.tree.FieldNode
*/ */
public List<FieldNode> fields; public List<FieldNode> fields;
/** /**
* The methods of this class. This list is a list of {@link MethodNode} * The methods of this class. This list is a list of {@link MethodNode} objects.
* objects.
* *
* @associates org.objectweb.asm.tree.MethodNode * @associates org.objectweb.asm.tree.MethodNode
*/ */
public List<MethodNode> methods; public List<MethodNode> methods;
/** /**
* Constructs a new {@link ClassNode}. <i>Subclasses must not use this * Constructs a new {@link ClassNode}. <i>Subclasses must not use this constructor</i>. Instead,
* constructor</i>. Instead, they must use the {@link #ClassNode(int)} * they must use the {@link #ClassNode(int)} version.
* version.
*/ */
public ClassNode() { public ClassNode() {
this(Opcodes.ASM4); this(Opcodes.ASM4);
@ -176,9 +162,8 @@ public class ClassNode extends ClassVisitor {
/** /**
* Constructs a new {@link ClassNode}. * Constructs a new {@link ClassNode}.
* *
* @param api * @param api the ASM API version implemented by this visitor. Must be one of
* the ASM API version implemented by this visitor. Must be one * {@link Opcodes#ASM4}.
* of {@link Opcodes#ASM4}.
*/ */
public ClassNode(final int api) { public ClassNode(final int api) {
super(api); super(api);
@ -194,8 +179,7 @@ public class ClassNode extends ClassVisitor {
@Override @Override
public void visit(final int version, final int access, final String name, public void visit(final int version, final int access, final String name,
final String signature, final String superName, final String signature, final String superName, final String[] interfaces) {
final String[] interfaces) {
this.version = version; this.version = version;
this.access = access; this.access = access;
this.name = name; this.name = name;
@ -213,16 +197,14 @@ public class ClassNode extends ClassVisitor {
} }
@Override @Override
public void visitOuterClass(final String owner, final String name, public void visitOuterClass(final String owner, final String name, final String desc) {
final String desc) {
outerClass = owner; outerClass = owner;
outerMethod = name; outerMethod = name;
outerMethodDesc = desc; outerMethodDesc = desc;
} }
@Override @Override
public AnnotationVisitor visitAnnotation(final String desc, public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
final boolean visible) {
AnnotationNode an = new AnnotationNode(desc); AnnotationNode an = new AnnotationNode(desc);
if (visible) { if (visible) {
if (visibleAnnotations == null) { if (visibleAnnotations == null) {
@ -247,46 +229,41 @@ public class ClassNode extends ClassVisitor {
} }
@Override @Override
public void visitInnerClass(final String name, final String outerName, public void visitInnerClass(final String name, final String outerName, final String innerName,
final String innerName, final int access) { final int access) {
InnerClassNode icn = new InnerClassNode(name, outerName, innerName, InnerClassNode icn = new InnerClassNode(name, outerName, innerName, access);
access);
innerClasses.add(icn); innerClasses.add(icn);
} }
@Override @Override
public FieldVisitor visitField(final int access, final String name, public FieldVisitor visitField(final int access, final String name, final String desc,
final String desc, final String signature, final Object value) { final String signature, final Object value) {
FieldNode fn = new FieldNode(access, name, desc, signature, value); FieldNode fn = new FieldNode(access, name, desc, signature, value);
fields.add(fn); fields.add(fn);
return fn; return fn;
} }
@Override @Override
public MethodVisitor visitMethod(final int access, final String name, public MethodVisitor visitMethod(final int access, final String name, final String desc,
final String desc, final String signature, final String[] exceptions) { final String signature, final String[] exceptions) {
MethodNode mn = new MethodNode(access, name, desc, signature, MethodNode mn = new MethodNode(access, name, desc, signature, exceptions);
exceptions);
methods.add(mn); methods.add(mn);
return mn; return mn;
} }
@Override @Override
public void visitEnd() { public void visitEnd() {}
}
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// Accept method // Accept method
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
/** /**
* Checks that this class node is compatible with the given ASM API version. * Checks that this class node is compatible with the given ASM API version. This methods checks
* This methods checks that this node, and all its nodes recursively, do not * that this node, and all its nodes recursively, do not contain elements that were introduced
* contain elements that were introduced in more recent versions of the ASM * in more recent versions of the ASM API than the given version.
* API than the given version.
* *
* @param api * @param api an ASM API version. Must be one of {@link Opcodes#ASM4}.
* an ASM API version. Must be one of {@link Opcodes#ASM4}.
*/ */
public void check(final int api) { public void check(final int api) {
// nothing to do // nothing to do
@ -295,8 +272,7 @@ public class ClassNode extends ClassVisitor {
/** /**
* Makes the given class visitor visit this class. * Makes the given class visitor visit this class.
* *
* @param cv * @param cv a class visitor.
* a class visitor.
*/ */
public void accept(final ClassVisitor cv) { public void accept(final ClassVisitor cv) {
// visits header // visits header

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -34,8 +26,8 @@ import java.util.Map;
import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.MethodVisitor;
/** /**
* A node that represents a field instruction. A field instruction is an * A node that represents a field instruction. A field instruction is an instruction that loads or
* instruction that loads or stores the value of a field of an object. * stores the value of a field of an object.
* *
* @author Eric Bruneton * @author Eric Bruneton
*/ */
@ -60,20 +52,15 @@ public class FieldInsnNode extends AbstractInsnNode {
/** /**
* Constructs a new {@link FieldInsnNode}. * Constructs a new {@link FieldInsnNode}.
* *
* @param opcode * @param opcode the opcode of the type instruction to be constructed. This opcode must be
* the opcode of the type instruction to be constructed. This * GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
* opcode must be GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD. * @param owner the internal name of the field's owner class (see
* @param owner * {@link org.objectweb.asm.Type#getInternalName() getInternalName}).
* the internal name of the field's owner class (see * @param name the field's name.
* {@link org.objectweb.asm.Type#getInternalName() * @param desc the field's descriptor (see {@link org.objectweb.asm.Type}).
* getInternalName}).
* @param name
* the field's name.
* @param desc
* the field's descriptor (see {@link org.objectweb.asm.Type}).
*/ */
public FieldInsnNode(final int opcode, final String owner, public FieldInsnNode(final int opcode, final String owner, final String name,
final String name, final String desc) { final String desc) {
super(opcode); super(opcode);
this.owner = owner; this.owner = owner;
this.name = name; this.name = name;
@ -83,9 +70,8 @@ public class FieldInsnNode extends AbstractInsnNode {
/** /**
* Sets the opcode of this instruction. * Sets the opcode of this instruction.
* *
* @param opcode * @param opcode the new instruction opcode. This opcode must be GETSTATIC, PUTSTATIC, GETFIELD
* the new instruction opcode. This opcode must be GETSTATIC, * or PUTFIELD.
* PUTSTATIC, GETFIELD or PUTFIELD.
*/ */
public void setOpcode(final int opcode) { public void setOpcode(final int opcode) {
this.opcode = opcode; this.opcode = opcode;

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -46,8 +38,8 @@ import org.objectweb.asm.Opcodes;
public class FieldNode extends FieldVisitor { public class FieldNode extends FieldVisitor {
/** /**
* The field's access flags (see {@link org.objectweb.asm.Opcodes}). This * The field's access flags (see {@link org.objectweb.asm.Opcodes}). This field also indicates
* field also indicates if the field is synthetic and/or deprecated. * if the field is synthetic and/or deprecated.
*/ */
public int access; public int access;
@ -67,15 +59,15 @@ public class FieldNode extends FieldVisitor {
public String signature; public String signature;
/** /**
* The field's initial value. This field, which may be <tt>null</tt> if the * The field's initial value. This field, which may be <tt>null</tt> if the field does not have
* field does not have an initial value, must be an {@link Integer}, a * an initial value, must be an {@link Integer}, a {@link Float}, a {@link Long}, a
* {@link Float}, a {@link Long}, a {@link Double} or a {@link String}. * {@link Double} or a {@link String}.
*/ */
public Object value; public Object value;
/** /**
* The runtime visible annotations of this field. This list is a list of * The runtime visible annotations of this field. This list is a list of {@link AnnotationNode}
* {@link AnnotationNode} objects. May be <tt>null</tt>. * objects. May be <tt>null</tt>.
* *
* @associates org.objectweb.asm.tree.AnnotationNode * @associates org.objectweb.asm.tree.AnnotationNode
* @label visible * @label visible
@ -92,67 +84,48 @@ public class FieldNode extends FieldVisitor {
public List<AnnotationNode> invisibleAnnotations; public List<AnnotationNode> invisibleAnnotations;
/** /**
* The non standard attributes of this field. This list is a list of * The non standard attributes of this field. This list is a list of {@link Attribute} objects.
* {@link Attribute} objects. May be <tt>null</tt>. * May be <tt>null</tt>.
* *
* @associates org.objectweb.asm.Attribute * @associates org.objectweb.asm.Attribute
*/ */
public List<Attribute> attrs; public List<Attribute> attrs;
/** /**
* Constructs a new {@link FieldNode}. <i>Subclasses must not use this * Constructs a new {@link FieldNode}. <i>Subclasses must not use this constructor</i>. Instead,
* constructor</i>. Instead, they must use the * they must use the {@link #FieldNode(int, int, String, String, String, Object)} version.
* {@link #FieldNode(int, int, String, String, String, Object)} version.
* *
* @param access * @param access the field's access flags (see {@link org.objectweb.asm.Opcodes}). This
* the field's access flags (see * parameter also indicates if the field is synthetic and/or deprecated.
* {@link org.objectweb.asm.Opcodes}). This parameter also * @param name the field's name.
* indicates if the field is synthetic and/or deprecated. * @param desc the field's descriptor (see {@link org.objectweb.asm.Type Type}).
* @param name * @param signature the field's signature.
* the field's name. * @param value the field's initial value. This parameter, which may be <tt>null</tt> if the
* @param desc * field does not have an initial value, must be an {@link Integer}, a {@link Float}, a
* the field's descriptor (see {@link org.objectweb.asm.Type * {@link Long}, a {@link Double} or a {@link String}.
* Type}).
* @param signature
* the field's signature.
* @param value
* the field's initial value. This parameter, which may be
* <tt>null</tt> if the field does not have an initial value,
* must be an {@link Integer}, a {@link Float}, a {@link Long}, a
* {@link Double} or a {@link String}.
*/ */
public FieldNode(final int access, final String name, final String desc, public FieldNode(final int access, final String name, final String desc, final String signature,
final String signature, final Object value) { final Object value) {
this(Opcodes.ASM4, access, name, desc, signature, value); this(Opcodes.ASM4, access, name, desc, signature, value);
} }
/** /**
* Constructs a new {@link FieldNode}. <i>Subclasses must not use this * Constructs a new {@link FieldNode}. <i>Subclasses must not use this constructor</i>. Instead,
* constructor</i>. Instead, they must use the * they must use the {@link #FieldNode(int, int, String, String, String, Object)} version.
* {@link #FieldNode(int, int, String, String, String, Object)} version.
* *
* @param api * @param api the ASM API version implemented by this visitor. Must be one of
* the ASM API version implemented by this visitor. Must be one * {@link Opcodes#ASM4}.
* of {@link Opcodes#ASM4}. * @param access the field's access flags (see {@link org.objectweb.asm.Opcodes}). This
* @param access * parameter also indicates if the field is synthetic and/or deprecated.
* the field's access flags (see * @param name the field's name.
* {@link org.objectweb.asm.Opcodes}). This parameter also * @param desc the field's descriptor (see {@link org.objectweb.asm.Type Type}).
* indicates if the field is synthetic and/or deprecated. * @param signature the field's signature.
* @param name * @param value the field's initial value. This parameter, which may be <tt>null</tt> if the
* the field's name. * field does not have an initial value, must be an {@link Integer}, a {@link Float}, a
* @param desc * {@link Long}, a {@link Double} or a {@link String}.
* the field's descriptor (see {@link org.objectweb.asm.Type
* Type}).
* @param signature
* the field's signature.
* @param value
* the field's initial value. This parameter, which may be
* <tt>null</tt> if the field does not have an initial value,
* must be an {@link Integer}, a {@link Float}, a {@link Long}, a
* {@link Double} or a {@link String}.
*/ */
public FieldNode(final int api, final int access, final String name, public FieldNode(final int api, final int access, final String name, final String desc,
final String desc, final String signature, final Object value) { final String signature, final Object value) {
super(api); super(api);
this.access = access; this.access = access;
this.name = name; this.name = name;
@ -166,8 +139,7 @@ public class FieldNode extends FieldVisitor {
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
@Override @Override
public AnnotationVisitor visitAnnotation(final String desc, public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
final boolean visible) {
AnnotationNode an = new AnnotationNode(desc); AnnotationNode an = new AnnotationNode(desc);
if (visible) { if (visible) {
if (visibleAnnotations == null) { if (visibleAnnotations == null) {
@ -192,21 +164,18 @@ public class FieldNode extends FieldVisitor {
} }
@Override @Override
public void visitEnd() { public void visitEnd() {}
}
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// Accept methods // Accept methods
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
/** /**
* Checks that this field node is compatible with the given ASM API version. * Checks that this field node is compatible with the given ASM API version. This methods checks
* This methods checks that this node, and all its nodes recursively, do not * that this node, and all its nodes recursively, do not contain elements that were introduced
* contain elements that were introduced in more recent versions of the ASM * in more recent versions of the ASM API than the given version.
* API than the given version.
* *
* @param api * @param api an ASM API version. Must be one of {@link Opcodes#ASM4}.
* an ASM API version. Must be one of {@link Opcodes#ASM4}.
*/ */
public void check(final int api) { public void check(final int api) {
// nothing to do // nothing to do
@ -215,8 +184,7 @@ public class FieldNode extends FieldVisitor {
/** /**
* Makes the given class visitor visit this field. * Makes the given class visitor visit this field.
* *
* @param cv * @param cv a class visitor.
* a class visitor.
*/ */
public void accept(final ClassVisitor cv) { public void accept(final ClassVisitor cv) {
FieldVisitor fv = cv.visitField(access, name, desc, signature, value); FieldVisitor fv = cv.visitField(access, name, desc, signature, value);

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -38,42 +30,39 @@ import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes; import org.objectweb.asm.Opcodes;
/** /**
* A node that represents a stack map frame. These nodes are pseudo instruction * A node that represents a stack map frame. These nodes are pseudo instruction nodes in order to be
* nodes in order to be inserted in an instruction list. In fact these nodes * inserted in an instruction list. In fact these nodes must(*) be inserted <i>just before</i> any
* must(*) be inserted <i>just before</i> any instruction node <b>i</b> that * instruction node <b>i</b> that follows an unconditionnal branch instruction such as GOTO or
* follows an unconditionnal branch instruction such as GOTO or THROW, that is * THROW, that is the target of a jump instruction, or that starts an exception handler block. The
* the target of a jump instruction, or that starts an exception handler block. * stack map frame types must describe the values of the local variables and of the operand stack
* The stack map frame types must describe the values of the local variables and * elements <i>just before</i> <b>i</b> is executed. <br>
* of the operand stack elements <i>just before</i> <b>i</b> is executed. <br>
* <br> * <br>
* (*) this is mandatory only for classes whose version is greater than or equal * (*) this is mandatory only for classes whose version is greater than or equal to
* to {@link Opcodes#V1_6 V1_6}. * {@link Opcodes#V1_6 V1_6}.
* *
* @author Eric Bruneton * @author Eric Bruneton
*/ */
public class FrameNode extends AbstractInsnNode { public class FrameNode extends AbstractInsnNode {
/** /**
* The type of this frame. Must be {@link Opcodes#F_NEW} for expanded * The type of this frame. Must be {@link Opcodes#F_NEW} for expanded frames, or
* frames, or {@link Opcodes#F_FULL}, {@link Opcodes#F_APPEND}, * {@link Opcodes#F_FULL}, {@link Opcodes#F_APPEND}, {@link Opcodes#F_CHOP},
* {@link Opcodes#F_CHOP}, {@link Opcodes#F_SAME} or * {@link Opcodes#F_SAME} or {@link Opcodes#F_APPEND}, {@link Opcodes#F_SAME1} for compressed
* {@link Opcodes#F_APPEND}, {@link Opcodes#F_SAME1} for compressed frames. * frames.
*/ */
public int type; public int type;
/** /**
* The types of the local variables of this stack map frame. Elements of * The types of the local variables of this stack map frame. Elements of this list can be
* this list can be Integer, String or LabelNode objects (for primitive, * Integer, String or LabelNode objects (for primitive, reference and uninitialized types
* reference and uninitialized types respectively - see * respectively - see {@link MethodVisitor}).
* {@link MethodVisitor}).
*/ */
public List<Object> local; public List<Object> local;
/** /**
* The types of the operand stack elements of this stack map frame. Elements * The types of the operand stack elements of this stack map frame. Elements of this list can be
* of this list can be Integer, String or LabelNode objects (for primitive, * Integer, String or LabelNode objects (for primitive, reference and uninitialized types
* reference and uninitialized types respectively - see * respectively - see {@link MethodVisitor}).
* {@link MethodVisitor}).
*/ */
public List<Object> stack; public List<Object> stack;
@ -84,29 +73,21 @@ public class FrameNode extends AbstractInsnNode {
/** /**
* Constructs a new {@link FrameNode}. * Constructs a new {@link FrameNode}.
* *
* @param type * @param type the type of this frame. Must be {@link Opcodes#F_NEW} for expanded frames, or
* the type of this frame. Must be {@link Opcodes#F_NEW} for * {@link Opcodes#F_FULL}, {@link Opcodes#F_APPEND}, {@link Opcodes#F_CHOP},
* expanded frames, or {@link Opcodes#F_FULL}, * {@link Opcodes#F_SAME} or {@link Opcodes#F_APPEND}, {@link Opcodes#F_SAME1} for
* {@link Opcodes#F_APPEND}, {@link Opcodes#F_CHOP}, * compressed frames.
* {@link Opcodes#F_SAME} or {@link Opcodes#F_APPEND}, * @param nLocal number of local variables of this stack map frame.
* {@link Opcodes#F_SAME1} for compressed frames. * @param local the types of the local variables of this stack map frame. Elements of this list
* @param nLocal * can be Integer, String or LabelNode objects (for primitive, reference and
* number of local variables of this stack map frame. * uninitialized types respectively - see {@link MethodVisitor}).
* @param local * @param nStack number of operand stack elements of this stack map frame.
* the types of the local variables of this stack map frame. * @param stack the types of the operand stack elements of this stack map frame. Elements of
* Elements of this list can be Integer, String or LabelNode * this list can be Integer, String or LabelNode objects (for primitive, reference and
* objects (for primitive, reference and uninitialized types * uninitialized types respectively - see {@link MethodVisitor}).
* respectively - see {@link MethodVisitor}).
* @param nStack
* number of operand stack elements of this stack map frame.
* @param stack
* the types of the operand stack elements of this stack map
* frame. Elements of this list can be Integer, String or
* LabelNode objects (for primitive, reference and uninitialized
* types respectively - see {@link MethodVisitor}).
*/ */
public FrameNode(final int type, final int nLocal, final Object[] local, public FrameNode(final int type, final int nLocal, final Object[] local, final int nStack,
final int nStack, final Object[] stack) { final Object[] stack) {
super(-1); super(-1);
this.type = type; this.type = type;
switch (type) { switch (type) {
@ -137,16 +118,14 @@ public class FrameNode extends AbstractInsnNode {
/** /**
* Makes the given visitor visit this stack map frame. * Makes the given visitor visit this stack map frame.
* *
* @param mv * @param mv a method visitor.
* a method visitor.
*/ */
@Override @Override
public void accept(final MethodVisitor mv) { public void accept(final MethodVisitor mv) {
switch (type) { switch (type) {
case Opcodes.F_NEW: case Opcodes.F_NEW:
case Opcodes.F_FULL: case Opcodes.F_FULL:
mv.visitFrame(type, local.size(), asArray(local), stack.size(), mv.visitFrame(type, local.size(), asArray(local), stack.size(), asArray(stack));
asArray(stack));
break; break;
case Opcodes.F_APPEND: case Opcodes.F_APPEND:
mv.visitFrame(type, local.size(), asArray(local), 0, null); mv.visitFrame(type, local.size(), asArray(local), 0, null);

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -54,10 +46,8 @@ public class IincInsnNode extends AbstractInsnNode {
/** /**
* Constructs a new {@link IincInsnNode}. * Constructs a new {@link IincInsnNode}.
* *
* @param var * @param var index of the local variable to be incremented.
* index of the local variable to be incremented. * @param incr increment amount to increment the local variable by.
* @param incr
* increment amount to increment the local variable by.
*/ */
public IincInsnNode(final int var, final int incr) { public IincInsnNode(final int var, final int incr) {
super(Opcodes.IINC); super(Opcodes.IINC);

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -39,50 +31,43 @@ import org.objectweb.asm.ClassVisitor;
public class InnerClassNode { public class InnerClassNode {
/** /**
* The internal name of an inner class (see * The internal name of an inner class (see {@link org.objectweb.asm.Type#getInternalName()
* {@link org.objectweb.asm.Type#getInternalName() getInternalName}). * getInternalName}).
*/ */
public String name; public String name;
/** /**
* The internal name of the class to which the inner class belongs (see * The internal name of the class to which the inner class belongs (see
* {@link org.objectweb.asm.Type#getInternalName() getInternalName}). May be * {@link org.objectweb.asm.Type#getInternalName() getInternalName}). May be <tt>null</tt>.
* <tt>null</tt>.
*/ */
public String outerName; public String outerName;
/** /**
* The (simple) name of the inner class inside its enclosing class. May be * The (simple) name of the inner class inside its enclosing class. May be <tt>null</tt> for
* <tt>null</tt> for anonymous inner classes. * anonymous inner classes.
*/ */
public String innerName; public String innerName;
/** /**
* The access flags of the inner class as originally declared in the * The access flags of the inner class as originally declared in the enclosing class.
* enclosing class.
*/ */
public int access; public int access;
/** /**
* Constructs a new {@link InnerClassNode}. * Constructs a new {@link InnerClassNode}.
* *
* @param name * @param name the internal name of an inner class (see
* the internal name of an inner class (see * {@link org.objectweb.asm.Type#getInternalName() getInternalName}).
* {@link org.objectweb.asm.Type#getInternalName() * @param outerName the internal name of the class to which the inner class belongs (see
* getInternalName}). * {@link org.objectweb.asm.Type#getInternalName() getInternalName}). May be
* @param outerName * <tt>null</tt>.
* the internal name of the class to which the inner class * @param innerName the (simple) name of the inner class inside its enclosing class. May be
* belongs (see {@link org.objectweb.asm.Type#getInternalName() * <tt>null</tt> for anonymous inner classes.
* getInternalName}). May be <tt>null</tt>. * @param access the access flags of the inner class as originally declared in the enclosing
* @param innerName * class.
* the (simple) name of the inner class inside its enclosing
* class. May be <tt>null</tt> for anonymous inner classes.
* @param access
* the access flags of the inner class as originally declared in
* the enclosing class.
*/ */
public InnerClassNode(final String name, final String outerName, public InnerClassNode(final String name, final String outerName, final String innerName,
final String innerName, final int access) { final int access) {
this.name = name; this.name = name;
this.outerName = outerName; this.outerName = outerName;
this.innerName = innerName; this.innerName = innerName;
@ -92,8 +77,7 @@ public class InnerClassNode {
/** /**
* Makes the given class visitor visit this inner class. * Makes the given class visitor visit this inner class.
* *
* @param cv * @param cv a class visitor.
* a class visitor.
*/ */
public void accept(final ClassVisitor cv) { public void accept(final ClassVisitor cv) {
cv.visitInnerClass(name, outerName, innerName, access); cv.visitInnerClass(name, outerName, innerName, access);

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -35,8 +27,8 @@ import java.util.NoSuchElementException;
import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.MethodVisitor;
/** /**
* A doubly linked list of {@link AbstractInsnNode} objects. <i>This * A doubly linked list of {@link AbstractInsnNode} objects. <i>This implementation is not thread
* implementation is not thread safe</i>. * safe</i>.
*/ */
public class InsnList { public class InsnList {
@ -56,8 +48,8 @@ public class InsnList {
private AbstractInsnNode last; private AbstractInsnNode last;
/** /**
* A cache of the instructions of this list. This cache is used to improve * A cache of the instructions of this list. This cache is used to improve the performance of
* the performance of the {@link #get} method. * the {@link #get} method.
*/ */
AbstractInsnNode[] cache; AbstractInsnNode[] cache;
@ -73,8 +65,7 @@ public class InsnList {
/** /**
* Returns the first instruction in this list. * Returns the first instruction in this list.
* *
* @return the first instruction in this list, or <tt>null</tt> if the list * @return the first instruction in this list, or <tt>null</tt> if the list is empty.
* is empty.
*/ */
public AbstractInsnNode getFirst() { public AbstractInsnNode getFirst() {
return first; return first;
@ -83,24 +74,21 @@ public class InsnList {
/** /**
* Returns the last instruction in this list. * Returns the last instruction in this list.
* *
* @return the last instruction in this list, or <tt>null</tt> if the list * @return the last instruction in this list, or <tt>null</tt> if the list is empty.
* is empty.
*/ */
public AbstractInsnNode getLast() { public AbstractInsnNode getLast() {
return last; return last;
} }
/** /**
* Returns the instruction whose index is given. This method builds a cache * Returns the instruction whose index is given. This method builds a cache of the instructions
* of the instructions in this list to avoid scanning the whole list each * in this list to avoid scanning the whole list each time it is called. Once the cache is
* time it is called. Once the cache is built, this method run in constant * built, this method run in constant time. This cache is invalidated by all the methods that
* time. This cache is invalidated by all the methods that modify the list. * modify the list.
* *
* @param index * @param index the index of the instruction that must be returned.
* the index of the instruction that must be returned.
* @return the instruction whose index is given. * @return the instruction whose index is given.
* @throws IndexOutOfBoundsException * @throws IndexOutOfBoundsException if (index < 0 || index >= size()).
* if (index < 0 || index >= size()).
*/ */
public AbstractInsnNode get(final int index) { public AbstractInsnNode get(final int index) {
if (index < 0 || index >= size) { if (index < 0 || index >= size) {
@ -113,12 +101,11 @@ public class InsnList {
} }
/** /**
* Returns <tt>true</tt> if the given instruction belongs to this list. This * Returns <tt>true</tt> if the given instruction belongs to this list. This method always scans
* method always scans the instructions of this list until it finds the * the instructions of this list until it finds the given instruction or reaches the end of the
* given instruction or reaches the end of the list. * list.
* *
* @param insn * @param insn an instruction.
* an instruction.
* @return <tt>true</tt> if the given instruction belongs to this list. * @return <tt>true</tt> if the given instruction belongs to this list.
*/ */
public boolean contains(final AbstractInsnNode insn) { public boolean contains(final AbstractInsnNode insn) {
@ -130,18 +117,16 @@ public class InsnList {
} }
/** /**
* Returns the index of the given instruction in this list. This method * Returns the index of the given instruction in this list. This method builds a cache of the
* builds a cache of the instruction indexes to avoid scanning the whole * instruction indexes to avoid scanning the whole list each time it is called. Once the cache
* list each time it is called. Once the cache is built, this method run in * is built, this method run in constant time. The cache is invalidated by all the methods that
* constant time. The cache is invalidated by all the methods that modify * modify the list.
* the list.
* *
* @param insn * @param insn an instruction <i>of this list</i>.
* an instruction <i>of this list</i>. * @return the index of the given instruction in this list. <i>The result of this method is
* @return the index of the given instruction in this list. <i>The result of * undefined if the given instruction does not belong to this list</i>. Use
* this method is undefined if the given instruction does not belong * {@link #contains contains} to test if an instruction belongs to an instruction list
* to this list</i>. Use {@link #contains contains} to test if an * or not.
* instruction belongs to an instruction list or not.
*/ */
public int indexOf(final AbstractInsnNode insn) { public int indexOf(final AbstractInsnNode insn) {
if (cache == null) { if (cache == null) {
@ -153,8 +138,7 @@ public class InsnList {
/** /**
* Makes the given visitor visit all of the instructions in this list. * Makes the given visitor visit all of the instructions in this list.
* *
* @param mv * @param mv the method visitor that must visit the instructions.
* the method visitor that must visit the instructions.
*/ */
public void accept(final MethodVisitor mv) { public void accept(final MethodVisitor mv) {
AbstractInsnNode insn = first; AbstractInsnNode insn = first;
@ -203,11 +187,8 @@ public class InsnList {
/** /**
* Replaces an instruction of this list with another instruction. * Replaces an instruction of this list with another instruction.
* *
* @param location * @param location an instruction <i>of this list</i>.
* an instruction <i>of this list</i>. * @param insn another instruction, <i>which must not belong to any {@link InsnList}</i>.
* @param insn
* another instruction, <i>which must not belong to any
* {@link InsnList}</i>.
*/ */
public void set(final AbstractInsnNode location, final AbstractInsnNode insn) { public void set(final AbstractInsnNode location, final AbstractInsnNode insn) {
AbstractInsnNode next = location.next; AbstractInsnNode next = location.next;
@ -239,9 +220,7 @@ public class InsnList {
/** /**
* Adds the given instruction to the end of this list. * Adds the given instruction to the end of this list.
* *
* @param insn * @param insn an instruction, <i>which must not belong to any {@link InsnList}</i>.
* an instruction, <i>which must not belong to any
* {@link InsnList}</i>.
*/ */
public void add(final AbstractInsnNode insn) { public void add(final AbstractInsnNode insn) {
++size; ++size;
@ -260,9 +239,8 @@ public class InsnList {
/** /**
* Adds the given instructions to the end of this list. * Adds the given instructions to the end of this list.
* *
* @param insns * @param insns an instruction list, which is cleared during the process. This list must be
* an instruction list, which is cleared during the process. This * different from 'this'.
* list must be different from 'this'.
*/ */
public void add(final InsnList insns) { public void add(final InsnList insns) {
if (insns.size == 0) { if (insns.size == 0) {
@ -285,9 +263,7 @@ public class InsnList {
/** /**
* Inserts the given instruction at the begining of this list. * Inserts the given instruction at the begining of this list.
* *
* @param insn * @param insn an instruction, <i>which must not belong to any {@link InsnList}</i>.
* an instruction, <i>which must not belong to any
* {@link InsnList}</i>.
*/ */
public void insert(final AbstractInsnNode insn) { public void insert(final AbstractInsnNode insn) {
++size; ++size;
@ -306,9 +282,8 @@ public class InsnList {
/** /**
* Inserts the given instructions at the begining of this list. * Inserts the given instructions at the begining of this list.
* *
* @param insns * @param insns an instruction list, which is cleared during the process. This list must be
* an instruction list, which is cleared during the process. This * different from 'this'.
* list must be different from 'this'.
*/ */
public void insert(final InsnList insns) { public void insert(final InsnList insns) {
if (insns.size == 0) { if (insns.size == 0) {
@ -331,15 +306,11 @@ public class InsnList {
/** /**
* Inserts the given instruction after the specified instruction. * Inserts the given instruction after the specified instruction.
* *
* @param location * @param location an instruction <i>of this list</i> after which insn must be inserted.
* an instruction <i>of this list</i> after which insn must be * @param insn the instruction to be inserted, <i>which must not belong to any
* inserted. * {@link InsnList}</i>.
* @param insn
* the instruction to be inserted, <i>which must not belong to
* any {@link InsnList}</i>.
*/ */
public void insert(final AbstractInsnNode location, public void insert(final AbstractInsnNode location, final AbstractInsnNode insn) {
final AbstractInsnNode insn) {
++size; ++size;
AbstractInsnNode next = location.next; AbstractInsnNode next = location.next;
if (next == null) { if (next == null) {
@ -357,12 +328,10 @@ public class InsnList {
/** /**
* Inserts the given instructions after the specified instruction. * Inserts the given instructions after the specified instruction.
* *
* @param location * @param location an instruction <i>of this list</i> after which the instructions must be
* an instruction <i>of this list</i> after which the * inserted.
* instructions must be inserted. * @param insns the instruction list to be inserted, which is cleared during the process. This
* @param insns * list must be different from 'this'.
* the instruction list to be inserted, which is cleared during
* the process. This list must be different from 'this'.
*/ */
public void insert(final AbstractInsnNode location, final InsnList insns) { public void insert(final AbstractInsnNode location, final InsnList insns) {
if (insns.size == 0) { if (insns.size == 0) {
@ -387,15 +356,11 @@ public class InsnList {
/** /**
* Inserts the given instruction before the specified instruction. * Inserts the given instruction before the specified instruction.
* *
* @param location * @param location an instruction <i>of this list</i> before which insn must be inserted.
* an instruction <i>of this list</i> before which insn must be * @param insn the instruction to be inserted, <i>which must not belong to any
* inserted. * {@link InsnList}</i>.
* @param insn
* the instruction to be inserted, <i>which must not belong to
* any {@link InsnList}</i>.
*/ */
public void insertBefore(final AbstractInsnNode location, public void insertBefore(final AbstractInsnNode location, final AbstractInsnNode insn) {
final AbstractInsnNode insn) {
++size; ++size;
AbstractInsnNode prev = location.prev; AbstractInsnNode prev = location.prev;
if (prev == null) { if (prev == null) {
@ -413,15 +378,12 @@ public class InsnList {
/** /**
* Inserts the given instructions before the specified instruction. * Inserts the given instructions before the specified instruction.
* *
* @param location * @param location an instruction <i>of this list</i> before which the instructions must be
* an instruction <i>of this list</i> before which the * inserted.
* instructions must be inserted. * @param insns the instruction list to be inserted, which is cleared during the process. This
* @param insns * list must be different from 'this'.
* the instruction list to be inserted, which is cleared during
* the process. This list must be different from 'this'.
*/ */
public void insertBefore(final AbstractInsnNode location, public void insertBefore(final AbstractInsnNode location, final InsnList insns) {
final InsnList insns) {
if (insns.size == 0) { if (insns.size == 0) {
return; return;
} }
@ -444,8 +406,7 @@ public class InsnList {
/** /**
* Removes the given instruction from this list. * Removes the given instruction from this list.
* *
* @param insn * @param insn the instruction <i>of this list</i> that must be removed.
* the instruction <i>of this list</i> that must be removed.
*/ */
public void remove(final AbstractInsnNode insn) { public void remove(final AbstractInsnNode insn) {
--size; --size;
@ -477,9 +438,8 @@ public class InsnList {
/** /**
* Removes all of the instructions of this list. * Removes all of the instructions of this list.
* *
* @param mark * @param mark if the instructions must be marked as no longer belonging to any
* if the instructions must be marked as no longer belonging to * {@link InsnList}.
* any {@link InsnList}.
*/ */
void removeAll(final boolean mark) { void removeAll(final boolean mark) {
if (mark) { if (mark) {
@ -506,9 +466,8 @@ public class InsnList {
} }
/** /**
* Reset all labels in the instruction list. This method should be called * Reset all labels in the instruction list. This method should be called before reusing same
* before reusing same instructions list between several * instructions list between several <code>ClassWriter</code>s.
* <code>ClassWriter</code>s.
*/ */
public void resetLabels() { public void resetLabels() {
AbstractInsnNode insn = first; AbstractInsnNode insn = first;

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -43,22 +35,17 @@ public class InsnNode extends AbstractInsnNode {
/** /**
* Constructs a new {@link InsnNode}. * Constructs a new {@link InsnNode}.
* *
* @param opcode * @param opcode the opcode of the instruction to be constructed. This opcode must be NOP,
* the opcode of the instruction to be constructed. This opcode * ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5,
* must be NOP, ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1, * LCONST_0, LCONST_1, FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD, LALOAD,
* ICONST_2, ICONST_3, ICONST_4, ICONST_5, LCONST_0, LCONST_1, * FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IASTORE, LASTORE, FASTORE, DASTORE,
* FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD, * AASTORE, BASTORE, CASTORE, SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1,
* LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, * DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB, IMUL, LMUL, FMUL, DMUL,
* IASTORE, LASTORE, FASTORE, DASTORE, AASTORE, BASTORE, CASTORE, * IDIV, LDIV, FDIV, DDIV, IREM, LREM, FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL,
* SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, * ISHR, LSHR, IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D, L2I, L2F,
* DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB, * L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S, LCMP, FCMPL, FCMPG, DCMPL, DCMPG,
* IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM, * IRETURN, LRETURN, FRETURN, DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW,
* FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL, ISHR, LSHR, * MONITORENTER, or MONITOREXIT.
* IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D,
* L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S,
* LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IRETURN, LRETURN, FRETURN,
* DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW, MONITORENTER,
* or MONITOREXIT.
*/ */
public InsnNode(final int opcode) { public InsnNode(final int opcode) {
super(opcode); super(opcode);
@ -72,8 +59,7 @@ public class InsnNode extends AbstractInsnNode {
/** /**
* Makes the given visitor visit this instruction. * Makes the given visitor visit this instruction.
* *
* @param mv * @param mv a method visitor.
* a method visitor.
*/ */
@Override @Override
public void accept(final MethodVisitor mv) { public void accept(final MethodVisitor mv) {

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -48,11 +40,9 @@ public class IntInsnNode extends AbstractInsnNode {
/** /**
* Constructs a new {@link IntInsnNode}. * Constructs a new {@link IntInsnNode}.
* *
* @param opcode * @param opcode the opcode of the instruction to be constructed. This opcode must be BIPUSH,
* the opcode of the instruction to be constructed. This opcode * SIPUSH or NEWARRAY.
* must be BIPUSH, SIPUSH or NEWARRAY. * @param operand the operand of the instruction to be constructed.
* @param operand
* the operand of the instruction to be constructed.
*/ */
public IntInsnNode(final int opcode, final int operand) { public IntInsnNode(final int opcode, final int operand) {
super(opcode); super(opcode);
@ -62,9 +52,7 @@ public class IntInsnNode extends AbstractInsnNode {
/** /**
* Sets the opcode of this instruction. * Sets the opcode of this instruction.
* *
* @param opcode * @param opcode the new instruction opcode. This opcode must be BIPUSH, SIPUSH or NEWARRAY.
* the new instruction opcode. This opcode must be BIPUSH, SIPUSH
* or NEWARRAY.
*/ */
public void setOpcode(final int opcode) { public void setOpcode(final int opcode) {
this.opcode = opcode; this.opcode = opcode;

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -65,17 +57,13 @@ public class InvokeDynamicInsnNode extends AbstractInsnNode {
/** /**
* Constructs a new {@link InvokeDynamicInsnNode}. * Constructs a new {@link InvokeDynamicInsnNode}.
* *
* @param name * @param name invokedynamic name.
* invokedynamic name. * @param desc invokedynamic descriptor (see {@link org.objectweb.asm.Type}).
* @param desc * @param bsm the bootstrap method.
* invokedynamic descriptor (see {@link org.objectweb.asm.Type}). * @param bsmArgs the boostrap constant arguments.
* @param bsm
* the bootstrap method.
* @param bsmArgs
* the boostrap constant arguments.
*/ */
public InvokeDynamicInsnNode(final String name, final String desc, public InvokeDynamicInsnNode(final String name, final String desc, final Handle bsm,
final Handle bsm, final Object... bsmArgs) { final Object... bsmArgs) {
super(Opcodes.INVOKEDYNAMIC); super(Opcodes.INVOKEDYNAMIC);
this.name = name; this.name = name;
this.desc = desc; this.desc = desc;

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -34,31 +26,27 @@ import java.util.Map;
import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.MethodVisitor;
/** /**
* A node that represents a jump instruction. A jump instruction is an * A node that represents a jump instruction. A jump instruction is an instruction that may jump to
* instruction that may jump to another instruction. * another instruction.
* *
* @author Eric Bruneton * @author Eric Bruneton
*/ */
public class JumpInsnNode extends AbstractInsnNode { public class JumpInsnNode extends AbstractInsnNode {
/** /**
* The operand of this instruction. This operand is a label that designates * The operand of this instruction. This operand is a label that designates the instruction to
* the instruction to which this instruction may jump. * which this instruction may jump.
*/ */
public LabelNode label; public LabelNode label;
/** /**
* Constructs a new {@link JumpInsnNode}. * Constructs a new {@link JumpInsnNode}.
* *
* @param opcode * @param opcode the opcode of the type instruction to be constructed. This opcode must be IFEQ,
* the opcode of the type instruction to be constructed. This * IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT,
* opcode must be IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ, * IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.
* IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, * @param label the operand of the instruction to be constructed. This operand is a label that
* IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL. * designates the instruction to which the jump instruction may jump.
* @param label
* the operand of the instruction to be constructed. This operand
* is a label that designates the instruction to which the jump
* instruction may jump.
*/ */
public JumpInsnNode(final int opcode, final LabelNode label) { public JumpInsnNode(final int opcode, final LabelNode label) {
super(opcode); super(opcode);
@ -68,11 +56,9 @@ public class JumpInsnNode extends AbstractInsnNode {
/** /**
* Sets the opcode of this instruction. * Sets the opcode of this instruction.
* *
* @param opcode * @param opcode the new instruction opcode. This opcode must be IFEQ, IFNE, IFLT, IFGE, IFGT,
* the new instruction opcode. This opcode must be IFEQ, IFNE, * IFLE, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ACMPEQ,
* IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, * IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.
* IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE, GOTO,
* JSR, IFNULL or IFNONNULL.
*/ */
public void setOpcode(final int opcode) { public void setOpcode(final int opcode) {
this.opcode = opcode; this.opcode = opcode;

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -42,19 +34,18 @@ import org.objectweb.asm.Opcodes;
public class LdcInsnNode extends AbstractInsnNode { public class LdcInsnNode extends AbstractInsnNode {
/** /**
* The constant to be loaded on the stack. This parameter must be a non null * The constant to be loaded on the stack. This parameter must be a non null {@link Integer}, a
* {@link Integer}, a {@link Float}, a {@link Long}, a {@link Double}, a * {@link Float}, a {@link Long}, a {@link Double}, a {@link String} or a
* {@link String} or a {@link org.objectweb.asm.Type}. * {@link org.objectweb.asm.Type}.
*/ */
public Object cst; public Object cst;
/** /**
* Constructs a new {@link LdcInsnNode}. * Constructs a new {@link LdcInsnNode}.
* *
* @param cst * @param cst the constant to be loaded on the stack. This parameter must be a non null
* the constant to be loaded on the stack. This parameter must be * {@link Integer}, a {@link Float}, a {@link Long}, a {@link Double} or a
* a non null {@link Integer}, a {@link Float}, a {@link Long}, a * {@link String}.
* {@link Double} or a {@link String}.
*/ */
public LdcInsnNode(final Object cst) { public LdcInsnNode(final Object cst) {
super(Opcodes.LDC); super(Opcodes.LDC);

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -34,16 +26,15 @@ import java.util.Map;
import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.MethodVisitor;
/** /**
* A node that represents a line number declaration. These nodes are pseudo * A node that represents a line number declaration. These nodes are pseudo instruction nodes in
* instruction nodes in order to be inserted in an instruction list. * order to be inserted in an instruction list.
* *
* @author Eric Bruneton * @author Eric Bruneton
*/ */
public class LineNumberNode extends AbstractInsnNode { public class LineNumberNode extends AbstractInsnNode {
/** /**
* A line number. This number refers to the source file from which the class * A line number. This number refers to the source file from which the class was compiled.
* was compiled.
*/ */
public int line; public int line;
@ -55,11 +46,9 @@ public class LineNumberNode extends AbstractInsnNode {
/** /**
* Constructs a new {@link LineNumberNode}. * Constructs a new {@link LineNumberNode}.
* *
* @param line * @param line a line number. This number refers to the source file from which the class was
* a line number. This number refers to the source file from * compiled.
* which the class was compiled. * @param start the first instruction corresponding to this line number.
* @param start
* the first instruction corresponding to this line number.
*/ */
public LineNumberNode(final int line, final LabelNode start) { public LineNumberNode(final int line, final LabelNode start) {
super(-1); super(-1);

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -54,14 +46,12 @@ public class LocalVariableNode {
public String signature; public String signature;
/** /**
* The first instruction corresponding to the scope of this local variable * The first instruction corresponding to the scope of this local variable (inclusive).
* (inclusive).
*/ */
public LabelNode start; public LabelNode start;
/** /**
* The last instruction corresponding to the scope of this local variable * The last instruction corresponding to the scope of this local variable (exclusive).
* (exclusive).
*/ */
public LabelNode end; public LabelNode end;
@ -73,24 +63,17 @@ public class LocalVariableNode {
/** /**
* Constructs a new {@link LocalVariableNode}. * Constructs a new {@link LocalVariableNode}.
* *
* @param name * @param name the name of a local variable.
* the name of a local variable. * @param desc the type descriptor of this local variable.
* @param desc * @param signature the signature of this local variable. May be <tt>null</tt>.
* the type descriptor of this local variable. * @param start the first instruction corresponding to the scope of this local variable
* @param signature * (inclusive).
* the signature of this local variable. May be <tt>null</tt>. * @param end the last instruction corresponding to the scope of this local variable
* @param start * (exclusive).
* the first instruction corresponding to the scope of this local * @param index the local variable's index.
* variable (inclusive).
* @param end
* the last instruction corresponding to the scope of this local
* variable (exclusive).
* @param index
* the local variable's index.
*/ */
public LocalVariableNode(final String name, final String desc, public LocalVariableNode(final String name, final String desc, final String signature,
final String signature, final LabelNode start, final LabelNode end, final LabelNode start, final LabelNode end, final int index) {
final int index) {
this.name = name; this.name = name;
this.desc = desc; this.desc = desc;
this.signature = signature; this.signature = signature;
@ -102,11 +85,9 @@ public class LocalVariableNode {
/** /**
* Makes the given visitor visit this local variable declaration. * Makes the given visitor visit this local variable declaration.
* *
* @param mv * @param mv a method visitor.
* a method visitor.
*/ */
public void accept(final MethodVisitor mv) { public void accept(final MethodVisitor mv) {
mv.visitLocalVariable(name, desc, signature, start.getLabel(), mv.visitLocalVariable(name, desc, signature, start.getLabel(), end.getLabel(), index);
end.getLabel(), index);
} }
} }

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -56,29 +48,23 @@ public class LookupSwitchInsnNode extends AbstractInsnNode {
public List<Integer> keys; public List<Integer> keys;
/** /**
* Beginnings of the handler blocks. This list is a list of * Beginnings of the handler blocks. This list is a list of {@link LabelNode} objects.
* {@link LabelNode} objects.
*/ */
public List<LabelNode> labels; public List<LabelNode> labels;
/** /**
* Constructs a new {@link LookupSwitchInsnNode}. * Constructs a new {@link LookupSwitchInsnNode}.
* *
* @param dflt * @param dflt beginning of the default handler block.
* beginning of the default handler block. * @param keys the values of the keys.
* @param keys * @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the beginning of the
* the values of the keys. * handler block for the <tt>keys[i]</tt> key.
* @param labels
* beginnings of the handler blocks. <tt>labels[i]</tt> is the
* beginning of the handler block for the <tt>keys[i]</tt> key.
*/ */
public LookupSwitchInsnNode(final LabelNode dflt, final int[] keys, public LookupSwitchInsnNode(final LabelNode dflt, final int[] keys, final LabelNode[] labels) {
final LabelNode[] labels) {
super(Opcodes.LOOKUPSWITCH); super(Opcodes.LOOKUPSWITCH);
this.dflt = dflt; this.dflt = dflt;
this.keys = new ArrayList<Integer>(keys == null ? 0 : keys.length); this.keys = new ArrayList<Integer>(keys == null ? 0 : keys.length);
this.labels = new ArrayList<LabelNode>(labels == null ? 0 this.labels = new ArrayList<LabelNode>(labels == null ? 0 : labels.length);
: labels.length);
if (keys != null) { if (keys != null) {
for (int i = 0; i < keys.length; ++i) { for (int i = 0; i < keys.length; ++i) {
this.keys.add(new Integer(keys[i])); this.keys.add(new Integer(keys[i]));
@ -109,8 +95,8 @@ public class LookupSwitchInsnNode extends AbstractInsnNode {
@Override @Override
public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) { public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
LookupSwitchInsnNode clone = new LookupSwitchInsnNode(clone(dflt, LookupSwitchInsnNode clone =
labels), null, clone(this.labels, labels)); new LookupSwitchInsnNode(clone(dflt, labels), null, clone(this.labels, labels));
clone.keys.addAll(keys); clone.keys.addAll(keys);
return clone; return clone;
} }

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -34,8 +26,8 @@ import java.util.Map;
import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.MethodVisitor;
/** /**
* A node that represents a method instruction. A method instruction is an * A node that represents a method instruction. A method instruction is an instruction that invokes
* instruction that invokes a method. * a method.
* *
* @author Eric Bruneton * @author Eric Bruneton
*/ */
@ -60,21 +52,15 @@ public class MethodInsnNode extends AbstractInsnNode {
/** /**
* Constructs a new {@link MethodInsnNode}. * Constructs a new {@link MethodInsnNode}.
* *
* @param opcode * @param opcode the opcode of the type instruction to be constructed. This opcode must be
* the opcode of the type instruction to be constructed. This * INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or INVOKEINTERFACE.
* opcode must be INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or * @param owner the internal name of the method's owner class (see
* INVOKEINTERFACE. * {@link org.objectweb.asm.Type#getInternalName() getInternalName}).
* @param owner * @param name the method's name.
* the internal name of the method's owner class (see * @param desc the method's descriptor (see {@link org.objectweb.asm.Type}).
* {@link org.objectweb.asm.Type#getInternalName()
* getInternalName}).
* @param name
* the method's name.
* @param desc
* the method's descriptor (see {@link org.objectweb.asm.Type}).
*/ */
public MethodInsnNode(final int opcode, final String owner, public MethodInsnNode(final int opcode, final String owner, final String name,
final String name, final String desc) { final String desc) {
super(opcode); super(opcode);
this.owner = owner; this.owner = owner;
this.name = name; this.name = name;
@ -84,9 +70,8 @@ public class MethodInsnNode extends AbstractInsnNode {
/** /**
* Sets the opcode of this instruction. * Sets the opcode of this instruction.
* *
* @param opcode * @param opcode the new instruction opcode. This opcode must be INVOKEVIRTUAL, INVOKESPECIAL,
* the new instruction opcode. This opcode must be INVOKEVIRTUAL, * INVOKESTATIC or INVOKEINTERFACE.
* INVOKESPECIAL, INVOKESTATIC or INVOKEINTERFACE.
*/ */
public void setOpcode(final int opcode) { public void setOpcode(final int opcode) {
this.opcode = opcode; this.opcode = opcode;

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -50,8 +42,8 @@ import org.objectweb.asm.Type;
public class MethodNode extends MethodVisitor { public class MethodNode extends MethodVisitor {
/** /**
* The method's access flags (see {@link Opcodes}). This field also * The method's access flags (see {@link Opcodes}). This field also indicates if the method is
* indicates if the method is synthetic and/or deprecated. * synthetic and/or deprecated.
*/ */
public int access; public int access;
@ -71,15 +63,14 @@ public class MethodNode extends MethodVisitor {
public String signature; public String signature;
/** /**
* The internal names of the method's exception classes (see * The internal names of the method's exception classes (see {@link Type#getInternalName()
* {@link Type#getInternalName() getInternalName}). This list is a list of * getInternalName}). This list is a list of {@link String} objects.
* {@link String} objects.
*/ */
public List<String> exceptions; public List<String> exceptions;
/** /**
* The runtime visible annotations of this method. This list is a list of * The runtime visible annotations of this method. This list is a list of {@link AnnotationNode}
* {@link AnnotationNode} objects. May be <tt>null</tt>. * objects. May be <tt>null</tt>.
* *
* @associates org.objectweb.asm.tree.AnnotationNode * @associates org.objectweb.asm.tree.AnnotationNode
* @label visible * @label visible
@ -96,26 +87,25 @@ public class MethodNode extends MethodVisitor {
public List<AnnotationNode> invisibleAnnotations; public List<AnnotationNode> invisibleAnnotations;
/** /**
* The non standard attributes of this method. This list is a list of * The non standard attributes of this method. This list is a list of {@link Attribute} objects.
* {@link Attribute} objects. May be <tt>null</tt>. * May be <tt>null</tt>.
* *
* @associates org.objectweb.asm.Attribute * @associates org.objectweb.asm.Attribute
*/ */
public List<Attribute> attrs; public List<Attribute> attrs;
/** /**
* The default value of this annotation interface method. This field must be * The default value of this annotation interface method. This field must be a {@link Byte},
* a {@link Byte}, {@link Boolean}, {@link Character}, {@link Short}, * {@link Boolean}, {@link Character}, {@link Short}, {@link Integer}, {@link Long},
* {@link Integer}, {@link Long}, {@link Float}, {@link Double}, * {@link Float}, {@link Double}, {@link String} or {@link Type}, or an two elements String
* {@link String} or {@link Type}, or an two elements String array (for * array (for enumeration values), a {@link AnnotationNode}, or a {@link List} of values of one
* enumeration values), a {@link AnnotationNode}, or a {@link List} of * of the preceding types. May be <tt>null</tt>.
* values of one of the preceding types. May be <tt>null</tt>.
*/ */
public Object annotationDefault; public Object annotationDefault;
/** /**
* The runtime visible parameter annotations of this method. These lists are * The runtime visible parameter annotations of this method. These lists are lists of
* lists of {@link AnnotationNode} objects. May be <tt>null</tt>. * {@link AnnotationNode} objects. May be <tt>null</tt>.
* *
* @associates org.objectweb.asm.tree.AnnotationNode * @associates org.objectweb.asm.tree.AnnotationNode
* @label invisible parameters * @label invisible parameters
@ -123,8 +113,8 @@ public class MethodNode extends MethodVisitor {
public List<AnnotationNode>[] visibleParameterAnnotations; public List<AnnotationNode>[] visibleParameterAnnotations;
/** /**
* The runtime invisible parameter annotations of this method. These lists * The runtime invisible parameter annotations of this method. These lists are lists of
* are lists of {@link AnnotationNode} objects. May be <tt>null</tt>. * {@link AnnotationNode} objects. May be <tt>null</tt>.
* *
* @associates org.objectweb.asm.tree.AnnotationNode * @associates org.objectweb.asm.tree.AnnotationNode
* @label visible parameters * @label visible parameters
@ -132,8 +122,7 @@ public class MethodNode extends MethodVisitor {
public List<AnnotationNode>[] invisibleParameterAnnotations; public List<AnnotationNode>[] invisibleParameterAnnotations;
/** /**
* The instructions of this method. This list is a list of * The instructions of this method. This list is a list of {@link AbstractInsnNode} objects.
* {@link AbstractInsnNode} objects.
* *
* @associates org.objectweb.asm.tree.AbstractInsnNode * @associates org.objectweb.asm.tree.AbstractInsnNode
* @label instructions * @label instructions
@ -141,8 +130,8 @@ public class MethodNode extends MethodVisitor {
public InsnList instructions; public InsnList instructions;
/** /**
* The try catch blocks of this method. This list is a list of * The try catch blocks of this method. This list is a list of {@link TryCatchBlockNode}
* {@link TryCatchBlockNode} objects. * objects.
* *
* @associates org.objectweb.asm.tree.TryCatchBlockNode * @associates org.objectweb.asm.tree.TryCatchBlockNode
*/ */
@ -159,8 +148,8 @@ public class MethodNode extends MethodVisitor {
public int maxLocals; public int maxLocals;
/** /**
* The local variables of this method. This list is a list of * The local variables of this method. This list is a list of {@link LocalVariableNode} objects.
* {@link LocalVariableNode} objects. May be <tt>null</tt> * May be <tt>null</tt>
* *
* @associates org.objectweb.asm.tree.LocalVariableNode * @associates org.objectweb.asm.tree.LocalVariableNode
*/ */
@ -172,9 +161,8 @@ public class MethodNode extends MethodVisitor {
private boolean visited; private boolean visited;
/** /**
* Constructs an uninitialized {@link MethodNode}. <i>Subclasses must not * Constructs an uninitialized {@link MethodNode}. <i>Subclasses must not use this
* use this constructor</i>. Instead, they must use the * constructor</i>. Instead, they must use the {@link #MethodNode(int)} version.
* {@link #MethodNode(int)} version.
*/ */
public MethodNode() { public MethodNode() {
this(Opcodes.ASM4); this(Opcodes.ASM4);
@ -183,9 +171,8 @@ public class MethodNode extends MethodVisitor {
/** /**
* Constructs an uninitialized {@link MethodNode}. * Constructs an uninitialized {@link MethodNode}.
* *
* @param api * @param api the ASM API version implemented by this visitor. Must be one of
* the ASM API version implemented by this visitor. Must be one * {@link Opcodes#ASM4}.
* of {@link Opcodes#ASM4}.
*/ */
public MethodNode(final int api) { public MethodNode(final int api) {
super(api); super(api);
@ -193,24 +180,17 @@ public class MethodNode extends MethodVisitor {
} }
/** /**
* Constructs a new {@link MethodNode}. <i>Subclasses must not use this * Constructs a new {@link MethodNode}. <i>Subclasses must not use this constructor</i>.
* constructor</i>. Instead, they must use the * Instead, they must use the {@link #MethodNode(int, int, String, String, String, String[])}
* {@link #MethodNode(int, int, String, String, String, String[])} version. * version.
* *
* @param access * @param access the method's access flags (see {@link Opcodes}). This parameter also indicates
* the method's access flags (see {@link Opcodes}). This * if the method is synthetic and/or deprecated.
* parameter also indicates if the method is synthetic and/or * @param name the method's name.
* deprecated. * @param desc the method's descriptor (see {@link Type}).
* @param name * @param signature the method's signature. May be <tt>null</tt>.
* the method's name. * @param exceptions the internal names of the method's exception classes (see
* @param desc * {@link Type#getInternalName() getInternalName}). May be <tt>null</tt>.
* the method's descriptor (see {@link Type}).
* @param signature
* the method's signature. May be <tt>null</tt>.
* @param exceptions
* the internal names of the method's exception classes (see
* {@link Type#getInternalName() getInternalName}). May be
* <tt>null</tt>.
*/ */
public MethodNode(final int access, final String name, final String desc, public MethodNode(final int access, final String name, final String desc,
final String signature, final String[] exceptions) { final String signature, final String[] exceptions) {
@ -220,33 +200,24 @@ public class MethodNode extends MethodVisitor {
/** /**
* Constructs a new {@link MethodNode}. * Constructs a new {@link MethodNode}.
* *
* @param api * @param api the ASM API version implemented by this visitor. Must be one of
* the ASM API version implemented by this visitor. Must be one * {@link Opcodes#ASM4}.
* of {@link Opcodes#ASM4}. * @param access the method's access flags (see {@link Opcodes}). This parameter also indicates
* @param access * if the method is synthetic and/or deprecated.
* the method's access flags (see {@link Opcodes}). This * @param name the method's name.
* parameter also indicates if the method is synthetic and/or * @param desc the method's descriptor (see {@link Type}).
* deprecated. * @param signature the method's signature. May be <tt>null</tt>.
* @param name * @param exceptions the internal names of the method's exception classes (see
* the method's name. * {@link Type#getInternalName() getInternalName}). May be <tt>null</tt>.
* @param desc
* the method's descriptor (see {@link Type}).
* @param signature
* the method's signature. May be <tt>null</tt>.
* @param exceptions
* the internal names of the method's exception classes (see
* {@link Type#getInternalName() getInternalName}). May be
* <tt>null</tt>.
*/ */
public MethodNode(final int api, final int access, final String name, public MethodNode(final int api, final int access, final String name, final String desc,
final String desc, final String signature, final String[] exceptions) { final String signature, final String[] exceptions) {
super(api); super(api);
this.access = access; this.access = access;
this.name = name; this.name = name;
this.desc = desc; this.desc = desc;
this.signature = signature; this.signature = signature;
this.exceptions = new ArrayList<String>(exceptions == null ? 0 this.exceptions = new ArrayList<String>(exceptions == null ? 0 : exceptions.length);
: exceptions.length);
boolean isAbstract = (access & Opcodes.ACC_ABSTRACT) != 0; boolean isAbstract = (access & Opcodes.ACC_ABSTRACT) != 0;
if (!isAbstract) { if (!isAbstract) {
this.localVariables = new ArrayList<LocalVariableNode>(5); this.localVariables = new ArrayList<LocalVariableNode>(5);
@ -274,8 +245,7 @@ public class MethodNode extends MethodVisitor {
} }
@Override @Override
public AnnotationVisitor visitAnnotation(final String desc, public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
final boolean visible) {
AnnotationNode an = new AnnotationNode(desc); AnnotationNode an = new AnnotationNode(desc);
if (visible) { if (visible) {
if (visibleAnnotations == null) { if (visibleAnnotations == null) {
@ -292,8 +262,8 @@ public class MethodNode extends MethodVisitor {
} }
@Override @Override
public AnnotationVisitor visitParameterAnnotation(final int parameter, public AnnotationVisitor visitParameterAnnotation(final int parameter, final String desc,
final String desc, final boolean visible) { final boolean visible) {
AnnotationNode an = new AnnotationNode(desc); AnnotationNode an = new AnnotationNode(desc);
if (visible) { if (visible) {
if (visibleParameterAnnotations == null) { if (visibleParameterAnnotations == null) {
@ -301,8 +271,7 @@ public class MethodNode extends MethodVisitor {
visibleParameterAnnotations = (List<AnnotationNode>[]) new List<?>[params]; visibleParameterAnnotations = (List<AnnotationNode>[]) new List<?>[params];
} }
if (visibleParameterAnnotations[parameter] == null) { if (visibleParameterAnnotations[parameter] == null) {
visibleParameterAnnotations[parameter] = new ArrayList<AnnotationNode>( visibleParameterAnnotations[parameter] = new ArrayList<AnnotationNode>(1);
1);
} }
visibleParameterAnnotations[parameter].add(an); visibleParameterAnnotations[parameter].add(an);
} else { } else {
@ -311,8 +280,7 @@ public class MethodNode extends MethodVisitor {
invisibleParameterAnnotations = (List<AnnotationNode>[]) new List<?>[params]; invisibleParameterAnnotations = (List<AnnotationNode>[]) new List<?>[params];
} }
if (invisibleParameterAnnotations[parameter] == null) { if (invisibleParameterAnnotations[parameter] == null) {
invisibleParameterAnnotations[parameter] = new ArrayList<AnnotationNode>( invisibleParameterAnnotations[parameter] = new ArrayList<AnnotationNode>(1);
1);
} }
invisibleParameterAnnotations[parameter].add(an); invisibleParameterAnnotations[parameter].add(an);
} }
@ -328,15 +296,13 @@ public class MethodNode extends MethodVisitor {
} }
@Override @Override
public void visitCode() { public void visitCode() {}
}
@Override @Override
public void visitFrame(final int type, final int nLocal, public void visitFrame(final int type, final int nLocal, final Object[] local, final int nStack,
final Object[] local, final int nStack, final Object[] stack) { final Object[] stack) {
instructions.add(new FrameNode(type, nLocal, local == null ? null instructions.add(new FrameNode(type, nLocal, local == null ? null : getLabelNodes(local),
: getLabelNodes(local), nStack, stack == null ? null nStack, stack == null ? null : getLabelNodes(stack)));
: getLabelNodes(stack)));
} }
@Override @Override
@ -360,20 +326,19 @@ public class MethodNode extends MethodVisitor {
} }
@Override @Override
public void visitFieldInsn(final int opcode, final String owner, public void visitFieldInsn(final int opcode, final String owner, final String name,
final String name, final String desc) { final String desc) {
instructions.add(new FieldInsnNode(opcode, owner, name, desc)); instructions.add(new FieldInsnNode(opcode, owner, name, desc));
} }
@Override @Override
public void visitMethodInsn(final int opcode, final String owner, public void visitMethodInsn(final int opcode, final String owner, final String name,
final String name, final String desc) { final String desc) {
instructions.add(new MethodInsnNode(opcode, owner, name, desc)); instructions.add(new MethodInsnNode(opcode, owner, name, desc));
} }
@Override @Override
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
Object... bsmArgs) {
instructions.add(new InvokeDynamicInsnNode(name, desc, bsm, bsmArgs)); instructions.add(new InvokeDynamicInsnNode(name, desc, bsm, bsmArgs));
} }
@ -398,17 +363,15 @@ public class MethodNode extends MethodVisitor {
} }
@Override @Override
public void visitTableSwitchInsn(final int min, final int max, public void visitTableSwitchInsn(final int min, final int max, final Label dflt,
final Label dflt, final Label... labels) { final Label... labels) {
instructions.add(new TableSwitchInsnNode(min, max, getLabelNode(dflt), instructions
getLabelNodes(labels))); .add(new TableSwitchInsnNode(min, max, getLabelNode(dflt), getLabelNodes(labels)));
} }
@Override @Override
public void visitLookupSwitchInsn(final Label dflt, final int[] keys, public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Label[] labels) {
final Label[] labels) { instructions.add(new LookupSwitchInsnNode(getLabelNode(dflt), keys, getLabelNodes(labels)));
instructions.add(new LookupSwitchInsnNode(getLabelNode(dflt), keys,
getLabelNodes(labels)));
} }
@Override @Override
@ -417,18 +380,17 @@ public class MethodNode extends MethodVisitor {
} }
@Override @Override
public void visitTryCatchBlock(final Label start, final Label end, public void visitTryCatchBlock(final Label start, final Label end, final Label handler,
final Label handler, final String type) { final String type) {
tryCatchBlocks.add(new TryCatchBlockNode(getLabelNode(start), tryCatchBlocks.add(new TryCatchBlockNode(getLabelNode(start), getLabelNode(end),
getLabelNode(end), getLabelNode(handler), type)); getLabelNode(handler), type));
} }
@Override @Override
public void visitLocalVariable(final String name, final String desc, public void visitLocalVariable(final String name, final String desc, final String signature,
final String signature, final Label start, final Label end, final Label start, final Label end, final int index) {
final int index) { localVariables.add(new LocalVariableNode(name, desc, signature, getLabelNode(start),
localVariables.add(new LocalVariableNode(name, desc, signature, getLabelNode(end), index));
getLabelNode(start), getLabelNode(end), index));
} }
@Override @Override
@ -443,17 +405,14 @@ public class MethodNode extends MethodVisitor {
} }
@Override @Override
public void visitEnd() { public void visitEnd() {}
}
/** /**
* Returns the LabelNode corresponding to the given Label. Creates a new * Returns the LabelNode corresponding to the given Label. Creates a new LabelNode if necessary.
* LabelNode if necessary. The default implementation of this method uses * The default implementation of this method uses the {@link Label#info} field to store
* the {@link Label#info} field to store associations between labels and * associations between labels and label nodes.
* label nodes.
* *
* @param l * @param l a Label.
* a Label.
* @return the LabelNode corresponding to l. * @return the LabelNode corresponding to l.
*/ */
protected LabelNode getLabelNode(final Label l) { protected LabelNode getLabelNode(final Label l) {
@ -488,13 +447,11 @@ public class MethodNode extends MethodVisitor {
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
/** /**
* Checks that this method node is compatible with the given ASM API * Checks that this method node is compatible with the given ASM API version. This methods
* version. This methods checks that this node, and all its nodes * checks that this node, and all its nodes recursively, do not contain elements that were
* recursively, do not contain elements that were introduced in more recent * introduced in more recent versions of the ASM API than the given version.
* versions of the ASM API than the given version.
* *
* @param api * @param api an ASM API version. Must be one of {@link Opcodes#ASM4}.
* an ASM API version. Must be one of {@link Opcodes#ASM4}.
*/ */
public void check(final int api) { public void check(final int api) {
// nothing to do // nothing to do
@ -503,14 +460,12 @@ public class MethodNode extends MethodVisitor {
/** /**
* Makes the given class visitor visit this method. * Makes the given class visitor visit this method.
* *
* @param cv * @param cv a class visitor.
* a class visitor.
*/ */
public void accept(final ClassVisitor cv) { public void accept(final ClassVisitor cv) {
String[] exceptions = new String[this.exceptions.size()]; String[] exceptions = new String[this.exceptions.size()];
this.exceptions.toArray(exceptions); this.exceptions.toArray(exceptions);
MethodVisitor mv = cv.visitMethod(access, name, desc, signature, MethodVisitor mv = cv.visitMethod(access, name, desc, signature, exceptions);
exceptions);
if (mv != null) { if (mv != null) {
accept(mv); accept(mv);
} }
@ -519,8 +474,7 @@ public class MethodNode extends MethodVisitor {
/** /**
* Makes the given method visitor visit this method. * Makes the given method visitor visit this method.
* *
* @param mv * @param mv a method visitor.
* a method visitor.
*/ */
public void accept(final MethodVisitor mv) { public void accept(final MethodVisitor mv) {
// visits the method attributes // visits the method attributes
@ -542,8 +496,7 @@ public class MethodNode extends MethodVisitor {
AnnotationNode an = invisibleAnnotations.get(i); AnnotationNode an = invisibleAnnotations.get(i);
an.accept(mv.visitAnnotation(an.desc, false)); an.accept(mv.visitAnnotation(an.desc, false));
} }
n = visibleParameterAnnotations == null ? 0 n = visibleParameterAnnotations == null ? 0 : visibleParameterAnnotations.length;
: visibleParameterAnnotations.length;
for (i = 0; i < n; ++i) { for (i = 0; i < n; ++i) {
List<?> l = visibleParameterAnnotations[i]; List<?> l = visibleParameterAnnotations[i];
if (l == null) { if (l == null) {
@ -554,8 +507,7 @@ public class MethodNode extends MethodVisitor {
an.accept(mv.visitParameterAnnotation(i, an.desc, true)); an.accept(mv.visitParameterAnnotation(i, an.desc, true));
} }
} }
n = invisibleParameterAnnotations == null ? 0 n = invisibleParameterAnnotations == null ? 0 : invisibleParameterAnnotations.length;
: invisibleParameterAnnotations.length;
for (i = 0; i < n; ++i) { for (i = 0; i < n; ++i) {
List<?> l = invisibleParameterAnnotations[i]; List<?> l = invisibleParameterAnnotations[i];
if (l == null) { if (l == null) {

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -54,10 +46,8 @@ public class MultiANewArrayInsnNode extends AbstractInsnNode {
/** /**
* Constructs a new {@link MultiANewArrayInsnNode}. * Constructs a new {@link MultiANewArrayInsnNode}.
* *
* @param desc * @param desc an array type descriptor (see {@link org.objectweb.asm.Type}).
* an array type descriptor (see {@link org.objectweb.asm.Type}). * @param dims number of dimensions of the array to allocate.
* @param dims
* number of dimensions of the array to allocate.
*/ */
public MultiANewArrayInsnNode(final String desc, final int dims) { public MultiANewArrayInsnNode(final String desc, final int dims) {
super(Opcodes.MULTIANEWARRAY); super(Opcodes.MULTIANEWARRAY);

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -61,26 +53,21 @@ public class TableSwitchInsnNode extends AbstractInsnNode {
public LabelNode dflt; public LabelNode dflt;
/** /**
* Beginnings of the handler blocks. This list is a list of * Beginnings of the handler blocks. This list is a list of {@link LabelNode} objects.
* {@link LabelNode} objects.
*/ */
public List<LabelNode> labels; public List<LabelNode> labels;
/** /**
* Constructs a new {@link TableSwitchInsnNode}. * Constructs a new {@link TableSwitchInsnNode}.
* *
* @param min * @param min the minimum key value.
* the minimum key value. * @param max the maximum key value.
* @param max * @param dflt beginning of the default handler block.
* the maximum key value. * @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the beginning of the
* @param dflt * handler block for the <tt>min + i</tt> key.
* beginning of the default handler block.
* @param labels
* beginnings of the handler blocks. <tt>labels[i]</tt> is the
* beginning of the handler block for the <tt>min + i</tt> key.
*/ */
public TableSwitchInsnNode(final int min, final int max, public TableSwitchInsnNode(final int min, final int max, final LabelNode dflt,
final LabelNode dflt, final LabelNode... labels) { final LabelNode... labels) {
super(Opcodes.TABLESWITCH); super(Opcodes.TABLESWITCH);
this.min = min; this.min = min;
this.max = max; this.max = max;
@ -107,7 +94,6 @@ public class TableSwitchInsnNode extends AbstractInsnNode {
@Override @Override
public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) { public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
return new TableSwitchInsnNode(min, max, clone(dflt, labels), clone( return new TableSwitchInsnNode(min, max, clone(dflt, labels), clone(this.labels, labels));
this.labels, labels));
} }
} }

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -54,27 +46,22 @@ public class TryCatchBlockNode {
public LabelNode handler; public LabelNode handler;
/** /**
* Internal name of the type of exceptions handled by the handler. May be * Internal name of the type of exceptions handled by the handler. May be <tt>null</tt> to catch
* <tt>null</tt> to catch any exceptions (for "finally" blocks). * any exceptions (for "finally" blocks).
*/ */
public String type; public String type;
/** /**
* Constructs a new {@link TryCatchBlockNode}. * Constructs a new {@link TryCatchBlockNode}.
* *
* @param start * @param start beginning of the exception handler's scope (inclusive).
* beginning of the exception handler's scope (inclusive). * @param end end of the exception handler's scope (exclusive).
* @param end * @param handler beginning of the exception handler's code.
* end of the exception handler's scope (exclusive). * @param type internal name of the type of exceptions handled by the handler, or <tt>null</tt>
* @param handler * to catch any exceptions (for "finally" blocks).
* beginning of the exception handler's code.
* @param type
* internal name of the type of exceptions handled by the
* handler, or <tt>null</tt> to catch any exceptions (for
* "finally" blocks).
*/ */
public TryCatchBlockNode(final LabelNode start, final LabelNode end, public TryCatchBlockNode(final LabelNode start, final LabelNode end, final LabelNode handler,
final LabelNode handler, final String type) { final String type) {
this.start = start; this.start = start;
this.end = end; this.end = end;
this.handler = handler; this.handler = handler;
@ -84,8 +71,7 @@ public class TryCatchBlockNode {
/** /**
* Makes the given visitor visit this try catch block. * Makes the given visitor visit this try catch block.
* *
* @param mv * @param mv a method visitor.
* a method visitor.
*/ */
public void accept(final MethodVisitor mv) { public void accept(final MethodVisitor mv) {
mv.visitTryCatchBlock(start.getLabel(), end.getLabel(), mv.visitTryCatchBlock(start.getLabel(), end.getLabel(),

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -34,8 +26,8 @@ import java.util.Map;
import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.MethodVisitor;
/** /**
* A node that represents a type instruction. A type instruction is an * A node that represents a type instruction. A type instruction is an instruction that takes a type
* instruction that takes a type descriptor as parameter. * descriptor as parameter.
* *
* @author Eric Bruneton * @author Eric Bruneton
*/ */
@ -50,12 +42,10 @@ public class TypeInsnNode extends AbstractInsnNode {
/** /**
* Constructs a new {@link TypeInsnNode}. * Constructs a new {@link TypeInsnNode}.
* *
* @param opcode * @param opcode the opcode of the type instruction to be constructed. This opcode must be NEW,
* the opcode of the type instruction to be constructed. This * ANEWARRAY, CHECKCAST or INSTANCEOF.
* opcode must be NEW, ANEWARRAY, CHECKCAST or INSTANCEOF. * @param desc the operand of the instruction to be constructed. This operand is an internal
* @param desc * name (see {@link org.objectweb.asm.Type}).
* the operand of the instruction to be constructed. This operand
* is an internal name (see {@link org.objectweb.asm.Type}).
*/ */
public TypeInsnNode(final int opcode, final String desc) { public TypeInsnNode(final int opcode, final String desc) {
super(opcode); super(opcode);
@ -65,9 +55,8 @@ public class TypeInsnNode extends AbstractInsnNode {
/** /**
* Sets the opcode of this instruction. * Sets the opcode of this instruction.
* *
* @param opcode * @param opcode the new instruction opcode. This opcode must be NEW, ANEWARRAY, CHECKCAST or
* the new instruction opcode. This opcode must be NEW, * INSTANCEOF.
* ANEWARRAY, CHECKCAST or INSTANCEOF.
*/ */
public void setOpcode(final int opcode) { public void setOpcode(final int opcode) {
this.opcode = opcode; this.opcode = opcode;

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree; package org.objectweb.asm.tree;
@ -34,30 +26,26 @@ import java.util.Map;
import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.MethodVisitor;
/** /**
* A node that represents a local variable instruction. A local variable * A node that represents a local variable instruction. A local variable instruction is an
* instruction is an instruction that loads or stores the value of a local * instruction that loads or stores the value of a local variable.
* variable.
* *
* @author Eric Bruneton * @author Eric Bruneton
*/ */
public class VarInsnNode extends AbstractInsnNode { public class VarInsnNode extends AbstractInsnNode {
/** /**
* The operand of this instruction. This operand is the index of a local * The operand of this instruction. This operand is the index of a local variable.
* variable.
*/ */
public int var; public int var;
/** /**
* Constructs a new {@link VarInsnNode}. * Constructs a new {@link VarInsnNode}.
* *
* @param opcode * @param opcode the opcode of the local variable instruction to be constructed. This opcode
* the opcode of the local variable instruction to be * must be ILOAD, LLOAD, FLOAD, DLOAD, ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or
* constructed. This opcode must be ILOAD, LLOAD, FLOAD, DLOAD, * RET.
* ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or RET. * @param var the operand of the instruction to be constructed. This operand is the index of a
* @param var * local variable.
* the operand of the instruction to be constructed. This operand
* is the index of a local variable.
*/ */
public VarInsnNode(final int opcode, final int var) { public VarInsnNode(final int opcode, final int var) {
super(opcode); super(opcode);
@ -67,10 +55,8 @@ public class VarInsnNode extends AbstractInsnNode {
/** /**
* Sets the opcode of this instruction. * Sets the opcode of this instruction.
* *
* @param opcode * @param opcode the new instruction opcode. This opcode must be ILOAD, LLOAD, FLOAD, DLOAD,
* the new instruction opcode. This opcode must be ILOAD, LLOAD, * ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or RET.
* FLOAD, DLOAD, ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or
* RET.
*/ */
public void setOpcode(final int opcode) { public void setOpcode(final int opcode) {
this.opcode = opcode; this.opcode = opcode;

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree.analysis; package org.objectweb.asm.tree.analysis;
@ -48,11 +40,10 @@ import org.objectweb.asm.tree.TryCatchBlockNode;
import org.objectweb.asm.tree.VarInsnNode; import org.objectweb.asm.tree.VarInsnNode;
/** /**
* A semantic bytecode analyzer. <i>This class does not fully check that JSR and * A semantic bytecode analyzer. <i>This class does not fully check that JSR and RET instructions
* RET instructions are valid.</i> * are valid.</i>
* *
* @param <V> * @param <V> type of the Value used for the analysis.
* type of the Value used for the analysis.
* *
* @author Eric Bruneton * @author Eric Bruneton
*/ */
@ -79,9 +70,8 @@ public class Analyzer<V extends Value> implements Opcodes {
/** /**
* Constructs a new {@link Analyzer}. * Constructs a new {@link Analyzer}.
* *
* @param interpreter * @param interpreter the interpreter to be used to symbolically interpret the bytecode
* the interpreter to be used to symbolically interpret the * instructions.
* bytecode instructions.
*/ */
public Analyzer(final Interpreter<V> interpreter) { public Analyzer(final Interpreter<V> interpreter) {
this.interpreter = interpreter; this.interpreter = interpreter;
@ -90,20 +80,15 @@ public class Analyzer<V extends Value> implements Opcodes {
/** /**
* Analyzes the given method. * Analyzes the given method.
* *
* @param owner * @param owner the internal name of the class to which the method belongs.
* the internal name of the class to which the method belongs. * @param m the method to be analyzed.
* @param m * @return the symbolic state of the execution stack frame at each bytecode instruction of the
* the method to be analyzed. * method. The size of the returned array is equal to the number of instructions (and
* @return the symbolic state of the execution stack frame at each bytecode * labels) of the method. A given frame is <tt>null</tt> if and only if the
* instruction of the method. The size of the returned array is * corresponding instruction cannot be reached (dead code).
* equal to the number of instructions (and labels) of the method. A * @throws AnalyzerException if a problem occurs during the analysis.
* given frame is <tt>null</tt> if and only if the corresponding
* instruction cannot be reached (dead code).
* @throws AnalyzerException
* if a problem occurs during the analysis.
*/ */
public Frame<V>[] analyze(final String owner, final MethodNode m) public Frame<V>[] analyze(final String owner, final MethodNode m) throws AnalyzerException {
throws AnalyzerException {
if ((m.access & (ACC_ABSTRACT | ACC_NATIVE)) != 0) { if ((m.access & (ACC_ABSTRACT | ACC_NATIVE)) != 0) {
frames = (Frame<V>[]) new Frame<?>[0]; frames = (Frame<V>[]) new Frame<?>[0];
return frames; return frames;
@ -190,8 +175,7 @@ public class Analyzer<V extends Value> implements Opcodes {
int insnOpcode = insnNode.getOpcode(); int insnOpcode = insnNode.getOpcode();
int insnType = insnNode.getType(); int insnType = insnNode.getType();
if (insnType == AbstractInsnNode.LABEL if (insnType == AbstractInsnNode.LABEL || insnType == AbstractInsnNode.LINE
|| insnType == AbstractInsnNode.LINE
|| insnType == AbstractInsnNode.FRAME) { || insnType == AbstractInsnNode.FRAME) {
merge(insn + 1, f, subroutine); merge(insn + 1, f, subroutine);
newControlFlowEdge(insn, insn + 1); newControlFlowEdge(insn, insn + 1);
@ -207,8 +191,7 @@ public class Analyzer<V extends Value> implements Opcodes {
} }
int jump = insns.indexOf(j.label); int jump = insns.indexOf(j.label);
if (insnOpcode == JSR) { if (insnOpcode == JSR) {
merge(jump, current, new Subroutine(j.label, merge(jump, current, new Subroutine(j.label, m.maxLocals, j));
m.maxLocals, j));
} else { } else {
merge(jump, current, subroutine); merge(jump, current, subroutine);
} }
@ -244,8 +227,8 @@ public class Analyzer<V extends Value> implements Opcodes {
JumpInsnNode caller = subroutine.callers.get(i); JumpInsnNode caller = subroutine.callers.get(i);
int call = insns.indexOf(caller); int call = insns.indexOf(caller);
if (frames[call] != null) { if (frames[call] != null) {
merge(call + 1, frames[call], current, merge(call + 1, frames[call], current, subroutines[call],
subroutines[call], subroutine.access); subroutine.access);
newControlFlowEdge(insn, call + 1); newControlFlowEdge(insn, call + 1);
} }
} }
@ -256,8 +239,7 @@ public class Analyzer<V extends Value> implements Opcodes {
int var = ((VarInsnNode) insnNode).var; int var = ((VarInsnNode) insnNode).var;
subroutine.access[var] = true; subroutine.access[var] = true;
if (insnOpcode == LLOAD || insnOpcode == DLOAD if (insnOpcode == LLOAD || insnOpcode == DLOAD
|| insnOpcode == LSTORE || insnOpcode == LSTORE || insnOpcode == DSTORE) {
|| insnOpcode == DSTORE) {
subroutine.access[var + 1] = true; subroutine.access[var + 1] = true;
} }
} else if (insnNode instanceof IincInsnNode) { } else if (insnNode instanceof IincInsnNode) {
@ -290,23 +272,22 @@ public class Analyzer<V extends Value> implements Opcodes {
} }
} }
} catch (AnalyzerException e) { } catch (AnalyzerException e) {
throw new AnalyzerException(e.node, "Error at instruction " throw new AnalyzerException(e.node,
+ insn + ": " + e.getMessage(), e); "Error at instruction " + insn + ": " + e.getMessage(), e);
} catch (Exception e) { } catch (Exception e) {
throw new AnalyzerException(insnNode, "Error at instruction " throw new AnalyzerException(insnNode,
+ insn + ": " + e.getMessage(), e); "Error at instruction " + insn + ": " + e.getMessage(), e);
} }
} }
return frames; return frames;
} }
private void findSubroutine(int insn, final Subroutine sub, private void findSubroutine(int insn, final Subroutine sub, final List<AbstractInsnNode> calls)
final List<AbstractInsnNode> calls) throws AnalyzerException { throws AnalyzerException {
while (true) { while (true) {
if (insn < 0 || insn >= n) { if (insn < 0 || insn >= n) {
throw new AnalyzerException(null, throw new AnalyzerException(null, "Execution can fall off end of the code");
"Execution can fall off end of the code");
} }
if (subroutines[insn] != null) { if (subroutines[insn] != null) {
return; return;
@ -368,15 +349,13 @@ public class Analyzer<V extends Value> implements Opcodes {
} }
/** /**
* Returns the symbolic stack frame for each instruction of the last * Returns the symbolic stack frame for each instruction of the last recently analyzed method.
* recently analyzed method.
* *
* @return the symbolic state of the execution stack frame at each bytecode * @return the symbolic state of the execution stack frame at each bytecode instruction of the
* instruction of the method. The size of the returned array is * method. The size of the returned array is equal to the number of instructions (and
* equal to the number of instructions (and labels) of the method. A * labels) of the method. A given frame is <tt>null</tt> if the corresponding
* given frame is <tt>null</tt> if the corresponding instruction * instruction cannot be reached, or if an error occured during the analysis of the
* cannot be reached, or if an error occured during the analysis of * method.
* the method.
*/ */
public Frame<V>[] getFrames() { public Frame<V>[] getFrames() {
return frames; return frames;
@ -385,9 +364,7 @@ public class Analyzer<V extends Value> implements Opcodes {
/** /**
* Returns the exception handlers for the given instruction. * Returns the exception handlers for the given instruction.
* *
* @param insn * @param insn the index of an instruction of the last recently analyzed method.
* the index of an instruction of the last recently analyzed
* method.
* @return a list of {@link TryCatchBlockNode} objects. * @return a list of {@link TryCatchBlockNode} objects.
*/ */
public List<TryCatchBlockNode> getHandlers(final int insn) { public List<TryCatchBlockNode> getHandlers(final int insn) {
@ -395,27 +372,20 @@ public class Analyzer<V extends Value> implements Opcodes {
} }
/** /**
* Initializes this analyzer. This method is called just before the * Initializes this analyzer. This method is called just before the execution of control flow
* execution of control flow analysis loop in #analyze. The default * analysis loop in #analyze. The default implementation of this method does nothing.
* implementation of this method does nothing.
* *
* @param owner * @param owner the internal name of the class to which the method belongs.
* the internal name of the class to which the method belongs. * @param m the method to be analyzed.
* @param m * @throws AnalyzerException if a problem occurs.
* the method to be analyzed.
* @throws AnalyzerException
* if a problem occurs.
*/ */
protected void init(String owner, MethodNode m) throws AnalyzerException { protected void init(String owner, MethodNode m) throws AnalyzerException {}
}
/** /**
* Constructs a new frame with the given size. * Constructs a new frame with the given size.
* *
* @param nLocals * @param nLocals the maximum number of local variables of the frame.
* the maximum number of local variables of the frame. * @param nStack the maximum stack size of the frame.
* @param nStack
* the maximum stack size of the frame.
* @return the created frame. * @return the created frame.
*/ */
protected Frame<V> newFrame(final int nLocals, final int nStack) { protected Frame<V> newFrame(final int nLocals, final int nStack) {
@ -425,8 +395,7 @@ public class Analyzer<V extends Value> implements Opcodes {
/** /**
* Constructs a new frame that is identical to the given frame. * Constructs a new frame that is identical to the given frame.
* *
* @param src * @param src a frame.
* a frame.
* @return the created frame. * @return the created frame.
*/ */
protected Frame<V> newFrame(final Frame<? extends V> src) { protected Frame<V> newFrame(final Frame<? extends V> src) {
@ -434,67 +403,52 @@ public class Analyzer<V extends Value> implements Opcodes {
} }
/** /**
* Creates a control flow graph edge. The default implementation of this * Creates a control flow graph edge. The default implementation of this method does nothing. It
* method does nothing. It can be overriden in order to construct the * can be overriden in order to construct the control flow graph of a method (this method is
* control flow graph of a method (this method is called by the * called by the {@link #analyze analyze} method during its visit of the method's code).
* {@link #analyze analyze} method during its visit of the method's code).
* *
* @param insn * @param insn an instruction index.
* an instruction index. * @param successor index of a successor instruction.
* @param successor
* index of a successor instruction.
*/ */
protected void newControlFlowEdge(final int insn, final int successor) { protected void newControlFlowEdge(final int insn, final int successor) {}
}
/** /**
* Creates a control flow graph edge corresponding to an exception handler. * Creates a control flow graph edge corresponding to an exception handler. The default
* The default implementation of this method does nothing. It can be * implementation of this method does nothing. It can be overridden in order to construct the
* overridden in order to construct the control flow graph of a method (this * control flow graph of a method (this method is called by the {@link #analyze analyze} method
* method is called by the {@link #analyze analyze} method during its visit * during its visit of the method's code).
* of the method's code).
* *
* @param insn * @param insn an instruction index.
* an instruction index. * @param successor index of a successor instruction.
* @param successor * @return true if this edge must be considered in the data flow analysis performed by this
* index of a successor instruction. * analyzer, or false otherwise. The default implementation of this method always
* @return true if this edge must be considered in the data flow analysis * returns true.
* performed by this analyzer, or false otherwise. The default
* implementation of this method always returns true.
*/ */
protected boolean newControlFlowExceptionEdge(final int insn, protected boolean newControlFlowExceptionEdge(final int insn, final int successor) {
final int successor) {
return true; return true;
} }
/** /**
* Creates a control flow graph edge corresponding to an exception handler. * Creates a control flow graph edge corresponding to an exception handler. The default
* The default implementation of this method delegates to * implementation of this method delegates to {@link #newControlFlowExceptionEdge(int, int)
* {@link #newControlFlowExceptionEdge(int, int) * newControlFlowExceptionEdge(int, int)}. It can be overridden in order to construct the
* newControlFlowExceptionEdge(int, int)}. It can be overridden in order to * control flow graph of a method (this method is called by the {@link #analyze analyze} method
* construct the control flow graph of a method (this method is called by * during its visit of the method's code).
* the {@link #analyze analyze} method during its visit of the method's
* code).
* *
* @param insn * @param insn an instruction index.
* an instruction index. * @param tcb TryCatchBlockNode corresponding to this edge.
* @param tcb * @return true if this edge must be considered in the data flow analysis performed by this
* TryCatchBlockNode corresponding to this edge. * analyzer, or false otherwise. The default implementation of this method delegates to
* @return true if this edge must be considered in the data flow analysis * {@link #newControlFlowExceptionEdge(int, int) newControlFlowExceptionEdge(int, int)}.
* performed by this analyzer, or false otherwise. The default
* implementation of this method delegates to
* {@link #newControlFlowExceptionEdge(int, int)
* newControlFlowExceptionEdge(int, int)}.
*/ */
protected boolean newControlFlowExceptionEdge(final int insn, protected boolean newControlFlowExceptionEdge(final int insn, final TryCatchBlockNode tcb) {
final TryCatchBlockNode tcb) {
return newControlFlowExceptionEdge(insn, insns.indexOf(tcb.handler)); return newControlFlowExceptionEdge(insn, insns.indexOf(tcb.handler));
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
private void merge(final int insn, final Frame<V> frame, private void merge(final int insn, final Frame<V> frame, final Subroutine subroutine)
final Subroutine subroutine) throws AnalyzerException { throws AnalyzerException {
Frame<V> oldFrame = frames[insn]; Frame<V> oldFrame = frames[insn];
Subroutine oldSubroutine = subroutines[insn]; Subroutine oldSubroutine = subroutines[insn];
boolean changes; boolean changes;
@ -522,9 +476,8 @@ public class Analyzer<V extends Value> implements Opcodes {
} }
} }
private void merge(final int insn, final Frame<V> beforeJSR, private void merge(final int insn, final Frame<V> beforeJSR, final Frame<V> afterRET,
final Frame<V> afterRET, final Subroutine subroutineBeforeJSR, final Subroutine subroutineBeforeJSR, final boolean[] access) throws AnalyzerException {
final boolean[] access) throws AnalyzerException {
Frame<V> oldFrame = frames[insn]; Frame<V> oldFrame = frames[insn];
Subroutine oldSubroutine = subroutines[insn]; Subroutine oldSubroutine = subroutines[insn];
boolean changes; boolean changes;

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree.analysis; package org.objectweb.asm.tree.analysis;
@ -52,10 +44,10 @@ public class AnalyzerException extends Exception {
this.node = node; this.node = node;
} }
public AnalyzerException(final AbstractInsnNode node, final String msg, public AnalyzerException(final AbstractInsnNode node, final String msg, final Object expected,
final Object expected, final Value encountered) { final Value encountered) {
super((msg == null ? "Expected " : msg + ": expected ") + expected super((msg == null ? "Expected " : msg + ": expected ") + expected + ", but found "
+ ", but found " + encountered); + encountered);
this.node = node; this.node = node;
} }
} }

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree.analysis; package org.objectweb.asm.tree.analysis;
@ -49,8 +41,7 @@ import org.objectweb.asm.tree.TypeInsnNode;
* @author Eric Bruneton * @author Eric Bruneton
* @author Bing Ran * @author Bing Ran
*/ */
public class BasicInterpreter extends Interpreter<BasicValue> implements public class BasicInterpreter extends Interpreter<BasicValue> implements Opcodes {
Opcodes {
public BasicInterpreter() { public BasicInterpreter() {
super(ASM4); super(ASM4);
@ -89,8 +80,7 @@ public class BasicInterpreter extends Interpreter<BasicValue> implements
} }
@Override @Override
public BasicValue newOperation(final AbstractInsnNode insn) public BasicValue newOperation(final AbstractInsnNode insn) throws AnalyzerException {
throws AnalyzerException {
switch (insn.getOpcode()) { switch (insn.getOpcode()) {
case ACONST_NULL: case ACONST_NULL:
return newValue(Type.getObjectType("null")); return newValue(Type.getObjectType("null"));
@ -132,18 +122,14 @@ public class BasicInterpreter extends Interpreter<BasicValue> implements
if (sort == Type.OBJECT || sort == Type.ARRAY) { if (sort == Type.OBJECT || sort == Type.ARRAY) {
return newValue(Type.getObjectType("java/lang/Class")); return newValue(Type.getObjectType("java/lang/Class"));
} else if (sort == Type.METHOD) { } else if (sort == Type.METHOD) {
return newValue(Type return newValue(Type.getObjectType("java/lang/invoke/MethodType"));
.getObjectType("java/lang/invoke/MethodType"));
} else { } else {
throw new IllegalArgumentException("Illegal LDC constant " throw new IllegalArgumentException("Illegal LDC constant " + cst);
+ cst);
} }
} else if (cst instanceof Handle) { } else if (cst instanceof Handle) {
return newValue(Type return newValue(Type.getObjectType("java/lang/invoke/MethodHandle"));
.getObjectType("java/lang/invoke/MethodHandle"));
} else { } else {
throw new IllegalArgumentException("Illegal LDC constant " throw new IllegalArgumentException("Illegal LDC constant " + cst);
+ cst);
} }
case JSR: case JSR:
return BasicValue.RETURNADDRESS_VALUE; return BasicValue.RETURNADDRESS_VALUE;
@ -157,14 +143,14 @@ public class BasicInterpreter extends Interpreter<BasicValue> implements
} }
@Override @Override
public BasicValue copyOperation(final AbstractInsnNode insn, public BasicValue copyOperation(final AbstractInsnNode insn, final BasicValue value)
final BasicValue value) throws AnalyzerException { throws AnalyzerException {
return value; return value;
} }
@Override @Override
public BasicValue unaryOperation(final AbstractInsnNode insn, public BasicValue unaryOperation(final AbstractInsnNode insn, final BasicValue value)
final BasicValue value) throws AnalyzerException { throws AnalyzerException {
switch (insn.getOpcode()) { switch (insn.getOpcode()) {
case INEG: case INEG:
case IINC: case IINC:
@ -251,9 +237,8 @@ public class BasicInterpreter extends Interpreter<BasicValue> implements
} }
@Override @Override
public BasicValue binaryOperation(final AbstractInsnNode insn, public BasicValue binaryOperation(final AbstractInsnNode insn, final BasicValue value1,
final BasicValue value1, final BasicValue value2) final BasicValue value2) throws AnalyzerException {
throws AnalyzerException {
switch (insn.getOpcode()) { switch (insn.getOpcode()) {
case IALOAD: case IALOAD:
case BALOAD: case BALOAD:
@ -322,9 +307,8 @@ public class BasicInterpreter extends Interpreter<BasicValue> implements
} }
@Override @Override
public BasicValue ternaryOperation(final AbstractInsnNode insn, public BasicValue ternaryOperation(final AbstractInsnNode insn, final BasicValue value1,
final BasicValue value1, final BasicValue value2, final BasicValue value2, final BasicValue value3) throws AnalyzerException {
final BasicValue value3) throws AnalyzerException {
return null; return null;
} }
@ -335,18 +319,15 @@ public class BasicInterpreter extends Interpreter<BasicValue> implements
if (opcode == MULTIANEWARRAY) { if (opcode == MULTIANEWARRAY) {
return newValue(Type.getType(((MultiANewArrayInsnNode) insn).desc)); return newValue(Type.getType(((MultiANewArrayInsnNode) insn).desc));
} else if (opcode == INVOKEDYNAMIC) { } else if (opcode == INVOKEDYNAMIC) {
return newValue(Type return newValue(Type.getReturnType(((InvokeDynamicInsnNode) insn).desc));
.getReturnType(((InvokeDynamicInsnNode) insn).desc));
} else { } else {
return newValue(Type.getReturnType(((MethodInsnNode) insn).desc)); return newValue(Type.getReturnType(((MethodInsnNode) insn).desc));
} }
} }
@Override @Override
public void returnOperation(final AbstractInsnNode insn, public void returnOperation(final AbstractInsnNode insn, final BasicValue value,
final BasicValue value, final BasicValue expected) final BasicValue expected) throws AnalyzerException {}
throws AnalyzerException {
}
@Override @Override
public BasicValue merge(final BasicValue v, final BasicValue w) { public BasicValue merge(final BasicValue v, final BasicValue w) {

View File

@ -1,40 +1,31 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree.analysis; package org.objectweb.asm.tree.analysis;
import org.objectweb.asm.Type; import org.objectweb.asm.Type;
/** /**
* A {@link Value} that is represented by its type in a seven types type system. * A {@link Value} that is represented by its type in a seven types type system. This type system
* This type system distinguishes the UNINITIALZED, INT, FLOAT, LONG, DOUBLE, * distinguishes the UNINITIALZED, INT, FLOAT, LONG, DOUBLE, REFERENCE and RETURNADDRESS types.
* REFERENCE and RETURNADDRESS types.
* *
* @author Eric Bruneton * @author Eric Bruneton
*/ */
@ -48,14 +39,12 @@ public class BasicValue implements Value {
public static final BasicValue LONG_VALUE = new BasicValue(Type.LONG_TYPE); public static final BasicValue LONG_VALUE = new BasicValue(Type.LONG_TYPE);
public static final BasicValue DOUBLE_VALUE = new BasicValue( public static final BasicValue DOUBLE_VALUE = new BasicValue(Type.DOUBLE_TYPE);
Type.DOUBLE_TYPE);
public static final BasicValue REFERENCE_VALUE = new BasicValue( public static final BasicValue REFERENCE_VALUE =
Type.getObjectType("java/lang/Object")); new BasicValue(Type.getObjectType("java/lang/Object"));
public static final BasicValue RETURNADDRESS_VALUE = new BasicValue( public static final BasicValue RETURNADDRESS_VALUE = new BasicValue(Type.VOID_TYPE);
Type.VOID_TYPE);
private final Type type; private final Type type;
@ -72,8 +61,7 @@ public class BasicValue implements Value {
} }
public boolean isReference() { public boolean isReference() {
return type != null return type != null && (type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY);
&& (type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY);
} }
@Override @Override

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree.analysis; package org.objectweb.asm.tree.analysis;
@ -38,8 +30,7 @@ import org.objectweb.asm.tree.InvokeDynamicInsnNode;
import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodInsnNode;
/** /**
* An extended {@link BasicInterpreter} that checks that bytecode instructions * An extended {@link BasicInterpreter} that checks that bytecode instructions are correctly used.
* are correctly used.
* *
* @author Eric Bruneton * @author Eric Bruneton
* @author Bing Ran * @author Bing Ran
@ -55,8 +46,8 @@ public class BasicVerifier extends BasicInterpreter {
} }
@Override @Override
public BasicValue copyOperation(final AbstractInsnNode insn, public BasicValue copyOperation(final AbstractInsnNode insn, final BasicValue value)
final BasicValue value) throws AnalyzerException { throws AnalyzerException {
Value expected; Value expected;
switch (insn.getOpcode()) { switch (insn.getOpcode()) {
case ILOAD: case ILOAD:
@ -77,13 +68,11 @@ public class BasicVerifier extends BasicInterpreter {
break; break;
case ALOAD: case ALOAD:
if (!value.isReference()) { if (!value.isReference()) {
throw new AnalyzerException(insn, null, "an object reference", throw new AnalyzerException(insn, null, "an object reference", value);
value);
} }
return value; return value;
case ASTORE: case ASTORE:
if (!value.isReference() if (!value.isReference() && !BasicValue.RETURNADDRESS_VALUE.equals(value)) {
&& !BasicValue.RETURNADDRESS_VALUE.equals(value)) {
throw new AnalyzerException(insn, null, throw new AnalyzerException(insn, null,
"an object reference or a return address", value); "an object reference or a return address", value);
} }
@ -98,8 +87,8 @@ public class BasicVerifier extends BasicInterpreter {
} }
@Override @Override
public BasicValue unaryOperation(final AbstractInsnNode insn, public BasicValue unaryOperation(final AbstractInsnNode insn, final BasicValue value)
final BasicValue value) throws AnalyzerException { throws AnalyzerException {
BasicValue expected; BasicValue expected;
switch (insn.getOpcode()) { switch (insn.getOpcode()) {
case INEG: case INEG:
@ -145,19 +134,16 @@ public class BasicVerifier extends BasicInterpreter {
expected = BasicValue.DOUBLE_VALUE; expected = BasicValue.DOUBLE_VALUE;
break; break;
case GETFIELD: case GETFIELD:
expected = newValue(Type expected = newValue(Type.getObjectType(((FieldInsnNode) insn).owner));
.getObjectType(((FieldInsnNode) insn).owner));
break; break;
case CHECKCAST: case CHECKCAST:
if (!value.isReference()) { if (!value.isReference()) {
throw new AnalyzerException(insn, null, "an object reference", throw new AnalyzerException(insn, null, "an object reference", value);
value);
} }
return super.unaryOperation(insn, value); return super.unaryOperation(insn, value);
case ARRAYLENGTH: case ARRAYLENGTH:
if (!isArrayValue(value)) { if (!isArrayValue(value)) {
throw new AnalyzerException(insn, null, "an array reference", throw new AnalyzerException(insn, null, "an array reference", value);
value);
} }
return super.unaryOperation(insn, value); return super.unaryOperation(insn, value);
case ARETURN: case ARETURN:
@ -168,8 +154,7 @@ public class BasicVerifier extends BasicInterpreter {
case IFNULL: case IFNULL:
case IFNONNULL: case IFNONNULL:
if (!value.isReference()) { if (!value.isReference()) {
throw new AnalyzerException(insn, null, "an object reference", throw new AnalyzerException(insn, null, "an object reference", value);
value);
} }
return super.unaryOperation(insn, value); return super.unaryOperation(insn, value);
case PUTSTATIC: case PUTSTATIC:
@ -185,9 +170,8 @@ public class BasicVerifier extends BasicInterpreter {
} }
@Override @Override
public BasicValue binaryOperation(final AbstractInsnNode insn, public BasicValue binaryOperation(final AbstractInsnNode insn, final BasicValue value1,
final BasicValue value1, final BasicValue value2) final BasicValue value2) throws AnalyzerException {
throws AnalyzerException {
BasicValue expected1; BasicValue expected1;
BasicValue expected2; BasicValue expected2;
switch (insn.getOpcode()) { switch (insn.getOpcode()) {
@ -299,11 +283,9 @@ public class BasicVerifier extends BasicInterpreter {
throw new Error("Internal error."); throw new Error("Internal error.");
} }
if (!isSubTypeOf(value1, expected1)) { if (!isSubTypeOf(value1, expected1)) {
throw new AnalyzerException(insn, "First argument", expected1, throw new AnalyzerException(insn, "First argument", expected1, value1);
value1);
} else if (!isSubTypeOf(value2, expected2)) { } else if (!isSubTypeOf(value2, expected2)) {
throw new AnalyzerException(insn, "Second argument", expected2, throw new AnalyzerException(insn, "Second argument", expected2, value2);
value2);
} }
if (insn.getOpcode() == AALOAD) { if (insn.getOpcode() == AALOAD) {
return getElementValue(value1); return getElementValue(value1);
@ -313,9 +295,8 @@ public class BasicVerifier extends BasicInterpreter {
} }
@Override @Override
public BasicValue ternaryOperation(final AbstractInsnNode insn, public BasicValue ternaryOperation(final AbstractInsnNode insn, final BasicValue value1,
final BasicValue value1, final BasicValue value2, final BasicValue value2, final BasicValue value3) throws AnalyzerException {
final BasicValue value3) throws AnalyzerException {
BasicValue expected1; BasicValue expected1;
BasicValue expected3; BasicValue expected3;
switch (insn.getOpcode()) { switch (insn.getOpcode()) {
@ -359,14 +340,12 @@ public class BasicVerifier extends BasicInterpreter {
throw new Error("Internal error."); throw new Error("Internal error.");
} }
if (!isSubTypeOf(value1, expected1)) { if (!isSubTypeOf(value1, expected1)) {
throw new AnalyzerException(insn, "First argument", "a " throw new AnalyzerException(insn, "First argument",
+ expected1 + " array reference", value1); "a " + expected1 + " array reference", value1);
} else if (!BasicValue.INT_VALUE.equals(value2)) { } else if (!BasicValue.INT_VALUE.equals(value2)) {
throw new AnalyzerException(insn, "Second argument", throw new AnalyzerException(insn, "Second argument", BasicValue.INT_VALUE, value2);
BasicValue.INT_VALUE, value2);
} else if (!isSubTypeOf(value3, expected3)) { } else if (!isSubTypeOf(value3, expected3)) {
throw new AnalyzerException(insn, "Third argument", expected3, throw new AnalyzerException(insn, "Third argument", expected3, value3);
value3);
} }
return null; return null;
} }
@ -378,8 +357,7 @@ public class BasicVerifier extends BasicInterpreter {
if (opcode == MULTIANEWARRAY) { if (opcode == MULTIANEWARRAY) {
for (int i = 0; i < values.size(); ++i) { for (int i = 0; i < values.size(); ++i) {
if (!BasicValue.INT_VALUE.equals(values.get(i))) { if (!BasicValue.INT_VALUE.equals(values.get(i))) {
throw new AnalyzerException(insn, null, throw new AnalyzerException(insn, null, BasicValue.INT_VALUE, values.get(i));
BasicValue.INT_VALUE, values.get(i));
} }
} }
} else { } else {
@ -388,8 +366,8 @@ public class BasicVerifier extends BasicInterpreter {
if (opcode != INVOKESTATIC && opcode != INVOKEDYNAMIC) { if (opcode != INVOKESTATIC && opcode != INVOKEDYNAMIC) {
Type owner = Type.getObjectType(((MethodInsnNode) insn).owner); Type owner = Type.getObjectType(((MethodInsnNode) insn).owner);
if (!isSubTypeOf(values.get(i++), newValue(owner))) { if (!isSubTypeOf(values.get(i++), newValue(owner))) {
throw new AnalyzerException(insn, "Method owner", throw new AnalyzerException(insn, "Method owner", newValue(owner),
newValue(owner), values.get(0)); values.get(0));
} }
} }
String desc = (opcode == INVOKEDYNAMIC) ? ((InvokeDynamicInsnNode) insn).desc String desc = (opcode == INVOKEDYNAMIC) ? ((InvokeDynamicInsnNode) insn).desc
@ -399,8 +377,7 @@ public class BasicVerifier extends BasicInterpreter {
BasicValue expected = newValue(args[j++]); BasicValue expected = newValue(args[j++]);
BasicValue encountered = values.get(i++); BasicValue encountered = values.get(i++);
if (!isSubTypeOf(encountered, expected)) { if (!isSubTypeOf(encountered, expected)) {
throw new AnalyzerException(insn, "Argument " + j, throw new AnalyzerException(insn, "Argument " + j, expected, encountered);
expected, encountered);
} }
} }
} }
@ -408,12 +385,10 @@ public class BasicVerifier extends BasicInterpreter {
} }
@Override @Override
public void returnOperation(final AbstractInsnNode insn, public void returnOperation(final AbstractInsnNode insn, final BasicValue value,
final BasicValue value, final BasicValue expected) final BasicValue expected) throws AnalyzerException {
throws AnalyzerException {
if (!isSubTypeOf(value, expected)) { if (!isSubTypeOf(value, expected)) {
throw new AnalyzerException(insn, "Incompatible return type", throw new AnalyzerException(insn, "Incompatible return type", expected, value);
expected, value);
} }
} }
@ -426,8 +401,7 @@ public class BasicVerifier extends BasicInterpreter {
return BasicValue.REFERENCE_VALUE; return BasicValue.REFERENCE_VALUE;
} }
protected boolean isSubTypeOf(final BasicValue value, protected boolean isSubTypeOf(final BasicValue value, final BasicValue expected) {
final BasicValue expected) {
return value.equals(expected); return value.equals(expected);
} }
} }

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree.analysis; package org.objectweb.asm.tree.analysis;
@ -42,10 +34,9 @@ import org.objectweb.asm.tree.MultiANewArrayInsnNode;
import org.objectweb.asm.tree.VarInsnNode; import org.objectweb.asm.tree.VarInsnNode;
/** /**
* A symbolic execution stack frame. A stack frame contains a set of local * A symbolic execution stack frame. A stack frame contains a set of local variable slots, and an
* variable slots, and an operand stack. Warning: long and double values are * operand stack. Warning: long and double values are represented by <i>two</i> slots in local
* represented by <i>two</i> slots in local variables, and by <i>one</i> slot in * variables, and by <i>one</i> slot in the operand stack.
* the operand stack.
* *
* @param <V> type of the Value used for the analysis. * @param <V> type of the Value used for the analysis.
* *
@ -54,8 +45,7 @@ import org.objectweb.asm.tree.VarInsnNode;
public class Frame<V extends Value> { public class Frame<V extends Value> {
/** /**
* The expected return type of the analyzed method, or <tt>null</tt> if the * The expected return type of the analyzed method, or <tt>null</tt> if the method returns void.
* method returns void.
*/ */
private V returnValue; private V returnValue;
@ -111,8 +101,8 @@ public class Frame<V extends Value> {
/** /**
* Sets the expected return type of the analyzed method. * Sets the expected return type of the analyzed method.
* *
* @param v the expected return type of the analyzed method, or <tt>null</tt> if * @param v the expected return type of the analyzed method, or <tt>null</tt> if the method
* the method returns void. * returns void.
*/ */
public void setReturn(final V v) { public void setReturn(final V v) {
returnValue = v; returnValue = v;
@ -150,14 +140,15 @@ public class Frame<V extends Value> {
*/ */
public void setLocal(final int i, final V value) throws IndexOutOfBoundsException { public void setLocal(final int i, final V value) throws IndexOutOfBoundsException {
if (i >= locals) { if (i >= locals) {
throw new IndexOutOfBoundsException("Trying to access an inexistant local variable " + i); throw new IndexOutOfBoundsException(
"Trying to access an inexistant local variable " + i);
} }
values[i] = value; values[i] = value;
} }
/** /**
* Returns the number of values in the operand stack of this frame. Long and * Returns the number of values in the operand stack of this frame. Long and double values are
* double values are treated as single values. * treated as single values.
* *
* @return the number of values in the operand stack of this frame. * @return the number of values in the operand stack of this frame.
*/ */
@ -213,7 +204,8 @@ public class Frame<V extends Value> {
values[top++ + locals] = value; values[top++ + locals] = value;
} }
public void execute(final AbstractInsnNode insn, final Interpreter<V> interpreter) throws AnalyzerException { public void execute(final AbstractInsnNode insn, final Interpreter<V> interpreter)
throws AnalyzerException {
V value1, value2, value3, value4; V value1, value2, value3, value4;
List<V> values; List<V> values;
int var; int var;
@ -645,11 +637,12 @@ public class Frame<V extends Value> {
* *
* @param frame a frame. * @param frame a frame.
* @param interpreter the interpreter used to merge values. * @param interpreter the interpreter used to merge values.
* @return <tt>true</tt> if this frame has been changed as a result of the merge * @return <tt>true</tt> if this frame has been changed as a result of the merge operation, or
* operation, or <tt>false</tt> otherwise. * <tt>false</tt> otherwise.
* @throws AnalyzerException if the frames have incompatible sizes. * @throws AnalyzerException if the frames have incompatible sizes.
*/ */
public boolean merge(final Frame<? extends V> frame, final Interpreter<V> interpreter) throws AnalyzerException { public boolean merge(final Frame<? extends V> frame, final Interpreter<V> interpreter)
throws AnalyzerException {
if (top != frame.top) { if (top != frame.top) {
throw new AnalyzerException(null, "Incompatible stack heights"); throw new AnalyzerException(null, "Incompatible stack heights");
} }
@ -668,10 +661,10 @@ public class Frame<V extends Value> {
* Merges this frame with the given frame (case of a RET instruction). * Merges this frame with the given frame (case of a RET instruction).
* *
* @param frame a frame * @param frame a frame
* @param access the local variables that have been accessed by the subroutine * @param access the local variables that have been accessed by the subroutine to which the RET
* to which the RET instruction corresponds. * instruction corresponds.
* @return <tt>true</tt> if this frame has been changed as a result of the merge * @return <tt>true</tt> if this frame has been changed as a result of the merge operation, or
* operation, or <tt>false</tt> otherwise. * <tt>false</tt> otherwise.
*/ */
public boolean merge(final Frame<? extends V> frame, final boolean[] access) { public boolean merge(final Frame<? extends V> frame, final boolean[] access) {
boolean changes = false; boolean changes = false;

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree.analysis; package org.objectweb.asm.tree.analysis;
@ -35,15 +27,13 @@ import org.objectweb.asm.Type;
import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.AbstractInsnNode;
/** /**
* A semantic bytecode interpreter. More precisely, this interpreter only * A semantic bytecode interpreter. More precisely, this interpreter only manages the computation of
* manages the computation of values from other values: it does not manage the * values from other values: it does not manage the transfer of values to or from the stack, and to
* transfer of values to or from the stack, and to or from the local variables. * or from the local variables. This separation allows a generic bytecode {@link Analyzer} to work
* This separation allows a generic bytecode {@link Analyzer} to work with * with various semantic interpreters, without needing to duplicate the code to simulate the
* various semantic interpreters, without needing to duplicate the code to * transfer of values.
* simulate the transfer of values.
* *
* @param <V> * @param <V> type of the Value used for the analysis.
* type of the Value used for the analysis.
* *
* @author Eric Bruneton * @author Eric Bruneton
*/ */
@ -58,169 +48,133 @@ public abstract class Interpreter<V extends Value> {
/** /**
* Creates a new value that represents the given type. * Creates a new value that represents the given type.
* *
* Called for method parameters (including <code>this</code>), exception * Called for method parameters (including <code>this</code>), exception handler variable and
* handler variable and with <code>null</code> type for variables reserved * with <code>null</code> type for variables reserved by long and double types.
* by long and double types.
* *
* @param type * @param type a primitive or reference type, or <tt>null</tt> to represent an uninitialized
* a primitive or reference type, or <tt>null</tt> to represent * value.
* an uninitialized value. * @return a value that represents the given type. The size of the returned value must be equal
* @return a value that represents the given type. The size of the returned * to the size of the given type.
* value must be equal to the size of the given type.
*/ */
public abstract V newValue(Type type); public abstract V newValue(Type type);
/** /**
* Interprets a bytecode instruction without arguments. This method is * Interprets a bytecode instruction without arguments. This method is called for the following
* called for the following opcodes: * opcodes:
* *
* ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, * ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, LCONST_0,
* ICONST_5, LCONST_0, LCONST_1, FCONST_0, FCONST_1, FCONST_2, DCONST_0, * LCONST_1, FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, BIPUSH, SIPUSH, LDC, JSR,
* DCONST_1, BIPUSH, SIPUSH, LDC, JSR, GETSTATIC, NEW * GETSTATIC, NEW
* *
* @param insn * @param insn the bytecode instruction to be interpreted.
* the bytecode instruction to be interpreted.
* @return the result of the interpretation of the given instruction. * @return the result of the interpretation of the given instruction.
* @throws AnalyzerException * @throws AnalyzerException if an error occured during the interpretation.
* if an error occured during the interpretation.
*/ */
public abstract V newOperation(AbstractInsnNode insn) public abstract V newOperation(AbstractInsnNode insn) throws AnalyzerException;
throws AnalyzerException;
/** /**
* Interprets a bytecode instruction that moves a value on the stack or to * Interprets a bytecode instruction that moves a value on the stack or to or from local
* or from local variables. This method is called for the following opcodes: * variables. This method is called for the following opcodes:
* *
* ILOAD, LLOAD, FLOAD, DLOAD, ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, * ILOAD, LLOAD, FLOAD, DLOAD, ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE, DUP, DUP_X1,
* ASTORE, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, SWAP * DUP_X2, DUP2, DUP2_X1, DUP2_X2, SWAP
* *
* @param insn * @param insn the bytecode instruction to be interpreted.
* the bytecode instruction to be interpreted. * @param value the value that must be moved by the instruction.
* @param value * @return the result of the interpretation of the given instruction. The returned value must be
* the value that must be moved by the instruction. * <tt>equal</tt> to the given value.
* @return the result of the interpretation of the given instruction. The * @throws AnalyzerException if an error occured during the interpretation.
* returned value must be <tt>equal</tt> to the given value.
* @throws AnalyzerException
* if an error occured during the interpretation.
*/ */
public abstract V copyOperation(AbstractInsnNode insn, V value) public abstract V copyOperation(AbstractInsnNode insn, V value) throws AnalyzerException;
throws AnalyzerException;
/** /**
* Interprets a bytecode instruction with a single argument. This method is * Interprets a bytecode instruction with a single argument. This method is called for the
* called for the following opcodes: * following opcodes:
* *
* INEG, LNEG, FNEG, DNEG, IINC, I2L, I2F, I2D, L2I, L2F, L2D, F2I, F2L, * INEG, LNEG, FNEG, DNEG, IINC, I2L, I2F, I2D, L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F,
* F2D, D2I, D2L, D2F, I2B, I2C, I2S, IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, * I2B, I2C, I2S, IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, TABLESWITCH, LOOKUPSWITCH, IRETURN,
* TABLESWITCH, LOOKUPSWITCH, IRETURN, LRETURN, FRETURN, DRETURN, ARETURN, * LRETURN, FRETURN, DRETURN, ARETURN, PUTSTATIC, GETFIELD, NEWARRAY, ANEWARRAY, ARRAYLENGTH,
* PUTSTATIC, GETFIELD, NEWARRAY, ANEWARRAY, ARRAYLENGTH, ATHROW, CHECKCAST, * ATHROW, CHECKCAST, INSTANCEOF, MONITORENTER, MONITOREXIT, IFNULL, IFNONNULL
* INSTANCEOF, MONITORENTER, MONITOREXIT, IFNULL, IFNONNULL
* *
* @param insn * @param insn the bytecode instruction to be interpreted.
* the bytecode instruction to be interpreted. * @param value the argument of the instruction to be interpreted.
* @param value
* the argument of the instruction to be interpreted.
* @return the result of the interpretation of the given instruction. * @return the result of the interpretation of the given instruction.
* @throws AnalyzerException * @throws AnalyzerException if an error occured during the interpretation.
* if an error occured during the interpretation.
*/ */
public abstract V unaryOperation(AbstractInsnNode insn, V value) public abstract V unaryOperation(AbstractInsnNode insn, V value) throws AnalyzerException;
throws AnalyzerException;
/** /**
* Interprets a bytecode instruction with two arguments. This method is * Interprets a bytecode instruction with two arguments. This method is called for the following
* called for the following opcodes: * opcodes:
* *
* IALOAD, LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IADD, * IALOAD, LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IADD, LADD, FADD, DADD, ISUB,
* LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB, IMUL, LMUL, FMUL, DMUL, IDIV, * LSUB, FSUB, DSUB, IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM, FREM, DREM,
* LDIV, FDIV, DDIV, IREM, LREM, FREM, DREM, ISHL, LSHL, ISHR, LSHR, IUSHR, * ISHL, LSHL, ISHR, LSHR, IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, LCMP, FCMPL, FCMPG,
* LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, LCMP, FCMPL, FCMPG, DCMPL, * DCMPL, DCMPG, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ACMPEQ,
* DCMPG, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, * IF_ACMPNE, PUTFIELD
* IF_ACMPEQ, IF_ACMPNE, PUTFIELD
* *
* @param insn * @param insn the bytecode instruction to be interpreted.
* the bytecode instruction to be interpreted. * @param value1 the first argument of the instruction to be interpreted.
* @param value1 * @param value2 the second argument of the instruction to be interpreted.
* the first argument of the instruction to be interpreted.
* @param value2
* the second argument of the instruction to be interpreted.
* @return the result of the interpretation of the given instruction. * @return the result of the interpretation of the given instruction.
* @throws AnalyzerException * @throws AnalyzerException if an error occured during the interpretation.
* if an error occured during the interpretation.
*/ */
public abstract V binaryOperation(AbstractInsnNode insn, V value1, V value2) public abstract V binaryOperation(AbstractInsnNode insn, V value1, V value2)
throws AnalyzerException; throws AnalyzerException;
/** /**
* Interprets a bytecode instruction with three arguments. This method is * Interprets a bytecode instruction with three arguments. This method is called for the
* called for the following opcodes: * following opcodes:
* *
* IASTORE, LASTORE, FASTORE, DASTORE, AASTORE, BASTORE, CASTORE, SASTORE * IASTORE, LASTORE, FASTORE, DASTORE, AASTORE, BASTORE, CASTORE, SASTORE
* *
* @param insn * @param insn the bytecode instruction to be interpreted.
* the bytecode instruction to be interpreted. * @param value1 the first argument of the instruction to be interpreted.
* @param value1 * @param value2 the second argument of the instruction to be interpreted.
* the first argument of the instruction to be interpreted. * @param value3 the third argument of the instruction to be interpreted.
* @param value2
* the second argument of the instruction to be interpreted.
* @param value3
* the third argument of the instruction to be interpreted.
* @return the result of the interpretation of the given instruction. * @return the result of the interpretation of the given instruction.
* @throws AnalyzerException * @throws AnalyzerException if an error occured during the interpretation.
* if an error occured during the interpretation.
*/ */
public abstract V ternaryOperation(AbstractInsnNode insn, V value1, public abstract V ternaryOperation(AbstractInsnNode insn, V value1, V value2, V value3)
V value2, V value3) throws AnalyzerException; throws AnalyzerException;
/** /**
* Interprets a bytecode instruction with a variable number of arguments. * Interprets a bytecode instruction with a variable number of arguments. This method is called
* This method is called for the following opcodes: * for the following opcodes:
* *
* INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC, INVOKEINTERFACE, * INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC, INVOKEINTERFACE, MULTIANEWARRAY and INVOKEDYNAMIC
* MULTIANEWARRAY and INVOKEDYNAMIC
* *
* @param insn * @param insn the bytecode instruction to be interpreted.
* the bytecode instruction to be interpreted. * @param values the arguments of the instruction to be interpreted.
* @param values
* the arguments of the instruction to be interpreted.
* @return the result of the interpretation of the given instruction. * @return the result of the interpretation of the given instruction.
* @throws AnalyzerException * @throws AnalyzerException if an error occured during the interpretation.
* if an error occured during the interpretation.
*/ */
public abstract V naryOperation(AbstractInsnNode insn, public abstract V naryOperation(AbstractInsnNode insn, List<? extends V> values)
List<? extends V> values) throws AnalyzerException; throws AnalyzerException;
/** /**
* Interprets a bytecode return instruction. This method is called for the * Interprets a bytecode return instruction. This method is called for the following opcodes:
* following opcodes:
* *
* IRETURN, LRETURN, FRETURN, DRETURN, ARETURN * IRETURN, LRETURN, FRETURN, DRETURN, ARETURN
* *
* @param insn * @param insn the bytecode instruction to be interpreted.
* the bytecode instruction to be interpreted. * @param value the argument of the instruction to be interpreted.
* @param value * @param expected the expected return type of the analyzed method.
* the argument of the instruction to be interpreted. * @throws AnalyzerException if an error occured during the interpretation.
* @param expected
* the expected return type of the analyzed method.
* @throws AnalyzerException
* if an error occured during the interpretation.
*/ */
public abstract void returnOperation(AbstractInsnNode insn, V value, public abstract void returnOperation(AbstractInsnNode insn, V value, V expected)
V expected) throws AnalyzerException; throws AnalyzerException;
/** /**
* Merges two values. The merge operation must return a value that * Merges two values. The merge operation must return a value that represents both values (for
* represents both values (for instance, if the two values are two types, * instance, if the two values are two types, the merged value must be a common super type of
* the merged value must be a common super type of the two types. If the two * the two types. If the two values are integer intervals, the merged value must be an interval
* values are integer intervals, the merged value must be an interval that * that contains the previous ones. Likewise for other types of values).
* contains the previous ones. Likewise for other types of values).
* *
* @param v * @param v a value.
* a value. * @param w another value.
* @param w * @return the merged value. If the merged value is equal to <tt>v</tt>, this method <i>must</i>
* another value. * return <tt>v</tt>.
* @return the merged value. If the merged value is equal to <tt>v</tt>,
* this method <i>must</i> return <tt>v</tt>.
*/ */
public abstract V merge(V v, V w); public abstract V merge(V v, V w);
} }

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree.analysis; package org.objectweb.asm.tree.analysis;
@ -34,9 +26,9 @@ import java.util.List;
import org.objectweb.asm.Type; import org.objectweb.asm.Type;
/** /**
* An extended {@link BasicVerifier} that performs more precise verifications. * An extended {@link BasicVerifier} that performs more precise verifications. This verifier
* This verifier computes exact class types, instead of using a single "object * computes exact class types, instead of using a single "object reference" type (as done in the
* reference" type (as done in the {@link BasicVerifier}). * {@link BasicVerifier}).
* *
* @author Eric Bruneton * @author Eric Bruneton
* @author Bing Ran * @author Bing Ran
@ -76,43 +68,33 @@ public class SimpleVerifier extends BasicVerifier {
} }
/** /**
* Constructs a new {@link SimpleVerifier} to verify a specific class. This * Constructs a new {@link SimpleVerifier} to verify a specific class. This class will not be
* class will not be loaded into the JVM since it may be incorrect. * loaded into the JVM since it may be incorrect.
* *
* @param currentClass * @param currentClass the class that is verified.
* the class that is verified. * @param currentSuperClass the super class of the class that is verified.
* @param currentSuperClass * @param isInterface if the class that is verified is an interface.
* the super class of the class that is verified.
* @param isInterface
* if the class that is verified is an interface.
*/ */
public SimpleVerifier(final Type currentClass, public SimpleVerifier(final Type currentClass, final Type currentSuperClass,
final Type currentSuperClass, final boolean isInterface) { final boolean isInterface) {
this(currentClass, currentSuperClass, null, isInterface); this(currentClass, currentSuperClass, null, isInterface);
} }
/** /**
* Constructs a new {@link SimpleVerifier} to verify a specific class. This * Constructs a new {@link SimpleVerifier} to verify a specific class. This class will not be
* class will not be loaded into the JVM since it may be incorrect. * loaded into the JVM since it may be incorrect.
* *
* @param currentClass * @param currentClass the class that is verified.
* the class that is verified. * @param currentSuperClass the super class of the class that is verified.
* @param currentSuperClass * @param currentClassInterfaces the interfaces implemented by the class that is verified.
* the super class of the class that is verified. * @param isInterface if the class that is verified is an interface.
* @param currentClassInterfaces
* the interfaces implemented by the class that is verified.
* @param isInterface
* if the class that is verified is an interface.
*/ */
public SimpleVerifier(final Type currentClass, public SimpleVerifier(final Type currentClass, final Type currentSuperClass,
final Type currentSuperClass,
final List<Type> currentClassInterfaces, final boolean isInterface) { final List<Type> currentClassInterfaces, final boolean isInterface) {
this(ASM4, currentClass, currentSuperClass, currentClassInterfaces, this(ASM4, currentClass, currentSuperClass, currentClassInterfaces, isInterface);
isInterface);
} }
protected SimpleVerifier(final int api, final Type currentClass, protected SimpleVerifier(final int api, final Type currentClass, final Type currentSuperClass,
final Type currentSuperClass,
final List<Type> currentClassInterfaces, final boolean isInterface) { final List<Type> currentClassInterfaces, final boolean isInterface) {
super(api); super(api);
this.currentClass = currentClass; this.currentClass = currentClass;
@ -122,12 +104,10 @@ public class SimpleVerifier extends BasicVerifier {
} }
/** /**
* Set the <code>ClassLoader</code> which will be used to load referenced * Set the <code>ClassLoader</code> which will be used to load referenced classes. This is
* classes. This is useful if you are verifying multiple interdependent * useful if you are verifying multiple interdependent classes.
* classes.
* *
* @param loader * @param loader a <code>ClassLoader</code> to use
* a <code>ClassLoader</code> to use
*/ */
public void setClassLoader(final ClassLoader loader) { public void setClassLoader(final ClassLoader loader) {
this.loader = loader; this.loader = loader;
@ -169,8 +149,7 @@ public class SimpleVerifier extends BasicVerifier {
@Override @Override
protected boolean isArrayValue(final BasicValue value) { protected boolean isArrayValue(final BasicValue value) {
Type t = value.getType(); Type t = value.getType();
return t != null return t != null && ("Lnull;".equals(t.getDescriptor()) || t.getSort() == Type.ARRAY);
&& ("Lnull;".equals(t.getDescriptor()) || t.getSort() == Type.ARRAY);
} }
@Override @Override
@ -179,8 +158,7 @@ public class SimpleVerifier extends BasicVerifier {
Type arrayType = objectArrayValue.getType(); Type arrayType = objectArrayValue.getType();
if (arrayType != null) { if (arrayType != null) {
if (arrayType.getSort() == Type.ARRAY) { if (arrayType.getSort() == Type.ARRAY) {
return newValue(Type.getType(arrayType.getDescriptor() return newValue(Type.getType(arrayType.getDescriptor().substring(1)));
.substring(1)));
} else if ("Lnull;".equals(arrayType.getDescriptor())) { } else if ("Lnull;".equals(arrayType.getDescriptor())) {
return objectArrayValue; return objectArrayValue;
} }
@ -189,8 +167,7 @@ public class SimpleVerifier extends BasicVerifier {
} }
@Override @Override
protected boolean isSubTypeOf(final BasicValue value, protected boolean isSubTypeOf(final BasicValue value, final BasicValue expected) {
final BasicValue expected) {
Type expectedType = expected.getType(); Type expectedType = expected.getType();
Type type = value.getType(); Type type = value.getType();
switch (expectedType.getSort()) { switch (expectedType.getSort()) {
@ -203,8 +180,7 @@ public class SimpleVerifier extends BasicVerifier {
case Type.OBJECT: case Type.OBJECT:
if ("Lnull;".equals(type.getDescriptor())) { if ("Lnull;".equals(type.getDescriptor())) {
return true; return true;
} else if (type.getSort() == Type.OBJECT } else if (type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY) {
|| type.getSort() == Type.ARRAY) {
return isAssignableFrom(expectedType, type); return isAssignableFrom(expectedType, type);
} else { } else {
return false; return false;
@ -219,10 +195,8 @@ public class SimpleVerifier extends BasicVerifier {
if (!v.equals(w)) { if (!v.equals(w)) {
Type t = v.getType(); Type t = v.getType();
Type u = w.getType(); Type u = w.getType();
if (t != null if (t != null && (t.getSort() == Type.OBJECT || t.getSort() == Type.ARRAY)) {
&& (t.getSort() == Type.OBJECT || t.getSort() == Type.ARRAY)) { if (u != null && (u.getSort() == Type.OBJECT || u.getSort() == Type.ARRAY)) {
if (u != null
&& (u.getSort() == Type.OBJECT || u.getSort() == Type.ARRAY)) {
if ("Lnull;".equals(t.getDescriptor())) { if ("Lnull;".equals(t.getDescriptor())) {
return w; return w;
} }
@ -279,8 +253,7 @@ public class SimpleVerifier extends BasicVerifier {
return false; return false;
} else { } else {
if (isInterface) { if (isInterface) {
return u.getSort() == Type.OBJECT return u.getSort() == Type.OBJECT || u.getSort() == Type.ARRAY;
|| u.getSort() == Type.ARRAY;
} }
return isAssignableFrom(t, getSuperClass(u)); return isAssignableFrom(t, getSuperClass(u));
} }
@ -309,8 +282,7 @@ public class SimpleVerifier extends BasicVerifier {
protected Class<?> getClass(final Type t) { protected Class<?> getClass(final Type t) {
try { try {
if (t.getSort() == Type.ARRAY) { if (t.getSort() == Type.ARRAY) {
return Class.forName(t.getDescriptor().replace('/', '.'), return Class.forName(t.getDescriptor().replace('/', '.'), false, loader);
false, loader);
} }
return Class.forName(t.getClassName(), false, loader); return Class.forName(t.getClassName(), false, loader);
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree.analysis; package org.objectweb.asm.tree.analysis;
@ -87,8 +79,7 @@ class SmallSet<E> extends AbstractSet<E> implements Iterator<E> {
return e; return e;
} }
public void remove() { public void remove() {}
}
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
// Utility methods // Utility methods

View File

@ -1,31 +1,23 @@
/*** /***
* ASM: a very small and fast Java bytecode manipulation framework * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* Copyright (c) 2000-2011 INRIA, France Telecom * France Telecom All rights reserved.
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without modification, are permitted
* modification, are permitted provided that the following conditions * provided that the following conditions are met: 1. Redistributions of source code must retain the
* are met: * above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* 1. Redistributions of source code must retain the above copyright * in binary form must reproduce the above copyright notice, this list of conditions and the
* notice, this list of conditions and the following disclaimer. * following disclaimer in the documentation and/or other materials provided with the distribution.
* 2. Redistributions in binary form must reproduce the above copyright * 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* notice, this list of conditions and the following disclaimer in the * endorse or promote products derived from this software without specific prior written permission.
* 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" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* 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.
*/ */
package org.objectweb.asm.tree.analysis; package org.objectweb.asm.tree.analysis;
@ -46,8 +38,7 @@ import org.objectweb.asm.tree.MethodInsnNode;
* *
* @author Eric Bruneton * @author Eric Bruneton
*/ */
public class SourceInterpreter extends Interpreter<SourceValue> implements public class SourceInterpreter extends Interpreter<SourceValue> implements Opcodes {
Opcodes {
public SourceInterpreter() { public SourceInterpreter() {
super(ASM4); super(ASM4);
@ -89,14 +80,12 @@ public class SourceInterpreter extends Interpreter<SourceValue> implements
} }
@Override @Override
public SourceValue copyOperation(final AbstractInsnNode insn, public SourceValue copyOperation(final AbstractInsnNode insn, final SourceValue value) {
final SourceValue value) {
return new SourceValue(value.getSize(), insn); return new SourceValue(value.getSize(), insn);
} }
@Override @Override
public SourceValue unaryOperation(final AbstractInsnNode insn, public SourceValue unaryOperation(final AbstractInsnNode insn, final SourceValue value) {
final SourceValue value) {
int size; int size;
switch (insn.getOpcode()) { switch (insn.getOpcode()) {
case LNEG: case LNEG:
@ -119,8 +108,8 @@ public class SourceInterpreter extends Interpreter<SourceValue> implements
} }
@Override @Override
public SourceValue binaryOperation(final AbstractInsnNode insn, public SourceValue binaryOperation(final AbstractInsnNode insn, final SourceValue value1,
final SourceValue value1, final SourceValue value2) { final SourceValue value2) {
int size; int size;
switch (insn.getOpcode()) { switch (insn.getOpcode()) {
case LALOAD: case LALOAD:
@ -150,9 +139,8 @@ public class SourceInterpreter extends Interpreter<SourceValue> implements
} }
@Override @Override
public SourceValue ternaryOperation(final AbstractInsnNode insn, public SourceValue ternaryOperation(final AbstractInsnNode insn, final SourceValue value1,
final SourceValue value1, final SourceValue value2, final SourceValue value2, final SourceValue value3) {
final SourceValue value3) {
return new SourceValue(1, insn); return new SourceValue(1, insn);
} }
@ -172,9 +160,8 @@ public class SourceInterpreter extends Interpreter<SourceValue> implements
} }
@Override @Override
public void returnOperation(final AbstractInsnNode insn, public void returnOperation(final AbstractInsnNode insn, final SourceValue value,
final SourceValue value, final SourceValue expected) { final SourceValue expected) {}
}
@Override @Override
public SourceValue merge(final SourceValue d, final SourceValue w) { public SourceValue merge(final SourceValue d, final SourceValue w) {

Some files were not shown because too many files have changed in this diff Show More