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
6e4acec1
Commit
6e4acec1
authored
9 years ago
by
Kevin Modzelewski
Browse files
Options
Browse Files
Download
Plain Diff
Merge commit '14aa0f~' into refcounting
parents
88d63f36
e912efed
Changes
16
Show whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
240 additions
and
63 deletions
+240
-63
.travis.yml
.travis.yml
+1
-0
CMakeLists.txt
CMakeLists.txt
+2
-1
docs/INSTALLING.md
docs/INSTALLING.md
+3
-3
from_cpython/Lib/test/test_fractions.py
from_cpython/Lib/test/test_fractions.py
+0
-1
from_cpython/Lib/test/test_long.py
from_cpython/Lib/test/test_long.py
+4
-2
from_cpython/Modules/mathmodule.c
from_cpython/Modules/mathmodule.c
+3
-1
src/runtime/classobj.cpp
src/runtime/classobj.cpp
+8
-3
src/runtime/complex.cpp
src/runtime/complex.cpp
+19
-0
src/runtime/float.cpp
src/runtime/float.cpp
+88
-11
src/runtime/long.cpp
src/runtime/long.cpp
+75
-37
test/CPYTHON_TEST_NOTES.md
test/CPYTHON_TEST_NOTES.md
+0
-3
test/tests/exec_directory.py
test/tests/exec_directory.py
+19
-0
test/tests/long.py
test/tests/long.py
+16
-0
test/tests/no_main_directory/sub_dir/__main__.py
test/tests/no_main_directory/sub_dir/__main__.py
+1
-0
test/tests/no_main_directory/test.py
test/tests/no_main_directory/test.py
+0
-0
test/unittests/CMakeLists.txt
test/unittests/CMakeLists.txt
+1
-1
No files found.
.travis.yml
View file @
6e4acec1
...
...
@@ -39,6 +39,7 @@ addons:
-
gdb
-
libbz2-dev
-
libgmp3-dev
-
libmpfr-dev
-
liblzma-dev
-
libncurses5-dev
-
libreadline-dev
...
...
This diff is collapsed.
Click to expand it.
CMakeLists.txt
View file @
6e4acec1
...
...
@@ -281,7 +281,8 @@ add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/linkdeps_dummy.c COMMAND ${CMAKE_C
add_executable
(
pyston $<TARGET_OBJECTS:PYSTON_MAIN_OBJECT> $<TARGET_OBJECTS:PYSTON_OBJECTS> $<TARGET_OBJECTS:FROM_CPYTHON> linkdeps_dummy.c
)
# Wrap the stdlib in --whole-archive to force all the symbols to be included and eventually exported
target_link_libraries
(
pyston -Wl,--whole-archive stdlib -Wl,--no-whole-archive pthread m z readline sqlite3 gmp ssl crypto unwind pypa liblz4 double-conversion util
${
LLVM_LIBS
}
${
LIBLZMA_LIBRARIES
}
${
OPTIONAL_LIBRARIES
}
${
CMAKE_BINARY_DIR
}
/jemalloc/lib/libjemalloc.a
)
target_link_libraries
(
pyston -Wl,--whole-archive stdlib -Wl,--no-whole-archive pthread m z readline sqlite3 gmp mpfr ssl crypto unwind pypa liblz4 double-conversion util
${
LLVM_LIBS
}
${
LIBLZMA_LIBRARIES
}
${
OPTIONAL_LIBRARIES
}
${
CMAKE_BINARY_DIR
}
/jemalloc/lib/libjemalloc.a
)
add_dependencies
(
pyston libjemalloc
)
# copy src/codegen/parse_ast.py to the build directory
...
...
This diff is collapsed.
Click to expand it.
docs/INSTALLING.md
View file @
6e4acec1
...
...
@@ -14,18 +14,18 @@ sudo add-apt-repository --yes ppa:ubuntu-toolchain-r/test
sudo add-apt-repository --yes ppa:kubuntu-ppa/backports
sudo apt-get -qq update
sudo apt-get install -yq git cmake ninja-build ccache libncurses5-dev liblzma-dev libreadline-dev libgmp3-dev autoconf libtool python-dev texlive-extra-utils clang-3.4 libstdc++-4.8-dev libssl-dev libsqlite3-dev pkg-config libbz2-dev
sudo apt-get install -yq git cmake ninja-build ccache libncurses5-dev liblzma-dev libreadline-dev libgmp3-dev
libmpfr-dev
autoconf libtool python-dev texlive-extra-utils clang-3.4 libstdc++-4.8-dev libssl-dev libsqlite3-dev pkg-config libbz2-dev
```
**Ubuntu 14.04/14.10/15.04**
```
sudo apt-get install -yq git cmake ninja-build ccache libncurses5-dev liblzma-dev libreadline-dev libgmp3-dev autoconf libtool python-dev texlive-extra-utils clang libssl-dev libsqlite3-dev pkg-config libbz2-dev
sudo apt-get install -yq git cmake ninja-build ccache libncurses5-dev liblzma-dev libreadline-dev libgmp3-dev
libmpfr-dev
autoconf libtool python-dev texlive-extra-utils clang libssl-dev libsqlite3-dev pkg-config libbz2-dev
```
**Fedora 21**
```
sudo yum install git make cmake clang gcc gcc-c++ ccache ninja-build xz-devel automake libtool gmp-devel readline-devel openssl-devel sqlite-devel python-devel zlib-devel bzip2-devel ncurses-devel texlive-latex2man libffi-devel
sudo yum install git make cmake clang gcc gcc-c++ ccache ninja-build xz-devel automake libtool gmp-devel
mpfr-devel
readline-devel openssl-devel sqlite-devel python-devel zlib-devel bzip2-devel ncurses-devel texlive-latex2man libffi-devel
```
### Building and testing
...
...
This diff is collapsed.
Click to expand it.
from_cpython/Lib/test/test_fractions.py
View file @
6e4acec1
# expected: fail
"""Tests for Lib/fractions.py."""
from
decimal
import
Decimal
...
...
This diff is collapsed.
Click to expand it.
from_cpython/Lib/test/test_long.py
View file @
6e4acec1
# expected: fail
import
unittest
import
sys
...
...
@@ -17,7 +16,10 @@ class Frm(object):
return
self
.
format
%
self
.
args
# SHIFT should match the value in longintrepr.h for best testing.
SHIFT
=
sys
.
long_info
.
bits_per_digit
SHIFT
=
64
# Pyston changes: Pyston long implementation not based on digits.
# disable it for now.
# SHIFT = sys.long_info.bits_per_digit
BASE
=
2
**
SHIFT
MASK
=
BASE
-
1
KARATSUBA_CUTOFF
=
70
# from longobject.c
...
...
This diff is collapsed.
Click to expand it.
from_cpython/Modules/mathmodule.c
View file @
6e4acec1
...
...
@@ -1281,7 +1281,9 @@ loghelper(PyObject* arg, double (*func)(double), char *funcname)
Py_ssize_t
e
;
/* Negative or zero inputs give a ValueError. */
if
(
Py_SIZE
(
arg
)
<=
0
)
{
// Pyston change: use _PyLong_Sign instead of Py_SIZE to check
// the sign of long object.
if
(
_PyLong_Sign
(
arg
)
<=
0
)
{
PyErr_SetString
(
PyExc_ValueError
,
"math domain error"
);
return
NULL
;
...
...
This diff is collapsed.
Click to expand it.
src/runtime/classobj.cpp
View file @
6e4acec1
...
...
@@ -459,7 +459,7 @@ static Box* _instanceGetattribute(Box* _inst, BoxedString* attr_str, bool raise_
return
inst
->
getAttrWrapper
();
if
(
attr_str
->
s
()
==
"__class__"
)
return
in
st
->
inst_cls
;
return
in
cref
(
inst
->
inst_cls
)
;
}
Box
*
attr
=
instanceGetattributeWithFallback
<
rewritable
>
(
inst
,
attr_str
,
rewrite_args
);
...
...
@@ -1522,8 +1522,13 @@ Box* instanceLong(Box* _inst) {
BoxedInstance
*
inst
=
static_cast
<
BoxedInstance
*>
(
_inst
);
static
BoxedString
*
long_str
=
getStaticString
(
"__long__"
);
if
(
PyObject_HasAttr
((
PyObject
*
)
inst
,
long_str
))
{
Box
*
long_func
=
_instanceGetattribute
(
inst
,
long_str
,
true
);
return
runtimeCall
(
long_func
,
ArgPassSpec
(
0
),
NULL
,
NULL
,
NULL
,
NULL
,
NULL
);
return
runtimeCall
(
autoDecref
(
long_func
),
ArgPassSpec
(
0
),
NULL
,
NULL
,
NULL
,
NULL
,
NULL
);
}
Box
*
res
=
instanceInt
(
inst
);
return
res
;
}
Box
*
instanceFloat
(
Box
*
_inst
)
{
...
...
This diff is collapsed.
Click to expand it.
src/runtime/complex.cpp
View file @
6e4acec1
...
...
@@ -541,6 +541,23 @@ Box* complexPow(BoxedComplex* lhs, Box* _rhs, Box* mod) {
return
boxComplex
(
p
.
real
,
p
.
imag
);
}
Box
*
complexRpow
(
BoxedComplex
*
_lhs
,
Box
*
_rhs
)
{
if
(
!
PyComplex_Check
(
_lhs
))
raiseExcHelper
(
TypeError
,
"descriptor '__rpow__' requires a 'complex' object but received a '%s'"
,
getTypeName
(
_lhs
));
BoxedComplex
*
lhs
=
new
BoxedComplex
(
0.0
,
0.0
);
if
(
PyInt_Check
(
_rhs
))
{
lhs
->
real
=
(
static_cast
<
BoxedInt
*>
(
_rhs
))
->
n
;
}
else
if
(
_rhs
->
cls
==
float_cls
)
{
lhs
->
real
=
(
static_cast
<
BoxedFloat
*>
(
_rhs
))
->
d
;
}
else
if
(
_rhs
->
cls
==
complex_cls
)
{
lhs
=
static_cast
<
BoxedComplex
*>
(
_rhs
);
}
else
{
return
NotImplemented
;
}
return
complexPow
(
lhs
,
_lhs
,
None
);
}
Box
*
complexHash
(
BoxedComplex
*
self
)
{
if
(
!
PyComplex_Check
(
self
))
raiseExcHelper
(
TypeError
,
"descriptor '__hash__' requires a 'complex' object but received a '%s'"
,
...
...
@@ -1254,6 +1271,8 @@ void setupComplex() {
complex_cls
->
giveAttr
(
"__rdiv__"
,
new
BoxedFunction
(
FunctionMetadata
::
create
((
void
*
)
complexRDiv
,
UNKNOWN
,
2
)));
complex_cls
->
giveAttr
(
"__pow__"
,
new
BoxedFunction
(
FunctionMetadata
::
create
((
void
*
)
complexPow
,
UNKNOWN
,
3
,
false
,
false
),
{
None
}));
complex_cls
->
giveAttr
(
"__rpow__"
,
new
BoxedFunction
(
FunctionMetadata
::
create
((
void
*
)
complexRpow
,
UNKNOWN
,
2
)));
complex_cls
->
giveAttr
(
"__mod__"
,
new
BoxedFunction
(
FunctionMetadata
::
create
((
void
*
)
complexMod
,
UNKNOWN
,
2
)));
complex_cls
->
giveAttr
(
"__divmod__"
,
new
BoxedFunction
(
FunctionMetadata
::
create
((
void
*
)
complexDivmod
,
BOXED_TUPLE
,
2
)));
...
...
This diff is collapsed.
Click to expand it.
src/runtime/float.cpp
View file @
6e4acec1
...
...
@@ -54,8 +54,13 @@ extern "C" double PyFloat_AsDouble(PyObject* o) noexcept {
if
(
o
->
cls
==
int_cls
||
o
->
cls
==
bool_cls
)
return
(
double
)
static_cast
<
BoxedInt
*>
(
o
)
->
n
;
// special case: long
if
(
o
->
cls
==
long_cls
)
return
mpz_get_d
(
static_cast
<
BoxedLong
*>
(
o
)
->
n
);
if
(
o
->
cls
==
long_cls
)
{
double
result
=
PyLong_AsDouble
(
static_cast
<
BoxedLong
*>
(
o
));
if
(
result
==
-
1.0
&&
PyErr_Occurred
())
return
-
1.0
;
return
result
;
}
// implementation from cpython:
PyNumberMethods
*
nb
;
...
...
@@ -125,7 +130,11 @@ extern "C" Box* floatAdd(BoxedFloat* lhs, Box* rhs) {
}
else
if
(
rhs
->
cls
==
float_cls
)
{
return
floatAddFloat
(
lhs
,
static_cast
<
BoxedFloat
*>
(
rhs
));
}
else
if
(
rhs
->
cls
==
long_cls
)
{
return
boxFloat
(
lhs
->
d
+
PyLong_AsDouble
(
rhs
));
double
rhs_f
=
PyLong_AsDouble
(
rhs
);
if
(
rhs_f
==
-
1.0
&&
PyErr_Occurred
())
{
throwCAPIException
();
}
return
boxFloat
(
lhs
->
d
+
rhs_f
);
}
else
{
return
incref
(
NotImplemented
);
}
...
...
@@ -152,7 +161,11 @@ extern "C" Box* floatDiv(BoxedFloat* lhs, Box* rhs) {
}
else
if
(
rhs
->
cls
==
float_cls
)
{
return
floatDivFloat
(
lhs
,
static_cast
<
BoxedFloat
*>
(
rhs
));
}
else
if
(
rhs
->
cls
==
long_cls
)
{
return
boxFloat
(
lhs
->
d
/
PyLong_AsDouble
(
rhs
));
double
rhs_f
=
PyLong_AsDouble
(
rhs
);
if
(
rhs_f
==
-
1.0
&&
PyErr_Occurred
())
{
throwCAPIException
();
}
return
boxFloat
(
lhs
->
d
/
rhs_f
);
}
else
{
return
incref
(
NotImplemented
);
}
...
...
@@ -165,7 +178,11 @@ extern "C" Box* floatTruediv(BoxedFloat* lhs, Box* rhs) {
}
else
if
(
rhs
->
cls
==
float_cls
)
{
return
floatDivFloat
(
lhs
,
static_cast
<
BoxedFloat
*>
(
rhs
));
}
else
if
(
rhs
->
cls
==
long_cls
)
{
return
boxFloat
(
lhs
->
d
/
PyLong_AsDouble
(
rhs
));
double
rhs_f
=
PyLong_AsDouble
(
rhs
);
if
(
rhs_f
==
-
1.0
&&
PyErr_Occurred
())
{
throwCAPIException
();
}
return
boxFloat
(
lhs
->
d
/
rhs_f
);
}
else
{
return
incref
(
NotImplemented
);
}
...
...
@@ -192,7 +209,11 @@ extern "C" Box* floatRDiv(BoxedFloat* lhs, Box* rhs) {
}
else
if
(
rhs
->
cls
==
float_cls
)
{
return
floatRDivFloat
(
lhs
,
static_cast
<
BoxedFloat
*>
(
rhs
));
}
else
if
(
rhs
->
cls
==
long_cls
)
{
return
boxFloat
(
PyLong_AsDouble
(
rhs
)
/
lhs
->
d
);
double
rhs_f
=
PyLong_AsDouble
(
rhs
);
if
(
rhs_f
==
-
1.0
&&
PyErr_Occurred
())
{
throwCAPIException
();
}
return
boxFloat
(
rhs_f
/
lhs
->
d
);
}
else
{
return
incref
(
NotImplemented
);
}
...
...
@@ -218,6 +239,33 @@ extern "C" Box* floatFloorDiv(BoxedFloat* lhs, Box* rhs) {
return
floatFloorDivInt
(
lhs
,
static_cast
<
BoxedInt
*>
(
rhs
));
}
else
if
(
rhs
->
cls
==
float_cls
)
{
return
floatFloorDivFloat
(
lhs
,
static_cast
<
BoxedFloat
*>
(
rhs
));
}
else
if
(
rhs
->
cls
==
long_cls
)
{
double
rhs_f
=
PyLong_AsDouble
(
rhs
);
if
(
rhs_f
==
-
1.0
&&
PyErr_Occurred
())
{
throwCAPIException
();
}
return
floatFloorDivFloat
(
lhs
,
new
BoxedFloat
(
rhs_f
));
}
else
{
return
NotImplemented
;
}
}
extern
"C"
Box
*
floatRFloorDiv
(
BoxedFloat
*
lhs
,
Box
*
_rhs
)
{
assert
(
lhs
->
cls
==
float_cls
);
if
(
PyInt_Check
(
_rhs
))
{
BoxedInt
*
rhs
=
(
BoxedInt
*
)
_rhs
;
raiseDivZeroExcIfZero
(
lhs
->
d
);
return
boxFloat
(
floor
(
rhs
->
n
/
lhs
->
d
));
}
else
if
(
_rhs
->
cls
==
float_cls
)
{
BoxedFloat
*
rhs
=
(
BoxedFloat
*
)
_rhs
;
raiseDivZeroExcIfZero
(
lhs
->
d
);
return
boxFloat
(
floor
(
rhs
->
d
/
lhs
->
d
));
}
else
if
(
_rhs
->
cls
==
long_cls
)
{
double
rhs_f
=
PyLong_AsDouble
(
_rhs
);
if
(
rhs_f
==
-
1.0
&&
PyErr_Occurred
())
{
throwCAPIException
();
}
return
floatFloorDivFloat
(
new
BoxedFloat
(
rhs_f
),
lhs
);
}
else
{
return
incref
(
NotImplemented
);
}
...
...
@@ -544,7 +592,11 @@ extern "C" Box* floatMod(BoxedFloat* lhs, Box* rhs) {
}
else
if
(
rhs
->
cls
==
float_cls
)
{
return
floatModFloat
(
lhs
,
static_cast
<
BoxedFloat
*>
(
rhs
));
}
else
if
(
rhs
->
cls
==
long_cls
)
{
return
boxFloat
(
mod_float_float
(
lhs
->
d
,
PyLong_AsDouble
(
rhs
)));
double
rhs_f
=
PyLong_AsDouble
(
rhs
);
if
(
rhs_f
==
-
1.0
&&
PyErr_Occurred
())
{
throwCAPIException
();
}
return
boxFloat
(
mod_float_float
(
lhs
->
d
,
rhs_f
));
}
else
{
return
incref
(
NotImplemented
);
}
...
...
@@ -569,7 +621,11 @@ extern "C" Box* floatRMod(BoxedFloat* lhs, Box* rhs) {
}
else
if
(
rhs
->
cls
==
float_cls
)
{
return
floatRModFloat
(
lhs
,
static_cast
<
BoxedFloat
*>
(
rhs
));
}
else
if
(
rhs
->
cls
==
long_cls
)
{
return
boxFloat
(
mod_float_float
(
PyLong_AsDouble
(
rhs
),
lhs
->
d
));
double
rhs_f
=
PyLong_AsDouble
(
rhs
);
if
(
rhs_f
==
-
1.0
&&
PyErr_Occurred
())
{
throwCAPIException
();
}
return
boxFloat
(
mod_float_float
(
rhs_f
,
lhs
->
d
));
}
else
{
return
incref
(
NotImplemented
);
}
...
...
@@ -626,7 +682,11 @@ extern "C" Box* floatMul(BoxedFloat* lhs, Box* rhs) {
}
else
if
(
rhs
->
cls
==
float_cls
)
{
return
floatMulFloat
(
lhs
,
static_cast
<
BoxedFloat
*>
(
rhs
));
}
else
if
(
rhs
->
cls
==
long_cls
)
{
return
boxFloat
(
lhs
->
d
*
PyLong_AsDouble
(
rhs
));
double
rhs_f
=
PyLong_AsDouble
(
rhs
);
if
(
rhs_f
==
-
1.0
&&
PyErr_Occurred
())
{
throwCAPIException
();
}
return
boxFloat
(
lhs
->
d
*
rhs_f
);
}
else
{
return
incref
(
NotImplemented
);
}
...
...
@@ -651,7 +711,11 @@ extern "C" Box* floatSub(BoxedFloat* lhs, Box* rhs) {
}
else
if
(
rhs
->
cls
==
float_cls
)
{
return
floatSubFloat
(
lhs
,
static_cast
<
BoxedFloat
*>
(
rhs
));
}
else
if
(
rhs
->
cls
==
long_cls
)
{
return
boxFloat
(
lhs
->
d
-
PyLong_AsDouble
(
rhs
));
double
rhs_f
=
PyLong_AsDouble
(
rhs
);
if
(
rhs_f
==
-
1.0
&&
PyErr_Occurred
())
{
throwCAPIException
();
}
return
boxFloat
(
lhs
->
d
-
rhs_f
);
}
else
{
return
incref
(
NotImplemented
);
}
...
...
@@ -676,7 +740,11 @@ extern "C" Box* floatRSub(BoxedFloat* lhs, Box* rhs) {
}
else
if
(
rhs
->
cls
==
float_cls
)
{
return
floatRSubFloat
(
lhs
,
static_cast
<
BoxedFloat
*>
(
rhs
));
}
else
if
(
rhs
->
cls
==
long_cls
)
{
return
boxFloat
(
PyLong_AsDouble
(
rhs
)
-
lhs
->
d
);
double
rhs_f
=
PyLong_AsDouble
(
rhs
);
if
(
rhs_f
==
-
1.0
&&
PyErr_Occurred
())
{
throwCAPIException
();
}
return
boxFloat
(
rhs_f
-
lhs
->
d
);
}
else
{
return
incref
(
NotImplemented
);
}
...
...
@@ -782,6 +850,13 @@ template <ExceptionStyle S> static BoxedFloat* _floatNew(Box* a) noexcept(S == C
return
static_cast
<
BoxedFloat
*>
(
a
);
}
else
if
(
PyInt_Check
(
a
))
{
return
new
BoxedFloat
(
static_cast
<
BoxedInt
*>
(
a
)
->
n
);
}
else
if
(
PyLong_Check
(
a
))
{
double
a_f
=
PyLong_AsDouble
(
a
);
if
(
a_f
==
-
1.0
&&
PyErr_Occurred
())
{
throwCAPIException
();
}
return
new
BoxedFloat
(
a_f
);
}
else
if
(
a
->
cls
==
str_cls
||
a
->
cls
==
unicode_cls
)
{
BoxedFloat
*
res
=
(
BoxedFloat
*
)
PyFloat_FromString
(
a
,
NULL
);
...
...
@@ -1656,6 +1731,8 @@ void setupFloat() {
_addFunc
(
"__div__"
,
BOXED_FLOAT
,
(
void
*
)
floatDivFloat
,
(
void
*
)
floatDivInt
,
(
void
*
)
floatDiv
);
_addFunc
(
"__rdiv__"
,
BOXED_FLOAT
,
(
void
*
)
floatRDivFloat
,
(
void
*
)
floatRDivInt
,
(
void
*
)
floatRDiv
);
_addFunc
(
"__floordiv__"
,
BOXED_FLOAT
,
(
void
*
)
floatFloorDivFloat
,
(
void
*
)
floatFloorDivInt
,
(
void
*
)
floatFloorDiv
);
float_cls
->
giveAttr
(
"__rfloordiv__"
,
new
BoxedFunction
(
FunctionMetadata
::
create
((
void
*
)
floatRFloorDiv
,
BOXED_FLOAT
,
2
)));
_addFunc
(
"__truediv__"
,
BOXED_FLOAT
,
(
void
*
)
floatDivFloat
,
(
void
*
)
floatDivInt
,
(
void
*
)
floatTruediv
);
_addFunc
(
"__mod__"
,
BOXED_FLOAT
,
(
void
*
)
floatModFloat
,
(
void
*
)
floatModInt
,
(
void
*
)
floatMod
);
...
...
This diff is collapsed.
Click to expand it.
src/runtime/long.cpp
View file @
6e4acec1
...
...
@@ -15,7 +15,9 @@
#include "runtime/long.h"
#include <cmath>
#include <float.h>
#include <gmp.h>
#include <mpfr.h>
#include <sstream>
#include "llvm/Support/raw_ostream.h"
...
...
@@ -204,17 +206,18 @@ extern "C" PyObject* PyLong_FromString(const char* str, char** pend, int base) n
BoxedLong
*
rtn
=
new
BoxedLong
();
int
r
=
0
;
if
(
str
[
strlen
(
str
)
-
1
]
==
'L'
||
str
[
strlen
(
str
)
-
1
]
==
'l'
)
{
if
(
(
str
[
strlen
(
str
)
-
1
]
==
'L'
||
str
[
strlen
(
str
)
-
1
]
==
'l'
)
&&
base
<
22
)
{
std
::
string
without_l
(
str
,
strlen
(
str
)
-
1
);
r
=
mpz_init_set_str
(
rtn
->
n
,
without_l
.
c_str
(),
base
);
}
else
{
// if base great than 22, 'l' or 'L' should count as a digit.
r
=
mpz_init_set_str
(
rtn
->
n
,
str
,
base
);
}
if
(
pend
)
*
pend
=
const_cast
<
char
*>
(
str
)
+
strlen
(
str
);
if
(
r
!=
0
)
{
PyErr_Format
(
PyExc_ValueError
,
"invalid literal for long() with base %d:
%s
"
,
base
,
str
);
PyErr_Format
(
PyExc_ValueError
,
"invalid literal for long() with base %d:
'%s'
"
,
base
,
str
);
return
NULL
;
}
...
...
@@ -339,15 +342,17 @@ extern "C" long PyLong_AsLongAndOverflow(Box* vv, int* overflow) noexcept {
extern
"C"
double
PyLong_AsDouble
(
PyObject
*
vv
)
noexcept
{
RELEASE_ASSERT
(
PyLong_Check
(
vv
),
""
);
BoxedLong
*
l
=
static_cast
<
BoxedLong
*>
(
vv
);
mpfr_t
result
;
mpfr_init
(
result
);
mpfr_init_set_z
(
result
,
l
->
n
,
MPFR_RNDN
);
double
result
=
mpz_get_d
(
l
->
n
);
if
(
std
::
isinf
(
result
))
{
double
result_f
=
mpfr_get_d
(
result
,
MPFR_RNDN
);
if
(
isinf
(
result_f
))
{
PyErr_SetString
(
PyExc_OverflowError
,
"long int too large to convert to float"
);
return
-
1
;
}
return
result
;
return
result
_f
;
}
/* Convert the long to a string object with given base,
...
...
@@ -455,7 +460,10 @@ extern "C" PyObject* PyLong_FromSize_t(size_t ival) noexcept {
#undef IS_LITTLE_ENDIAN
extern
"C"
double
_PyLong_Frexp
(
PyLongObject
*
a
,
Py_ssize_t
*
e
)
noexcept
{
Py_FatalError
(
"unimplemented"
);
BoxedLong
*
v
=
(
BoxedLong
*
)
a
;
double
result
=
mpz_get_d_2exp
(
e
,
v
->
n
);
static_assert
(
sizeof
(
Py_ssize_t
)
==
8
,
"need to add overflow checking"
);
return
result
;
}
/* Create a new long (or int) object from a C pointer */
...
...
@@ -690,11 +698,11 @@ template <ExceptionStyle S> Box* _longNew(Box* val, Box* _base) noexcept(S == CA
if
(
s
->
size
()
!=
strlen
(
s
->
data
()))
{
Box
*
srepr
=
PyObject_Repr
(
val
);
if
(
S
==
CAPI
)
{
PyErr_Format
(
PyExc_ValueError
,
"invalid literal for long() with base %d:
%s
"
,
base
,
PyErr_Format
(
PyExc_ValueError
,
"invalid literal for long() with base %d:
'%s'
"
,
base
,
PyString_AS_STRING
(
srepr
));
return
NULL
;
}
else
{
raiseExcHelper
(
ValueError
,
"invalid literal for long() with base %d:
%s
"
,
base
,
raiseExcHelper
(
ValueError
,
"invalid literal for long() with base %d:
'%s'
"
,
base
,
PyString_AS_STRING
(
srepr
));
}
}
...
...
@@ -772,8 +780,8 @@ Box* longFloat(BoxedLong* v) {
double
result
=
PyLong_AsDouble
(
v
);
if
(
result
==
-
1
)
checkAndT
hrowCAPIException
();
if
(
result
==
-
1
.0
&&
PyErr_Occurred
()
)
t
hrowCAPIException
();
return
new
BoxedFloat
(
result
);
}
...
...
@@ -1233,18 +1241,34 @@ Box* longTrueDiv(BoxedLong* v1, Box* _v2) {
raiseExcHelper
(
TypeError
,
"descriptor '__truediv__' requires a 'long' object but received a '%s'"
,
getTypeName
(
v1
));
// We only support args which fit into an int for now...
i
nt
overflow
=
0
;
long
lhs
=
PyLong_AsLongAndOverflow
(
v1
,
&
overflow
);
if
(
overflow
)
return
incref
(
NotImplemented
);
long
rhs
=
PyLong_AsLongAndOverflow
(
_v2
,
&
overflow
);
if
(
overflow
)
BoxedLong
*
v2
;
i
f
(
PyInt_Check
(
_v2
)
||
PyLong_Check
(
_v2
))
{
v2
=
(
BoxedLong
*
)
PyNumber_Long
(
_v2
);
if
(
!
v2
)
{
throwCAPIException
(
);
}
}
else
{
return
incref
(
NotImplemented
);
}
if
(
rhs
==
0
)
AUTO_DECREF
(
v2
);
if
(
mpz_sgn
(
v2
->
n
)
==
0
)
{
raiseExcHelper
(
ZeroDivisionError
,
"division by zero"
);
return
boxFloat
(
lhs
/
(
double
)
rhs
);
}
mpfr_t
lhs_f
,
rhs_f
,
result
;
mpfr_init
(
result
);
mpfr_init_set_z
(
lhs_f
,
v1
->
n
,
MPFR_RNDN
);
mpfr_init_set_z
(
rhs_f
,
v2
->
n
,
MPFR_RNDZ
);
mpfr_div
(
result
,
lhs_f
,
rhs_f
,
MPFR_RNDN
);
double
result_f
=
mpfr_get_d
(
result
,
MPFR_RNDN
);
if
(
isinf
(
result_f
))
{
raiseExcHelper
(
OverflowError
,
"integer division result too large for a float"
);
}
return
boxFloat
(
result_f
);
}
Box
*
longRTrueDiv
(
BoxedLong
*
v1
,
Box
*
_v2
)
{
...
...
@@ -1252,18 +1276,29 @@ Box* longRTrueDiv(BoxedLong* v1, Box* _v2) {
raiseExcHelper
(
TypeError
,
"descriptor '__rtruediv__' requires a 'long' object but received a '%s'"
,
getTypeName
(
v1
));
// We only support args which fit into an int for now...
int
overflow
=
0
;
long
lhs
=
PyLong_AsLongAndOverflow
(
_v2
,
&
overflow
);
if
(
overflow
)
return
incref
(
NotImplemented
);
long
rhs
=
PyLong_AsLongAndOverflow
(
v1
,
&
overflow
);
if
(
overflow
)
BoxedLong
*
v2
;
if
(
PyInt_Check
(
_v2
)
||
PyLong_Check
(
_v2
))
{
v2
=
(
BoxedLong
*
)
PyNumber_Long
(
_v2
);
}
else
{
return
incref
(
NotImplemented
);
}
AUTO_DECREF
(
v2
);
if
(
rhs
==
0
)
if
(
mpz_sgn
(
v2
->
n
)
==
0
)
{
raiseExcHelper
(
ZeroDivisionError
,
"division by zero"
);
return
boxFloat
(
lhs
/
(
double
)
rhs
);
}
mpfr_t
lhs_f
,
rhs_f
,
result
;
mpfr_init
(
result
);
mpfr_init_set_z
(
lhs_f
,
v2
->
n
,
MPFR_RNDN
);
mpfr_init_set_z
(
rhs_f
,
v1
->
n
,
MPFR_RNDZ
);
mpfr_div
(
result
,
lhs_f
,
rhs_f
,
MPFR_RNDN
);
double
result_f
=
mpfr_get_d
(
result
,
MPFR_RNDZ
);
if
(
isinf
(
result_f
))
{
raiseExcHelper
(
OverflowError
,
"integer division result too large for a float"
);
}
return
boxFloat
(
result_f
);
}
static
void
_addFuncPow
(
const
char
*
name
,
ConcreteCompilerType
*
rtn_type
,
void
*
float_func
,
void
*
long_func
)
{
...
...
@@ -1385,14 +1420,17 @@ Box* longHash(BoxedLong* self) {
if
(
mpz_fits_slong_p
(
self
->
n
))
return
boxInt
(
mpz_get_si
(
self
->
n
));
// Not sure if this is a good hash function or not;
// simple, but only includes top bits:
union
{
uint64_t
n
;
double
d
;
};
d
=
mpz_get_d
(
self
->
n
);
return
boxInt
(
n
);
// CPython use the absolute value of self mod ULONG_MAX.
unsigned
long
remainder
=
mpz_tdiv_ui
(
self
->
n
,
ULONG_MAX
);
if
(
remainder
==
0
)
remainder
=
-
1
;
// CPython compatibility -- ULONG_MAX mod ULONG_MAX is ULONG_MAX to them.
remainder
*=
mpz_sgn
(
self
->
n
);
if
(
remainder
==
-
1
)
remainder
=
-
2
;
return
boxInt
(
remainder
);
}
extern
"C"
Box
*
longTrunc
(
BoxedLong
*
self
)
{
...
...
This diff is collapsed.
Click to expand it.
test/CPYTHON_TEST_NOTES.md
View file @
6e4acec1
...
...
@@ -101,7 +101,6 @@ test_file_eintr not sure
test_fileio [unknown]
test_file wontfix: we don't destruct file objects when the test wants
test_fork1 [unknown]
test_fractions [unknown]
test_frozen [unknown]
test_ftplib [unknown]
test_funcattrs we don't allow changing numing of function defaults
...
...
@@ -141,7 +140,6 @@ test__locale No module named _locale
test_locale [unknown]
test_longexp [unknown]
test_long_future [unknown]
test_long sys.long_info
test_macos Not really a failure, but it tries to skip itself and we don't support that
test_macostools Not really a failure, but it tries to skip itself and we don't support that
test_mailbox [unknown]
...
...
@@ -187,7 +185,6 @@ test_runpy [unknown]
test_sax [unknown]
test_scope eval of code object from existing function (not currently supported)
test_scriptpackages [unknown]
test_set lots of set issues
test_shelve [unknown]
test_shlex [unknown]
test_signal [unknown]
...
...
This diff is collapsed.
Click to expand it.
test/tests/exec_directory.py
0 → 100644
View file @
6e4acec1
import
sys
import
os
import
subprocess
me
=
sys
.
executable
file_path
=
os
.
path
.
dirname
(
__file__
)
with
open
(
'/dev/null'
)
as
ignore
:
def
run
(
args
):
process
=
subprocess
.
Popen
([
me
]
+
args
,
stdout
=
subprocess
.
PIPE
,
stderr
=
ignore
)
out
,
err
=
process
.
communicate
()
sys
.
stdout
.
flush
()
print
(
out
)
sys
.
stdout
.
flush
()
run
([
""
.
join
([
file_path
,
"/no_main_directory"
])])
run
([
""
.
join
([
file_path
,
"/no_main_directory/sub_dir"
])])
This diff is collapsed.
Click to expand it.
test/tests/long.py
View file @
6e4acec1
...
...
@@ -146,3 +146,19 @@ print(long(unicode("-3")))
print
(
long
(
x
=
10
))
print
(
long
(
x
=
"10"
,
base
=
10
))
try
:
print
(
long
(
'hek2mgl'
,
22
))
except
Exception
as
e
:
print
(
e
.
message
)
print
(
long
(
'hek2mgl'
,
23
))
print
(
long
(
'hek2mgl'
,
24
))
for
i
in
range
(
-
10
,
10
):
print
(
hash
((
-
1
<<
63
)
+
i
))
print
(
hash
((
1
<<
63
)
+
i
))
for
i
in
xrange
(
100
):
for
j
in
xrange
(
100
):
print
i
,
j
,
hash
((
1
<<
i
)
-
(
1
<<
j
))
This diff is collapsed.
Click to expand it.
test/tests/no_main_directory/sub_dir/__main__.py
0 → 100644
View file @
6e4acec1
print
(
"echo from __main__"
)
This diff is collapsed.
Click to expand it.
test/tests/no_main_directory/test.py
0 → 100644
View file @
6e4acec1
This diff is collapsed.
Click to expand it.
test/unittests/CMakeLists.txt
View file @
6e4acec1
...
...
@@ -9,7 +9,7 @@ add_custom_target(unittests)
macro
(
add_unittest unittest
)
add_executable
(
${
unittest
}
_unittest EXCLUDE_FROM_ALL
${
unittest
}
.cpp $<TARGET_OBJECTS:PYSTON_OBJECTS> $<TARGET_OBJECTS:FROM_CPYTHON>
)
target_link_libraries
(
${
unittest
}
_unittest stdlib z sqlite3 gmp ssl crypto readline pypa liblz4 double-conversion unwind gtest gtest_main util
${
LLVM_LIBS
}
${
LIBLZMA_LIBRARIES
}
)
target_link_libraries
(
${
unittest
}
_unittest stdlib z sqlite3 gmp
mpfr
ssl crypto readline pypa liblz4 double-conversion unwind gtest gtest_main util
${
LLVM_LIBS
}
${
LIBLZMA_LIBRARIES
}
)
add_dependencies
(
unittests
${
unittest
}
_unittest
)
endmacro
()
...
...
This diff is collapsed.
Click to expand it.
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