Skip to content

Commit a12f862

Browse files
committed
自定义类型
1 parent 525b9d3 commit a12f862

14 files changed

+69
-12
lines changed

object/hiDict.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ void DictKlass::del_subscr(HiObject *x, HiObject *y) {
126126
((HiDict *) x)->remove(y);
127127
}
128128

129-
HiObject *DictKlass::allocate_instance(ArrayList<HiObject *> *args) {
129+
HiObject *DictKlass::allocate_instance(HiObject *callable, ArrayList<HiObject *> *args) {
130130
if (!args || args->length() == 0) {
131131
return new HiDict();
132132
} else {

object/hiDict.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class DictKlass : public Klass {
2323
virtual void store_subscr(HiObject* x, HiObject* y, HiObject* z);
2424
virtual void del_subscr (HiObject* x, HiObject* y);
2525

26-
virtual HiObject *allocate_instance(ArrayList<HiObject *> *args);
26+
virtual HiObject *allocate_instance(HiObject* callable, ArrayList<HiObject *> *args);
2727

2828
virtual size_t size();
2929
};

object/hiInteger.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ HiObject *IntegerKlass::mod(HiObject *x, HiObject *y) {
182182
return new HiInteger(ix->value() % iy->value());
183183
}
184184

185-
HiObject *IntegerKlass::allocate_instance(ArrayList<HiObject *> *args) {
185+
HiObject *IntegerKlass::allocate_instance(HiObject *callable, ArrayList<HiObject *> *args) {
186186
if (!args || args->length() == 0) {
187187
return new HiInteger(0);
188188
} else {

object/hiInteger.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class IntegerKlass : public Klass {
3030
virtual HiObject* div(HiObject* x, HiObject* y);
3131
virtual HiObject* mod(HiObject* x, HiObject* y);
3232

33-
virtual HiObject *allocate_instance(ArrayList<HiObject *> *args);
33+
virtual HiObject *allocate_instance(HiObject* callable, ArrayList<HiObject *> *args);
3434
};
3535

3636
class HiInteger : public HiObject {

object/hiList.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ HiObject *ListKlass::iter(HiObject *x) {
179179
return new ListIterator((HiList *) x);
180180
}
181181

182-
HiObject *ListKlass::allocate_instance(ArrayList<HiObject *> *args) {
182+
HiObject *ListKlass::allocate_instance(HiObject *callable, ArrayList<HiObject *> *args) {
183183
if (!args || args->length() == 0) {
184184
return new HiList();
185185
} else {

object/hiList.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class ListKlass : public Klass {
3030
virtual HiObject *len(HiObject *x);
3131
virtual HiObject *iter(HiObject* x);
3232

33-
virtual HiObject *allocate_instance(ArrayList<HiObject *> *args);
33+
virtual HiObject *allocate_instance(HiObject* callable, ArrayList<HiObject *> *args);
3434
};
3535

3636
class HiList : public HiObject {

object/hiString.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ HiObject *StringKlass::len(HiObject *x) {
8989
return new HiInteger(((HiString *) x)->length());
9090
}
9191

92-
HiObject *StringKlass::allocate_instance(ArrayList<HiObject *> *args) {
92+
HiObject *StringKlass::allocate_instance(HiObject *callable, ArrayList<HiObject *> *args) {
9393
if (!args || args->length() == 0) {
9494
return new HiString("");
9595
} else {

object/hiString.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class StringKlass : public Klass {
3030

3131
virtual HiObject *len(HiObject *x);
3232

33-
virtual HiObject *allocate_instance(ArrayList<HiObject *> *args);
33+
virtual HiObject *allocate_instance(HiObject* callable, ArrayList<HiObject *> *args);
3434
};
3535

3636
class HiString : public HiObject {

object/klass.cpp

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
#include "object/hiObject.hpp"
77
#include "object/hiInteger.hpp"
88
#include "object/hiString.hpp"
9+
#include "object/hiDict.hpp"
10+
#include "object/hiList.hpp"
911
#include "runtime/universe.hpp"
1012

1113
Klass::Klass() {
@@ -28,4 +30,33 @@ int Klass::compare_klass(Klass *x, Klass *y) {
2830
} else {
2931
return 1;
3032
}
31-
}
33+
}
34+
35+
HiObject *Klass::create_klass(HiObject *x, HiObject *supers, HiObject *name) {
36+
assert(x->klass() == (Klass *) DictKlass::get_instance());
37+
assert(supers->klass() == (Klass *) ListKlass::get_instance());
38+
assert(name->klass() == (Klass *) StringKlass::get_instance());
39+
40+
Klass *new_klass = new Klass();
41+
HiDict *klass_dict = (HiDict *) x;
42+
HiList *supers_list = (HiList *) supers;
43+
44+
new_klass->set_klass_dict(klass_dict);
45+
new_klass->set_name((HiString *) name);
46+
// TODO 暂时先处理单继承
47+
if (supers_list->inner_list()->length() > 0) {
48+
HiTypeObject *super = (HiTypeObject *) supers_list->inner_list()->get(0);
49+
new_klass->set_super(super->own_klass());
50+
}
51+
52+
HiTypeObject *type_obj = new HiTypeObject();
53+
type_obj->set_own_klass(new_klass);
54+
55+
return type_obj;
56+
}
57+
58+
HiObject *Klass::allocate_instance(HiObject *callable, ArrayList<HiObject *> *args) {
59+
HiObject *instance = new HiObject();
60+
instance->set_klass(((HiTypeObject*)callable)->own_klass());
61+
return instance;
62+
}

object/klass.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ class Klass {
2525
public:
2626
Klass();
2727

28+
static HiObject *create_klass(HiObject *x, HiObject *supers, HiObject *name);
29+
2830
static int compare_klass(Klass* x, Klass* y);
2931

3032
void set_type_object(HiTypeObject *x) { _type_object = x; }
@@ -65,7 +67,7 @@ class Klass {
6567
virtual HiObject *next (HiObject* x) { return 0; }
6668
virtual HiObject *iter (HiObject* x) { return 0; }
6769

68-
virtual HiObject *allocate_instance(ArrayList<HiObject *> *args) { return 0;}
70+
virtual HiObject *allocate_instance(HiObject* callable, ArrayList<HiObject *> *args);
6971
};
7072

7173
#endif //PYTHONVM_KLASS_HPP

0 commit comments

Comments
 (0)