Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GH-98831: Add macro and op and their implementation to DSL #99495

Merged
merged 21 commits into from
Nov 23, 2022
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
7fb598a
Add macro() and op() DSL features
gvanrossum Nov 14, 2022
edae5af
Improve code generation for super/macro instructions
gvanrossum Nov 15, 2022
881357e
Move super code generation into a helper
gvanrossum Nov 16, 2022
0f12c40
Reduce the fiddling with integers in super analysis
gvanrossum Nov 16, 2022
babdbf9
Do the super/macro analysis at analysis time
gvanrossum Nov 16, 2022
2fa0a04
Convert WITH_EXCEPT_START, fix generator to make it work
gvanrossum Nov 16, 2022
cb0c874
Fix lexer to balk at unrecognized characters, e.g. '@'
gvanrossum Nov 16, 2022
fe0d336
Fix typo in comment
gvanrossum Nov 17, 2022
d84a5c3
Code review from GH-99526
gvanrossum Nov 18, 2022
d7ad950
Fix moved output names; support object pointers in cache
gvanrossum Nov 18, 2022
a034675
Tune README
gvanrossum Nov 18, 2022
1aafac8
Introduce error() method to print errors
gvanrossum Nov 18, 2022
20062f4
Check components of super/macro ops
gvanrossum Nov 18, 2022
7194723
Fix crash when WITH_EXCEPT_START errors out
gvanrossum Nov 18, 2022
cb62653
Merge branch 'main' into macro-ops
gvanrossum Nov 19, 2022
b74aa6a
Don't use typing.Dict
gvanrossum Nov 22, 2022
a0feff9
Kill more "unused" literals
gvanrossum Nov 22, 2022
a2e9991
Don't over-use f-strings
gvanrossum Nov 22, 2022
240126b
Avoid compiler warning on unused variable
gvanrossum Nov 22, 2022
6640706
Merge remote-tracking branch 'origin/main' into macro-ops
gvanrossum Nov 22, 2022
7afa58c
Introduce read_uint16(p) as equivalent to *p
gvanrossum Nov 22, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 12 additions & 19 deletions Python/bytecodes.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ do { \
#define DISPATCH_SAME_OPARG() ((void)0)

#define inst(name, ...) case name:
#define op(name, ...) /* NAME is ignored */
#define macro(name) static int MACRO_##name
#define super(name) static int SUPER_##name
#define family(name, ...) static int family_##name

Expand All @@ -80,6 +82,7 @@ do { \
static PyObject *value, *value1, *value2, *left, *right, *res, *sum, *prod, *sub;
static PyObject *container, *start, *stop, *v, *lhs, *rhs;
static PyObject *list, *tuple, *dict;
static PyObject *exit_func, *lasti, *val;

static PyObject *
dummy_func(
Expand Down Expand Up @@ -156,10 +159,7 @@ dummy_func(
res = NULL;
}

inst(END_FOR, (value1, value2 --)) {
Py_DECREF(value1);
Py_DECREF(value2);
}
macro(END_FOR) = POP_TOP + POP_TOP;

inst(UNARY_POSITIVE, (value -- res)) {
res = PyNumber_Positive(value);
Expand Down Expand Up @@ -2725,33 +2725,26 @@ dummy_func(
PUSH(res);
}

// stack effect: ( -- __0)
inst(WITH_EXCEPT_START) {
inst(WITH_EXCEPT_START, (exit_func, lasti, unused, val -- exit_func, lasti, unused, val, res)) {
/* At the top of the stack are 4 values:
- TOP = exc_info()
- SECOND = previous exception
- THIRD: lasti of exception in exc_info()
- FOURTH: the context.__exit__ bound method
- val: TOP = exc_info()
- unused: SECOND = previous exception
- lasti: THIRD = lasti of exception in exc_info()
- exit_func: FOURTH = the context.__exit__ bound method
We call FOURTH(type(TOP), TOP, GetTraceback(TOP)).
Then we push the __exit__ return value.
*/
PyObject *exit_func;
PyObject *exc, *val, *tb, *res;
PyObject *exc, *tb;

val = TOP();
assert(val && PyExceptionInstance_Check(val));
exc = PyExceptionInstance_Class(val);
tb = PyException_GetTraceback(val);
Py_XDECREF(tb);
assert(PyLong_Check(PEEK(3)));
exit_func = PEEK(4);
assert(PyLong_Check(lasti));
PyObject *stack[4] = {NULL, exc, val, tb};
res = PyObject_Vectorcall(exit_func, stack + 1,
3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
if (res == NULL)
goto error;

PUSH(res);
ERROR_IF(res == NULL, error);
}

// stack effect: ( -- __0)
Expand Down
100 changes: 58 additions & 42 deletions Python/generated_cases.c.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions Tools/cases_generator/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

What's currently here:

- lexer.py: lexer for C, originally written by Mark Shannon
- plexer.py: OO interface on top of lexer.py; main class: `PLexer`
- parser.py: Parser for instruction definition DSL; main class `Parser`
- `lexer.py`: lexer for C, originally written by Mark Shannon
- `plexer.py`: OO interface on top of lexer.py; main class: `PLexer`
- `parser.py`: Parser for instruction definition DSL; main class `Parser`
- `generate_cases.py`: driver script to read `Python/bytecodes.c` and
write `Python/generated_cases.c.h`

Expand Down
Loading