Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
P
Pyston
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Boxiang Sun
Pyston
Commits
5c1e2802
Commit
5c1e2802
authored
May 09, 2015
by
Kevin Modzelewski
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #513 from kmod/dashm
-m support
parents
8b47368a
17ce4263
Changes
14
Show whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
277 additions
and
128 deletions
+277
-128
from_cpython/Include/descrobject.h
from_cpython/Include/descrobject.h
+2
-2
src/capi/errors.cpp
src/capi/errors.cpp
+49
-1
src/core/options.cpp
src/core/options.cpp
+1
-0
src/jit.cpp
src/jit.cpp
+88
-77
src/runtime/capi.cpp
src/runtime/capi.cpp
+7
-0
src/runtime/file.cpp
src/runtime/file.cpp
+14
-1
src/runtime/stacktrace.cpp
src/runtime/stacktrace.cpp
+36
-28
src/runtime/types.cpp
src/runtime/types.cpp
+31
-15
test/tests/dash_m.py
test/tests/dash_m.py
+17
-0
test/tests/dir.py
test/tests/dir.py
+1
-1
test/tests/file.py
test/tests/file.py
+2
-0
test/tests/file_closed.py
test/tests/file_closed.py
+0
-3
test/tests/import_target.py
test/tests/import_target.py
+5
-0
test/tests/oldstyle_classes.py
test/tests/oldstyle_classes.py
+24
-0
No files found.
from_cpython/Include/descrobject.h
View file @
5c1e2802
...
@@ -11,10 +11,10 @@ typedef PyObject *(*getter)(PyObject *, void *);
...
@@ -11,10 +11,10 @@ typedef PyObject *(*getter)(PyObject *, void *);
typedef
int
(
*
setter
)(
PyObject
*
,
PyObject
*
,
void
*
);
typedef
int
(
*
setter
)(
PyObject
*
,
PyObject
*
,
void
*
);
typedef
struct
PyGetSetDef
{
typedef
struct
PyGetSetDef
{
char
*
name
;
c
onst
c
har
*
name
;
getter
get
;
getter
get
;
setter
set
;
setter
set
;
char
*
doc
;
c
onst
c
har
*
doc
;
void
*
closure
;
void
*
closure
;
}
PyGetSetDef
;
}
PyGetSetDef
;
...
...
src/capi/errors.cpp
View file @
5c1e2802
...
@@ -354,7 +354,55 @@ extern "C" void PyErr_Display(PyObject* exception, PyObject* value, PyObject* tb
...
@@ -354,7 +354,55 @@ extern "C" void PyErr_Display(PyObject* exception, PyObject* value, PyObject* tb
}
}
static
void
handle_system_exit
(
void
)
noexcept
{
static
void
handle_system_exit
(
void
)
noexcept
{
Py_FatalError
(
"unimplemented"
);
PyObject
*
exception
,
*
value
,
*
tb
;
int
exitcode
=
0
;
if
(
Py_InspectFlag
)
/* Don't exit if -i flag was given. This flag is set to 0
* when entering interactive mode for inspecting. */
return
;
PyErr_Fetch
(
&
exception
,
&
value
,
&
tb
);
if
(
Py_FlushLine
())
PyErr_Clear
();
fflush
(
stdout
);
if
(
value
==
NULL
||
value
==
Py_None
)
goto
done
;
if
(
PyExceptionInstance_Check
(
value
))
{
/* The error code should be in the `code' attribute. */
PyObject
*
code
=
PyObject_GetAttrString
(
value
,
"code"
);
if
(
code
)
{
Py_DECREF
(
value
);
value
=
code
;
if
(
value
==
Py_None
)
goto
done
;
}
/* If we failed to dig out the 'code' attribute,
just let the else clause below print the error. */
}
if
(
PyInt_Check
(
value
))
exitcode
=
(
int
)
PyInt_AsLong
(
value
);
else
{
PyObject
*
sys_stderr
=
PySys_GetObject
(
"stderr"
);
if
(
sys_stderr
!=
NULL
&&
sys_stderr
!=
Py_None
)
{
PyFile_WriteObject
(
value
,
sys_stderr
,
Py_PRINT_RAW
);
}
else
{
PyObject_Print
(
value
,
stderr
,
Py_PRINT_RAW
);
fflush
(
stderr
);
}
PySys_WriteStderr
(
"
\n
"
);
exitcode
=
1
;
}
done:
/* Restore and clear the exception info, in order to properly decref
* the exception, value, and traceback. If we just exit instead,
* these leak, which confuses PYTHONDUMPREFS output, and may prevent
* some finalizers from running.
*/
PyErr_Restore
(
exception
,
value
,
tb
);
PyErr_Clear
();
Py_Exit
(
exitcode
);
/* NOTREACHED */
}
}
extern
"C"
void
PyErr_PrintEx
(
int
set_sys_last_vars
)
noexcept
{
extern
"C"
void
PyErr_PrintEx
(
int
set_sys_last_vars
)
noexcept
{
...
...
src/core/options.cpp
View file @
5c1e2802
...
@@ -82,6 +82,7 @@ bool BOOLS_AS_I64 = ENABLE_FRAME_INTROSPECTION;
...
@@ -82,6 +82,7 @@ bool BOOLS_AS_I64 = ENABLE_FRAME_INTROSPECTION;
extern
"C"
{
extern
"C"
{
int
Py_FrozenFlag
=
1
;
int
Py_FrozenFlag
=
1
;
int
Py_IgnoreEnvironmentFlag
=
0
;
int
Py_IgnoreEnvironmentFlag
=
0
;
int
Py_InspectFlag
=
0
;
int
Py_NoSiteFlag
=
0
;
int
Py_NoSiteFlag
=
0
;
int
Py_OptimizeFlag
=
0
;
int
Py_OptimizeFlag
=
0
;
int
Py_VerboseFlag
=
0
;
int
Py_VerboseFlag
=
0
;
...
...
src/jit.cpp
View file @
5c1e2802
...
@@ -31,6 +31,7 @@
...
@@ -31,6 +31,7 @@
#include "osdefs.h"
#include "osdefs.h"
#include "capi/types.h"
#include "codegen/entry.h"
#include "codegen/entry.h"
#include "codegen/irgen/hooks.h"
#include "codegen/irgen/hooks.h"
#include "codegen/parser.h"
#include "codegen/parser.h"
...
@@ -54,42 +55,7 @@ namespace pyston {
...
@@ -54,42 +55,7 @@ namespace pyston {
extern
void
setEncodingAndErrors
();
extern
void
setEncodingAndErrors
();
// returns true iff we got a request to exit, i.e. SystemExit, placing the
// return code in `*retcode`. does not touch `*retcode* if it returns false.
static
bool
handle_toplevel_exn
(
const
ExcInfo
&
e
,
int
*
retcode
)
{
if
(
e
.
matches
(
SystemExit
))
{
Box
*
value
=
e
.
value
;
if
(
value
&&
PyExceptionInstance_Check
(
value
))
{
Box
*
code
=
getattr
(
value
,
"code"
);
if
(
code
)
value
=
code
;
}
if
(
!
value
||
value
==
None
)
*
retcode
=
0
;
else
if
(
isSubclass
(
value
->
cls
,
int_cls
))
*
retcode
=
static_cast
<
BoxedInt
*>
(
value
)
->
n
;
else
{
*
retcode
=
1
;
PyObject
*
sys_stderr
=
PySys_GetObject
(
"stderr"
);
if
(
sys_stderr
!=
NULL
&&
sys_stderr
!=
Py_None
)
{
PyFile_WriteObject
(
value
,
sys_stderr
,
Py_PRINT_RAW
);
}
else
{
PyObject_Print
(
value
,
stderr
,
Py_PRINT_RAW
);
fflush
(
stderr
);
}
PySys_WriteStderr
(
"
\n
"
);
}
return
true
;
}
e
.
printExcAndTraceback
();
return
false
;
}
static
bool
force_repl
=
false
;
static
bool
unbuffered
=
false
;
static
bool
unbuffered
=
false
;
static
const
char
*
argv0
;
static
const
char
*
argv0
;
...
@@ -186,7 +152,7 @@ int handleArg(char code) {
...
@@ -186,7 +152,7 @@ int handleArg(char code) {
else
if
(
code
==
'I'
)
else
if
(
code
==
'I'
)
FORCE_INTERPRETER
=
true
;
FORCE_INTERPRETER
=
true
;
else
if
(
code
==
'i'
)
else
if
(
code
==
'i'
)
force_repl
=
true
;
Py_InspectFlag
=
true
;
else
if
(
code
==
'n'
)
{
else
if
(
code
==
'n'
)
{
ENABLE_INTERPRETER
=
false
;
ENABLE_INTERPRETER
=
false
;
}
else
if
(
code
==
'p'
)
{
}
else
if
(
code
==
'p'
)
{
...
@@ -222,6 +188,41 @@ int handleArg(char code) {
...
@@ -222,6 +188,41 @@ int handleArg(char code) {
return
0
;
return
0
;
}
}
static
int
RunModule
(
const
char
*
module
,
int
set_argv0
)
{
PyObject
*
runpy
,
*
runmodule
,
*
runargs
,
*
result
;
runpy
=
PyImport_ImportModule
(
"runpy"
);
if
(
runpy
==
NULL
)
{
fprintf
(
stderr
,
"Could not import runpy module
\n
"
);
return
-
1
;
}
runmodule
=
PyObject_GetAttrString
(
runpy
,
"_run_module_as_main"
);
if
(
runmodule
==
NULL
)
{
fprintf
(
stderr
,
"Could not access runpy._run_module_as_main
\n
"
);
Py_DECREF
(
runpy
);
return
-
1
;
}
runargs
=
Py_BuildValue
(
"(si)"
,
module
,
set_argv0
);
if
(
runargs
==
NULL
)
{
fprintf
(
stderr
,
"Could not create arguments for runpy._run_module_as_main
\n
"
);
Py_DECREF
(
runpy
);
Py_DECREF
(
runmodule
);
return
-
1
;
}
result
=
PyObject_Call
(
runmodule
,
runargs
,
NULL
);
if
(
result
==
NULL
)
{
PyErr_Print
();
}
Py_DECREF
(
runpy
);
Py_DECREF
(
runmodule
);
Py_DECREF
(
runargs
);
if
(
result
==
NULL
)
{
return
-
1
;
}
Py_DECREF
(
result
);
return
0
;
}
static
int
main
(
int
argc
,
char
**
argv
)
{
static
int
main
(
int
argc
,
char
**
argv
)
{
argv0
=
argv
[
0
];
argv0
=
argv
[
0
];
...
@@ -233,12 +234,13 @@ static int main(int argc, char** argv) {
...
@@ -233,12 +234,13 @@ static int main(int argc, char** argv) {
timespec
before_ts
,
after_ts
;
timespec
before_ts
,
after_ts
;
Timer
main_time
;
Timer
main_time
;
int
rtncode
;
int
rtncode
=
0
;
{
{
STAT_TIMER2
(
t0
,
"us_timer_main_toplevel"
,
main_time
.
getStartTime
());
STAT_TIMER2
(
t0
,
"us_timer_main_toplevel"
,
main_time
.
getStartTime
());
int
code
;
int
code
;
const
char
*
command
=
NULL
;
const
char
*
command
=
NULL
;
const
char
*
module
=
NULL
;
char
*
env_args
=
getenv
(
"PYSTON_RUN_ARGS"
);
char
*
env_args
=
getenv
(
"PYSTON_RUN_ARGS"
);
...
@@ -253,12 +255,17 @@ static int main(int argc, char** argv) {
...
@@ -253,12 +255,17 @@ static int main(int argc, char** argv) {
// Suppress getopt errors so we can throw them ourselves
// Suppress getopt errors so we can throw them ourselves
opterr
=
0
;
opterr
=
0
;
while
((
code
=
getopt
(
argc
,
argv
,
"+:OqdIibpjtrsSvnxEc:FuPTG"
))
!=
-
1
)
{
while
((
code
=
getopt
(
argc
,
argv
,
"+:OqdIibpjtrsSvnxEc:FuPTG
m:
"
))
!=
-
1
)
{
if
(
code
==
'c'
)
{
if
(
code
==
'c'
)
{
assert
(
optarg
);
assert
(
optarg
);
command
=
optarg
;
command
=
optarg
;
// no more option parsing; the rest of our arguments go into sys.argv.
// no more option parsing; the rest of our arguments go into sys.argv.
break
;
break
;
}
else
if
(
code
==
'm'
)
{
assert
(
optarg
);
module
=
optarg
;
// no more option parsing; the rest of our arguments go into sys.argv.
break
;
}
else
if
(
code
==
':'
)
{
}
else
if
(
code
==
':'
)
{
fprintf
(
stderr
,
"Argument expected for the -%c option
\n
"
,
optopt
);
fprintf
(
stderr
,
"Argument expected for the -%c option
\n
"
,
optopt
);
return
2
;
return
2
;
...
@@ -299,7 +306,10 @@ static int main(int argc, char** argv) {
...
@@ -299,7 +306,10 @@ static int main(int argc, char** argv) {
// are parsed.
// are parsed.
if
(
command
)
if
(
command
)
addToSysArgv
(
"-c"
);
addToSysArgv
(
"-c"
);
else
if
(
optind
!=
argc
)
{
else
if
(
module
)
{
// CPython does this...
addToSysArgv
(
"-c"
);
}
else
if
(
optind
!=
argc
)
{
addToSysArgv
(
argv
[
optind
]);
addToSysArgv
(
argv
[
optind
]);
if
(
strcmp
(
"-"
,
argv
[
optind
])
!=
0
)
if
(
strcmp
(
"-"
,
argv
[
optind
])
!=
0
)
fn
=
argv
[
optind
];
fn
=
argv
[
optind
];
...
@@ -351,14 +361,18 @@ static int main(int argc, char** argv) {
...
@@ -351,14 +361,18 @@ static int main(int argc, char** argv) {
main_module
=
createModule
(
"__main__"
,
"<string>"
);
main_module
=
createModule
(
"__main__"
,
"<string>"
);
AST_Module
*
m
=
parse_string
(
command
);
AST_Module
*
m
=
parse_string
(
command
);
compileAndRunModule
(
m
,
main_module
);
compileAndRunModule
(
m
,
main_module
);
rtncode
=
0
;
}
catch
(
ExcInfo
e
)
{
}
catch
(
ExcInfo
e
)
{
int
retcode
=
1
;
setCAPIException
(
e
);
(
void
)
handle_toplevel_exn
(
e
,
&
retcode
);
PyErr_Print
();
Stats
::
dump
(
false
);
rtncode
=
1
;
return
retcode
;
}
}
}
}
else
if
(
module
!=
NULL
)
{
// TODO: CPython uses the same main module for all code paths
main_module
=
createModule
(
"__main__"
,
"<string>"
);
rtncode
=
(
RunModule
(
module
,
1
)
!=
0
);
}
else
{
rtncode
=
0
;
if
(
fn
!=
NULL
)
{
if
(
fn
!=
NULL
)
{
llvm
::
SmallString
<
128
>
path
;
llvm
::
SmallString
<
128
>
path
;
...
@@ -381,19 +395,19 @@ static int main(int argc, char** argv) {
...
@@ -381,19 +395,19 @@ static int main(int argc, char** argv) {
AST_Module
*
ast
=
caching_parse_file
(
fn
);
AST_Module
*
ast
=
caching_parse_file
(
fn
);
compileAndRunModule
(
ast
,
main_module
);
compileAndRunModule
(
ast
,
main_module
);
}
catch
(
ExcInfo
e
)
{
}
catch
(
ExcInfo
e
)
{
int
retcode
=
1
;
setCAPIException
(
e
);
(
void
)
handle_toplevel_exn
(
e
,
&
retcode
);
PyErr_Print
();
if
(
!
force_repl
)
{
rtncode
=
1
;
Stats
::
dump
(
false
);
return
retcode
;
}
}
}
}
}
}
if
(
force_repl
||
!
(
command
||
fn
))
{
if
(
Py_InspectFlag
||
!
(
command
||
fn
||
module
))
{
printf
(
"Pyston v%d.%d (rev "
STRINGIFY
(
GITREV
)
")"
,
PYSTON_VERSION_MAJOR
,
PYSTON_VERSION_MINOR
);
printf
(
"Pyston v%d.%d (rev "
STRINGIFY
(
GITREV
)
")"
,
PYSTON_VERSION_MAJOR
,
PYSTON_VERSION_MINOR
);
printf
(
", targeting Python %d.%d.%d
\n
"
,
PYTHON_VERSION_MAJOR
,
PYTHON_VERSION_MINOR
,
PYTHON_VERSION_MICRO
);
printf
(
", targeting Python %d.%d.%d
\n
"
,
PYTHON_VERSION_MAJOR
,
PYTHON_VERSION_MINOR
,
PYTHON_VERSION_MICRO
);
Py_InspectFlag
=
0
;
if
(
!
main_module
)
{
if
(
!
main_module
)
{
main_module
=
createModule
(
"__main__"
,
"<stdin>"
);
main_module
=
createModule
(
"__main__"
,
"<stdin>"
);
}
else
{
}
else
{
...
@@ -432,11 +446,8 @@ static int main(int argc, char** argv) {
...
@@ -432,11 +446,8 @@ static int main(int argc, char** argv) {
compileAndRunModule
(
m
,
main_module
);
compileAndRunModule
(
m
,
main_module
);
}
catch
(
ExcInfo
e
)
{
}
catch
(
ExcInfo
e
)
{
int
retcode
=
0xdeadbeef
;
// should never be seen
setCAPIException
(
e
);
if
(
handle_toplevel_exn
(
e
,
&
retcode
))
{
PyErr_Print
();
Stats
::
dump
(
false
);
return
retcode
;
}
}
}
}
}
}
}
...
@@ -450,7 +461,7 @@ static int main(int argc, char** argv) {
...
@@ -450,7 +461,7 @@ static int main(int argc, char** argv) {
_t
.
split
(
"joinRuntime"
);
_t
.
split
(
"joinRuntime"
);
rtncode
=
joinRuntime
();
joinRuntime
();
_t
.
split
(
"finishing up"
);
_t
.
split
(
"finishing up"
);
uint64_t
main_time_ended_at
;
uint64_t
main_time_ended_at
;
...
...
src/runtime/capi.cpp
View file @
5c1e2802
...
@@ -685,6 +685,13 @@ void checkAndThrowCAPIException() {
...
@@ -685,6 +685,13 @@ void checkAndThrowCAPIException() {
}
}
}
}
extern
"C"
void
Py_Exit
(
int
sts
)
noexcept
{
// Py_Finalize();
Stats
::
dump
(
false
);
exit
(
sts
);
}
extern
"C"
void
PyErr_Restore
(
PyObject
*
type
,
PyObject
*
value
,
PyObject
*
traceback
)
noexcept
{
extern
"C"
void
PyErr_Restore
(
PyObject
*
type
,
PyObject
*
value
,
PyObject
*
traceback
)
noexcept
{
cur_thread_state
.
curexc_type
=
type
;
cur_thread_state
.
curexc_type
=
type
;
cur_thread_state
.
curexc_value
=
value
;
cur_thread_state
.
curexc_value
=
value
;
...
...
src/runtime/file.cpp
View file @
5c1e2802
...
@@ -1572,6 +1572,10 @@ static PyObject* file_isatty(BoxedFile* f) noexcept {
...
@@ -1572,6 +1572,10 @@ static PyObject* file_isatty(BoxedFile* f) noexcept {
return
PyBool_FromLong
(
res
);
return
PyBool_FromLong
(
res
);
}
}
static
PyObject
*
get_closed
(
BoxedFile
*
f
,
void
*
closure
)
noexcept
{
return
PyBool_FromLong
((
long
)(
f
->
f_fp
==
0
));
}
PyDoc_STRVAR
(
seek_doc
,
"seek(offset[, whence]) -> None. Move to new file position.
\n
"
PyDoc_STRVAR
(
seek_doc
,
"seek(offset[, whence]) -> None. Move to new file position.
\n
"
"
\n
"
"
\n
"
"Argument offset is a byte count. Optional argument whence defaults to
\n
"
"Argument offset is a byte count. Optional argument whence defaults to
\n
"
...
@@ -1592,13 +1596,17 @@ PyDoc_STRVAR(readlines_doc, "readlines([size]) -> list of strings, each a line f
...
@@ -1592,13 +1596,17 @@ PyDoc_STRVAR(readlines_doc, "readlines([size]) -> list of strings, each a line f
PyDoc_STRVAR
(
isatty_doc
,
"isatty() -> true or false. True if the file is connected to a tty device."
);
PyDoc_STRVAR
(
isatty_doc
,
"isatty() -> true or false. True if the file is connected to a tty device."
);
PyMethodDef
file_methods
[]
=
{
static
PyMethodDef
file_methods
[]
=
{
{
"seek"
,
(
PyCFunction
)
file_seek
,
METH_VARARGS
,
seek_doc
},
{
"seek"
,
(
PyCFunction
)
file_seek
,
METH_VARARGS
,
seek_doc
},
{
"readlines"
,
(
PyCFunction
)
file_readlines
,
METH_VARARGS
,
readlines_doc
},
{
"readlines"
,
(
PyCFunction
)
file_readlines
,
METH_VARARGS
,
readlines_doc
},
{
"writelines"
,
(
PyCFunction
)
file_writelines
,
METH_O
,
NULL
},
{
"writelines"
,
(
PyCFunction
)
file_writelines
,
METH_O
,
NULL
},
{
"isatty"
,
(
PyCFunction
)
file_isatty
,
METH_NOARGS
,
isatty_doc
},
{
"isatty"
,
(
PyCFunction
)
file_isatty
,
METH_NOARGS
,
isatty_doc
},
};
};
static
PyGetSetDef
file_getsetlist
[]
=
{
{
"closed"
,
(
getter
)
get_closed
,
NULL
,
"True if the file is closed"
,
NULL
},
};
void
fileDestructor
(
Box
*
b
)
{
void
fileDestructor
(
Box
*
b
)
{
assert
(
isSubclass
(
b
->
cls
,
file_cls
));
assert
(
isSubclass
(
b
->
cls
,
file_cls
));
BoxedFile
*
self
=
static_cast
<
BoxedFile
*>
(
b
);
BoxedFile
*
self
=
static_cast
<
BoxedFile
*>
(
b
);
...
@@ -1657,6 +1665,11 @@ void setupFile() {
...
@@ -1657,6 +1665,11 @@ void setupFile() {
file_cls
->
giveAttr
(
md
.
ml_name
,
new
BoxedMethodDescriptor
(
&
md
,
file_cls
));
file_cls
->
giveAttr
(
md
.
ml_name
,
new
BoxedMethodDescriptor
(
&
md
,
file_cls
));
}
}
for
(
auto
&
getset
:
file_getsetlist
)
{
file_cls
->
giveAttr
(
getset
.
name
,
new
(
capi_getset_cls
)
BoxedGetsetDescriptor
(
getset
.
get
,
(
void
(
*
)(
Box
*
,
Box
*
,
void
*
))
getset
.
set
,
getset
.
closure
));
}
file_cls
->
freeze
();
file_cls
->
freeze
();
}
}
...
...
src/runtime/stacktrace.cpp
View file @
5c1e2802
...
@@ -235,9 +235,6 @@ extern "C" void raise0() {
...
@@ -235,9 +235,6 @@ extern "C" void raise0() {
#ifndef NDEBUG
#ifndef NDEBUG
ExcInfo
::
ExcInfo
(
Box
*
type
,
Box
*
value
,
Box
*
traceback
)
:
type
(
type
),
value
(
value
),
traceback
(
traceback
)
{
ExcInfo
::
ExcInfo
(
Box
*
type
,
Box
*
value
,
Box
*
traceback
)
:
type
(
type
),
value
(
value
),
traceback
(
traceback
)
{
if
(
this
->
type
&&
this
->
type
!=
None
)
RELEASE_ASSERT
(
isSubclass
(
this
->
type
->
cls
,
type_cls
),
"throwing old-style objects not supported yet (%s)"
,
getTypeName
(
this
->
type
));
}
}
#endif
#endif
...
@@ -253,39 +250,50 @@ bool ExcInfo::matches(BoxedClass* cls) const {
...
@@ -253,39 +250,50 @@ bool ExcInfo::matches(BoxedClass* cls) const {
}
}
// takes the three arguments of a `raise' and produces the ExcInfo to throw
// takes the three arguments of a `raise' and produces the ExcInfo to throw
ExcInfo
excInfoForRaise
(
Box
*
exc_cls
,
Box
*
exc_val
,
Box
*
exc_
tb
)
{
ExcInfo
excInfoForRaise
(
Box
*
type
,
Box
*
value
,
Box
*
tb
)
{
assert
(
exc_cls
&&
exc_val
&&
exc_
tb
);
// use None for default behavior, not nullptr
assert
(
type
&&
value
&&
tb
);
// use None for default behavior, not nullptr
// TODO switch this to PyErr_Normalize
// TODO switch this to PyErr_Normalize
if
(
exc_tb
==
None
)
if
(
tb
==
None
)
exc_tb
=
getTraceback
();
tb
=
getTraceback
();
if
(
isSubclass
(
exc_cls
->
cls
,
type_cls
))
{
BoxedClass
*
c
=
static_cast
<
BoxedClass
*>
(
exc_cls
);
if
(
isSubclass
(
c
,
BaseException
))
{
Box
*
exc_obj
;
if
(
isSubclass
(
exc_val
->
cls
,
BaseException
))
{
/* Next, repeatedly, replace a tuple exception with its first item */
exc_obj
=
exc_val
;
while
(
PyTuple_Check
(
type
)
&&
PyTuple_Size
(
type
)
>
0
)
{
c
=
exc_obj
->
cls
;
PyObject
*
tmp
=
type
;
}
else
if
(
exc_val
!=
None
)
{
type
=
PyTuple_GET_ITEM
(
type
,
0
);
exc_obj
=
runtimeCall
(
c
,
ArgPassSpec
(
1
),
exc_val
,
NULL
,
NULL
,
NULL
,
NULL
);
Py_INCREF
(
type
);
}
else
{
Py_DECREF
(
tmp
);
exc_obj
=
runtimeCall
(
c
,
ArgPassSpec
(
0
),
NULL
,
NULL
,
NULL
,
NULL
,
NULL
);
}
}
return
ExcInfo
(
c
,
exc_obj
,
exc_tb
);
if
(
PyExceptionClass_Check
(
type
))
{
}
PyErr_NormalizeException
(
&
type
,
&
value
,
&
tb
);
if
(
!
PyExceptionInstance_Check
(
value
))
{
raiseExcHelper
(
TypeError
,
"calling %s() should have returned an instance of "
"BaseException, not '%s'"
,
((
PyTypeObject
*
)
type
)
->
tp_name
,
Py_TYPE
(
value
)
->
tp_name
);
}
}
}
else
if
(
PyExceptionInstance_Check
(
type
))
{
if
(
isSubclass
(
exc_cls
->
cls
,
BaseException
))
{
/* Raising an instance. The value should be a dummy. */
if
(
exc_val
!=
None
)
if
(
value
!=
Py_None
)
{
raiseExcHelper
(
TypeError
,
"instance exception may not have a separate value"
);
raiseExcHelper
(
TypeError
,
"instance exception may not have a separate value"
);
return
ExcInfo
(
exc_cls
->
cls
,
exc_cls
,
exc_tb
);
}
else
{
/* Normalize to raise <class>, <instance> */
Py_DECREF
(
value
);
value
=
type
;
type
=
PyExceptionInstance_Class
(
type
);
Py_INCREF
(
type
);
}
}
}
else
{
/* Not something you can raise. You get an exception
anyway, just not what you specified :-) */
raiseExcHelper
(
TypeError
,
"exceptions must be old-style classes or "
"derived from BaseException, not %s"
,
type
->
cls
->
tp_name
);
}
assert
(
PyExceptionClass_Check
(
type
));
raiseExcHelper
(
TypeError
,
"exceptions must be old-style classes or derived from BaseException, not %s"
,
return
ExcInfo
(
type
,
value
,
tb
);
getTypeName
(
exc_cls
));
}
}
extern
"C"
void
raise3
(
Box
*
arg0
,
Box
*
arg1
,
Box
*
arg2
)
{
extern
"C"
void
raise3
(
Box
*
arg0
,
Box
*
arg1
,
Box
*
arg2
)
{
...
...
src/runtime/types.cpp
View file @
5c1e2802
...
@@ -1530,16 +1530,24 @@ public:
...
@@ -1530,16 +1530,24 @@ public:
return
boxInt
(
attrs
->
hcls
->
getStrAttrOffsets
().
size
());
return
boxInt
(
attrs
->
hcls
->
getStrAttrOffsets
().
size
());
}
}
static
Box
*
update
(
Box
*
_self
,
Box
*
_container
)
{
static
Box
*
update
(
Box
*
_self
,
Box
edTuple
*
args
,
BoxedDict
*
kwargs
)
{
STAT_TIMER
(
t0
,
"us_timer_AttrWrapper_update"
);
STAT_TIMER
(
t0
,
"us_timer_AttrWrapper_update"
);
RELEASE_ASSERT
(
_self
->
cls
==
attrwrapper_cls
,
""
);
RELEASE_ASSERT
(
_self
->
cls
==
attrwrapper_cls
,
""
);
AttrWrapper
*
self
=
static_cast
<
AttrWrapper
*>
(
_self
);
AttrWrapper
*
self
=
static_cast
<
AttrWrapper
*>
(
_self
);
assert
(
args
->
cls
==
tuple_cls
);
assert
(
kwargs
);
assert
(
kwargs
->
cls
==
dict_cls
);
RELEASE_ASSERT
(
args
->
size
()
<=
1
,
""
);
// should throw a TypeError
auto
handle
=
[
&
](
Box
*
_container
)
{
if
(
_container
->
cls
==
attrwrapper_cls
)
{
if
(
_container
->
cls
==
attrwrapper_cls
)
{
AttrWrapper
*
container
=
static_cast
<
AttrWrapper
*>
(
_container
);
AttrWrapper
*
container
=
static_cast
<
AttrWrapper
*>
(
_container
);
HCAttrs
*
attrs
=
container
->
b
->
getHCAttrsPtr
();
HCAttrs
*
attrs
=
container
->
b
->
getHCAttrsPtr
();
RELEASE_ASSERT
(
attrs
->
hcls
->
type
==
HiddenClass
::
NORMAL
||
attrs
->
hcls
->
type
==
HiddenClass
::
SINGLETON
,
""
);
RELEASE_ASSERT
(
attrs
->
hcls
->
type
==
HiddenClass
::
NORMAL
||
attrs
->
hcls
->
type
==
HiddenClass
::
SINGLETON
,
""
);
for
(
const
auto
&
p
:
attrs
->
hcls
->
getStrAttrOffsets
())
{
for
(
const
auto
&
p
:
attrs
->
hcls
->
getStrAttrOffsets
())
{
self
->
b
->
setattr
(
p
.
first
(),
attrs
->
attr_list
->
attrs
[
p
.
second
],
NULL
);
self
->
b
->
setattr
(
p
.
first
(),
attrs
->
attr_list
->
attrs
[
p
.
second
],
NULL
);
}
}
...
@@ -1552,6 +1560,13 @@ public:
...
@@ -1552,6 +1560,13 @@ public:
}
else
{
}
else
{
RELEASE_ASSERT
(
0
,
"not implemented: %s"
,
_container
->
cls
->
tp_name
);
RELEASE_ASSERT
(
0
,
"not implemented: %s"
,
_container
->
cls
->
tp_name
);
}
}
};
for
(
auto
e
:
*
args
)
{
handle
(
e
);
}
handle
(
kwargs
);
return
None
;
return
None
;
}
}
...
@@ -2481,7 +2496,8 @@ void setupRuntime() {
...
@@ -2481,7 +2496,8 @@ void setupRuntime() {
attrwrapper_cls
->
giveAttr
(
"copy"
,
new
BoxedFunction
(
boxRTFunction
((
void
*
)
AttrWrapper
::
copy
,
UNKNOWN
,
1
)));
attrwrapper_cls
->
giveAttr
(
"copy"
,
new
BoxedFunction
(
boxRTFunction
((
void
*
)
AttrWrapper
::
copy
,
UNKNOWN
,
1
)));
attrwrapper_cls
->
giveAttr
(
"__len__"
,
new
BoxedFunction
(
boxRTFunction
((
void
*
)
AttrWrapper
::
len
,
BOXED_INT
,
1
)));
attrwrapper_cls
->
giveAttr
(
"__len__"
,
new
BoxedFunction
(
boxRTFunction
((
void
*
)
AttrWrapper
::
len
,
BOXED_INT
,
1
)));
attrwrapper_cls
->
giveAttr
(
"__iter__"
,
new
BoxedFunction
(
boxRTFunction
((
void
*
)
AttrWrapper
::
iter
,
UNKNOWN
,
1
)));
attrwrapper_cls
->
giveAttr
(
"__iter__"
,
new
BoxedFunction
(
boxRTFunction
((
void
*
)
AttrWrapper
::
iter
,
UNKNOWN
,
1
)));
attrwrapper_cls
->
giveAttr
(
"update"
,
new
BoxedFunction
(
boxRTFunction
((
void
*
)
AttrWrapper
::
update
,
NONE
,
2
)));
attrwrapper_cls
->
giveAttr
(
"update"
,
new
BoxedFunction
(
boxRTFunction
((
void
*
)
AttrWrapper
::
update
,
NONE
,
1
,
0
,
true
,
true
)));
attrwrapper_cls
->
freeze
();
attrwrapper_cls
->
freeze
();
attrwrapperiter_cls
->
giveAttr
(
"__hasnext__"
,
attrwrapperiter_cls
->
giveAttr
(
"__hasnext__"
,
...
...
test/tests/dash_m.py
0 → 100644
View file @
5c1e2802
import
os
import
sys
import
subprocess
me
=
sys
.
executable
with
open
(
'/dev/null'
)
as
ignore
:
def
run
(
args
):
print
subprocess
.
call
([
me
]
+
args
,
stderr
=
ignore
)
# just prints out the usage
run
([
"-m"
,
"pydoc"
])
run
([
"-m"
,
"doesnt_exist"
])
os
.
environ
[
"PYTHONPATH"
]
=
os
.
path
.
dirname
(
__file__
)
run
([
"-m"
,
"import_target"
])
test/tests/dir.py
View file @
5c1e2802
...
@@ -95,7 +95,7 @@ l.sort()
...
@@ -95,7 +95,7 @@ l.sort()
print
l
print
l
c
=
C1
()
c
=
C1
()
c
.
__dict__
.
update
(
dict
(
a
=
1
,
b
=
5
))
c
.
__dict__
.
update
(
dict
(
a
=
1
,
b
=
5
)
,
d
=
4
)
print
sorted
(
c
.
__dict__
.
items
())
print
sorted
(
c
.
__dict__
.
items
())
class
TestClass3
:
# old-style
class
TestClass3
:
# old-style
...
...
test/tests/file.py
View file @
5c1e2802
...
@@ -91,3 +91,5 @@ try:
...
@@ -91,3 +91,5 @@ try:
print
"succeeded"
print
"succeeded"
except
Exception
as
e
:
except
Exception
as
e
:
print
e
print
e
print
sys
.
stdout
.
closed
test/tests/file_closed.py
deleted
100644 → 0
View file @
8b47368a
# expected: fail
import
sys
print
sys
.
stdout
.
closed
test/tests/import_target.py
View file @
5c1e2802
...
@@ -20,3 +20,8 @@ __all__ = ['x', u'z']
...
@@ -20,3 +20,8 @@ __all__ = ['x', u'z']
def
letMeCallThatForYou
(
f
,
*
args
):
def
letMeCallThatForYou
(
f
,
*
args
):
return
f
(
*
args
)
return
f
(
*
args
)
if
__name__
==
"__main__"
:
import
sys
print
"running import_target as main"
print
"argv:"
,
sys
.
argv
test/tests/oldstyle_classes.py
View file @
5c1e2802
...
@@ -275,3 +275,27 @@ class OldSeqTest:
...
@@ -275,3 +275,27 @@ class OldSeqTest:
return
n
**
2
return
n
**
2
m
=
OldSeqTest
()
m
=
OldSeqTest
()
print
list
(
m
)
print
list
(
m
)
import
sys
class
E
:
def
__init__
(
self
,
*
args
):
print
"__init__"
,
args
def
__repr__
(
self
):
return
"<E object>"
try
:
raise
E
except
:
print
sys
.
exc_info
()[
0
].
__name__
,
sys
.
exc_info
()[
1
]
try
:
raise
E
,
1
except
:
print
sys
.
exc_info
()[
0
].
__name__
,
sys
.
exc_info
()[
1
]
try
:
raise
E
()
except
:
print
sys
.
exc_info
()[
0
].
__name__
,
sys
.
exc_info
()[
1
]
try
:
raise
E
(),
1
except
:
print
sys
.
exc_info
()[
0
].
__name__
,
sys
.
exc_info
()[
1
]
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment