src/share/vm/ci/ciReplay.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File 8039525 Sdiff src/share/vm/ci

src/share/vm/ci/ciReplay.cpp

Print this page




 280   //   'tag' <length> # # ...
 281   // Where each # is an intptr_t item
 282   intptr_t* parse_intptr_data(const char* tag, int& length) {
 283     if (!parse_tag_and_count(tag, length)) {
 284       return NULL;
 285     }
 286 
 287     intptr_t* result = NEW_RESOURCE_ARRAY(intptr_t, length);
 288     for (int i = 0; i < length; i++) {
 289       skip_ws();
 290       intptr_t val = parse_intptr_t("data");
 291       result[i] = val;
 292     }
 293     return result;
 294   }
 295 
 296   // Parse a possibly quoted version of a symbol into a symbolOop
 297   Symbol* parse_symbol(TRAPS) {
 298     const char* str = parse_escaped_string();
 299     if (str != NULL) {
 300       Symbol* sym = SymbolTable::lookup(str, (int)strlen(str), CHECK_NULL);
 301       return sym;
 302     }
 303     return NULL;
 304   }
 305 
 306   // Parse a valid klass name and look it up
 307   Klass* parse_klass(TRAPS) {
 308     const char* str = parse_escaped_string();
 309     Symbol* klass_name = SymbolTable::lookup(str, (int)strlen(str), CHECK_NULL);
 310     if (klass_name != NULL) {
 311       Klass* k = NULL;
 312       if (_iklass != NULL) {
 313         k = (Klass*)_iklass->find_klass(ciSymbol::make(klass_name->as_C_string()))->constant_encoding();
 314       } else {
 315         k = SystemDictionary::resolve_or_fail(klass_name, _loader, _protection_domain, true, THREAD);
 316       }
 317       if (HAS_PENDING_EXCEPTION) {
 318         oop throwable = PENDING_EXCEPTION;
 319         java_lang_Throwable::print(throwable, tty);
 320         tty->cr();
 321         report_error(str);
 322         return NULL;
 323       }
 324       return k;
 325     }
 326     return NULL;
 327   }
 328 
 329   // Lookup a klass
 330   Klass* resolve_klass(const char* klass, TRAPS) {
 331     Symbol* klass_name = SymbolTable::lookup(klass, (int)strlen(klass), CHECK_NULL);
 332     return SystemDictionary::resolve_or_fail(klass_name, _loader, _protection_domain, true, CHECK_NULL);
 333   }
 334 
 335   // Parse the standard tuple of <klass> <name> <signature>
 336   Method* parse_method(TRAPS) {
 337     InstanceKlass* k = (InstanceKlass*)parse_klass(CHECK_NULL);
 338     Symbol* method_name = parse_symbol(CHECK_NULL);
 339     Symbol* method_signature = parse_symbol(CHECK_NULL);
 340     Method* m = k->find_method(method_name, method_signature);
 341     if (m == NULL) {
 342       report_error("Can't find method");
 343     }
 344     return m;
 345   }
 346 
 347   int get_line(int c) {
 348     while(c != EOF) {
 349       if (_buffer_pos + 1 >= _buffer_length) {
 350         int new_length = _buffer_length * 2;
 351         // Next call will throw error in case of OOM.


 712     }
 713   }
 714 
 715   // Initialize a class and fill in the value for a static field.
 716   // This is useful when the compile was dependent on the value of
 717   // static fields but it's impossible to properly rerun the static
 718   // initiailizer.
 719   void process_staticfield(TRAPS) {
 720     InstanceKlass* k = (InstanceKlass *)parse_klass(CHECK);
 721 
 722     if (ReplaySuppressInitializers == 0 ||
 723         ReplaySuppressInitializers == 2 && k->class_loader() == NULL) {
 724       return;
 725     }
 726 
 727     assert(k->is_initialized(), "must be");
 728 
 729     const char* field_name = parse_escaped_string();;
 730     const char* field_signature = parse_string();
 731     fieldDescriptor fd;
 732     Symbol* name = SymbolTable::lookup(field_name, (int)strlen(field_name), CHECK);
 733     Symbol* sig = SymbolTable::lookup(field_signature, (int)strlen(field_signature), CHECK);
 734     if (!k->find_local_field(name, sig, &fd) ||
 735         !fd.is_static() ||
 736         fd.has_initial_value()) {
 737       report_error(field_name);
 738       return;
 739     }
 740 
 741     oop java_mirror = k->java_mirror();
 742     if (field_signature[0] == '[') {
 743       int length = parse_int("array length");
 744       oop value = NULL;
 745 
 746       if (field_signature[1] == '[') {
 747         // multi dimensional array
 748         ArrayKlass* kelem = (ArrayKlass *)parse_klass(CHECK);
 749         int rank = 0;
 750         while (field_signature[rank] == '[') {
 751           rank++;
 752         }
 753         int* dims = NEW_RESOURCE_ARRAY(int, rank);


 798       } else if (strcmp(field_signature, "Z") == 0) {
 799         int value = atol(string_value);
 800         java_mirror->bool_field_put(fd.offset(), value);
 801       } else if (strcmp(field_signature, "J") == 0) {
 802         jlong value;
 803         if (sscanf(string_value, JLONG_FORMAT, &value) != 1) {
 804           fprintf(stderr, "Error parsing long: %s\n", string_value);
 805           return;
 806         }
 807         java_mirror->long_field_put(fd.offset(), value);
 808       } else if (strcmp(field_signature, "F") == 0) {
 809         float value = atof(string_value);
 810         java_mirror->float_field_put(fd.offset(), value);
 811       } else if (strcmp(field_signature, "D") == 0) {
 812         double value = atof(string_value);
 813         java_mirror->double_field_put(fd.offset(), value);
 814       } else if (strcmp(field_signature, "Ljava/lang/String;") == 0) {
 815         Handle value = java_lang_String::create_from_str(string_value, CHECK);
 816         java_mirror->obj_field_put(fd.offset(), value());
 817       } else if (field_signature[0] == 'L') {
 818         Symbol* klass_name = SymbolTable::lookup(field_signature, (int)strlen(field_signature), CHECK);
 819         KlassHandle kelem = resolve_klass(field_signature, CHECK);
 820         oop value = ((InstanceKlass*)kelem())->allocate_instance(CHECK);
 821         java_mirror->obj_field_put(fd.offset(), value);
 822       } else {
 823         report_error("unhandled staticfield");
 824       }
 825     }
 826   }
 827 
 828 #if INCLUDE_JVMTI
 829   void process_JvmtiExport(TRAPS) {
 830     const char* field = parse_string();
 831     bool value = parse_int("JvmtiExport flag") != 0;
 832     if (strcmp(field, "can_access_local_variables") == 0) {
 833       JvmtiExport::set_can_access_local_variables(value);
 834     } else if (strcmp(field, "can_hotswap_or_post_breakpoint") == 0) {
 835       JvmtiExport::set_can_hotswap_or_post_breakpoint(value);
 836     } else if (strcmp(field, "can_post_on_exceptions") == 0) {
 837       JvmtiExport::set_can_post_on_exceptions(value);
 838     } else {




 280   //   'tag' <length> # # ...
 281   // Where each # is an intptr_t item
 282   intptr_t* parse_intptr_data(const char* tag, int& length) {
 283     if (!parse_tag_and_count(tag, length)) {
 284       return NULL;
 285     }
 286 
 287     intptr_t* result = NEW_RESOURCE_ARRAY(intptr_t, length);
 288     for (int i = 0; i < length; i++) {
 289       skip_ws();
 290       intptr_t val = parse_intptr_t("data");
 291       result[i] = val;
 292     }
 293     return result;
 294   }
 295 
 296   // Parse a possibly quoted version of a symbol into a symbolOop
 297   Symbol* parse_symbol(TRAPS) {
 298     const char* str = parse_escaped_string();
 299     if (str != NULL) {
 300       Symbol* sym = SymbolTable::lookup_and_add(str, (int)strlen(str), CHECK_NULL);
 301       return sym;
 302     }
 303     return NULL;
 304   }
 305 
 306   // Parse a valid klass name and look it up
 307   Klass* parse_klass(TRAPS) {
 308     const char* str = parse_escaped_string();
 309     Symbol* klass_name = SymbolTable::lookup_and_add(str, (int)strlen(str), CHECK_NULL);
 310     if (klass_name != NULL) {
 311       Klass* k = NULL;
 312       if (_iklass != NULL) {
 313         k = (Klass*)_iklass->find_klass(ciSymbol::make(klass_name->as_C_string()))->constant_encoding();
 314       } else {
 315         k = SystemDictionary::resolve_or_fail(klass_name, _loader, _protection_domain, true, THREAD);
 316       }
 317       if (HAS_PENDING_EXCEPTION) {
 318         oop throwable = PENDING_EXCEPTION;
 319         java_lang_Throwable::print(throwable, tty);
 320         tty->cr();
 321         report_error(str);
 322         return NULL;
 323       }
 324       return k;
 325     }
 326     return NULL;
 327   }
 328 
 329   // Lookup a klass
 330   Klass* resolve_klass(const char* klass, TRAPS) {
 331     Symbol* klass_name = SymbolTable::lookup_and_add(klass, (int)strlen(klass), CHECK_NULL);
 332     return SystemDictionary::resolve_or_fail(klass_name, _loader, _protection_domain, true, CHECK_NULL);
 333   }
 334 
 335   // Parse the standard tuple of <klass> <name> <signature>
 336   Method* parse_method(TRAPS) {
 337     InstanceKlass* k = (InstanceKlass*)parse_klass(CHECK_NULL);
 338     Symbol* method_name = parse_symbol(CHECK_NULL);
 339     Symbol* method_signature = parse_symbol(CHECK_NULL);
 340     Method* m = k->find_method(method_name, method_signature);
 341     if (m == NULL) {
 342       report_error("Can't find method");
 343     }
 344     return m;
 345   }
 346 
 347   int get_line(int c) {
 348     while(c != EOF) {
 349       if (_buffer_pos + 1 >= _buffer_length) {
 350         int new_length = _buffer_length * 2;
 351         // Next call will throw error in case of OOM.


 712     }
 713   }
 714 
 715   // Initialize a class and fill in the value for a static field.
 716   // This is useful when the compile was dependent on the value of
 717   // static fields but it's impossible to properly rerun the static
 718   // initiailizer.
 719   void process_staticfield(TRAPS) {
 720     InstanceKlass* k = (InstanceKlass *)parse_klass(CHECK);
 721 
 722     if (ReplaySuppressInitializers == 0 ||
 723         ReplaySuppressInitializers == 2 && k->class_loader() == NULL) {
 724       return;
 725     }
 726 
 727     assert(k->is_initialized(), "must be");
 728 
 729     const char* field_name = parse_escaped_string();;
 730     const char* field_signature = parse_string();
 731     fieldDescriptor fd;
 732     Symbol* name = SymbolTable::lookup_and_add(field_name, (int)strlen(field_name), CHECK);
 733     Symbol* sig = SymbolTable::lookup_and_add(field_signature, (int)strlen(field_signature), CHECK);
 734     if (!k->find_local_field(name, sig, &fd) ||
 735         !fd.is_static() ||
 736         fd.has_initial_value()) {
 737       report_error(field_name);
 738       return;
 739     }
 740 
 741     oop java_mirror = k->java_mirror();
 742     if (field_signature[0] == '[') {
 743       int length = parse_int("array length");
 744       oop value = NULL;
 745 
 746       if (field_signature[1] == '[') {
 747         // multi dimensional array
 748         ArrayKlass* kelem = (ArrayKlass *)parse_klass(CHECK);
 749         int rank = 0;
 750         while (field_signature[rank] == '[') {
 751           rank++;
 752         }
 753         int* dims = NEW_RESOURCE_ARRAY(int, rank);


 798       } else if (strcmp(field_signature, "Z") == 0) {
 799         int value = atol(string_value);
 800         java_mirror->bool_field_put(fd.offset(), value);
 801       } else if (strcmp(field_signature, "J") == 0) {
 802         jlong value;
 803         if (sscanf(string_value, JLONG_FORMAT, &value) != 1) {
 804           fprintf(stderr, "Error parsing long: %s\n", string_value);
 805           return;
 806         }
 807         java_mirror->long_field_put(fd.offset(), value);
 808       } else if (strcmp(field_signature, "F") == 0) {
 809         float value = atof(string_value);
 810         java_mirror->float_field_put(fd.offset(), value);
 811       } else if (strcmp(field_signature, "D") == 0) {
 812         double value = atof(string_value);
 813         java_mirror->double_field_put(fd.offset(), value);
 814       } else if (strcmp(field_signature, "Ljava/lang/String;") == 0) {
 815         Handle value = java_lang_String::create_from_str(string_value, CHECK);
 816         java_mirror->obj_field_put(fd.offset(), value());
 817       } else if (field_signature[0] == 'L') {
 818         Symbol* klass_name = SymbolTable::lookup_and_add(field_signature, (int)strlen(field_signature), CHECK);
 819         KlassHandle kelem = resolve_klass(field_signature, CHECK);
 820         oop value = ((InstanceKlass*)kelem())->allocate_instance(CHECK);
 821         java_mirror->obj_field_put(fd.offset(), value);
 822       } else {
 823         report_error("unhandled staticfield");
 824       }
 825     }
 826   }
 827 
 828 #if INCLUDE_JVMTI
 829   void process_JvmtiExport(TRAPS) {
 830     const char* field = parse_string();
 831     bool value = parse_int("JvmtiExport flag") != 0;
 832     if (strcmp(field, "can_access_local_variables") == 0) {
 833       JvmtiExport::set_can_access_local_variables(value);
 834     } else if (strcmp(field, "can_hotswap_or_post_breakpoint") == 0) {
 835       JvmtiExport::set_can_hotswap_or_post_breakpoint(value);
 836     } else if (strcmp(field, "can_post_on_exceptions") == 0) {
 837       JvmtiExport::set_can_post_on_exceptions(value);
 838     } else {


src/share/vm/ci/ciReplay.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File