535 short klassSymbolLength; 536 short nameSymbolLength; 537 short signatureSymbolLength; 538 char * nameString = NULL; 539 char * klassString = NULL; 540 char * signatureString = NULL; 541 int err; 542 543 err = read_pointer(J, methodPtr + OFFSET_Method_constMethod, &constMethod); 544 CHECK_FAIL(err); 545 err = read_pointer(J, constMethod + OFFSET_ConstMethod_constants, &constantPool); 546 CHECK_FAIL(err); 547 548 /* To get name string */ 549 err = ps_pread(J->P, constMethod + OFFSET_ConstMethod_name_index, &nameIndex, 2); 550 CHECK_FAIL(err); 551 err = read_pointer(J, constantPool + nameIndex * POINTER_SIZE + SIZE_ConstantPool, &nameSymbol); 552 CHECK_FAIL(err); 553 // The symbol is a CPSlot and has lower bit set to indicate metadata 554 nameSymbol &= (~1); // remove metadata lsb 555 err = ps_pread(J->P, nameSymbol + OFFSET_Symbol_length, &nameSymbolLength, 2); 556 CHECK_FAIL(err); 557 nameString = (char*)calloc(nameSymbolLength + 1, 1); 558 err = ps_pread(J->P, nameSymbol + OFFSET_Symbol_body, nameString, nameSymbolLength); 559 CHECK_FAIL(err); 560 561 /* To get signature string */ 562 err = ps_pread(J->P, constMethod + OFFSET_ConstMethod_signature_index, &signatureIndex, 2); 563 CHECK_FAIL(err); 564 err = read_pointer(J, constantPool + signatureIndex * POINTER_SIZE + SIZE_ConstantPool, &signatureSymbol); 565 CHECK_FAIL(err); 566 signatureSymbol &= (~1); // remove metadata lsb 567 err = ps_pread(J->P, signatureSymbol + OFFSET_Symbol_length, &signatureSymbolLength, 2); 568 CHECK_FAIL(err); 569 signatureString = (char*)calloc(signatureSymbolLength + 1, 1); 570 err = ps_pread(J->P, signatureSymbol + OFFSET_Symbol_body, signatureString, signatureSymbolLength); 571 CHECK_FAIL(err); 572 573 /* To get klass string */ 574 err = read_pointer(J, constantPool + OFFSET_ConstantPool_pool_holder, &klassPtr); 575 CHECK_FAIL(err); 576 err = read_pointer(J, klassPtr + OFFSET_Klass_name, &klassSymbol); 577 CHECK_FAIL(err); 578 err = ps_pread(J->P, klassSymbol + OFFSET_Symbol_length, &klassSymbolLength, 2); 579 CHECK_FAIL(err); 580 klassString = (char*)calloc(klassSymbolLength + 1, 1); 581 err = ps_pread(J->P, klassSymbol + OFFSET_Symbol_body, klassString, klassSymbolLength); 582 CHECK_FAIL(err); 583 584 result[0] = '\0'; 585 if (snprintf(result, size, 586 "%s.%s%s", 587 klassString, 588 nameString, 589 signatureString) >= size) { 590 // truncation 591 goto fail; 592 } 593 594 if (nameString != NULL) free(nameString); 595 if (klassString != NULL) free(klassString); 596 if (signatureString != NULL) free(signatureString); 597 598 return PS_OK; | 535 short klassSymbolLength; 536 short nameSymbolLength; 537 short signatureSymbolLength; 538 char * nameString = NULL; 539 char * klassString = NULL; 540 char * signatureString = NULL; 541 int err; 542 543 err = read_pointer(J, methodPtr + OFFSET_Method_constMethod, &constMethod); 544 CHECK_FAIL(err); 545 err = read_pointer(J, constMethod + OFFSET_ConstMethod_constants, &constantPool); 546 CHECK_FAIL(err); 547 548 /* To get name string */ 549 err = ps_pread(J->P, constMethod + OFFSET_ConstMethod_name_index, &nameIndex, 2); 550 CHECK_FAIL(err); 551 err = read_pointer(J, constantPool + nameIndex * POINTER_SIZE + SIZE_ConstantPool, &nameSymbol); 552 CHECK_FAIL(err); 553 // The symbol is a CPSlot and has lower bit set to indicate metadata 554 nameSymbol &= (~1); // remove metadata lsb 555 // The length is in the top half of the word. 556 err = ps_pread(J->P, nameSymbol + OFFSET_Symbol_length_and_refcount, &nameSymbolLength, 2); 557 CHECK_FAIL(err); 558 nameString = (char*)calloc(nameSymbolLength + 1, 1); 559 err = ps_pread(J->P, nameSymbol + OFFSET_Symbol_body, nameString, nameSymbolLength); 560 CHECK_FAIL(err); 561 562 /* To get signature string */ 563 err = ps_pread(J->P, constMethod + OFFSET_ConstMethod_signature_index, &signatureIndex, 2); 564 CHECK_FAIL(err); 565 err = read_pointer(J, constantPool + signatureIndex * POINTER_SIZE + SIZE_ConstantPool, &signatureSymbol); 566 CHECK_FAIL(err); 567 signatureSymbol &= (~1); // remove metadata lsb 568 err = ps_pread(J->P, signatureSymbol + OFFSET_Symbol_length_and_refcount, &signatureSymbolLength, 2); 569 CHECK_FAIL(err); 570 signatureString = (char*)calloc(signatureSymbolLength + 1, 1); 571 err = ps_pread(J->P, signatureSymbol + OFFSET_Symbol_body, signatureString, signatureSymbolLength); 572 CHECK_FAIL(err); 573 574 /* To get klass string */ 575 err = read_pointer(J, constantPool + OFFSET_ConstantPool_pool_holder, &klassPtr); 576 CHECK_FAIL(err); 577 err = read_pointer(J, klassPtr + OFFSET_Klass_name, &klassSymbol); 578 CHECK_FAIL(err); 579 err = ps_pread(J->P, klassSymbol + OFFSET_Symbol_length_and_refcount, &klassSymbolLength, 2); 580 CHECK_FAIL(err); 581 klassString = (char*)calloc(klassSymbolLength + 1, 1); 582 err = ps_pread(J->P, klassSymbol + OFFSET_Symbol_body, klassString, klassSymbolLength); 583 CHECK_FAIL(err); 584 585 result[0] = '\0'; 586 if (snprintf(result, size, 587 "%s.%s%s", 588 klassString, 589 nameString, 590 signatureString) >= size) { 591 // truncation 592 goto fail; 593 } 594 595 if (nameString != NULL) free(nameString); 596 if (klassString != NULL) free(klassString); 597 if (signatureString != NULL) free(signatureString); 598 599 return PS_OK; |