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 {
|