Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
- Loading branch information
Showing
41 changed files
with
6,269 additions
and
120 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
#ifndef Py_CONTEXT_H | ||
#define Py_CONTEXT_H | ||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
#ifndef Py_LIMITED_API | ||
|
||
|
||
PyAPI_DATA(PyTypeObject) PyContext_Type; | ||
typedef struct _pycontextobject PyContext; | ||
|
||
PyAPI_DATA(PyTypeObject) PyContextVar_Type; | ||
typedef struct _pycontextvarobject PyContextVar; | ||
|
||
PyAPI_DATA(PyTypeObject) PyContextToken_Type; | ||
typedef struct _pycontexttokenobject PyContextToken; | ||
|
||
|
||
#define PyContext_CheckExact(o) (Py_TYPE(o) == &PyContext_Type) | ||
#define PyContextVar_CheckExact(o) (Py_TYPE(o) == &PyContextVar_Type) | ||
#define PyContextToken_CheckExact(o) (Py_TYPE(o) == &PyContextToken_Type) | ||
|
||
|
||
PyAPI_FUNC(PyContext *) PyContext_New(void); | ||
PyAPI_FUNC(PyContext *) PyContext_Copy(PyContext *); | ||
PyAPI_FUNC(PyContext *) PyContext_CopyCurrent(void); | ||
|
||
PyAPI_FUNC(int) PyContext_Enter(PyContext *); | ||
PyAPI_FUNC(int) PyContext_Exit(PyContext *); | ||
|
||
|
||
/* Create a new context variable. | ||
default_value can be NULL. | ||
*/ | ||
PyAPI_FUNC(PyContextVar *) PyContextVar_New( | ||
const char *name, PyObject *default_value); | ||
|
||
|
||
/* Get a value for the variable. | ||
Returns -1 if an error occurred during lookup. | ||
Returns 0 if value either was or was not found. | ||
If value was found, *value will point to it. | ||
If not, it will point to: | ||
- default_value, if not NULL; | ||
- the default value of "var", if not NULL; | ||
- NULL. | ||
'*value' will be a new ref, if not NULL. | ||
*/ | ||
PyAPI_FUNC(int) PyContextVar_Get( | ||
PyContextVar *var, PyObject *default_value, PyObject **value); | ||
|
||
|
||
/* Set a new value for the variable. | ||
Returns NULL if an error occurs. | ||
*/ | ||
PyAPI_FUNC(PyContextToken *) PyContextVar_Set( | ||
PyContextVar *var, PyObject *value); | ||
|
||
|
||
/* Reset a variable to its previous value. | ||
Returns 0 on sucess, -1 on error. | ||
*/ | ||
PyAPI_FUNC(int) PyContextVar_Reset( | ||
PyContextVar *var, PyContextToken *token); | ||
|
||
|
||
/* This method is exposed only for CPython tests. Don not use it. */ | ||
PyAPI_FUNC(PyObject *) _PyContext_NewHamtForTests(void); | ||
|
||
|
||
PyAPI_FUNC(int) PyContext_ClearFreeList(void); | ||
|
||
|
||
#endif /* !Py_LIMITED_API */ | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
#endif /* !Py_CONTEXT_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
#ifndef Py_INTERNAL_CONTEXT_H | ||
#define Py_INTERNAL_CONTEXT_H | ||
|
||
|
||
#include "internal/hamt.h" | ||
|
||
|
||
struct _pycontextobject { | ||
PyObject_HEAD | ||
PyContext *ctx_prev; | ||
PyHamtObject *ctx_vars; | ||
PyObject *ctx_weakreflist; | ||
int ctx_entered; | ||
}; | ||
|
||
|
||
struct _pycontextvarobject { | ||
PyObject_HEAD | ||
PyObject *var_name; | ||
PyObject *var_default; | ||
PyObject *var_cached; | ||
uint64_t var_cached_tsid; | ||
uint64_t var_cached_tsver; | ||
Py_hash_t var_hash; | ||
}; | ||
|
||
|
||
struct _pycontexttokenobject { | ||
PyObject_HEAD | ||
PyContext *tok_ctx; | ||
PyContextVar *tok_var; | ||
PyObject *tok_oldval; | ||
int tok_used; | ||
}; | ||
|
||
|
||
int _PyContext_Init(void); | ||
void _PyContext_Fini(void); | ||
|
||
|
||
#endif /* !Py_INTERNAL_CONTEXT_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
#ifndef Py_INTERNAL_HAMT_H | ||
#define Py_INTERNAL_HAMT_H | ||
|
||
|
||
#define _Py_HAMT_MAX_TREE_DEPTH 7 | ||
|
||
|
||
#define PyHamt_Check(o) (Py_TYPE(o) == &_PyHamt_Type) | ||
|
||
|
||
/* Abstract tree node. */ | ||
typedef struct { | ||
PyObject_HEAD | ||
} PyHamtNode; | ||
|
||
|
||
/* An HAMT immutable mapping collection. */ | ||
typedef struct { | ||
PyObject_HEAD | ||
PyHamtNode *h_root; | ||
PyObject *h_weakreflist; | ||
Py_ssize_t h_count; | ||
} PyHamtObject; | ||
|
||
|
||
/* A struct to hold the state of depth-first traverse of the tree. | ||
HAMT is an immutable collection. Iterators will hold a strong reference | ||
to it, and every node in the HAMT has strong references to its children. | ||
So for iterators, we can implement zero allocations and zero reference | ||
inc/dec depth-first iteration. | ||
- i_nodes: an array of seven pointers to tree nodes | ||
- i_level: the current node in i_nodes | ||
- i_pos: an array of positions within nodes in i_nodes. | ||
*/ | ||
typedef struct { | ||
PyHamtNode *i_nodes[_Py_HAMT_MAX_TREE_DEPTH]; | ||
Py_ssize_t i_pos[_Py_HAMT_MAX_TREE_DEPTH]; | ||
int8_t i_level; | ||
} PyHamtIteratorState; | ||
|
||
|
||
/* Base iterator object. | ||
Contains the iteration state, a pointer to the HAMT tree, | ||
and a pointer to the 'yield function'. The latter is a simple | ||
function that returns a key/value tuple for the 'Items' iterator, | ||
just a key for the 'Keys' iterator, and a value for the 'Values' | ||
iterator. | ||
*/ | ||
typedef struct { | ||
PyObject_HEAD | ||
PyHamtObject *hi_obj; | ||
PyHamtIteratorState hi_iter; | ||
binaryfunc hi_yield; | ||
} PyHamtIterator; | ||
|
||
|
||
PyAPI_DATA(PyTypeObject) _PyHamt_Type; | ||
PyAPI_DATA(PyTypeObject) _PyHamt_ArrayNode_Type; | ||
PyAPI_DATA(PyTypeObject) _PyHamt_BitmapNode_Type; | ||
PyAPI_DATA(PyTypeObject) _PyHamt_CollisionNode_Type; | ||
PyAPI_DATA(PyTypeObject) _PyHamtKeys_Type; | ||
PyAPI_DATA(PyTypeObject) _PyHamtValues_Type; | ||
PyAPI_DATA(PyTypeObject) _PyHamtItems_Type; | ||
|
||
|
||
/* Create a new HAMT immutable mapping. */ | ||
PyHamtObject * _PyHamt_New(void); | ||
|
||
/* Return a new collection based on "o", but with an additional | ||
key/val pair. */ | ||
PyHamtObject * _PyHamt_Assoc(PyHamtObject *o, PyObject *key, PyObject *val); | ||
|
||
/* Return a new collection based on "o", but without "key". */ | ||
PyHamtObject * _PyHamt_Without(PyHamtObject *o, PyObject *key); | ||
|
||
/* Find "key" in the "o" collection. | ||
Return: | ||
- -1: An error ocurred. | ||
- 0: "key" wasn't found in "o". | ||
- 1: "key" is in "o"; "*val" is set to its value (a borrowed ref). | ||
*/ | ||
int _PyHamt_Find(PyHamtObject *o, PyObject *key, PyObject **val); | ||
|
||
/* Check if "v" is equal to "w". | ||
Return: | ||
- 0: v != w | ||
- 1: v == w | ||
- -1: An error occurred. | ||
*/ | ||
int _PyHamt_Eq(PyHamtObject *v, PyHamtObject *w); | ||
|
||
/* Return the size of "o"; equivalent of "len(o)". */ | ||
Py_ssize_t _PyHamt_Len(PyHamtObject *o); | ||
|
||
/* Return a Keys iterator over "o". */ | ||
PyObject * _PyHamt_NewIterKeys(PyHamtObject *o); | ||
|
||
/* Return a Values iterator over "o". */ | ||
PyObject * _PyHamt_NewIterValues(PyHamtObject *o); | ||
|
||
/* Return a Items iterator over "o". */ | ||
PyObject * _PyHamt_NewIterItems(PyHamtObject *o); | ||
|
||
int _PyHamt_Init(void); | ||
void _PyHamt_Fini(void); | ||
|
||
#endif /* !Py_INTERNAL_HAMT_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.