diff --git a/src/main/vm/CMakeLists.txt b/src/main/vm/CMakeLists.txt index d5237cb9a97969817f128d085aea9dafb30d06e0..e91b7cbf332b987b3d1b7de45f23035b3aad2d7b 100644 --- a/src/main/vm/CMakeLists.txt +++ b/src/main/vm/CMakeLists.txt @@ -11,6 +11,7 @@ INCLUDE_DIRECTORIES(./) set(SOURCE_FILE object/hiInteger.cpp + object/hiLong.cpp object/hiDouble.cpp object/hiString.cpp object/hiObject.cpp @@ -67,6 +68,6 @@ ADD_LIBRARY(hivm SHARED ${SOURCE_FILE}) # libmath ADD_LIBRARY(math SHARED extlib/math.cpp) -TARGET_LINK_LIBRARIES(hivm dl) +TARGET_LINK_LIBRARIES(hivm) TARGET_LINK_LIBRARIES(math hivm) TARGET_LINK_LIBRARIES(railgun hivm math) diff --git a/src/main/vm/object/hiLong.cpp b/src/main/vm/object/hiLong.cpp new file mode 100644 index 0000000000000000000000000000000000000000..eaed7a96086f812fb901660d3df0b5f7e338b79e --- /dev/null +++ b/src/main/vm/object/hiLong.cpp @@ -0,0 +1,222 @@ +#include "object/klass.hpp" +#include "object/hiDict.hpp" +#include "object/hiDouble.hpp" +#include "object/hiString.hpp" +#include "object/HiLong.hpp" +#include "runtime/universe.hpp" + +#include +#include + +LongKlass* LongKlass::instance = NULL; + +LongKlass::LongKlass() { +} + +void LongKlass::initialize() { + set_klass_dict(new HiDict()); + set_name(new HiString("int")); + (new HiTypeObject())->set_own_klass(this); + add_super(ObjectKlass::get_instance()); +} + +HiLong::HiLong(long long x) { + _value = x; + set_klass(LongKlass::get_instance()); +} + +LongKlass* LongKlass::get_instance() { + if (instance == NULL) + instance = new LongKlass(); + + return instance; +} + +void LongKlass::print(HiObject* obj) { + HiLong* long_obj = (HiLong*) obj; + + assert(long_obj && (long_obj->klass()) == this); + + printf("%ld", long_obj->value()); +} + +HiObject* LongKlass::allocate_instance(HiObject* callable, + ArrayList* args) { + if (!args || args->length() == 0) + return new HiLong(0); + else + return NULL; +} + +size_t LongKlass::size() { + return sizeof(HiLong); +} + +void LongKlass::oops_do(OopClosure* f, HiObject* obj) { + // do nothing + // only overwrite warning message in Klass +} + +HiObject* LongKlass::greater(HiObject* x, HiObject* y) { + HiLong* ix = (HiLong*) x; + HiLong* iy = (HiLong*) y; + + assert(ix && (ix->klass() == (Klass *)this)); + assert(iy && (iy->klass() == (Klass *)this)); + + if (ix->value() > iy->value()) + return Universe::HiTrue; + else + return Universe::HiFalse; +} + +HiObject* LongKlass::less(HiObject* x, HiObject* y) { + HiLong* ix = (HiLong*) x; + assert(ix && (ix->klass() == (Klass *)this)); + + if (x->klass() != y->klass()) { + if (Klass::compare_klass(x->klass(), y->klass()) < 0) + return Universe::HiTrue; + else + return Universe::HiFalse; + } + + HiLong* iy = (HiLong*)y; + assert(iy && (iy->klass() == (Klass *)this)); + + if (ix->value() < iy->value()) + return Universe::HiTrue; + else + return Universe::HiFalse; +} + +HiObject* LongKlass::equal(HiObject* x, HiObject* y) { + if (x->klass() != y->klass()) + return Universe::HiFalse; + + HiLong* ix = (HiLong*) x; + HiLong* iy = (HiLong*) y; + + assert(ix && (ix->klass() == (Klass *)this)); + assert(iy && (iy->klass() == (Klass *)this)); + + if (ix->value() == iy->value()) + return Universe::HiTrue; + else + return Universe::HiFalse; +} + +HiObject* LongKlass::not_equal(HiObject* x, HiObject* y) { + HiLong* ix = (HiLong*) x; + HiLong* iy = (HiLong*) y; + + assert(ix && (ix->klass() == (Klass *)this)); + assert(iy && (iy->klass() == (Klass *)this)); + + if (ix->value() != iy->value()) + return Universe::HiTrue; + else + return Universe::HiFalse; +} + +HiObject* LongKlass::ge(HiObject* x, HiObject* y) { + HiLong* ix = (HiLong*) x; + HiLong* iy = (HiLong*) y; + + assert(ix && (ix->klass() == (Klass *)this)); + assert(iy && (iy->klass() == (Klass *)this)); + + if (ix->value() >= iy->value()) + return Universe::HiTrue; + else + return Universe::HiFalse; +} + +HiObject* LongKlass::le(HiObject* x, HiObject* y) { + HiLong* ix = (HiLong*) x; + HiLong* iy = (HiLong*) y; + + assert(ix && (ix->klass() == (Klass *)this)); + assert(iy && (iy->klass() == (Klass *)this)); + + if (ix->value() <= iy->value()) + return Universe::HiTrue; + else + return Universe::HiFalse; +} + +HiObject* LongKlass::neg(HiObject* x) { + HiLong* ix = (HiLong*) x; + assert(ix && (ix->klass() == (Klass *)this)); + + return new HiLong(0 - ix->value()); +} + +HiObject* LongKlass::add(HiObject* x, HiObject* y) { + HiLong* ix = (HiLong*) x; + HiLong* iy = (HiLong*) y; + + assert(ix && (ix->klass() == (Klass *)this)); + assert(iy && (iy->klass() == (Klass *)this)); + + return new HiLong(ix->value() + iy->value()); +} + +HiObject* LongKlass::power(HiObject* x, HiObject* y) { + HiLong* ix = (HiLong*) x; + assert(ix && (ix->klass() == (Klass *)this)); + + if (y->klass() == (Klass *) this) { + HiLong* iy = (HiLong*) y; + return new HiLong((int)(pow(ix->value(), iy->value()))); + } + else if (y->klass() == (Klass *)(DoubleKlass::get_instance())) { + HiDouble* dy = (HiDouble *) y; + return new HiDouble(pow(ix->value(), dy->value())); + } + + return NULL; +} + +HiObject* LongKlass::sub(HiObject* x, HiObject* y) { + HiLong* ix = (HiLong*) x; + HiLong* iy = (HiLong*) y; + + assert(ix && (ix->klass() == (Klass *)this)); + assert(iy && (iy->klass() == (Klass *)this)); + + return new HiLong(ix->value() - iy->value()); +} + +HiObject* LongKlass::mul(HiObject* x, HiObject* y) { + HiLong* ix = (HiLong*) x; + HiLong* iy = (HiLong*) y; + + assert(ix && (ix->klass() == (Klass *)this)); + assert(iy && (iy->klass() == (Klass *)this)); + + return new HiLong(ix->value() * iy->value()); +} + +HiObject* LongKlass::div(HiObject* x, HiObject* y) { + HiLong* ix = (HiLong*) x; + HiLong* iy = (HiLong*) y; + + assert(ix && (ix->klass() == (Klass *)this)); + assert(iy && (iy->klass() == (Klass *)this)); + assert(iy->value() != 0); + + return new HiLong(ix->value() / iy->value()); +} + +HiObject* LongKlass::mod(HiObject* x, HiObject* y) { + HiLong* ix = (HiLong*) x; + HiLong* iy = (HiLong*) y; + + assert(ix && (ix->klass() == (Klass *)this)); + assert(iy && (iy->klass() == (Klass *)this)); + assert(iy->value() != 0); + + return new HiLong(ix->value() % iy->value()); +} + diff --git a/src/main/vm/object/hiLong.hpp b/src/main/vm/object/hiLong.hpp new file mode 100644 index 0000000000000000000000000000000000000000..408f5b7fdf6ffec50e2206562950cef247b69185 --- /dev/null +++ b/src/main/vm/object/hiLong.hpp @@ -0,0 +1,51 @@ +#ifndef _HI_LONG_HPP +#define _HI_LONG_HPP + +#include "object/klass.hpp" +#include "object/hiObject.hpp" + +class LongKlass : public Klass { +private: + LongKlass(); + static LongKlass* instance; + +public: + static LongKlass* get_instance(); + void initialize(); + + virtual void print(HiObject* obj); + + virtual HiObject* greater (HiObject* x, HiObject* y); + virtual HiObject* less (HiObject* x, HiObject* y); + virtual HiObject* equal (HiObject* x, HiObject* y); + virtual HiObject* not_equal(HiObject* x, HiObject* y); + virtual HiObject* ge (HiObject* x, HiObject* y); + virtual HiObject* le (HiObject* x, HiObject* y); + + virtual HiObject* neg(HiObject* x); + + virtual HiObject* add(HiObject* x, HiObject* y); + virtual HiObject* sub(HiObject* x, HiObject* y); + virtual HiObject* mul(HiObject* x, HiObject* y); + virtual HiObject* div(HiObject* x, HiObject* y); + virtual HiObject* power(HiObject* x, HiObject* y); + virtual HiObject* mod(HiObject* x, HiObject* y); + + virtual HiObject* allocate_instance(HiObject* callable, + ArrayList* args); + + virtual size_t size(); + virtual void oops_do(OopClosure* f, HiObject* obj); +}; + +class HiLong : public HiObject { +private: + long long _value; + +public: + HiLong(long long x); + long long value() { return _value; } +}; + +#endif +