mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 03:20:18 +00:00
up
This commit is contained in:
parent
48ad1f2ca2
commit
e61eb15a62
@ -509,7 +509,7 @@ void __initializeBuiltinFunctions(VM* _vm) {
|
|||||||
|
|
||||||
|
|
||||||
void __addModuleTime(VM* vm){
|
void __addModuleTime(VM* vm){
|
||||||
PyVar mod = vm->newModule("time");
|
PyVar mod = vm->new_module("time");
|
||||||
vm->bindFunc<0>(mod, "time", [](VM* vm, const pkpy::ArgList& args) {
|
vm->bindFunc<0>(mod, "time", [](VM* vm, const pkpy::ArgList& args) {
|
||||||
auto now = std::chrono::high_resolution_clock::now();
|
auto now = std::chrono::high_resolution_clock::now();
|
||||||
return vm->PyFloat(std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch()).count() / 1000000.0);
|
return vm->PyFloat(std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch()).count() / 1000000.0);
|
||||||
@ -517,7 +517,7 @@ void __addModuleTime(VM* vm){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void __addModuleSys(VM* vm){
|
void __addModuleSys(VM* vm){
|
||||||
PyVar mod = vm->newModule("sys");
|
PyVar mod = vm->new_module("sys");
|
||||||
vm->bindFunc<1>(mod, "getrefcount", [](VM* vm, const pkpy::ArgList& args) {
|
vm->bindFunc<1>(mod, "getrefcount", [](VM* vm, const pkpy::ArgList& args) {
|
||||||
return vm->PyInt(args[0].use_count());
|
return vm->PyInt(args[0].use_count());
|
||||||
});
|
});
|
||||||
@ -535,7 +535,7 @@ void __addModuleSys(VM* vm){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void __addModuleJson(VM* vm){
|
void __addModuleJson(VM* vm){
|
||||||
PyVar mod = vm->newModule("json");
|
PyVar mod = vm->new_module("json");
|
||||||
vm->bindFunc<1>(mod, "loads", [](VM* vm, const pkpy::ArgList& args) {
|
vm->bindFunc<1>(mod, "loads", [](VM* vm, const pkpy::ArgList& args) {
|
||||||
const _Str& expr = vm->PyStr_AS_C(args[0]);
|
const _Str& expr = vm->PyStr_AS_C(args[0]);
|
||||||
_Code code = vm->compile(expr, "<json>", JSON_MODE);
|
_Code code = vm->compile(expr, "<json>", JSON_MODE);
|
||||||
@ -548,7 +548,7 @@ void __addModuleJson(VM* vm){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void __addModuleMath(VM* vm){
|
void __addModuleMath(VM* vm){
|
||||||
PyVar mod = vm->newModule("math");
|
PyVar mod = vm->new_module("math");
|
||||||
vm->setattr(mod, "pi", vm->PyFloat(3.1415926535897932384));
|
vm->setattr(mod, "pi", vm->PyFloat(3.1415926535897932384));
|
||||||
vm->setattr(mod, "e" , vm->PyFloat(2.7182818284590452354));
|
vm->setattr(mod, "e" , vm->PyFloat(2.7182818284590452354));
|
||||||
|
|
||||||
@ -647,7 +647,7 @@ PyVar __regex_search(const _Str& pattern, const _Str& string, bool fromStart, VM
|
|||||||
};
|
};
|
||||||
|
|
||||||
void __addModuleRe(VM* vm){
|
void __addModuleRe(VM* vm){
|
||||||
PyVar mod = vm->newModule("re");
|
PyVar mod = vm->new_module("re");
|
||||||
ReMatch::_bind(vm);
|
ReMatch::_bind(vm);
|
||||||
|
|
||||||
vm->bindFunc<2>(mod, "match", [](VM* vm, const pkpy::ArgList& args) {
|
vm->bindFunc<2>(mod, "match", [](VM* vm, const pkpy::ArgList& args) {
|
||||||
@ -783,7 +783,7 @@ extern "C" {
|
|||||||
__EXPORT
|
__EXPORT
|
||||||
/// Add a source module into a virtual machine.
|
/// Add a source module into a virtual machine.
|
||||||
void pkpy_vm_add_module(VM* vm, const char* name, const char* source){
|
void pkpy_vm_add_module(VM* vm, const char* name, const char* source){
|
||||||
vm->addLazyModule(name, source);
|
vm->_lazy_modules[name] = source;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __vm_init(VM* vm){
|
void __vm_init(VM* vm){
|
||||||
|
16
src/vm.h
16
src/vm.h
@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
class VM {
|
class VM {
|
||||||
std::vector<PyVar> _small_integers; // [-5, 256]
|
std::vector<PyVar> _small_integers; // [-5, 256]
|
||||||
emhash8::HashMap<_Str, _Str> _lazy_modules; // lazy loaded modules
|
|
||||||
protected:
|
protected:
|
||||||
std::deque< std::unique_ptr<Frame> > callstack;
|
std::deque< std::unique_ptr<Frame> > callstack;
|
||||||
PyVar __py2py_call_signal;
|
PyVar __py2py_call_signal;
|
||||||
@ -310,7 +309,7 @@ protected:
|
|||||||
}else{
|
}else{
|
||||||
const _Str& source = it2->second;
|
const _Str& source = it2->second;
|
||||||
_Code code = compile(source, name, EXEC_MODE);
|
_Code code = compile(source, name, EXEC_MODE);
|
||||||
PyVar _m = newModule(name);
|
PyVar _m = new_module(name);
|
||||||
_exec(code, _m, pkpy::make_shared<PyVarDict>());
|
_exec(code, _m, pkpy::make_shared<PyVarDict>());
|
||||||
frame->push(_m);
|
frame->push(_m);
|
||||||
_lazy_modules.erase(it2);
|
_lazy_modules.erase(it2);
|
||||||
@ -340,6 +339,7 @@ protected:
|
|||||||
public:
|
public:
|
||||||
PyVarDict _types;
|
PyVarDict _types;
|
||||||
PyVarDict _modules; // loaded modules
|
PyVarDict _modules; // loaded modules
|
||||||
|
emhash8::HashMap<_Str, _Str> _lazy_modules; // lazy loaded modules
|
||||||
PyVar None, True, False, Ellipsis;
|
PyVar None, True, False, Ellipsis;
|
||||||
|
|
||||||
bool use_stdio;
|
bool use_stdio;
|
||||||
@ -598,17 +598,13 @@ public:
|
|||||||
return new_object(T::_tp(this), T(std::forward<Args>(args)...));
|
return new_object(T::_tp(this), T(std::forward<Args>(args)...));
|
||||||
}
|
}
|
||||||
|
|
||||||
PyVar newModule(_Str name) {
|
PyVar new_module(_Str name) {
|
||||||
PyVar obj = new_object(_tp_module, (i64)-2);
|
PyVar obj = new_object(_tp_module, DUMMY_VAL);
|
||||||
setattr(obj, __name__, PyStr(name));
|
setattr(obj, __name__, PyStr(name));
|
||||||
_modules[name] = obj;
|
_modules[name] = obj;
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
void addLazyModule(_Str name, _Str source){
|
|
||||||
_lazy_modules[name] = source;
|
|
||||||
}
|
|
||||||
|
|
||||||
PyVarOrNull getattr(const PyVar& obj, const _Str& name, bool throw_err=true) {
|
PyVarOrNull getattr(const PyVar& obj, const _Str& name, bool throw_err=true) {
|
||||||
PyVarDict::iterator it;
|
PyVarDict::iterator it;
|
||||||
PyObject* cls;
|
PyObject* cls;
|
||||||
@ -860,8 +856,8 @@ public:
|
|||||||
this->Ellipsis = new_object(_types["ellipsis"], DUMMY_VAL);
|
this->Ellipsis = new_object(_types["ellipsis"], DUMMY_VAL);
|
||||||
this->True = new_object(_tp_bool, true);
|
this->True = new_object(_tp_bool, true);
|
||||||
this->False = new_object(_tp_bool, false);
|
this->False = new_object(_tp_bool, false);
|
||||||
this->builtins = newModule("builtins");
|
this->builtins = new_module("builtins");
|
||||||
this->_main = newModule("__main__");
|
this->_main = new_module("__main__");
|
||||||
|
|
||||||
setattr(_tp_type, __base__, _tp_object);
|
setattr(_tp_type, __base__, _tp_object);
|
||||||
_tp_type->_type = _tp_type;
|
_tp_type->_type = _tp_type;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user