|
12 | 12 | #include "openminecraft/vm/pixeltower/om_pixeltower_frame_structdef.hpp" |
13 | 13 | #include "openminecraft/vm/pixeltower/om_pixeltower_memorymanager.hpp" |
14 | 14 | #include <any> |
15 | | -#include <list> |
| 15 | +#include <cstring> |
16 | 16 | #include <memory> |
17 | 17 | #include <stack> |
18 | 18 | #include <string> |
@@ -516,7 +516,7 @@ std::string OMInterpreter::fetchName(OMArrayType type) |
516 | 516 | } |
517 | 517 | } |
518 | 518 | // TODO: other types |
519 | | -void OMInterpreter::writeStackTop(void *target) |
| 519 | +void OMInterpreter::writeStackTop(void *target, std::string desc) |
520 | 520 | { |
521 | 521 | auto it = std::type_index(STACK_ACCESS.top().type()); |
522 | 522 |
|
@@ -570,7 +570,7 @@ OMResult<std::any, err::OMValidationError> OMInterpreter::operand_putfield(std:: |
570 | 570 | { |
571 | 571 | if (fi->name == name && (fi->accessFlag & JVM_Acc_Static) == 0) |
572 | 572 | { |
573 | | - writeStackTop((uint8_t *)OBJECT_ACCESS(std::any_cast<void *>(item)) + fi->offset); |
| 573 | + writeStackTop(OBJECT_ACCESS(std::any_cast<void *>(item), fi->offset), fi->desc); |
574 | 574 | return OMResult<std::any, err::OMValidationError>::ok(nullptr); |
575 | 575 | } |
576 | 576 | } |
@@ -601,7 +601,7 @@ OMResult<std::any, err::OMValidationError> OMInterpreter::operand_putstatic(std: |
601 | 601 | { |
602 | 602 | if (fi->name == name && (fi->accessFlag & JVM_Acc_Static)) |
603 | 603 | { |
604 | | - writeStackTop((void *)((uint8_t *)res.unwrap()->staticFieldBlock + fi->offset)); |
| 604 | + writeStackTop(OBJECT_ACCESS(res.unwrap()->staticFieldBlock, fi->offset), fi->desc); |
605 | 605 | return OMResult<std::any, err::OMValidationError>::ok(nullptr); |
606 | 606 | } |
607 | 607 | } |
@@ -787,4 +787,22 @@ void OMInterpreter::operand_pop(std::shared_ptr<OMFrameMetadata> frame) |
787 | 787 | STACK_ACCESS.pop(); |
788 | 788 | frame->offset++; |
789 | 789 | } |
| 790 | +void *OMInterpreter::newString(std::string data) |
| 791 | +{ |
| 792 | + auto cls = tower.fetchClass("java/lang/String"); |
| 793 | + if (cls.type == Err) |
| 794 | + { |
| 795 | + logger.warn(cls.unwrap_err().what()); |
| 796 | + return nullptr; |
| 797 | + } |
| 798 | + |
| 799 | + void *rawarr = tower.allocateArray(Byte, data.size()); |
| 800 | + char *arrdata = ((char *)rawarr) + sizeof(OMArrayHeader); |
| 801 | + memcpy(arrdata, data.c_str(), data.size()); |
| 802 | + void *str = tower.allocate(cls.unwrap()); |
| 803 | + STACK_ACCESS.push(str); |
| 804 | + STACK_ACCESS.push(rawarr); |
| 805 | + auto initresult = execute(cls.unwrap(), "<init>", "([B)V"); |
| 806 | + return str; |
| 807 | +} |
790 | 808 | } // namespace openminecraft::vm::pixeltower::runtime |
0 commit comments