mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 19:40:18 +00:00
some fix
This commit is contained in:
parent
0bafc17994
commit
fdc26c6b93
@ -53,7 +53,6 @@ typedef struct pk_VM {
|
|||||||
// singleton objects
|
// singleton objects
|
||||||
py_TValue True, False, None, NotImplemented, Ellipsis;
|
py_TValue True, False, None, NotImplemented, Ellipsis;
|
||||||
|
|
||||||
py_Error* last_error;
|
|
||||||
py_TValue last_retval;
|
py_TValue last_retval;
|
||||||
py_TValue reg[8]; // users' registers
|
py_TValue reg[8]; // users' registers
|
||||||
|
|
||||||
|
@ -8,18 +8,24 @@ typedef struct py_TValue py_TValue;
|
|||||||
typedef struct pk_VM pk_VM;
|
typedef struct pk_VM pk_VM;
|
||||||
typedef uint16_t py_Name;
|
typedef uint16_t py_Name;
|
||||||
typedef int16_t py_Type;
|
typedef int16_t py_Type;
|
||||||
typedef py_TValue* py_Ref;
|
|
||||||
typedef struct py_Str py_Str;
|
typedef struct py_Str py_Str;
|
||||||
|
|
||||||
typedef struct py_Error {
|
/// Generic reference.
|
||||||
py_Type type;
|
typedef py_TValue* py_Ref;
|
||||||
} py_Error;
|
/// An object reference which has the same lifespan as the object.
|
||||||
|
typedef py_TValue* py_ObjectRef;
|
||||||
|
/// A global reference which has the same lifespan as the VM.
|
||||||
|
typedef py_TValue* py_GlobalRef;
|
||||||
|
/// A specific location in the stack.
|
||||||
|
typedef py_TValue* py_StackRef;
|
||||||
|
/// A temporary reference which has a short or unknown lifespan.
|
||||||
|
typedef py_TValue* py_TmpRef;
|
||||||
|
|
||||||
/// Native function signature.
|
/// Native function signature.
|
||||||
/// @param argc number of arguments.
|
/// @param argc number of arguments.
|
||||||
/// @param argv array of arguments. Use `py_arg(i)` macro to get the i-th argument.
|
/// @param argv array of arguments. Use `py_arg(i)` macro to get the i-th argument.
|
||||||
/// @return true if the function is successful.
|
/// @return true if the function is successful.
|
||||||
typedef bool (*py_CFunction)(int argc, py_TValue* argv);
|
typedef bool (*py_CFunction)(int argc, py_StackRef argv);
|
||||||
|
|
||||||
typedef enum BindType {
|
typedef enum BindType {
|
||||||
BindType_FUNCTION,
|
BindType_FUNCTION,
|
||||||
@ -115,12 +121,12 @@ bool py_issubclass(py_Type derived, py_Type base);
|
|||||||
#define py_checkargc(n) \
|
#define py_checkargc(n) \
|
||||||
if(argc != n) return TypeError()
|
if(argc != n) return TypeError()
|
||||||
|
|
||||||
py_Ref py_tpmagic(py_Type type, py_Name name);
|
py_GlobalRef py_tpmagic(py_Type type, py_Name name);
|
||||||
#define py_bindmagic(type, __magic__, f) py_newnativefunc(py_tpmagic((type), __magic__), (f))
|
#define py_bindmagic(type, __magic__, f) py_newnativefunc(py_tpmagic((type), __magic__), (f))
|
||||||
|
|
||||||
// new style decl-based bindings
|
// new style decl-based bindings
|
||||||
py_Ref py_bind(py_Ref obj, const char* sig, py_CFunction f);
|
py_TmpRef py_bind(py_Ref obj, const char* sig, py_CFunction f);
|
||||||
py_Ref py_bind2(py_Ref obj,
|
py_TmpRef py_bind2(py_Ref obj,
|
||||||
const char* sig,
|
const char* sig,
|
||||||
py_CFunction f,
|
py_CFunction f,
|
||||||
BindType bt,
|
BindType bt,
|
||||||
@ -133,23 +139,23 @@ void py_bindnativefunc(py_Ref obj, const char* name, py_CFunction f);
|
|||||||
|
|
||||||
/// Get the reference to the i-th register.
|
/// Get the reference to the i-th register.
|
||||||
/// @lifespan: Permanent.
|
/// @lifespan: Permanent.
|
||||||
py_Ref py_reg(int i);
|
py_GlobalRef py_reg(int i);
|
||||||
|
|
||||||
/// Get the reference of the object's `__dict__`.
|
/// Get the reference of the object's `__dict__`.
|
||||||
/// The object must have a `__dict__`.
|
/// The object must have a `__dict__`.
|
||||||
/// Returns a reference to the value or NULL if not found.
|
/// Returns a reference to the value or NULL if not found.
|
||||||
/// @lifespan: Object.
|
/// @lifespan: Object.
|
||||||
py_Ref py_getdict(const py_Ref self, py_Name name);
|
py_ObjectRef py_getdict(const py_Ref self, py_Name name);
|
||||||
void py_setdict(py_Ref self, py_Name name, const py_Ref val);
|
void py_setdict(py_Ref self, py_Name name, const py_Ref val);
|
||||||
|
|
||||||
/// Get the reference of the i-th slot of the object.
|
/// Get the reference of the i-th slot of the object.
|
||||||
/// The object must have slots and `i` must be in range.
|
/// The object must have slots and `i` must be in range.
|
||||||
/// @lifespan: Object.
|
/// @lifespan: Object.
|
||||||
py_Ref py_getslot(const py_Ref self, int i);
|
py_ObjectRef py_getslot(const py_Ref self, int i);
|
||||||
void py_setslot(py_Ref self, int i, const py_Ref val);
|
void py_setslot(py_Ref self, int i, const py_Ref val);
|
||||||
|
|
||||||
py_Ref py_getupvalue(py_Ref argv);
|
py_TmpRef py_getupvalue(py_StackRef argv);
|
||||||
void py_setupvalue(py_Ref argv, const py_Ref val);
|
void py_setupvalue(py_StackRef argv, const py_Ref val);
|
||||||
|
|
||||||
/// Gets the attribute of the object.
|
/// Gets the attribute of the object.
|
||||||
bool py_getattr(const py_Ref self, py_Name name, py_Ref out);
|
bool py_getattr(const py_Ref self, py_Name name, py_Ref out);
|
||||||
@ -194,7 +200,7 @@ void py_assign(py_Ref dst, const py_Ref src);
|
|||||||
/************* Stack Operations *************/
|
/************* Stack Operations *************/
|
||||||
/// Returns a reference to the i-th object from the top of the stack.
|
/// Returns a reference to the i-th object from the top of the stack.
|
||||||
/// i should be negative, e.g. (-1) means TOS.
|
/// i should be negative, e.g. (-1) means TOS.
|
||||||
py_Ref py_peek(int i);
|
py_StackRef py_peek(int i);
|
||||||
/// Pushes the object to the stack.
|
/// Pushes the object to the stack.
|
||||||
void py_push(const py_Ref src);
|
void py_push(const py_Ref src);
|
||||||
/// Pops an object from the stack.
|
/// Pops an object from the stack.
|
||||||
@ -202,7 +208,7 @@ void py_pop();
|
|||||||
/// Shrink the stack by n.
|
/// Shrink the stack by n.
|
||||||
void py_shrink(int n);
|
void py_shrink(int n);
|
||||||
/// Get a temporary variable from the stack and returns the reference to it.
|
/// Get a temporary variable from the stack and returns the reference to it.
|
||||||
py_Ref py_pushtmp();
|
py_StackRef py_pushtmp();
|
||||||
/// Free n temporary variable.
|
/// Free n temporary variable.
|
||||||
#define py_poptmp(n) py_shrink(n)
|
#define py_poptmp(n) py_shrink(n)
|
||||||
|
|
||||||
@ -213,11 +219,12 @@ py_Ref py_pushtmp();
|
|||||||
#define py_duptop() py_push(py_peek(-1))
|
#define py_duptop() py_push(py_peek(-1))
|
||||||
#define py_dupsecond() py_push(py_peek(-2))
|
#define py_dupsecond() py_push(py_peek(-2))
|
||||||
/************* Modules *************/
|
/************* Modules *************/
|
||||||
py_Ref py_newmodule(const char* name, const char* package);
|
py_TmpRef py_newmodule(const char* name, const char* package);
|
||||||
py_Ref py_getmodule(const char* name);
|
py_TmpRef py_getmodule(const char* name);
|
||||||
|
|
||||||
/// Import a module.
|
/// Import a module.
|
||||||
bool py_import(const char* name, py_Ref out);
|
/// The result will be set to `py_retval()`.
|
||||||
|
bool py_import(const char* name);
|
||||||
|
|
||||||
/************* Errors *************/
|
/************* Errors *************/
|
||||||
/// Print the last error to the console.
|
/// Print the last error to the console.
|
||||||
@ -267,19 +274,19 @@ bool py_callmagic(py_Name name, int argc, py_Ref argv);
|
|||||||
#define py_str(self) py_callmagic(__str__, 1, self)
|
#define py_str(self) py_callmagic(__str__, 1, self)
|
||||||
|
|
||||||
/// The return value of the most recent call.
|
/// The return value of the most recent call.
|
||||||
py_Ref py_retval();
|
py_GlobalRef py_retval();
|
||||||
|
|
||||||
#define py_isnull(self) ((self)->type == 0)
|
#define py_isnull(self) ((self)->type == 0)
|
||||||
|
|
||||||
/* tuple */
|
/* tuple */
|
||||||
|
|
||||||
// unchecked functions, if self is not a tuple, the behavior is undefined
|
// unchecked functions, if self is not a tuple, the behavior is undefined
|
||||||
py_Ref py_tuple__getitem(const py_Ref self, int i);
|
py_ObjectRef py_tuple__getitem(const py_Ref self, int i);
|
||||||
void py_tuple__setitem(py_Ref self, int i, const py_Ref val);
|
void py_tuple__setitem(py_Ref self, int i, const py_Ref val);
|
||||||
int py_tuple__len(const py_Ref self);
|
int py_tuple__len(const py_Ref self);
|
||||||
|
|
||||||
// unchecked functions, if self is not a list, the behavior is undefined
|
// unchecked functions, if self is not a list, the behavior is undefined
|
||||||
py_Ref py_list__getitem(const py_Ref self, int i);
|
py_ObjectRef py_list__getitem(const py_Ref self, int i);
|
||||||
void py_list__setitem(py_Ref self, int i, const py_Ref val);
|
void py_list__setitem(py_Ref self, int i, const py_Ref val);
|
||||||
void py_list__delitem(py_Ref self, int i);
|
void py_list__delitem(py_Ref self, int i);
|
||||||
int py_list__len(const py_Ref self);
|
int py_list__len(const py_Ref self);
|
||||||
@ -294,11 +301,11 @@ pk_TypeInfo* pk_tpinfo(const py_Ref self);
|
|||||||
/// Search the magic method from the given type to the base type.
|
/// Search the magic method from the given type to the base type.
|
||||||
/// Returns the reference or NULL if not found.
|
/// Returns the reference or NULL if not found.
|
||||||
/// @lifespan: Permanent.
|
/// @lifespan: Permanent.
|
||||||
py_Ref py_tpfindmagic(py_Type, py_Name name);
|
py_GlobalRef py_tpfindmagic(py_Type, py_Name name);
|
||||||
|
|
||||||
/// Get the type object of the given type.
|
/// Get the type object of the given type.
|
||||||
/// @lifespan: Permanent.
|
/// @lifespan: Permanent.
|
||||||
py_Ref py_tpobject(py_Type type);
|
py_GlobalRef py_tpobject(py_Type type);
|
||||||
|
|
||||||
#define MAGIC_METHOD(x) extern uint16_t x;
|
#define MAGIC_METHOD(x) extern uint16_t x;
|
||||||
#include "pocketpy/xmacros/magics.h"
|
#include "pocketpy/xmacros/magics.h"
|
||||||
|
@ -63,7 +63,6 @@ void pk_VM__ctor(pk_VM* self) {
|
|||||||
self->_stdout = pk_default_stdout;
|
self->_stdout = pk_default_stdout;
|
||||||
self->_stderr = pk_default_stderr;
|
self->_stderr = pk_default_stderr;
|
||||||
|
|
||||||
self->last_error = NULL;
|
|
||||||
self->last_retval = PY_NULL;
|
self->last_retval = PY_NULL;
|
||||||
|
|
||||||
self->__curr_class = PY_NULL;
|
self->__curr_class = PY_NULL;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user