代码拉取完成,页面将自动刷新
同步操作将从 hinus/pythonvm 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
#include "object/hiInteger.hpp"
#include "object/hiList.hpp"
#include "object/hiString.hpp"
#include "object/hiDict.hpp"
#include "runtime/universe.hpp"
#include "runtime/functionObject.hpp"
#include "memory/heap.hpp"
#include "memory/oopClosure.hpp"
FunctionKlass* FunctionKlass::instance = NULL;
FunctionKlass* FunctionKlass::get_instance() {
if (instance == NULL)
instance = new FunctionKlass();
return instance;
}
FunctionKlass::FunctionKlass() {
add_super(ObjectKlass::get_instance());
set_name(new HiString("function"));
HiTypeObject* tp_obj = new HiTypeObject();
tp_obj->set_own_klass(this);
}
void FunctionKlass::print(HiObject* obj) {
printf("<function : ");
FunctionObject* fo = static_cast<FunctionObject*>(obj);
assert(fo && fo->klass() == (Klass*) this);
fo->func_name()->print();
printf(">");
}
size_t FunctionKlass::size() {
return sizeof(FunctionObject);
}
void FunctionKlass::oops_do(OopClosure* f, HiObject* obj) {
FunctionObject* fo = (FunctionObject*)obj;
assert(fo->klass() == (Klass*)this);
f->do_oop((HiObject**)&fo->_func_code);
f->do_oop((HiObject**)&fo->_func_name);
f->do_oop((HiObject**)&fo->_globals);
f->do_oop((HiObject**)&fo->_closure);
f->do_array_list(&fo->_defaults);
}
FunctionObject::FunctionObject(HiObject* code_object) {
CodeObject* co = (CodeObject*) code_object;
_func_code = co;
_func_name = co->_co_name;
_flags = co->_flag;
_globals = NULL;
_closure = NULL;
set_klass(FunctionKlass::get_instance());
}
FunctionObject::FunctionObject(NativeFuncPointer nfp) {
_func_code = NULL;
_func_name = NULL;
_flags = 0;
_globals = NULL;
_closure = NULL;
_native_func = nfp;
set_klass(NativeFunctionKlass::get_instance());
}
void FunctionObject::set_default(ArrayList<HiObject*>* defaults) {
if (defaults == NULL) {
_defaults = NULL;
return;
}
_defaults = new ArrayList<HiObject*>(defaults->length());
for (int i = 0; i < defaults->length(); i++) {
_defaults->set(i, defaults->get(i));
}
}
/*
* Operations for native calls.
*/
NativeFunctionKlass* NativeFunctionKlass::instance = NULL;
NativeFunctionKlass* NativeFunctionKlass::get_instance() {
if (instance == NULL)
instance = new NativeFunctionKlass();
return instance;
}
NativeFunctionKlass::NativeFunctionKlass() {
add_super(FunctionKlass::get_instance());
set_name(new HiString("native function"));
HiTypeObject* tp_obj = new HiTypeObject();
tp_obj->set_own_klass(this);
}
HiObject* FunctionObject::call(ObjList args) {
return (*_native_func)(args);
}
/*
* Operations for methods
* Method is a wrapper for function.
*/
MethodKlass* MethodKlass::instance = NULL;
MethodKlass* MethodKlass::get_instance() {
if (instance == NULL)
instance = new MethodKlass();
return instance;
}
MethodKlass::MethodKlass() {
add_super(FunctionKlass::get_instance());
set_name(new HiString("method"));
HiTypeObject* tp_obj = new HiTypeObject();
tp_obj->set_own_klass(this);
}
size_t MethodKlass::size() {
return sizeof(MethodObject);
}
void MethodKlass::oops_do(OopClosure* f, HiObject* obj) {
MethodObject* mo = (MethodObject*)obj;
assert(mo->klass() == (Klass*)this);
f->do_oop((HiObject**)&mo->_owner);
f->do_oop((HiObject**)&mo->_func);
}
HiObject* len(ObjList args) {
return args->get(0)->len();
}
HiObject* string_upper(ObjList args) {
HiObject* arg0 = args->get(0);
assert(arg0->klass() == StringKlass::get_instance());
HiString* str_obj = (HiString*)arg0;
int length = str_obj->length();
if (length <= 0)
return Universe::HiNone;
char* v = new char[length];
char c;
for (int i = 0; i < length; i++) {
c = str_obj->value()[i];
if (c >= 'a' && c <= 'z')
v[i] = c - 0x20;
else
v[i] = c;
}
return new HiString(v, length);
}
HiObject* type_of(ObjList args) {
HiObject* arg0 = args->get(0);
return arg0->klass()->type_object();
}
HiObject* isinstance(ObjList args) {
HiObject* x = args->get(0);
HiObject* y = args->get(1);
assert(y && y->klass() == TypeKlass::get_instance());
Klass* k = x->klass();
if (k->type_object() == y)
return Universe::HiTrue;
for (int i = 0; i < k->mro()->size(); i++) {
if (k->mro()->get(i) == y) {
return Universe::HiTrue;
}
}
return Universe::HiFalse;
}
HiObject* builtin_super(ObjList args) {
return NULL;
}
HiObject* sysgc(ObjList args) {
Universe::heap->gc();
return Universe::HiNone;
}
bool MethodObject::is_function(HiObject *x) {
Klass* k = x->klass();
if (k == (Klass*) FunctionKlass::get_instance())
return true;
if (k->mro() == NULL)
return false;
for (int i = 0; i < k->mro()->size(); i++) {
if (k->mro()->get(i) ==
FunctionKlass::get_instance()->type_object()) {
return true;
}
}
return false;
}
bool MethodObject::is_yield_function(HiObject *x) {
Klass* k = x->klass();
if (k != (Klass*) FunctionKlass::get_instance())
return false;
FunctionObject* fo = (FunctionObject*)x;
return ((fo->flags() & FunctionObject::CO_GENERATOR) != 0);
}
size_t NativeFunctionKlass::size() {
return sizeof(FunctionObject);
}
void NativeFunctionKlass::oops_do(OopClosure* f, HiObject* obj) {
FunctionObject* fo = (FunctionObject*)obj;
assert(fo->klass() == (Klass*)this);
f->do_oop((HiObject**)&fo->_func_code);
f->do_oop((HiObject**)&fo->_func_name);
f->do_oop((HiObject**)&fo->_globals);
f->do_oop((HiObject**)&fo->_closure);
f->do_array_list(&fo->_defaults);
}
HiObject* iter(ObjList args) {
return args->get(0)->iter();
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。