void _Method::InvokeOn_With_(Interpreter* interp, VMFrame* frame) { // REM: this is a clone with _Primitive::InvokeOn_With_ VMArray* args = static_cast<VMArray*>(frame->Pop()); vm_oop_t rcvr = static_cast<vm_oop_t>(frame->Pop()); VMMethod* mthd = static_cast<VMMethod*>(frame->Pop()); frame->Push(rcvr); size_t num_args = args->GetNumberOfIndexableFields(); for (size_t i = 0; i < num_args; i++) { vm_oop_t arg = args->GetIndexableField(i); frame->Push(arg); } mthd->Invoke(interp, frame); }
void CloneObjectsTest::testCloneArray() { VMArray* orig = GetUniverse()->NewArray(3); orig->SetIndexableField(0, GetUniverse()->NewString("foobar42")); orig->SetIndexableField(1, GetUniverse()->NewString("foobar43")); orig->SetIndexableField(2, GetUniverse()->NewString("foobar44")); VMArray* clone = orig->Clone(); CPPUNIT_ASSERT((intptr_t)orig != (intptr_t)clone); CPPUNIT_ASSERT_EQUAL_MESSAGE("class differs!!", orig->clazz, clone->clazz); CPPUNIT_ASSERT_EQUAL_MESSAGE("objectSize differs!!", orig->objectSize, clone->objectSize); CPPUNIT_ASSERT_EQUAL_MESSAGE("numberOfFields differs!!", orig->numberOfFields, clone->numberOfFields); CPPUNIT_ASSERT_EQUAL_MESSAGE("numberOfFields differs!!", orig->GetNumberOfIndexableFields(), clone->GetNumberOfIndexableFields()); CPPUNIT_ASSERT_EQUAL_MESSAGE("field 0 differs", orig->GetIndexableField(0), clone->GetIndexableField(0)); CPPUNIT_ASSERT_EQUAL_MESSAGE("field 1 differs", orig->GetIndexableField(1), clone->GetIndexableField(1)); CPPUNIT_ASSERT_EQUAL_MESSAGE("field 2 differs", orig->GetIndexableField(2), clone->GetIndexableField(2)); }