TEST_F(FFITest, CStackWithString) { CStack cstack; cstack.push(Object::makeFixnum(3), CStack::SIGNATURE_INT); cstack.push("hige", CStack::SIGNATURE_POINTER); intptr_t* p = cstack.frame(); EXPECT_EQ(2, cstack.count()); EXPECT_EQ(3, p[0]); EXPECT_STREQ("hige", (char*)p[1]); }
TEST_F(FFITest, CStackWithFlonum) { CStack cstack; EXPECT_TRUE(cstack.push(Object::makeFlonum(3.0), CStack::SIGNATURE_DOUBLE)); EXPECT_TRUE(cstack.push(Object::makeFlonum(2.0), CStack::SIGNATURE_DOUBLE)); double* p = (double*)cstack.frame(); EXPECT_EQ(4, cstack.count()); EXPECT_DOUBLE_EQ(3.0, p[0]); EXPECT_DOUBLE_EQ(2.0, p[1]); }
TEST_F(FFITest, CStackWithByteVector) { CStack cstack; Object b = Object::makeByteVector(2); ByteVector* const bv = b.toByteVector(); bv->u8Set(0, 1); bv->u8Set(1, 2); cstack.push(b, CStack::SIGNATURE_POINTER); cstack.push("hige", CStack::SIGNATURE_POINTER); intptr_t* p = cstack.frame(); EXPECT_EQ(2, cstack.count()); EXPECT_EQ(1, ((uint8_t*)(p[0]))[0]); EXPECT_EQ(2, ((uint8_t*)(p[0]))[1]); EXPECT_STREQ("hige", (char*)p[1]); }
TEST_F(FFITest, CStackWithFixnum) { CStack cstack; EXPECT_TRUE(cstack.push(Object::makeFixnum(3), CStack::SIGNATURE_INT)); EXPECT_TRUE(cstack.push(Object::makeFixnum(4), CStack::SIGNATURE_INT)); EXPECT_TRUE(cstack.push(Object::makeFixnum(-5), CStack::SIGNATURE_INT)); EXPECT_TRUE(cstack.push(Bignum::makeIntegerFromU32(0xffffffff), CStack::SIGNATURE_INT64)); intptr_t* p = cstack.frame(); EXPECT_EQ(5, cstack.count()); EXPECT_EQ(3, p[0]); EXPECT_EQ(4, p[1]); EXPECT_EQ(-5, p[2]); const uint32_t x = 0xffffffff; const uint32_t y = p[3]; EXPECT_EQ(x, y); }
TEST_F(FFITest, CStackWithFlonum) { CStack cstack; // use sse registers EXPECT_TRUE(cstack.push(Object::makeFlonum(1.0), CStack::SIGNATURE_DOUBLE)); EXPECT_TRUE(cstack.push(Object::makeFlonum(2.0), CStack::SIGNATURE_DOUBLE)); EXPECT_TRUE(cstack.push(Object::makeFlonum(3.0), CStack::SIGNATURE_DOUBLE)); EXPECT_TRUE(cstack.push(Object::makeFlonum(4.0), CStack::SIGNATURE_DOUBLE)); EXPECT_TRUE(cstack.push(Object::makeFlonum(5.0), CStack::SIGNATURE_DOUBLE)); EXPECT_TRUE(cstack.push(Object::makeFlonum(6.0), CStack::SIGNATURE_DOUBLE)); EXPECT_TRUE(cstack.push(Object::makeFlonum(7.0), CStack::SIGNATURE_DOUBLE)); EXPECT_TRUE(cstack.push(Object::makeFlonum(8.0), CStack::SIGNATURE_DOUBLE)); // use stack EXPECT_TRUE(cstack.push(Object::makeFlonum(9.0), CStack::SIGNATURE_DOUBLE)); EXPECT_TRUE(cstack.push(Object::makeFlonum(10.0), CStack::SIGNATURE_DOUBLE)); EXPECT_EQ(2, cstack.count()); double* p = (double*)cstack.frame(); EXPECT_DOUBLE_EQ(9.0, p[0]); EXPECT_DOUBLE_EQ(10.0, p[1]); }