src/share/vm/prims/jvmtiRedefineClasses.cpp

changeset 7327
50054b63f0aa
parent 6680
78bbf4d43a14
child 7333
b12a2a9b05ca
equal deleted inserted replaced
7325:3c87c13918fb 7327:50054b63f0aa
1567 THREAD)) { 1567 THREAD)) {
1568 // propagate failure back to caller 1568 // propagate failure back to caller
1569 return false; 1569 return false;
1570 } 1570 }
1571 1571
1572 // rewrite constant pool references in the class_type_annotations:
1573 if (!rewrite_cp_refs_in_class_type_annotations(scratch_class, THREAD)) {
1574 // propagate failure back to caller
1575 return false;
1576 }
1577
1578 // rewrite constant pool references in the fields_type_annotations:
1579 if (!rewrite_cp_refs_in_fields_type_annotations(scratch_class, THREAD)) {
1580 // propagate failure back to caller
1581 return false;
1582 }
1583
1584 // rewrite constant pool references in the methods_type_annotations:
1585 if (!rewrite_cp_refs_in_methods_type_annotations(scratch_class, THREAD)) {
1586 // propagate failure back to caller
1587 return false;
1588 }
1589
1590 // There can be type annotations in the Code part of a method_info attribute.
1591 // These annotations are not accessible, even by reflection.
1592 // Currently they are not even parsed by the ClassFileParser.
1593 // If runtime access is added they will also need to be rewritten.
1594
1572 // rewrite source file name index: 1595 // rewrite source file name index:
1573 u2 source_file_name_idx = scratch_class->source_file_name_index(); 1596 u2 source_file_name_idx = scratch_class->source_file_name_index();
1574 if (source_file_name_idx != 0) { 1597 if (source_file_name_idx != 0) {
1575 u2 new_source_file_name_idx = find_new_index(source_file_name_idx); 1598 u2 new_source_file_name_idx = find_new_index(source_file_name_idx);
1576 if (new_source_file_name_idx != 0) { 1599 if (new_source_file_name_idx != 0) {
2235 } 2258 }
2236 } 2259 }
2237 2260
2238 return true; 2261 return true;
2239 } // end rewrite_cp_refs_in_methods_default_annotations() 2262 } // end rewrite_cp_refs_in_methods_default_annotations()
2263
2264
2265 // Rewrite constant pool references in a class_type_annotations field.
2266 bool VM_RedefineClasses::rewrite_cp_refs_in_class_type_annotations(
2267 instanceKlassHandle scratch_class, TRAPS) {
2268
2269 AnnotationArray* class_type_annotations = scratch_class->class_type_annotations();
2270 if (class_type_annotations == NULL || class_type_annotations->length() == 0) {
2271 // no class_type_annotations so nothing to do
2272 return true;
2273 }
2274
2275 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2276 ("class_type_annotations length=%d", class_type_annotations->length()));
2277
2278 int byte_i = 0; // byte index into class_type_annotations
2279 return rewrite_cp_refs_in_type_annotations_typeArray(class_type_annotations,
2280 byte_i, "ClassFile", THREAD);
2281 } // end rewrite_cp_refs_in_class_type_annotations()
2282
2283
2284 // Rewrite constant pool references in a fields_type_annotations field.
2285 bool VM_RedefineClasses::rewrite_cp_refs_in_fields_type_annotations(
2286 instanceKlassHandle scratch_class, TRAPS) {
2287
2288 Array<AnnotationArray*>* fields_type_annotations = scratch_class->fields_type_annotations();
2289 if (fields_type_annotations == NULL || fields_type_annotations->length() == 0) {
2290 // no fields_type_annotations so nothing to do
2291 return true;
2292 }
2293
2294 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2295 ("fields_type_annotations length=%d", fields_type_annotations->length()));
2296
2297 for (int i = 0; i < fields_type_annotations->length(); i++) {
2298 AnnotationArray* field_type_annotations = fields_type_annotations->at(i);
2299 if (field_type_annotations == NULL || field_type_annotations->length() == 0) {
2300 // this field does not have any annotations so skip it
2301 continue;
2302 }
2303
2304 int byte_i = 0; // byte index into field_type_annotations
2305 if (!rewrite_cp_refs_in_type_annotations_typeArray(field_type_annotations,
2306 byte_i, "field_info", THREAD)) {
2307 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2308 ("bad field_type_annotations at %d", i));
2309 // propagate failure back to caller
2310 return false;
2311 }
2312 }
2313
2314 return true;
2315 } // end rewrite_cp_refs_in_fields_type_annotations()
2316
2317
2318 // Rewrite constant pool references in a methods_type_annotations field.
2319 bool VM_RedefineClasses::rewrite_cp_refs_in_methods_type_annotations(
2320 instanceKlassHandle scratch_class, TRAPS) {
2321
2322 for (int i = 0; i < scratch_class->methods()->length(); i++) {
2323 Method* m = scratch_class->methods()->at(i);
2324 AnnotationArray* method_type_annotations = m->constMethod()->type_annotations();
2325
2326 if (method_type_annotations == NULL || method_type_annotations->length() == 0) {
2327 // this method does not have any annotations so skip it
2328 continue;
2329 }
2330
2331 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2332 ("methods type_annotations length=%d", method_type_annotations->length()));
2333
2334 int byte_i = 0; // byte index into method_type_annotations
2335 if (!rewrite_cp_refs_in_type_annotations_typeArray(method_type_annotations,
2336 byte_i, "method_info", THREAD)) {
2337 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2338 ("bad method_type_annotations at %d", i));
2339 // propagate failure back to caller
2340 return false;
2341 }
2342 }
2343
2344 return true;
2345 } // end rewrite_cp_refs_in_methods_type_annotations()
2346
2347
2348 // Rewrite constant pool references in a type_annotations
2349 // field. This "structure" is adapted from the
2350 // RuntimeVisibleTypeAnnotations_attribute described in
2351 // section 4.7.20 of the Java SE 8 Edition of the VM spec:
2352 //
2353 // type_annotations_typeArray {
2354 // u2 num_annotations;
2355 // type_annotation annotations[num_annotations];
2356 // }
2357 //
2358 bool VM_RedefineClasses::rewrite_cp_refs_in_type_annotations_typeArray(
2359 AnnotationArray* type_annotations_typeArray, int &byte_i_ref,
2360 const char * location_mesg, TRAPS) {
2361
2362 if ((byte_i_ref + 2) > type_annotations_typeArray->length()) {
2363 // not enough room for num_annotations field
2364 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2365 ("length() is too small for num_annotations field"));
2366 return false;
2367 }
2368
2369 u2 num_annotations = Bytes::get_Java_u2((address)
2370 type_annotations_typeArray->adr_at(byte_i_ref));
2371 byte_i_ref += 2;
2372
2373 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2374 ("num_type_annotations=%d", num_annotations));
2375
2376 int calc_num_annotations = 0;
2377 for (; calc_num_annotations < num_annotations; calc_num_annotations++) {
2378 if (!rewrite_cp_refs_in_type_annotation_struct(type_annotations_typeArray,
2379 byte_i_ref, location_mesg, THREAD)) {
2380 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2381 ("bad type_annotation_struct at %d", calc_num_annotations));
2382 // propagate failure back to caller
2383 return false;
2384 }
2385 }
2386 assert(num_annotations == calc_num_annotations, "sanity check");
2387
2388 if (byte_i_ref != type_annotations_typeArray->length()) {
2389 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2390 ("read wrong amount of bytes at end of processing "
2391 "type_annotations_typeArray (%d of %d bytes were read)",
2392 byte_i_ref, type_annotations_typeArray->length()));
2393 return false;
2394 }
2395
2396 return true;
2397 } // end rewrite_cp_refs_in_type_annotations_typeArray()
2398
2399
2400 // Rewrite constant pool references in a type_annotation
2401 // field. This "structure" is adapted from the
2402 // RuntimeVisibleTypeAnnotations_attribute described in
2403 // section 4.7.20 of the Java SE 8 Edition of the VM spec:
2404 //
2405 // type_annotation {
2406 // u1 target_type;
2407 // union {
2408 // type_parameter_target;
2409 // supertype_target;
2410 // type_parameter_bound_target;
2411 // empty_target;
2412 // method_formal_parameter_target;
2413 // throws_target;
2414 // localvar_target;
2415 // catch_target;
2416 // offset_target;
2417 // type_argument_target;
2418 // } target_info;
2419 // type_path target_path;
2420 // annotation anno;
2421 // }
2422 //
2423 bool VM_RedefineClasses::rewrite_cp_refs_in_type_annotation_struct(
2424 AnnotationArray* type_annotations_typeArray, int &byte_i_ref,
2425 const char * location_mesg, TRAPS) {
2426
2427 if (!skip_type_annotation_target(type_annotations_typeArray,
2428 byte_i_ref, location_mesg, THREAD)) {
2429 return false;
2430 }
2431
2432 if (!skip_type_annotation_type_path(type_annotations_typeArray,
2433 byte_i_ref, THREAD)) {
2434 return false;
2435 }
2436
2437 if (!rewrite_cp_refs_in_annotation_struct(type_annotations_typeArray,
2438 byte_i_ref, THREAD)) {
2439 return false;
2440 }
2441
2442 return true;
2443 } // end rewrite_cp_refs_in_type_annotation_struct()
2444
2445
2446 // Read, verify and skip over the target_type and target_info part
2447 // so that rewriting can continue in the later parts of the struct.
2448 //
2449 // u1 target_type;
2450 // union {
2451 // type_parameter_target;
2452 // supertype_target;
2453 // type_parameter_bound_target;
2454 // empty_target;
2455 // method_formal_parameter_target;
2456 // throws_target;
2457 // localvar_target;
2458 // catch_target;
2459 // offset_target;
2460 // type_argument_target;
2461 // } target_info;
2462 //
2463 bool VM_RedefineClasses::skip_type_annotation_target(
2464 AnnotationArray* type_annotations_typeArray, int &byte_i_ref,
2465 const char * location_mesg, TRAPS) {
2466
2467 if ((byte_i_ref + 1) > type_annotations_typeArray->length()) {
2468 // not enough room for a target_type let alone the rest of a type_annotation
2469 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2470 ("length() is too small for a target_type"));
2471 return false;
2472 }
2473
2474 u1 target_type = type_annotations_typeArray->at(byte_i_ref);
2475 byte_i_ref += 1;
2476 RC_TRACE_WITH_THREAD(0x02000000, THREAD, ("target_type=0x%.2x", target_type));
2477 RC_TRACE_WITH_THREAD(0x02000000, THREAD, ("location=%s", location_mesg));
2478
2479 // Skip over target_info
2480 switch (target_type) {
2481 case 0x00:
2482 // kind: type parameter declaration of generic class or interface
2483 // location: ClassFile
2484 case 0x01:
2485 // kind: type parameter declaration of generic method or constructor
2486 // location: method_info
2487
2488 {
2489 // struct:
2490 // type_parameter_target {
2491 // u1 type_parameter_index;
2492 // }
2493 //
2494 if ((byte_i_ref + 1) > type_annotations_typeArray->length()) {
2495 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2496 ("length() is too small for a type_parameter_target"));
2497 return false;
2498 }
2499
2500 u1 type_parameter_index = type_annotations_typeArray->at(byte_i_ref);
2501 byte_i_ref += 1;
2502
2503 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2504 ("type_parameter_target: type_parameter_index=%d",
2505 type_parameter_index));
2506 } break;
2507
2508 case 0x10:
2509 // kind: type in extends clause of class or interface declaration
2510 // (including the direct superclass of an anonymous class declaration),
2511 // or in implements clause of interface declaration
2512 // location: ClassFile
2513
2514 {
2515 // struct:
2516 // supertype_target {
2517 // u2 supertype_index;
2518 // }
2519 //
2520 if ((byte_i_ref + 2) > type_annotations_typeArray->length()) {
2521 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2522 ("length() is too small for a supertype_target"));
2523 return false;
2524 }
2525
2526 u2 supertype_index = Bytes::get_Java_u2((address)
2527 type_annotations_typeArray->adr_at(byte_i_ref));
2528 byte_i_ref += 2;
2529
2530 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2531 ("supertype_target: supertype_index=%d", supertype_index));
2532 } break;
2533
2534 case 0x11:
2535 // kind: type in bound of type parameter declaration of generic class or interface
2536 // location: ClassFile
2537 case 0x12:
2538 // kind: type in bound of type parameter declaration of generic method or constructor
2539 // location: method_info
2540
2541 {
2542 // struct:
2543 // type_parameter_bound_target {
2544 // u1 type_parameter_index;
2545 // u1 bound_index;
2546 // }
2547 //
2548 if ((byte_i_ref + 2) > type_annotations_typeArray->length()) {
2549 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2550 ("length() is too small for a type_parameter_bound_target"));
2551 return false;
2552 }
2553
2554 u1 type_parameter_index = type_annotations_typeArray->at(byte_i_ref);
2555 byte_i_ref += 1;
2556 u1 bound_index = type_annotations_typeArray->at(byte_i_ref);
2557 byte_i_ref += 1;
2558
2559 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2560 ("type_parameter_bound_target: type_parameter_index=%d, bound_index=%d",
2561 type_parameter_index, bound_index));
2562 } break;
2563
2564 case 0x13:
2565 // kind: type in field declaration
2566 // location: field_info
2567 case 0x14:
2568 // kind: return type of method, or type of newly constructed object
2569 // location: method_info
2570 case 0x15:
2571 // kind: receiver type of method or constructor
2572 // location: method_info
2573
2574 {
2575 // struct:
2576 // empty_target {
2577 // }
2578 //
2579 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2580 ("empty_target"));
2581 } break;
2582
2583 case 0x16:
2584 // kind: type in formal parameter declaration of method, constructor, or lambda expression
2585 // location: method_info
2586
2587 {
2588 // struct:
2589 // formal_parameter_target {
2590 // u1 formal_parameter_index;
2591 // }
2592 //
2593 if ((byte_i_ref + 1) > type_annotations_typeArray->length()) {
2594 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2595 ("length() is too small for a formal_parameter_target"));
2596 return false;
2597 }
2598
2599 u1 formal_parameter_index = type_annotations_typeArray->at(byte_i_ref);
2600 byte_i_ref += 1;
2601
2602 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2603 ("formal_parameter_target: formal_parameter_index=%d",
2604 formal_parameter_index));
2605 } break;
2606
2607 case 0x17:
2608 // kind: type in throws clause of method or constructor
2609 // location: method_info
2610
2611 {
2612 // struct:
2613 // throws_target {
2614 // u2 throws_type_index
2615 // }
2616 //
2617 if ((byte_i_ref + 2) > type_annotations_typeArray->length()) {
2618 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2619 ("length() is too small for a throws_target"));
2620 return false;
2621 }
2622
2623 u2 throws_type_index = Bytes::get_Java_u2((address)
2624 type_annotations_typeArray->adr_at(byte_i_ref));
2625 byte_i_ref += 2;
2626
2627 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2628 ("throws_target: throws_type_index=%d", throws_type_index));
2629 } break;
2630
2631 case 0x40:
2632 // kind: type in local variable declaration
2633 // location: Code
2634 case 0x41:
2635 // kind: type in resource variable declaration
2636 // location: Code
2637
2638 {
2639 // struct:
2640 // localvar_target {
2641 // u2 table_length;
2642 // struct {
2643 // u2 start_pc;
2644 // u2 length;
2645 // u2 index;
2646 // } table[table_length];
2647 // }
2648 //
2649 if ((byte_i_ref + 2) > type_annotations_typeArray->length()) {
2650 // not enough room for a table_length let alone the rest of a localvar_target
2651 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2652 ("length() is too small for a localvar_target table_length"));
2653 return false;
2654 }
2655
2656 u2 table_length = Bytes::get_Java_u2((address)
2657 type_annotations_typeArray->adr_at(byte_i_ref));
2658 byte_i_ref += 2;
2659
2660 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2661 ("localvar_target: table_length=%d", table_length));
2662
2663 int table_struct_size = 2 + 2 + 2; // 3 u2 variables per table entry
2664 int table_size = table_length * table_struct_size;
2665
2666 if ((byte_i_ref + table_size) > type_annotations_typeArray->length()) {
2667 // not enough room for a table
2668 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2669 ("length() is too small for a table array of length %d", table_length));
2670 return false;
2671 }
2672
2673 // Skip over table
2674 byte_i_ref += table_size;
2675 } break;
2676
2677 case 0x42:
2678 // kind: type in exception parameter declaration
2679 // location: Code
2680
2681 {
2682 // struct:
2683 // catch_target {
2684 // u2 exception_table_index;
2685 // }
2686 //
2687 if ((byte_i_ref + 2) > type_annotations_typeArray->length()) {
2688 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2689 ("length() is too small for a catch_target"));
2690 return false;
2691 }
2692
2693 u2 exception_table_index = Bytes::get_Java_u2((address)
2694 type_annotations_typeArray->adr_at(byte_i_ref));
2695 byte_i_ref += 2;
2696
2697 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2698 ("catch_target: exception_table_index=%d", exception_table_index));
2699 } break;
2700
2701 case 0x43:
2702 // kind: type in instanceof expression
2703 // location: Code
2704 case 0x44:
2705 // kind: type in new expression
2706 // location: Code
2707 case 0x45:
2708 // kind: type in method reference expression using ::new
2709 // location: Code
2710 case 0x46:
2711 // kind: type in method reference expression using ::Identifier
2712 // location: Code
2713
2714 {
2715 // struct:
2716 // offset_target {
2717 // u2 offset;
2718 // }
2719 //
2720 if ((byte_i_ref + 2) > type_annotations_typeArray->length()) {
2721 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2722 ("length() is too small for a offset_target"));
2723 return false;
2724 }
2725
2726 u2 offset = Bytes::get_Java_u2((address)
2727 type_annotations_typeArray->adr_at(byte_i_ref));
2728 byte_i_ref += 2;
2729
2730 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2731 ("offset_target: offset=%d", offset));
2732 } break;
2733
2734 case 0x47:
2735 // kind: type in cast expression
2736 // location: Code
2737 case 0x48:
2738 // kind: type argument for generic constructor in new expression or
2739 // explicit constructor invocation statement
2740 // location: Code
2741 case 0x49:
2742 // kind: type argument for generic method in method invocation expression
2743 // location: Code
2744 case 0x4A:
2745 // kind: type argument for generic constructor in method reference expression using ::new
2746 // location: Code
2747 case 0x4B:
2748 // kind: type argument for generic method in method reference expression using ::Identifier
2749 // location: Code
2750
2751 {
2752 // struct:
2753 // type_argument_target {
2754 // u2 offset;
2755 // u1 type_argument_index;
2756 // }
2757 //
2758 if ((byte_i_ref + 3) > type_annotations_typeArray->length()) {
2759 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2760 ("length() is too small for a type_argument_target"));
2761 return false;
2762 }
2763
2764 u2 offset = Bytes::get_Java_u2((address)
2765 type_annotations_typeArray->adr_at(byte_i_ref));
2766 byte_i_ref += 2;
2767 u1 type_argument_index = type_annotations_typeArray->at(byte_i_ref);
2768 byte_i_ref += 1;
2769
2770 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2771 ("type_argument_target: offset=%d, type_argument_index=%d",
2772 offset, type_argument_index));
2773 } break;
2774
2775 default:
2776 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2777 ("unknown target_type"));
2778 #ifdef ASSERT
2779 ShouldNotReachHere();
2780 #endif
2781 return false;
2782 }
2783
2784 return true;
2785 } // end skip_type_annotation_target()
2786
2787
2788 // Read, verify and skip over the type_path part so that rewriting
2789 // can continue in the later parts of the struct.
2790 //
2791 // type_path {
2792 // u1 path_length;
2793 // {
2794 // u1 type_path_kind;
2795 // u1 type_argument_index;
2796 // } path[path_length];
2797 // }
2798 //
2799 bool VM_RedefineClasses::skip_type_annotation_type_path(
2800 AnnotationArray* type_annotations_typeArray, int &byte_i_ref, TRAPS) {
2801
2802 if ((byte_i_ref + 1) > type_annotations_typeArray->length()) {
2803 // not enough room for a path_length let alone the rest of the type_path
2804 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2805 ("length() is too small for a type_path"));
2806 return false;
2807 }
2808
2809 u1 path_length = type_annotations_typeArray->at(byte_i_ref);
2810 byte_i_ref += 1;
2811
2812 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2813 ("type_path: path_length=%d", path_length));
2814
2815 int calc_path_length = 0;
2816 for (; calc_path_length < path_length; calc_path_length++) {
2817 if ((byte_i_ref + 1 + 1) > type_annotations_typeArray->length()) {
2818 // not enough room for a path
2819 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2820 ("length() is too small for path entry %d of %d",
2821 calc_path_length, path_length));
2822 return false;
2823 }
2824
2825 u1 type_path_kind = type_annotations_typeArray->at(byte_i_ref);
2826 byte_i_ref += 1;
2827 u1 type_argument_index = type_annotations_typeArray->at(byte_i_ref);
2828 byte_i_ref += 1;
2829
2830 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2831 ("type_path: path[%d]: type_path_kind=%d, type_argument_index=%d",
2832 calc_path_length, type_path_kind, type_argument_index));
2833
2834 if (type_path_kind > 3 || (type_path_kind != 3 && type_argument_index != 0)) {
2835 // not enough room for a path
2836 RC_TRACE_WITH_THREAD(0x02000000, THREAD,
2837 ("inconsistent type_path values"));
2838 return false;
2839 }
2840 }
2841 assert(path_length == calc_path_length, "sanity check");
2842
2843 return true;
2844 } // end skip_type_annotation_type_path()
2240 2845
2241 2846
2242 // Rewrite constant pool references in the method's stackmap table. 2847 // Rewrite constant pool references in the method's stackmap table.
2243 // These "structures" are adapted from the StackMapTable_attribute that 2848 // These "structures" are adapted from the StackMapTable_attribute that
2244 // is described in section 4.8.4 of the 6.0 version of the VM spec 2849 // is described in section 4.8.4 of the 6.0 version of the VM spec
3221 } 3826 }
3222 3827
3223 3828
3224 void VM_RedefineClasses::swap_annotations(instanceKlassHandle the_class, 3829 void VM_RedefineClasses::swap_annotations(instanceKlassHandle the_class,
3225 instanceKlassHandle scratch_class) { 3830 instanceKlassHandle scratch_class) {
3226 // Since there is currently no rewriting of type annotations indexes
3227 // into the CP, we null out type annotations on scratch_class before
3228 // we swap annotations with the_class rather than facing the
3229 // possibility of shipping annotations with broken indexes to
3230 // Java-land.
3231 ClassLoaderData* loader_data = scratch_class->class_loader_data();
3232 AnnotationArray* new_class_type_annotations = scratch_class->class_type_annotations();
3233 if (new_class_type_annotations != NULL) {
3234 MetadataFactory::free_array<u1>(loader_data, new_class_type_annotations);
3235 scratch_class->annotations()->set_class_type_annotations(NULL);
3236 }
3237 Array<AnnotationArray*>* new_field_type_annotations = scratch_class->fields_type_annotations();
3238 if (new_field_type_annotations != NULL) {
3239 Annotations::free_contents(loader_data, new_field_type_annotations);
3240 scratch_class->annotations()->set_fields_type_annotations(NULL);
3241 }
3242
3243 // Swap annotation fields values 3831 // Swap annotation fields values
3244 Annotations* old_annotations = the_class->annotations(); 3832 Annotations* old_annotations = the_class->annotations();
3245 the_class->set_annotations(scratch_class->annotations()); 3833 the_class->set_annotations(scratch_class->annotations());
3246 scratch_class->set_annotations(old_annotations); 3834 scratch_class->set_annotations(old_annotations);
3247 } 3835 }

mercurial