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
128e2b0d
Commit
128e2b0d
authored
Sep 08, 2016
by
Marius Wachtler
Committed by
GitHub
Sep 08, 2016
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1361 from undingen/delete_ast_nodes
AST: deallocate nodes
parents
0dea31b9
6926ccff
Changes
11
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
372 additions
and
264 deletions
+372
-264
src/codegen/cpython_ast.cpp
src/codegen/cpython_ast.cpp
+78
-72
src/codegen/cpython_ast.h
src/codegen/cpython_ast.h
+1
-1
src/codegen/irgen/hooks.cpp
src/codegen/irgen/hooks.cpp
+3
-1
src/codegen/parser.cpp
src/codegen/parser.cpp
+85
-71
src/codegen/parser.h
src/codegen/parser.h
+4
-3
src/core/ast.h
src/core/ast.h
+121
-61
src/core/cfg.cpp
src/core/cfg.cpp
+56
-46
src/jit.cpp
src/jit.cpp
+7
-2
src/runtime/capi.cpp
src/runtime/capi.cpp
+3
-2
src/runtime/import.cpp
src/runtime/import.cpp
+7
-2
test/unittests/analysis.cpp
test/unittests/analysis.cpp
+7
-3
No files found.
src/codegen/cpython_ast.cpp
View file @
128e2b0d
...
@@ -41,7 +41,7 @@ while lines:
...
@@ -41,7 +41,7 @@ while lines:
elif l.startswith("}"):
elif l.startswith("}"):
name = l[2:-1]
name = l[2:-1]
print "case %s_kind: {" % name
print "case %s_kind: {" % name
print "auto r = new AST_%s();" % name
print "auto r = new
(getAlloc())
AST_%s();" % name
print "auto v = %s->v.%s;" % (type, name)
print "auto v = %s->v.%s;" % (type, name)
for n in names:
for n in names:
print "r->%s = convert(v.%s);" % (n, n)
print "r->%s = convert(v.%s);" % (n, n)
...
@@ -64,6 +64,9 @@ private:
...
@@ -64,6 +64,9 @@ private:
int
interactive
=
0
;
int
interactive
=
0
;
int
nestlevel
=
0
;
int
nestlevel
=
0
;
llvm
::
StringRef
fn
;
llvm
::
StringRef
fn
;
std
::
unique_ptr
<
ASTAllocator
>
ast_allocator
;
ASTAllocator
&
getAlloc
()
{
return
*
ast_allocator
;
}
public:
public:
Converter
(
llvm
::
StringRef
fn
)
:
fn
(
fn
)
{}
Converter
(
llvm
::
StringRef
fn
)
:
fn
(
fn
)
{}
...
@@ -100,11 +103,11 @@ public:
...
@@ -100,11 +103,11 @@ public:
AST_Name
*
convertToName
(
identifier
ident
)
{
AST_Name
*
convertToName
(
identifier
ident
)
{
if
(
!
ident
)
if
(
!
ident
)
return
NULL
;
return
NULL
;
return
new
AST_Name
(
convert
(
ident
),
AST_TYPE
::
Store
,
-
1
,
-
1
);
return
new
(
getAlloc
())
AST_Name
(
convert
(
ident
),
AST_TYPE
::
Store
,
-
1
,
-
1
);
}
}
AST_arguments
*
convert
(
arguments_ty
ident
,
AST
*
parent
)
{
AST_arguments
*
convert
(
arguments_ty
ident
,
AST
*
parent
)
{
auto
r
=
new
AST_arguments
();
auto
r
=
new
(
getAlloc
())
AST_arguments
();
convertAll
<
expr_ty
>
(
ident
->
args
,
r
->
args
);
convertAll
<
expr_ty
>
(
ident
->
args
,
r
->
args
);
convertAll
<
expr_ty
>
(
ident
->
defaults
,
r
->
defaults
);
convertAll
<
expr_ty
>
(
ident
->
defaults
,
r
->
defaults
);
...
@@ -221,14 +224,14 @@ public:
...
@@ -221,14 +224,14 @@ public:
#undef CASE
#undef CASE
AST_keyword
*
convert
(
keyword_ty
keyword
)
{
AST_keyword
*
convert
(
keyword_ty
keyword
)
{
auto
r
=
new
AST_keyword
();
auto
r
=
new
(
getAlloc
())
AST_keyword
();
r
->
arg
=
convert
(
keyword
->
arg
);
r
->
arg
=
convert
(
keyword
->
arg
);
r
->
value
=
convert
(
keyword
->
value
);
r
->
value
=
convert
(
keyword
->
value
);
return
r
;
return
r
;
}
}
AST_comprehension
*
convert
(
comprehension_ty
comprehension
)
{
AST_comprehension
*
convert
(
comprehension_ty
comprehension
)
{
auto
r
=
new
AST_comprehension
();
auto
r
=
new
(
getAlloc
())
AST_comprehension
();
r
->
target
=
convert
(
comprehension
->
target
);
r
->
target
=
convert
(
comprehension
->
target
);
r
->
iter
=
convert
(
comprehension
->
iter
);
r
->
iter
=
convert
(
comprehension
->
iter
);
r
->
ifs
=
convert
<
expr_ty
,
AST_expr
*>
(
comprehension
->
ifs
);
r
->
ifs
=
convert
<
expr_ty
,
AST_expr
*>
(
comprehension
->
ifs
);
...
@@ -238,7 +241,7 @@ public:
...
@@ -238,7 +241,7 @@ public:
AST_slice
*
convert
(
slice_ty
slice
)
{
AST_slice
*
convert
(
slice_ty
slice
)
{
switch
(
slice
->
kind
)
{
switch
(
slice
->
kind
)
{
case
Slice_kind
:
{
case
Slice_kind
:
{
auto
r
=
new
AST_Slice
();
auto
r
=
new
(
getAlloc
())
AST_Slice
();
auto
v
=
slice
->
v
.
Slice
;
auto
v
=
slice
->
v
.
Slice
;
r
->
lower
=
convert
(
v
.
lower
);
r
->
lower
=
convert
(
v
.
lower
);
r
->
upper
=
convert
(
v
.
upper
);
r
->
upper
=
convert
(
v
.
upper
);
...
@@ -246,19 +249,19 @@ public:
...
@@ -246,19 +249,19 @@ public:
return
r
;
return
r
;
}
}
case
ExtSlice_kind
:
{
case
ExtSlice_kind
:
{
auto
r
=
new
AST_ExtSlice
();
auto
r
=
new
(
getAlloc
())
AST_ExtSlice
();
auto
v
=
slice
->
v
.
ExtSlice
;
auto
v
=
slice
->
v
.
ExtSlice
;
r
->
dims
=
convert
<
slice_ty
,
AST_slice
*>
(
v
.
dims
);
r
->
dims
=
convert
<
slice_ty
,
AST_slice
*>
(
v
.
dims
);
return
r
;
return
r
;
}
}
case
Index_kind
:
{
case
Index_kind
:
{
auto
r
=
new
AST_Index
();
auto
r
=
new
(
getAlloc
())
AST_Index
();
auto
v
=
slice
->
v
.
Index
;
auto
v
=
slice
->
v
.
Index
;
r
->
value
=
convert
(
v
.
value
);
r
->
value
=
convert
(
v
.
value
);
return
r
;
return
r
;
}
}
case
Ellipsis_kind
:
case
Ellipsis_kind
:
return
new
AST_Ellipsis
();
return
new
(
getAlloc
())
AST_Ellipsis
();
}
}
RELEASE_ASSERT
(
0
,
"invalid slice type: %d"
,
slice
->
kind
);
RELEASE_ASSERT
(
0
,
"invalid slice type: %d"
,
slice
->
kind
);
}
}
...
@@ -266,14 +269,14 @@ public:
...
@@ -266,14 +269,14 @@ public:
AST_expr
*
_convert
(
expr_ty
expr
)
{
AST_expr
*
_convert
(
expr_ty
expr
)
{
switch
(
expr
->
kind
)
{
switch
(
expr
->
kind
)
{
case
BoolOp_kind
:
{
case
BoolOp_kind
:
{
auto
r
=
new
AST_BoolOp
();
auto
r
=
new
(
getAlloc
())
AST_BoolOp
();
auto
v
=
expr
->
v
.
BoolOp
;
auto
v
=
expr
->
v
.
BoolOp
;
r
->
op_type
=
convert
(
v
.
op
);
r
->
op_type
=
convert
(
v
.
op
);
r
->
values
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
values
);
r
->
values
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
values
);
return
r
;
return
r
;
}
}
case
BinOp_kind
:
{
case
BinOp_kind
:
{
auto
r
=
new
AST_BinOp
();
auto
r
=
new
(
getAlloc
())
AST_BinOp
();
auto
v
=
expr
->
v
.
BinOp
;
auto
v
=
expr
->
v
.
BinOp
;
r
->
left
=
convert
(
v
.
left
);
r
->
left
=
convert
(
v
.
left
);
r
->
op_type
=
convert
(
v
.
op
);
r
->
op_type
=
convert
(
v
.
op
);
...
@@ -281,14 +284,14 @@ public:
...
@@ -281,14 +284,14 @@ public:
return
r
;
return
r
;
}
}
case
UnaryOp_kind
:
{
case
UnaryOp_kind
:
{
auto
r
=
new
AST_UnaryOp
();
auto
r
=
new
(
getAlloc
())
AST_UnaryOp
();
auto
v
=
expr
->
v
.
UnaryOp
;
auto
v
=
expr
->
v
.
UnaryOp
;
r
->
op_type
=
convert
(
v
.
op
);
r
->
op_type
=
convert
(
v
.
op
);
r
->
operand
=
convert
(
v
.
operand
);
r
->
operand
=
convert
(
v
.
operand
);
return
r
;
return
r
;
}
}
case
Lambda_kind
:
{
case
Lambda_kind
:
{
auto
r
=
new
AST_Lambda
();
auto
r
=
new
(
getAlloc
())
AST_Lambda
();
r
->
lineno
=
expr
->
lineno
;
r
->
lineno
=
expr
->
lineno
;
r
->
col_offset
=
expr
->
col_offset
;
r
->
col_offset
=
expr
->
col_offset
;
auto
v
=
expr
->
v
.
Lambda
;
auto
v
=
expr
->
v
.
Lambda
;
...
@@ -297,7 +300,7 @@ public:
...
@@ -297,7 +300,7 @@ public:
return
r
;
return
r
;
}
}
case
IfExp_kind
:
{
case
IfExp_kind
:
{
auto
r
=
new
AST_IfExp
();
auto
r
=
new
(
getAlloc
())
AST_IfExp
();
auto
v
=
expr
->
v
.
IfExp
;
auto
v
=
expr
->
v
.
IfExp
;
r
->
test
=
convert
(
v
.
test
);
r
->
test
=
convert
(
v
.
test
);
r
->
body
=
convert
(
v
.
body
);
r
->
body
=
convert
(
v
.
body
);
...
@@ -305,34 +308,34 @@ public:
...
@@ -305,34 +308,34 @@ public:
return
r
;
return
r
;
}
}
case
Dict_kind
:
{
case
Dict_kind
:
{
auto
r
=
new
AST_Dict
();
auto
r
=
new
(
getAlloc
())
AST_Dict
();
auto
v
=
expr
->
v
.
Dict
;
auto
v
=
expr
->
v
.
Dict
;
r
->
keys
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
keys
);
r
->
keys
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
keys
);
r
->
values
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
values
);
r
->
values
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
values
);
return
r
;
return
r
;
}
}
case
Set_kind
:
{
case
Set_kind
:
{
auto
r
=
new
AST_Set
();
auto
r
=
new
(
getAlloc
())
AST_Set
();
auto
v
=
expr
->
v
.
Set
;
auto
v
=
expr
->
v
.
Set
;
r
->
elts
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
elts
);
r
->
elts
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
elts
);
return
r
;
return
r
;
}
}
case
ListComp_kind
:
{
case
ListComp_kind
:
{
auto
r
=
new
AST_ListComp
();
auto
r
=
new
(
getAlloc
())
AST_ListComp
();
auto
v
=
expr
->
v
.
ListComp
;
auto
v
=
expr
->
v
.
ListComp
;
r
->
elt
=
convert
(
v
.
elt
);
r
->
elt
=
convert
(
v
.
elt
);
r
->
generators
=
convert
<
comprehension_ty
,
AST_comprehension
*>
(
v
.
generators
);
r
->
generators
=
convert
<
comprehension_ty
,
AST_comprehension
*>
(
v
.
generators
);
return
r
;
return
r
;
}
}
case
SetComp_kind
:
{
case
SetComp_kind
:
{
auto
r
=
new
AST_SetComp
();
auto
r
=
new
(
getAlloc
())
AST_SetComp
();
auto
v
=
expr
->
v
.
SetComp
;
auto
v
=
expr
->
v
.
SetComp
;
r
->
elt
=
convert
(
v
.
elt
);
r
->
elt
=
convert
(
v
.
elt
);
r
->
generators
=
convert
<
comprehension_ty
,
AST_comprehension
*>
(
v
.
generators
);
r
->
generators
=
convert
<
comprehension_ty
,
AST_comprehension
*>
(
v
.
generators
);
return
r
;
return
r
;
}
}
case
DictComp_kind
:
{
case
DictComp_kind
:
{
auto
r
=
new
AST_DictComp
();
auto
r
=
new
(
getAlloc
())
AST_DictComp
();
auto
v
=
expr
->
v
.
DictComp
;
auto
v
=
expr
->
v
.
DictComp
;
r
->
key
=
convert
(
v
.
key
);
r
->
key
=
convert
(
v
.
key
);
r
->
value
=
convert
(
v
.
value
);
r
->
value
=
convert
(
v
.
value
);
...
@@ -340,20 +343,20 @@ public:
...
@@ -340,20 +343,20 @@ public:
return
r
;
return
r
;
}
}
case
GeneratorExp_kind
:
{
case
GeneratorExp_kind
:
{
auto
r
=
new
AST_GeneratorExp
();
auto
r
=
new
(
getAlloc
())
AST_GeneratorExp
();
auto
v
=
expr
->
v
.
GeneratorExp
;
auto
v
=
expr
->
v
.
GeneratorExp
;
r
->
elt
=
convert
(
v
.
elt
);
r
->
elt
=
convert
(
v
.
elt
);
r
->
generators
=
convert
<
comprehension_ty
,
AST_comprehension
*>
(
v
.
generators
);
r
->
generators
=
convert
<
comprehension_ty
,
AST_comprehension
*>
(
v
.
generators
);
return
r
;
return
r
;
}
}
case
Yield_kind
:
{
case
Yield_kind
:
{
auto
r
=
new
AST_Yield
();
auto
r
=
new
(
getAlloc
())
AST_Yield
();
auto
v
=
expr
->
v
.
Yield
;
auto
v
=
expr
->
v
.
Yield
;
r
->
value
=
convert
(
v
.
value
);
r
->
value
=
convert
(
v
.
value
);
return
r
;
return
r
;
}
}
case
Compare_kind
:
{
case
Compare_kind
:
{
auto
r
=
new
AST_Compare
();
auto
r
=
new
(
getAlloc
())
AST_Compare
();
auto
v
=
expr
->
v
.
Compare
;
auto
v
=
expr
->
v
.
Compare
;
r
->
left
=
convert
(
v
.
left
);
r
->
left
=
convert
(
v
.
left
);
r
->
ops
=
convert
<
cmpop_ty
,
AST_TYPE
::
AST_TYPE
>
(
v
.
ops
);
r
->
ops
=
convert
<
cmpop_ty
,
AST_TYPE
::
AST_TYPE
>
(
v
.
ops
);
...
@@ -361,7 +364,7 @@ public:
...
@@ -361,7 +364,7 @@ public:
return
r
;
return
r
;
}
}
case
Call_kind
:
{
case
Call_kind
:
{
auto
r
=
new
AST_Call
();
auto
r
=
new
(
getAlloc
())
AST_Call
();
auto
v
=
expr
->
v
.
Call
;
auto
v
=
expr
->
v
.
Call
;
r
->
func
=
convert
(
v
.
func
);
r
->
func
=
convert
(
v
.
func
);
r
->
args
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
args
);
r
->
args
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
args
);
...
@@ -371,13 +374,13 @@ public:
...
@@ -371,13 +374,13 @@ public:
return
r
;
return
r
;
}
}
case
Repr_kind
:
{
case
Repr_kind
:
{
auto
r
=
new
AST_Repr
();
auto
r
=
new
(
getAlloc
())
AST_Repr
();
auto
v
=
expr
->
v
.
Repr
;
auto
v
=
expr
->
v
.
Repr
;
r
->
value
=
convert
(
v
.
value
);
r
->
value
=
convert
(
v
.
value
);
return
r
;
return
r
;
}
}
case
Attribute_kind
:
{
case
Attribute_kind
:
{
auto
r
=
new
AST_Attribute
();
auto
r
=
new
(
getAlloc
())
AST_Attribute
();
auto
v
=
expr
->
v
.
Attribute
;
auto
v
=
expr
->
v
.
Attribute
;
r
->
value
=
convert
(
v
.
value
);
r
->
value
=
convert
(
v
.
value
);
r
->
attr
=
convert
(
v
.
attr
);
r
->
attr
=
convert
(
v
.
attr
);
...
@@ -385,7 +388,7 @@ public:
...
@@ -385,7 +388,7 @@ public:
return
r
;
return
r
;
}
}
case
Subscript_kind
:
{
case
Subscript_kind
:
{
auto
r
=
new
AST_Subscript
();
auto
r
=
new
(
getAlloc
())
AST_Subscript
();
auto
v
=
expr
->
v
.
Subscript
;
auto
v
=
expr
->
v
.
Subscript
;
r
->
value
=
convert
(
v
.
value
);
r
->
value
=
convert
(
v
.
value
);
r
->
slice
=
convert
(
v
.
slice
);
r
->
slice
=
convert
(
v
.
slice
);
...
@@ -394,18 +397,18 @@ public:
...
@@ -394,18 +397,18 @@ public:
}
}
case
Name_kind
:
{
case
Name_kind
:
{
auto
v
=
expr
->
v
.
Name
;
auto
v
=
expr
->
v
.
Name
;
auto
r
=
new
AST_Name
(
convert
(
v
.
id
),
convert
(
v
.
ctx
),
0
);
auto
r
=
new
(
getAlloc
())
AST_Name
(
convert
(
v
.
id
),
convert
(
v
.
ctx
),
0
);
return
r
;
return
r
;
}
}
case
List_kind
:
{
case
List_kind
:
{
auto
r
=
new
AST_List
();
auto
r
=
new
(
getAlloc
())
AST_List
();
auto
v
=
expr
->
v
.
List
;
auto
v
=
expr
->
v
.
List
;
r
->
elts
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
elts
);
r
->
elts
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
elts
);
r
->
ctx_type
=
convert
(
v
.
ctx
);
r
->
ctx_type
=
convert
(
v
.
ctx
);
return
r
;
return
r
;
}
}
case
Tuple_kind
:
{
case
Tuple_kind
:
{
auto
r
=
new
AST_Tuple
();
auto
r
=
new
(
getAlloc
())
AST_Tuple
();
auto
v
=
expr
->
v
.
Tuple
;
auto
v
=
expr
->
v
.
Tuple
;
r
->
elts
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
elts
);
r
->
elts
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
elts
);
r
->
ctx_type
=
convert
(
v
.
ctx
);
r
->
ctx_type
=
convert
(
v
.
ctx
);
...
@@ -414,19 +417,19 @@ public:
...
@@ -414,19 +417,19 @@ public:
case
Num_kind
:
{
case
Num_kind
:
{
PyObject
*
o
=
expr
->
v
.
Num
.
n
;
PyObject
*
o
=
expr
->
v
.
Num
.
n
;
if
(
o
->
cls
==
int_cls
)
{
if
(
o
->
cls
==
int_cls
)
{
auto
r
=
new
AST_Num
();
auto
r
=
new
(
getAlloc
())
AST_Num
();
r
->
num_type
=
AST_Num
::
INT
;
r
->
num_type
=
AST_Num
::
INT
;
r
->
n_int
=
unboxInt
(
o
);
r
->
n_int
=
unboxInt
(
o
);
return
r
;
return
r
;
}
}
if
(
o
->
cls
==
float_cls
)
{
if
(
o
->
cls
==
float_cls
)
{
auto
r
=
new
AST_Num
();
auto
r
=
new
(
getAlloc
())
AST_Num
();
r
->
num_type
=
AST_Num
::
FLOAT
;
r
->
num_type
=
AST_Num
::
FLOAT
;
r
->
n_float
=
unboxFloat
(
o
);
r
->
n_float
=
unboxFloat
(
o
);
return
r
;
return
r
;
}
}
if
(
o
->
cls
==
long_cls
)
{
if
(
o
->
cls
==
long_cls
)
{
auto
r
=
new
AST_Num
();
auto
r
=
new
(
getAlloc
())
AST_Num
();
r
->
num_type
=
AST_Num
::
LONG
;
r
->
num_type
=
AST_Num
::
LONG
;
// XXX This is pretty silly:
// XXX This is pretty silly:
auto
s
=
_PyLong_Format
(
o
,
10
,
0
,
0
);
auto
s
=
_PyLong_Format
(
o
,
10
,
0
,
0
);
...
@@ -436,7 +439,7 @@ public:
...
@@ -436,7 +439,7 @@ public:
return
r
;
return
r
;
}
}
if
(
o
->
cls
==
complex_cls
)
{
if
(
o
->
cls
==
complex_cls
)
{
auto
r
=
new
AST_Num
();
auto
r
=
new
(
getAlloc
())
AST_Num
();
r
->
num_type
=
AST_Num
::
COMPLEX
;
r
->
num_type
=
AST_Num
::
COMPLEX
;
double
real
=
PyComplex_RealAsDouble
(
o
);
double
real
=
PyComplex_RealAsDouble
(
o
);
...
@@ -450,11 +453,11 @@ public:
...
@@ -450,11 +453,11 @@ public:
return
r
;
return
r
;
// TODO very silly:
// TODO very silly:
auto
freal
=
new
AST_Num
();
auto
freal
=
new
(
getAlloc
())
AST_Num
();
freal
->
n_float
=
real
;
freal
->
n_float
=
real
;
freal
->
num_type
=
AST_Num
::
FLOAT
;
freal
->
num_type
=
AST_Num
::
FLOAT
;
auto
binop
=
new
AST_BinOp
();
auto
binop
=
new
(
getAlloc
())
AST_BinOp
();
binop
->
op_type
=
AST_TYPE
::
Add
;
binop
->
op_type
=
AST_TYPE
::
Add
;
binop
->
left
=
freal
;
binop
->
left
=
freal
;
binop
->
right
=
r
;
binop
->
right
=
r
;
...
@@ -470,14 +473,14 @@ public:
...
@@ -470,14 +473,14 @@ public:
RELEASE_ASSERT
(
o
,
""
);
RELEASE_ASSERT
(
o
,
""
);
AUTO_DECREF
(
o
);
AUTO_DECREF
(
o
);
auto
r
=
new
AST_Str
();
auto
r
=
new
(
getAlloc
())
AST_Str
();
r
->
str_data
=
static_cast
<
BoxedString
*>
(
o
)
->
s
();
r
->
str_data
=
static_cast
<
BoxedString
*>
(
o
)
->
s
();
r
->
str_type
=
AST_Str
::
UNICODE
;
r
->
str_type
=
AST_Str
::
UNICODE
;
return
r
;
return
r
;
}
}
if
(
o
->
cls
==
str_cls
)
{
if
(
o
->
cls
==
str_cls
)
{
return
new
AST_Str
(
static_cast
<
BoxedString
*>
(
o
)
->
s
());
return
new
(
getAlloc
())
AST_Str
(
static_cast
<
BoxedString
*>
(
o
)
->
s
());
}
}
RELEASE_ASSERT
(
0
,
"unhandled str type: %s
\n
"
,
o
->
cls
->
tp_name
);
RELEASE_ASSERT
(
0
,
"unhandled str type: %s
\n
"
,
o
->
cls
->
tp_name
);
}
}
...
@@ -500,7 +503,7 @@ public:
...
@@ -500,7 +503,7 @@ public:
AST_ExceptHandler
*
convert
(
excepthandler_ty
eh
)
{
AST_ExceptHandler
*
convert
(
excepthandler_ty
eh
)
{
assert
(
eh
->
kind
==
ExceptHandler_kind
);
assert
(
eh
->
kind
==
ExceptHandler_kind
);
auto
r
=
new
AST_ExceptHandler
();
auto
r
=
new
(
getAlloc
())
AST_ExceptHandler
();
auto
v
=
eh
->
v
.
ExceptHandler
;
auto
v
=
eh
->
v
.
ExceptHandler
;
r
->
type
=
convert
(
v
.
type
);
r
->
type
=
convert
(
v
.
type
);
r
->
name
=
convert
(
v
.
name
);
r
->
name
=
convert
(
v
.
name
);
...
@@ -510,12 +513,14 @@ public:
...
@@ -510,12 +513,14 @@ public:
return
r
;
return
r
;
}
}
AST_alias
*
convert
(
alias_ty
alias
)
{
return
new
AST_alias
(
convert
(
alias
->
name
),
convert
(
alias
->
asname
));
}
AST_alias
*
convert
(
alias_ty
alias
)
{
return
new
(
getAlloc
())
AST_alias
(
convert
(
alias
->
name
),
convert
(
alias
->
asname
));
}
AST_stmt
*
_convert
(
stmt_ty
stmt
)
{
AST_stmt
*
_convert
(
stmt_ty
stmt
)
{
switch
(
stmt
->
kind
)
{
switch
(
stmt
->
kind
)
{
case
FunctionDef_kind
:
{
case
FunctionDef_kind
:
{
auto
r
=
new
AST_FunctionDef
();
auto
r
=
new
(
getAlloc
())
AST_FunctionDef
();
r
->
lineno
=
stmt
->
lineno
;
r
->
lineno
=
stmt
->
lineno
;
r
->
col_offset
=
stmt
->
col_offset
;
r
->
col_offset
=
stmt
->
col_offset
;
auto
v
=
stmt
->
v
.
FunctionDef
;
auto
v
=
stmt
->
v
.
FunctionDef
;
...
@@ -528,7 +533,7 @@ public:
...
@@ -528,7 +533,7 @@ public:
return
r
;
return
r
;
}
}
case
ClassDef_kind
:
{
case
ClassDef_kind
:
{
auto
r
=
new
AST_ClassDef
();
auto
r
=
new
(
getAlloc
())
AST_ClassDef
();
auto
v
=
stmt
->
v
.
ClassDef
;
auto
v
=
stmt
->
v
.
ClassDef
;
r
->
name
=
convert
(
v
.
name
);
r
->
name
=
convert
(
v
.
name
);
r
->
bases
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
bases
);
r
->
bases
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
bases
);
...
@@ -539,26 +544,26 @@ public:
...
@@ -539,26 +544,26 @@ public:
return
r
;
return
r
;
}
}
case
Return_kind
:
{
case
Return_kind
:
{
auto
r
=
new
AST_Return
();
auto
r
=
new
(
getAlloc
())
AST_Return
();
auto
v
=
stmt
->
v
.
Return
;
auto
v
=
stmt
->
v
.
Return
;
r
->
value
=
convert
(
v
.
value
);
r
->
value
=
convert
(
v
.
value
);
return
r
;
return
r
;
}
}
case
Delete_kind
:
{
case
Delete_kind
:
{
auto
r
=
new
AST_Delete
();
auto
r
=
new
(
getAlloc
())
AST_Delete
();
auto
v
=
stmt
->
v
.
Delete
;
auto
v
=
stmt
->
v
.
Delete
;
r
->
targets
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
targets
);
r
->
targets
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
targets
);
return
r
;
return
r
;
}
}
case
Assign_kind
:
{
case
Assign_kind
:
{
auto
r
=
new
AST_Assign
();
auto
r
=
new
(
getAlloc
())
AST_Assign
();
auto
v
=
stmt
->
v
.
Assign
;
auto
v
=
stmt
->
v
.
Assign
;
r
->
targets
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
targets
);
r
->
targets
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
targets
);
r
->
value
=
convert
(
v
.
value
);
r
->
value
=
convert
(
v
.
value
);
return
r
;
return
r
;
}
}
case
AugAssign_kind
:
{
case
AugAssign_kind
:
{
auto
r
=
new
AST_AugAssign
();
auto
r
=
new
(
getAlloc
())
AST_AugAssign
();
auto
v
=
stmt
->
v
.
AugAssign
;
auto
v
=
stmt
->
v
.
AugAssign
;
r
->
target
=
convert
(
v
.
target
);
r
->
target
=
convert
(
v
.
target
);
r
->
op_type
=
convert
(
v
.
op
);
r
->
op_type
=
convert
(
v
.
op
);
...
@@ -566,7 +571,7 @@ public:
...
@@ -566,7 +571,7 @@ public:
return
r
;
return
r
;
}
}
case
Print_kind
:
{
case
Print_kind
:
{
auto
r
=
new
AST_Print
();
auto
r
=
new
(
getAlloc
())
AST_Print
();
auto
v
=
stmt
->
v
.
Print
;
auto
v
=
stmt
->
v
.
Print
;
r
->
dest
=
convert
(
v
.
dest
);
r
->
dest
=
convert
(
v
.
dest
);
r
->
values
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
values
);
r
->
values
=
convert
<
expr_ty
,
AST_expr
*>
(
v
.
values
);
...
@@ -574,7 +579,7 @@ public:
...
@@ -574,7 +579,7 @@ public:
return
r
;
return
r
;
}
}
case
For_kind
:
{
case
For_kind
:
{
auto
r
=
new
AST_For
();
auto
r
=
new
(
getAlloc
())
AST_For
();
auto
v
=
stmt
->
v
.
For
;
auto
v
=
stmt
->
v
.
For
;
r
->
target
=
convert
(
v
.
target
);
r
->
target
=
convert
(
v
.
target
);
r
->
iter
=
convert
(
v
.
iter
);
r
->
iter
=
convert
(
v
.
iter
);
...
@@ -588,7 +593,7 @@ public:
...
@@ -588,7 +593,7 @@ public:
return
r
;
return
r
;
}
}
case
While_kind
:
{
case
While_kind
:
{
auto
r
=
new
AST_While
();
auto
r
=
new
(
getAlloc
())
AST_While
();
auto
v
=
stmt
->
v
.
While
;
auto
v
=
stmt
->
v
.
While
;
r
->
test
=
convert
(
v
.
test
);
r
->
test
=
convert
(
v
.
test
);
auto
fin
=
in_finally
;
auto
fin
=
in_finally
;
...
@@ -601,7 +606,7 @@ public:
...
@@ -601,7 +606,7 @@ public:
return
r
;
return
r
;
}
}
case
If_kind
:
{
case
If_kind
:
{
auto
r
=
new
AST_If
();
auto
r
=
new
(
getAlloc
())
AST_If
();
auto
v
=
stmt
->
v
.
If
;
auto
v
=
stmt
->
v
.
If
;
r
->
test
=
convert
(
v
.
test
);
r
->
test
=
convert
(
v
.
test
);
r
->
body
=
convert
<
stmt_ty
,
AST_stmt
*>
(
v
.
body
);
r
->
body
=
convert
<
stmt_ty
,
AST_stmt
*>
(
v
.
body
);
...
@@ -609,7 +614,7 @@ public:
...
@@ -609,7 +614,7 @@ public:
return
r
;
return
r
;
}
}
case
With_kind
:
{
case
With_kind
:
{
auto
r
=
new
AST_With
();
auto
r
=
new
(
getAlloc
())
AST_With
();
auto
v
=
stmt
->
v
.
With
;
auto
v
=
stmt
->
v
.
With
;
r
->
context_expr
=
convert
(
v
.
context_expr
);
r
->
context_expr
=
convert
(
v
.
context_expr
);
r
->
optional_vars
=
convert
(
v
.
optional_vars
);
r
->
optional_vars
=
convert
(
v
.
optional_vars
);
...
@@ -617,7 +622,7 @@ public:
...
@@ -617,7 +622,7 @@ public:
return
r
;
return
r
;
}
}
case
Raise_kind
:
{
case
Raise_kind
:
{
auto
r
=
new
AST_Raise
();
auto
r
=
new
(
getAlloc
())
AST_Raise
();
auto
v
=
stmt
->
v
.
Raise
;
auto
v
=
stmt
->
v
.
Raise
;
r
->
arg0
=
convert
(
v
.
type
);
r
->
arg0
=
convert
(
v
.
type
);
r
->
arg1
=
convert
(
v
.
inst
);
r
->
arg1
=
convert
(
v
.
inst
);
...
@@ -625,7 +630,7 @@ public:
...
@@ -625,7 +630,7 @@ public:
return
r
;
return
r
;
}
}
case
TryExcept_kind
:
{
case
TryExcept_kind
:
{
auto
r
=
new
AST_TryExcept
();
auto
r
=
new
(
getAlloc
())
AST_TryExcept
();
auto
v
=
stmt
->
v
.
TryExcept
;
auto
v
=
stmt
->
v
.
TryExcept
;
r
->
body
=
convert
<
stmt_ty
,
AST_stmt
*>
(
v
.
body
);
r
->
body
=
convert
<
stmt_ty
,
AST_stmt
*>
(
v
.
body
);
r
->
handlers
=
convert
<
excepthandler_ty
,
AST_ExceptHandler
*>
(
v
.
handlers
);
r
->
handlers
=
convert
<
excepthandler_ty
,
AST_ExceptHandler
*>
(
v
.
handlers
);
...
@@ -633,7 +638,7 @@ public:
...
@@ -633,7 +638,7 @@ public:
return
r
;
return
r
;
}
}
case
TryFinally_kind
:
{
case
TryFinally_kind
:
{
auto
r
=
new
AST_TryFinally
();
auto
r
=
new
(
getAlloc
())
AST_TryFinally
();
auto
v
=
stmt
->
v
.
TryFinally
;
auto
v
=
stmt
->
v
.
TryFinally
;
r
->
body
=
convert
<
stmt_ty
,
AST_stmt
*>
(
v
.
body
);
r
->
body
=
convert
<
stmt_ty
,
AST_stmt
*>
(
v
.
body
);
in_finally
++
;
in_finally
++
;
...
@@ -642,20 +647,20 @@ public:
...
@@ -642,20 +647,20 @@ public:
return
r
;
return
r
;
}
}
case
Assert_kind
:
{
case
Assert_kind
:
{
auto
r
=
new
AST_Assert
();
auto
r
=
new
(
getAlloc
())
AST_Assert
();
auto
v
=
stmt
->
v
.
Assert
;
auto
v
=
stmt
->
v
.
Assert
;
r
->
test
=
convert
(
v
.
test
);
r
->
test
=
convert
(
v
.
test
);
r
->
msg
=
convert
(
v
.
msg
);
r
->
msg
=
convert
(
v
.
msg
);
return
r
;
return
r
;
}
}
case
Import_kind
:
{
case
Import_kind
:
{
auto
r
=
new
AST_Import
();
auto
r
=
new
(
getAlloc
())
AST_Import
();
auto
v
=
stmt
->
v
.
Import
;
auto
v
=
stmt
->
v
.
Import
;
r
->
names
=
convert
<
alias_ty
,
AST_alias
*>
(
v
.
names
);
r
->
names
=
convert
<
alias_ty
,
AST_alias
*>
(
v
.
names
);
return
r
;
return
r
;
}
}
case
ImportFrom_kind
:
{
case
ImportFrom_kind
:
{
auto
r
=
new
AST_ImportFrom
();
auto
r
=
new
(
getAlloc
())
AST_ImportFrom
();
auto
v
=
stmt
->
v
.
ImportFrom
;
auto
v
=
stmt
->
v
.
ImportFrom
;
r
->
module
=
convert
(
v
.
module
);
r
->
module
=
convert
(
v
.
module
);
r
->
names
=
convert
<
alias_ty
,
AST_alias
*>
(
v
.
names
);
r
->
names
=
convert
<
alias_ty
,
AST_alias
*>
(
v
.
names
);
...
@@ -663,7 +668,7 @@ public:
...
@@ -663,7 +668,7 @@ public:
return
r
;
return
r
;
}
}
case
Exec_kind
:
{
case
Exec_kind
:
{
auto
r
=
new
AST_Exec
();
auto
r
=
new
(
getAlloc
())
AST_Exec
();
auto
v
=
stmt
->
v
.
Exec
;
auto
v
=
stmt
->
v
.
Exec
;
r
->
body
=
convert
(
v
.
body
);
r
->
body
=
convert
(
v
.
body
);
r
->
globals
=
convert
(
v
.
globals
);
r
->
globals
=
convert
(
v
.
globals
);
...
@@ -671,36 +676,36 @@ public:
...
@@ -671,36 +676,36 @@ public:
return
r
;
return
r
;
}
}
case
Global_kind
:
{
case
Global_kind
:
{
auto
r
=
new
AST_Global
();
auto
r
=
new
(
getAlloc
())
AST_Global
();
auto
v
=
stmt
->
v
.
Global
;
auto
v
=
stmt
->
v
.
Global
;
r
->
names
=
convert
<
identifier
,
InternedString
>
(
v
.
names
);
r
->
names
=
convert
<
identifier
,
InternedString
>
(
v
.
names
);
return
r
;
return
r
;
}
}
case
Expr_kind
:
{
case
Expr_kind
:
{
auto
r
=
new
AST_Expr
();
auto
r
=
new
(
getAlloc
())
AST_Expr
();
auto
v
=
stmt
->
v
.
Expr
;
auto
v
=
stmt
->
v
.
Expr
;
r
->
value
=
convert
(
v
.
value
);
r
->
value
=
convert
(
v
.
value
);
if
(
interactive
&&
nestlevel
<=
0
)
{
if
(
interactive
&&
nestlevel
<=
0
)
{
auto
print_expr
=
new
AST_LangPrimitive
(
AST_LangPrimitive
::
PRINT_EXPR
);
auto
print_expr
=
new
(
getAlloc
())
AST_LangPrimitive
(
AST_LangPrimitive
::
PRINT_EXPR
);
print_expr
->
args
.
push_back
(
r
->
value
);
print_expr
->
args
.
push_back
(
r
->
value
);
r
->
value
=
print_expr
;
r
->
value
=
print_expr
;
}
}
return
r
;
return
r
;
}
}
case
Pass_kind
:
case
Pass_kind
:
return
new
AST_Pass
();
return
new
(
getAlloc
())
AST_Pass
();
case
Break_kind
:
case
Break_kind
:
// This is not really the right place to be handling this, but this whole thing is temporary anyway.
// This is not really the right place to be handling this, but this whole thing is temporary anyway.
if
(
loop_depth
==
0
)
if
(
loop_depth
==
0
)
raiseSyntaxError
(
"'break' outside loop"
,
stmt
->
lineno
,
stmt
->
col_offset
,
fn
,
""
,
true
);
raiseSyntaxError
(
"'break' outside loop"
,
stmt
->
lineno
,
stmt
->
col_offset
,
fn
,
""
,
true
);
return
new
AST_Break
();
return
new
(
getAlloc
())
AST_Break
();
case
Continue_kind
:
case
Continue_kind
:
if
(
loop_depth
==
0
)
if
(
loop_depth
==
0
)
raiseSyntaxError
(
"'continue' not properly in loop"
,
stmt
->
lineno
,
stmt
->
col_offset
,
fn
,
""
,
true
);
raiseSyntaxError
(
"'continue' not properly in loop"
,
stmt
->
lineno
,
stmt
->
col_offset
,
fn
,
""
,
true
);
if
(
in_finally
)
if
(
in_finally
)
raiseSyntaxError
(
"'continue' not supported inside 'finally' clause"
,
stmt
->
lineno
,
stmt
->
col_offset
,
raiseSyntaxError
(
"'continue' not supported inside 'finally' clause"
,
stmt
->
lineno
,
stmt
->
col_offset
,
fn
,
""
,
true
);
fn
,
""
,
true
);
return
new
AST_Continue
();
return
new
(
getAlloc
())
AST_Continue
();
};
};
// GCC wants this:
// GCC wants this:
RELEASE_ASSERT
(
0
,
"invalid statement type: %d"
,
stmt
->
kind
);
RELEASE_ASSERT
(
0
,
"invalid statement type: %d"
,
stmt
->
kind
);
...
@@ -720,39 +725,40 @@ public:
...
@@ -720,39 +725,40 @@ public:
return
r
;
return
r
;
}
}
AST
*
convert
(
mod_ty
mod
)
{
std
::
pair
<
AST
*
,
std
::
unique_ptr
<
ASTAllocator
>>
convert
(
mod_ty
mod
)
{
ast_allocator
.
reset
(
new
ASTAllocator
);
switch
(
mod
->
kind
)
{
switch
(
mod
->
kind
)
{
case
Module_kind
:
{
case
Module_kind
:
{
AST_Module
*
rtn
=
new
AST_Module
(
llvm
::
make_unique
<
InternedStringPool
>
());
AST_Module
*
rtn
=
new
(
getAlloc
())
AST_Module
(
llvm
::
make_unique
<
InternedStringPool
>
());
rtn
->
lineno
=
1
;
rtn
->
lineno
=
1
;
assert
(
!
this
->
pool
);
assert
(
!
this
->
pool
);
this
->
pool
=
rtn
->
interned_strings
.
get
();
this
->
pool
=
rtn
->
interned_strings
.
get
();
convertAll
<
stmt_ty
>
(
mod
->
v
.
Module
.
body
,
rtn
->
body
);
convertAll
<
stmt_ty
>
(
mod
->
v
.
Module
.
body
,
rtn
->
body
);
return
rtn
;
return
std
::
make_pair
(
rtn
,
std
::
move
(
ast_allocator
))
;
}
}
case
Interactive_kind
:
{
case
Interactive_kind
:
{
this
->
interactive
=
1
;
this
->
interactive
=
1
;
AST_Module
*
rtn
=
new
AST_Module
(
llvm
::
make_unique
<
InternedStringPool
>
());
AST_Module
*
rtn
=
new
(
getAlloc
())
AST_Module
(
llvm
::
make_unique
<
InternedStringPool
>
());
rtn
->
lineno
=
1
;
rtn
->
lineno
=
1
;
assert
(
!
this
->
pool
);
assert
(
!
this
->
pool
);
this
->
pool
=
rtn
->
interned_strings
.
get
();
this
->
pool
=
rtn
->
interned_strings
.
get
();
convertAll
<
stmt_ty
>
(
mod
->
v
.
Interactive
.
body
,
rtn
->
body
);
convertAll
<
stmt_ty
>
(
mod
->
v
.
Interactive
.
body
,
rtn
->
body
);
return
rtn
;
return
std
::
make_pair
(
rtn
,
std
::
move
(
ast_allocator
))
;
}
}
case
Expression_kind
:
{
case
Expression_kind
:
{
AST_Expression
*
rtn
=
new
AST_Expression
(
llvm
::
make_unique
<
InternedStringPool
>
());
AST_Expression
*
rtn
=
new
(
getAlloc
())
AST_Expression
(
llvm
::
make_unique
<
InternedStringPool
>
());
rtn
->
lineno
=
1
;
rtn
->
lineno
=
1
;
this
->
pool
=
rtn
->
interned_strings
.
get
();
this
->
pool
=
rtn
->
interned_strings
.
get
();
// instead of storing the expression inside the AST node we convert it directly to a return statement
// instead of storing the expression inside the AST node we convert it directly to a return statement
AST_expr
*
expr
=
this
->
convert
(
mod
->
v
.
Expression
.
body
);
AST_expr
*
expr
=
this
->
convert
(
mod
->
v
.
Expression
.
body
);
auto
rtn_stmt
=
new
AST_Return
;
auto
rtn_stmt
=
new
(
getAlloc
())
AST_Return
;
rtn_stmt
->
lineno
=
expr
->
lineno
;
rtn_stmt
->
lineno
=
expr
->
lineno
;
rtn_stmt
->
col_offset
=
expr
->
col_offset
;
rtn_stmt
->
col_offset
=
expr
->
col_offset
;
rtn_stmt
->
value
=
expr
;
rtn_stmt
->
value
=
expr
;
rtn
->
body
=
rtn_stmt
;
rtn
->
body
=
rtn_stmt
;
return
rtn
;
return
std
::
make_pair
(
rtn
,
std
::
move
(
ast_allocator
))
;
}
}
default:
default:
RELEASE_ASSERT
(
0
,
"unhandled kind: %d
\n
"
,
mod
->
kind
);
RELEASE_ASSERT
(
0
,
"unhandled kind: %d
\n
"
,
mod
->
kind
);
...
@@ -760,7 +766,7 @@ public:
...
@@ -760,7 +766,7 @@ public:
}
}
};
};
AST
*
cpythonToPystonAST
(
mod_ty
mod
,
llvm
::
StringRef
fn
)
{
std
::
pair
<
AST
*
,
std
::
unique_ptr
<
ASTAllocator
>>
cpythonToPystonAST
(
mod_ty
mod
,
llvm
::
StringRef
fn
)
{
Converter
c
(
fn
);
Converter
c
(
fn
);
return
c
.
convert
(
mod
);
return
c
.
convert
(
mod
);
}
}
...
...
src/codegen/cpython_ast.h
View file @
128e2b0d
...
@@ -25,7 +25,7 @@ namespace pyston {
...
@@ -25,7 +25,7 @@ namespace pyston {
// Convert a CPython ast object to a Pyston ast object.
// Convert a CPython ast object to a Pyston ast object.
// This will also check for certain kinds of "syntax errors" (ex continue not in loop) and will
// This will also check for certain kinds of "syntax errors" (ex continue not in loop) and will
// throw them as C++ exceptions.
// throw them as C++ exceptions.
AST
*
cpythonToPystonAST
(
mod_ty
mod
,
llvm
::
StringRef
fn
);
std
::
pair
<
AST
*
,
std
::
unique_ptr
<
ASTAllocator
>>
cpythonToPystonAST
(
mod_ty
mod
,
llvm
::
StringRef
fn
);
}
}
#endif
#endif
src/codegen/irgen/hooks.cpp
View file @
128e2b0d
...
@@ -292,7 +292,9 @@ extern "C" PyCodeObject* PyAST_Compile(struct _mod* _mod, const char* filename,
...
@@ -292,7 +292,9 @@ extern "C" PyCodeObject* PyAST_Compile(struct _mod* _mod, const char* filename,
PyArena
*
arena
)
noexcept
{
PyArena
*
arena
)
noexcept
{
try
{
try
{
mod_ty
mod
=
_mod
;
mod_ty
mod
=
_mod
;
AST
*
parsed
=
cpythonToPystonAST
(
mod
,
filename
);
std
::
unique_ptr
<
ASTAllocator
>
ast_allocator
;
AST
*
parsed
;
std
::
tie
(
parsed
,
ast_allocator
)
=
cpythonToPystonAST
(
mod
,
filename
);
BoxedCode
*
code
=
NULL
;
BoxedCode
*
code
=
NULL
;
switch
(
mod
->
kind
)
{
switch
(
mod
->
kind
)
{
case
Module_kind
:
case
Module_kind
:
...
...
src/codegen/parser.cpp
View file @
128e2b0d
...
@@ -65,6 +65,8 @@ private:
...
@@ -65,6 +65,8 @@ private:
}
}
public:
public:
std
::
unique_ptr
<
ASTAllocator
>
ast_allocator
;
void
fill
()
{
void
fill
()
{
if
(
unlikely
(
fp
))
{
if
(
unlikely
(
fp
))
{
memmove
(
buf
,
buf
+
start
,
end
-
start
);
memmove
(
buf
,
buf
+
start
,
end
-
start
);
...
@@ -76,9 +78,15 @@ public:
...
@@ -76,9 +78,15 @@ public:
}
}
}
}
BufferedReader
(
FILE
*
fp
)
:
start
(
0
),
end
(
0
),
fp
(
fp
),
data
(),
intern_pool
(
NULL
)
{}
BufferedReader
(
FILE
*
fp
)
:
start
(
0
),
end
(
0
),
fp
(
fp
),
data
(),
intern_pool
(
NULL
),
ast_allocator
(
llvm
::
make_unique
<
ASTAllocator
>
())
{}
BufferedReader
(
std
::
vector
<
char
>
data
,
int
start_offset
=
0
)
BufferedReader
(
std
::
vector
<
char
>
data
,
int
start_offset
=
0
)
:
start
(
start_offset
),
end
(
data
.
size
()),
fp
(
NULL
),
data
(
std
::
move
(
data
)),
intern_pool
(
NULL
)
{}
:
start
(
start_offset
),
end
(
data
.
size
()),
fp
(
NULL
),
data
(
std
::
move
(
data
)),
intern_pool
(
NULL
),
ast_allocator
(
llvm
::
make_unique
<
ASTAllocator
>
())
{}
int
bytesBuffered
()
{
return
(
end
-
start
);
}
int
bytesBuffered
()
{
return
(
end
-
start
);
}
...
@@ -104,6 +112,8 @@ public:
...
@@ -104,6 +112,8 @@ public:
return
d
;
return
d
;
}
}
ASTAllocator
&
getAlloc
()
{
return
*
ast_allocator
;
}
std
::
unique_ptr
<
InternedStringPool
>
createInternedPool
();
std
::
unique_ptr
<
InternedStringPool
>
createInternedPool
();
InternedString
readAndInternString
();
InternedString
readAndInternString
();
void
readAndInternStringVector
(
std
::
vector
<
InternedString
>&
v
);
void
readAndInternStringVector
(
std
::
vector
<
InternedString
>&
v
);
...
@@ -205,7 +215,7 @@ AST_alias* read_alias(BufferedReader* reader) {
...
@@ -205,7 +215,7 @@ AST_alias* read_alias(BufferedReader* reader) {
InternedString
asname
=
reader
->
readAndInternString
();
InternedString
asname
=
reader
->
readAndInternString
();
InternedString
name
=
reader
->
readAndInternString
();
InternedString
name
=
reader
->
readAndInternString
();
AST_alias
*
rtn
=
new
AST_alias
(
name
,
asname
);
AST_alias
*
rtn
=
new
(
reader
->
getAlloc
())
AST_alias
(
name
,
asname
);
rtn
->
col_offset
=
-
1
;
rtn
->
col_offset
=
-
1
;
rtn
->
lineno
=
-
1
;
rtn
->
lineno
=
-
1
;
...
@@ -216,7 +226,7 @@ AST_arguments* read_arguments(BufferedReader* reader) {
...
@@ -216,7 +226,7 @@ AST_arguments* read_arguments(BufferedReader* reader) {
if
(
VERBOSITY
(
"parsing"
)
>=
3
)
if
(
VERBOSITY
(
"parsing"
)
>=
3
)
printf
(
"reading arguments
\n
"
);
printf
(
"reading arguments
\n
"
);
AST_arguments
*
rtn
=
new
AST_arguments
();
AST_arguments
*
rtn
=
new
(
reader
->
getAlloc
())
AST_arguments
();
readExprVector
(
rtn
->
args
,
reader
);
readExprVector
(
rtn
->
args
,
reader
);
rtn
->
col_offset
=
-
1
;
rtn
->
col_offset
=
-
1
;
...
@@ -228,7 +238,7 @@ AST_arguments* read_arguments(BufferedReader* reader) {
...
@@ -228,7 +238,7 @@ AST_arguments* read_arguments(BufferedReader* reader) {
}
}
AST_Assert
*
read_assert
(
BufferedReader
*
reader
)
{
AST_Assert
*
read_assert
(
BufferedReader
*
reader
)
{
AST_Assert
*
rtn
=
new
AST_Assert
();
AST_Assert
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Assert
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
lineno
=
reader
->
readULL
();
rtn
->
lineno
=
reader
->
readULL
();
...
@@ -238,7 +248,7 @@ AST_Assert* read_assert(BufferedReader* reader) {
...
@@ -238,7 +248,7 @@ AST_Assert* read_assert(BufferedReader* reader) {
}
}
AST_Assign
*
read_assign
(
BufferedReader
*
reader
)
{
AST_Assign
*
read_assign
(
BufferedReader
*
reader
)
{
AST_Assign
*
rtn
=
new
AST_Assign
();
AST_Assign
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Assign
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
lineno
=
reader
->
readULL
();
rtn
->
lineno
=
reader
->
readULL
();
...
@@ -248,7 +258,7 @@ AST_Assign* read_assign(BufferedReader* reader) {
...
@@ -248,7 +258,7 @@ AST_Assign* read_assign(BufferedReader* reader) {
}
}
AST_AugAssign
*
read_augassign
(
BufferedReader
*
reader
)
{
AST_AugAssign
*
read_augassign
(
BufferedReader
*
reader
)
{
AST_AugAssign
*
rtn
=
new
AST_AugAssign
();
AST_AugAssign
*
rtn
=
new
(
reader
->
getAlloc
())
AST_AugAssign
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
lineno
=
reader
->
readULL
();
rtn
->
lineno
=
reader
->
readULL
();
...
@@ -259,7 +269,7 @@ AST_AugAssign* read_augassign(BufferedReader* reader) {
...
@@ -259,7 +269,7 @@ AST_AugAssign* read_augassign(BufferedReader* reader) {
}
}
AST_Attribute
*
read_attribute
(
BufferedReader
*
reader
)
{
AST_Attribute
*
read_attribute
(
BufferedReader
*
reader
)
{
AST_Attribute
*
rtn
=
new
AST_Attribute
();
AST_Attribute
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Attribute
();
rtn
->
attr
=
reader
->
readAndInternString
();
rtn
->
attr
=
reader
->
readAndInternString
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
...
@@ -270,7 +280,7 @@ AST_Attribute* read_attribute(BufferedReader* reader) {
...
@@ -270,7 +280,7 @@ AST_Attribute* read_attribute(BufferedReader* reader) {
}
}
AST_expr
*
read_binop
(
BufferedReader
*
reader
)
{
AST_expr
*
read_binop
(
BufferedReader
*
reader
)
{
AST_BinOp
*
rtn
=
new
AST_BinOp
();
AST_BinOp
*
rtn
=
new
(
reader
->
getAlloc
())
AST_BinOp
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
left
=
readASTExpr
(
reader
);
rtn
->
left
=
readASTExpr
(
reader
);
...
@@ -282,7 +292,7 @@ AST_expr* read_binop(BufferedReader* reader) {
...
@@ -282,7 +292,7 @@ AST_expr* read_binop(BufferedReader* reader) {
}
}
AST_expr
*
read_boolop
(
BufferedReader
*
reader
)
{
AST_expr
*
read_boolop
(
BufferedReader
*
reader
)
{
AST_BoolOp
*
rtn
=
new
AST_BoolOp
();
AST_BoolOp
*
rtn
=
new
(
reader
->
getAlloc
())
AST_BoolOp
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
lineno
=
reader
->
readULL
();
rtn
->
lineno
=
reader
->
readULL
();
...
@@ -293,7 +303,7 @@ AST_expr* read_boolop(BufferedReader* reader) {
...
@@ -293,7 +303,7 @@ AST_expr* read_boolop(BufferedReader* reader) {
}
}
AST_Break
*
read_break
(
BufferedReader
*
reader
)
{
AST_Break
*
read_break
(
BufferedReader
*
reader
)
{
AST_Break
*
rtn
=
new
AST_Break
();
AST_Break
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Break
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
lineno
=
reader
->
readULL
();
rtn
->
lineno
=
reader
->
readULL
();
...
@@ -302,7 +312,7 @@ AST_Break* read_break(BufferedReader* reader) {
...
@@ -302,7 +312,7 @@ AST_Break* read_break(BufferedReader* reader) {
}
}
AST_Call
*
read_call
(
BufferedReader
*
reader
)
{
AST_Call
*
read_call
(
BufferedReader
*
reader
)
{
AST_Call
*
rtn
=
new
AST_Call
();
AST_Call
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Call
();
readExprVector
(
rtn
->
args
,
reader
);
readExprVector
(
rtn
->
args
,
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
...
@@ -317,7 +327,7 @@ AST_Call* read_call(BufferedReader* reader) {
...
@@ -317,7 +327,7 @@ AST_Call* read_call(BufferedReader* reader) {
}
}
AST_expr
*
read_compare
(
BufferedReader
*
reader
)
{
AST_expr
*
read_compare
(
BufferedReader
*
reader
)
{
AST_Compare
*
rtn
=
new
AST_Compare
();
AST_Compare
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Compare
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
readExprVector
(
rtn
->
comparators
,
reader
);
readExprVector
(
rtn
->
comparators
,
reader
);
...
@@ -334,7 +344,7 @@ AST_expr* read_compare(BufferedReader* reader) {
...
@@ -334,7 +344,7 @@ AST_expr* read_compare(BufferedReader* reader) {
}
}
AST_comprehension
*
read_comprehension
(
BufferedReader
*
reader
)
{
AST_comprehension
*
read_comprehension
(
BufferedReader
*
reader
)
{
AST_comprehension
*
rtn
=
new
AST_comprehension
();
AST_comprehension
*
rtn
=
new
(
reader
->
getAlloc
())
AST_comprehension
();
readExprVector
(
rtn
->
ifs
,
reader
);
readExprVector
(
rtn
->
ifs
,
reader
);
rtn
->
iter
=
readASTExpr
(
reader
);
rtn
->
iter
=
readASTExpr
(
reader
);
...
@@ -347,7 +357,7 @@ AST_comprehension* read_comprehension(BufferedReader* reader) {
...
@@ -347,7 +357,7 @@ AST_comprehension* read_comprehension(BufferedReader* reader) {
}
}
AST_ClassDef
*
read_classdef
(
BufferedReader
*
reader
)
{
AST_ClassDef
*
read_classdef
(
BufferedReader
*
reader
)
{
AST_ClassDef
*
rtn
=
new
AST_ClassDef
();
AST_ClassDef
*
rtn
=
new
(
reader
->
getAlloc
())
AST_ClassDef
();
readExprVector
(
rtn
->
bases
,
reader
);
readExprVector
(
rtn
->
bases
,
reader
);
readStmtVector
(
rtn
->
body
,
reader
);
readStmtVector
(
rtn
->
body
,
reader
);
...
@@ -360,7 +370,7 @@ AST_ClassDef* read_classdef(BufferedReader* reader) {
...
@@ -360,7 +370,7 @@ AST_ClassDef* read_classdef(BufferedReader* reader) {
}
}
AST_Continue
*
read_continue
(
BufferedReader
*
reader
)
{
AST_Continue
*
read_continue
(
BufferedReader
*
reader
)
{
AST_Continue
*
rtn
=
new
AST_Continue
();
AST_Continue
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Continue
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
lineno
=
reader
->
readULL
();
rtn
->
lineno
=
reader
->
readULL
();
...
@@ -369,7 +379,7 @@ AST_Continue* read_continue(BufferedReader* reader) {
...
@@ -369,7 +379,7 @@ AST_Continue* read_continue(BufferedReader* reader) {
}
}
AST_Delete
*
read_delete
(
BufferedReader
*
reader
)
{
AST_Delete
*
read_delete
(
BufferedReader
*
reader
)
{
AST_Delete
*
rtn
=
new
AST_Delete
();
AST_Delete
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Delete
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
lineno
=
reader
->
readULL
();
rtn
->
lineno
=
reader
->
readULL
();
...
@@ -379,7 +389,7 @@ AST_Delete* read_delete(BufferedReader* reader) {
...
@@ -379,7 +389,7 @@ AST_Delete* read_delete(BufferedReader* reader) {
}
}
AST_Dict
*
read_dict
(
BufferedReader
*
reader
)
{
AST_Dict
*
read_dict
(
BufferedReader
*
reader
)
{
AST_Dict
*
rtn
=
new
AST_Dict
();
AST_Dict
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Dict
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
readExprVector
(
rtn
->
keys
,
reader
);
readExprVector
(
rtn
->
keys
,
reader
);
...
@@ -391,7 +401,7 @@ AST_Dict* read_dict(BufferedReader* reader) {
...
@@ -391,7 +401,7 @@ AST_Dict* read_dict(BufferedReader* reader) {
}
}
AST_DictComp
*
read_dictcomp
(
BufferedReader
*
reader
)
{
AST_DictComp
*
read_dictcomp
(
BufferedReader
*
reader
)
{
AST_DictComp
*
rtn
=
new
AST_DictComp
();
AST_DictComp
*
rtn
=
new
(
reader
->
getAlloc
())
AST_DictComp
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
readMiscVector
(
rtn
->
generators
,
reader
);
readMiscVector
(
rtn
->
generators
,
reader
);
rtn
->
key
=
readASTExpr
(
reader
);
rtn
->
key
=
readASTExpr
(
reader
);
...
@@ -401,14 +411,14 @@ AST_DictComp* read_dictcomp(BufferedReader* reader) {
...
@@ -401,14 +411,14 @@ AST_DictComp* read_dictcomp(BufferedReader* reader) {
}
}
AST_Ellipsis
*
read_ellipsis
(
BufferedReader
*
reader
)
{
AST_Ellipsis
*
read_ellipsis
(
BufferedReader
*
reader
)
{
AST_Ellipsis
*
rtn
=
new
AST_Ellipsis
();
AST_Ellipsis
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Ellipsis
();
rtn
->
col_offset
=
-
1
;
rtn
->
col_offset
=
-
1
;
rtn
->
lineno
=
-
1
;
rtn
->
lineno
=
-
1
;
return
rtn
;
return
rtn
;
}
}
AST_ExceptHandler
*
read_excepthandler
(
BufferedReader
*
reader
)
{
AST_ExceptHandler
*
read_excepthandler
(
BufferedReader
*
reader
)
{
AST_ExceptHandler
*
rtn
=
new
AST_ExceptHandler
();
AST_ExceptHandler
*
rtn
=
new
(
reader
->
getAlloc
())
AST_ExceptHandler
();
readStmtVector
(
rtn
->
body
,
reader
);
readStmtVector
(
rtn
->
body
,
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
...
@@ -420,7 +430,7 @@ AST_ExceptHandler* read_excepthandler(BufferedReader* reader) {
...
@@ -420,7 +430,7 @@ AST_ExceptHandler* read_excepthandler(BufferedReader* reader) {
}
}
AST_Exec
*
read_exec
(
BufferedReader
*
reader
)
{
AST_Exec
*
read_exec
(
BufferedReader
*
reader
)
{
AST_Exec
*
rtn
=
new
AST_Exec
();
AST_Exec
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Exec
();
rtn
->
body
=
readASTExpr
(
reader
);
rtn
->
body
=
readASTExpr
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
...
@@ -432,7 +442,7 @@ AST_Exec* read_exec(BufferedReader* reader) {
...
@@ -432,7 +442,7 @@ AST_Exec* read_exec(BufferedReader* reader) {
}
}
AST_Expr
*
read_expr
(
BufferedReader
*
reader
)
{
AST_Expr
*
read_expr
(
BufferedReader
*
reader
)
{
AST_Expr
*
rtn
=
new
AST_Expr
();
AST_Expr
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Expr
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
lineno
=
reader
->
readULL
();
rtn
->
lineno
=
reader
->
readULL
();
...
@@ -441,7 +451,7 @@ AST_Expr* read_expr(BufferedReader* reader) {
...
@@ -441,7 +451,7 @@ AST_Expr* read_expr(BufferedReader* reader) {
}
}
AST_ExtSlice
*
read_extslice
(
BufferedReader
*
reader
)
{
AST_ExtSlice
*
read_extslice
(
BufferedReader
*
reader
)
{
AST_ExtSlice
*
rtn
=
new
AST_ExtSlice
();
AST_ExtSlice
*
rtn
=
new
(
reader
->
getAlloc
())
AST_ExtSlice
();
rtn
->
col_offset
=
-
1
;
rtn
->
col_offset
=
-
1
;
rtn
->
lineno
=
-
1
;
rtn
->
lineno
=
-
1
;
...
@@ -450,7 +460,7 @@ AST_ExtSlice* read_extslice(BufferedReader* reader) {
...
@@ -450,7 +460,7 @@ AST_ExtSlice* read_extslice(BufferedReader* reader) {
}
}
AST_For
*
read_for
(
BufferedReader
*
reader
)
{
AST_For
*
read_for
(
BufferedReader
*
reader
)
{
AST_For
*
rtn
=
new
AST_For
();
AST_For
*
rtn
=
new
(
reader
->
getAlloc
())
AST_For
();
readStmtVector
(
rtn
->
body
,
reader
);
readStmtVector
(
rtn
->
body
,
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
...
@@ -464,7 +474,7 @@ AST_For* read_for(BufferedReader* reader) {
...
@@ -464,7 +474,7 @@ AST_For* read_for(BufferedReader* reader) {
AST_FunctionDef
*
read_functiondef
(
BufferedReader
*
reader
)
{
AST_FunctionDef
*
read_functiondef
(
BufferedReader
*
reader
)
{
if
(
VERBOSITY
(
"parsing"
)
>=
3
)
if
(
VERBOSITY
(
"parsing"
)
>=
3
)
printf
(
"reading functiondef
\n
"
);
printf
(
"reading functiondef
\n
"
);
AST_FunctionDef
*
rtn
=
new
AST_FunctionDef
();
AST_FunctionDef
*
rtn
=
new
(
reader
->
getAlloc
())
AST_FunctionDef
();
rtn
->
args
=
ast_cast
<
AST_arguments
>
(
readASTMisc
(
reader
));
rtn
->
args
=
ast_cast
<
AST_arguments
>
(
readASTMisc
(
reader
));
readStmtVector
(
rtn
->
body
,
reader
);
readStmtVector
(
rtn
->
body
,
reader
);
...
@@ -476,7 +486,7 @@ AST_FunctionDef* read_functiondef(BufferedReader* reader) {
...
@@ -476,7 +486,7 @@ AST_FunctionDef* read_functiondef(BufferedReader* reader) {
}
}
AST_GeneratorExp
*
read_generatorexp
(
BufferedReader
*
reader
)
{
AST_GeneratorExp
*
read_generatorexp
(
BufferedReader
*
reader
)
{
AST_GeneratorExp
*
rtn
=
new
AST_GeneratorExp
();
AST_GeneratorExp
*
rtn
=
new
(
reader
->
getAlloc
())
AST_GeneratorExp
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
elt
=
readASTExpr
(
reader
);
rtn
->
elt
=
readASTExpr
(
reader
);
...
@@ -486,7 +496,7 @@ AST_GeneratorExp* read_generatorexp(BufferedReader* reader) {
...
@@ -486,7 +496,7 @@ AST_GeneratorExp* read_generatorexp(BufferedReader* reader) {
}
}
AST_Global
*
read_global
(
BufferedReader
*
reader
)
{
AST_Global
*
read_global
(
BufferedReader
*
reader
)
{
AST_Global
*
rtn
=
new
AST_Global
();
AST_Global
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Global
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
lineno
=
reader
->
readULL
();
rtn
->
lineno
=
reader
->
readULL
();
...
@@ -495,7 +505,7 @@ AST_Global* read_global(BufferedReader* reader) {
...
@@ -495,7 +505,7 @@ AST_Global* read_global(BufferedReader* reader) {
}
}
AST_If
*
read_if
(
BufferedReader
*
reader
)
{
AST_If
*
read_if
(
BufferedReader
*
reader
)
{
AST_If
*
rtn
=
new
AST_If
();
AST_If
*
rtn
=
new
(
reader
->
getAlloc
())
AST_If
();
readStmtVector
(
rtn
->
body
,
reader
);
readStmtVector
(
rtn
->
body
,
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
...
@@ -506,7 +516,7 @@ AST_If* read_if(BufferedReader* reader) {
...
@@ -506,7 +516,7 @@ AST_If* read_if(BufferedReader* reader) {
}
}
AST_IfExp
*
read_ifexp
(
BufferedReader
*
reader
)
{
AST_IfExp
*
read_ifexp
(
BufferedReader
*
reader
)
{
AST_IfExp
*
rtn
=
new
AST_IfExp
();
AST_IfExp
*
rtn
=
new
(
reader
->
getAlloc
())
AST_IfExp
();
rtn
->
body
=
readASTExpr
(
reader
);
rtn
->
body
=
readASTExpr
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
...
@@ -517,7 +527,7 @@ AST_IfExp* read_ifexp(BufferedReader* reader) {
...
@@ -517,7 +527,7 @@ AST_IfExp* read_ifexp(BufferedReader* reader) {
}
}
AST_Import
*
read_import
(
BufferedReader
*
reader
)
{
AST_Import
*
read_import
(
BufferedReader
*
reader
)
{
AST_Import
*
rtn
=
new
AST_Import
();
AST_Import
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Import
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
lineno
=
reader
->
readULL
();
rtn
->
lineno
=
reader
->
readULL
();
...
@@ -526,7 +536,7 @@ AST_Import* read_import(BufferedReader* reader) {
...
@@ -526,7 +536,7 @@ AST_Import* read_import(BufferedReader* reader) {
}
}
AST_ImportFrom
*
read_importfrom
(
BufferedReader
*
reader
)
{
AST_ImportFrom
*
read_importfrom
(
BufferedReader
*
reader
)
{
AST_ImportFrom
*
rtn
=
new
AST_ImportFrom
();
AST_ImportFrom
*
rtn
=
new
(
reader
->
getAlloc
())
AST_ImportFrom
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
level
=
reader
->
readULL
();
rtn
->
level
=
reader
->
readULL
();
...
@@ -537,7 +547,7 @@ AST_ImportFrom* read_importfrom(BufferedReader* reader) {
...
@@ -537,7 +547,7 @@ AST_ImportFrom* read_importfrom(BufferedReader* reader) {
}
}
AST_Index
*
read_index
(
BufferedReader
*
reader
)
{
AST_Index
*
read_index
(
BufferedReader
*
reader
)
{
AST_Index
*
rtn
=
new
AST_Index
();
AST_Index
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Index
();
rtn
->
col_offset
=
-
1
;
rtn
->
col_offset
=
-
1
;
rtn
->
lineno
=
-
1
;
rtn
->
lineno
=
-
1
;
...
@@ -547,7 +557,7 @@ AST_Index* read_index(BufferedReader* reader) {
...
@@ -547,7 +557,7 @@ AST_Index* read_index(BufferedReader* reader) {
}
}
AST_keyword
*
read_keyword
(
BufferedReader
*
reader
)
{
AST_keyword
*
read_keyword
(
BufferedReader
*
reader
)
{
AST_keyword
*
rtn
=
new
AST_keyword
();
AST_keyword
*
rtn
=
new
(
reader
->
getAlloc
())
AST_keyword
();
rtn
->
arg
=
reader
->
readAndInternString
();
rtn
->
arg
=
reader
->
readAndInternString
();
rtn
->
col_offset
=
-
1
;
rtn
->
col_offset
=
-
1
;
...
@@ -557,7 +567,7 @@ AST_keyword* read_keyword(BufferedReader* reader) {
...
@@ -557,7 +567,7 @@ AST_keyword* read_keyword(BufferedReader* reader) {
}
}
AST_Lambda
*
read_lambda
(
BufferedReader
*
reader
)
{
AST_Lambda
*
read_lambda
(
BufferedReader
*
reader
)
{
AST_Lambda
*
rtn
=
new
AST_Lambda
();
AST_Lambda
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Lambda
();
rtn
->
args
=
ast_cast
<
AST_arguments
>
(
readASTMisc
(
reader
));
rtn
->
args
=
ast_cast
<
AST_arguments
>
(
readASTMisc
(
reader
));
rtn
->
body
=
readASTExpr
(
reader
);
rtn
->
body
=
readASTExpr
(
reader
);
...
@@ -567,7 +577,7 @@ AST_Lambda* read_lambda(BufferedReader* reader) {
...
@@ -567,7 +577,7 @@ AST_Lambda* read_lambda(BufferedReader* reader) {
}
}
AST_List
*
read_list
(
BufferedReader
*
reader
)
{
AST_List
*
read_list
(
BufferedReader
*
reader
)
{
AST_List
*
rtn
=
new
AST_List
();
AST_List
*
rtn
=
new
(
reader
->
getAlloc
())
AST_List
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
ctx_type
=
(
AST_TYPE
::
AST_TYPE
)
reader
->
readByte
();
rtn
->
ctx_type
=
(
AST_TYPE
::
AST_TYPE
)
reader
->
readByte
();
...
@@ -577,7 +587,7 @@ AST_List* read_list(BufferedReader* reader) {
...
@@ -577,7 +587,7 @@ AST_List* read_list(BufferedReader* reader) {
}
}
AST_ListComp
*
read_listcomp
(
BufferedReader
*
reader
)
{
AST_ListComp
*
read_listcomp
(
BufferedReader
*
reader
)
{
AST_ListComp
*
rtn
=
new
AST_ListComp
();
AST_ListComp
*
rtn
=
new
(
reader
->
getAlloc
())
AST_ListComp
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
elt
=
readASTExpr
(
reader
);
rtn
->
elt
=
readASTExpr
(
reader
);
...
@@ -590,7 +600,7 @@ AST_Module* read_module(BufferedReader* reader) {
...
@@ -590,7 +600,7 @@ AST_Module* read_module(BufferedReader* reader) {
if
(
VERBOSITY
(
"parsing"
)
>=
3
)
if
(
VERBOSITY
(
"parsing"
)
>=
3
)
printf
(
"reading module
\n
"
);
printf
(
"reading module
\n
"
);
AST_Module
*
rtn
=
new
AST_Module
(
reader
->
createInternedPool
());
AST_Module
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Module
(
reader
->
createInternedPool
());
readStmtVector
(
rtn
->
body
,
reader
);
readStmtVector
(
rtn
->
body
,
reader
);
rtn
->
col_offset
=
0
;
rtn
->
col_offset
=
0
;
...
@@ -604,11 +614,11 @@ AST_Name* read_name(BufferedReader* reader) {
...
@@ -604,11 +614,11 @@ AST_Name* read_name(BufferedReader* reader) {
auto
id
=
reader
->
readAndInternString
();
auto
id
=
reader
->
readAndInternString
();
auto
lineno
=
reader
->
readULL
();
auto
lineno
=
reader
->
readULL
();
return
new
AST_Name
(
std
::
move
(
id
),
ctx_type
,
lineno
,
col_offset
);
return
new
(
reader
->
getAlloc
())
AST_Name
(
std
::
move
(
id
),
ctx_type
,
lineno
,
col_offset
);
}
}
AST_Num
*
read_num
(
BufferedReader
*
reader
)
{
AST_Num
*
read_num
(
BufferedReader
*
reader
)
{
AST_Num
*
rtn
=
new
AST_Num
();
AST_Num
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Num
();
rtn
->
num_type
=
(
AST_Num
::
NumType
)
reader
->
readByte
();
rtn
->
num_type
=
(
AST_Num
::
NumType
)
reader
->
readByte
();
...
@@ -630,7 +640,7 @@ AST_Num* read_num(BufferedReader* reader) {
...
@@ -630,7 +640,7 @@ AST_Num* read_num(BufferedReader* reader) {
}
}
AST_Repr
*
read_repr
(
BufferedReader
*
reader
)
{
AST_Repr
*
read_repr
(
BufferedReader
*
reader
)
{
AST_Repr
*
rtn
=
new
AST_Repr
();
AST_Repr
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Repr
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
lineno
=
reader
->
readULL
();
rtn
->
lineno
=
reader
->
readULL
();
rtn
->
value
=
readASTExpr
(
reader
);
rtn
->
value
=
readASTExpr
(
reader
);
...
@@ -639,7 +649,7 @@ AST_Repr* read_repr(BufferedReader* reader) {
...
@@ -639,7 +649,7 @@ AST_Repr* read_repr(BufferedReader* reader) {
}
}
AST_Pass
*
read_pass
(
BufferedReader
*
reader
)
{
AST_Pass
*
read_pass
(
BufferedReader
*
reader
)
{
AST_Pass
*
rtn
=
new
AST_Pass
();
AST_Pass
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Pass
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
lineno
=
reader
->
readULL
();
rtn
->
lineno
=
reader
->
readULL
();
...
@@ -647,7 +657,7 @@ AST_Pass* read_pass(BufferedReader* reader) {
...
@@ -647,7 +657,7 @@ AST_Pass* read_pass(BufferedReader* reader) {
}
}
AST_Print
*
read_print
(
BufferedReader
*
reader
)
{
AST_Print
*
read_print
(
BufferedReader
*
reader
)
{
AST_Print
*
rtn
=
new
AST_Print
();
AST_Print
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Print
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
dest
=
readASTExpr
(
reader
);
rtn
->
dest
=
readASTExpr
(
reader
);
...
@@ -658,7 +668,7 @@ AST_Print* read_print(BufferedReader* reader) {
...
@@ -658,7 +668,7 @@ AST_Print* read_print(BufferedReader* reader) {
}
}
AST_Raise
*
read_raise
(
BufferedReader
*
reader
)
{
AST_Raise
*
read_raise
(
BufferedReader
*
reader
)
{
AST_Raise
*
rtn
=
new
AST_Raise
();
AST_Raise
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Raise
();
// "arg0" "arg1" "arg2" are called "type", "inst", and "tback" in the python ast,
// "arg0" "arg1" "arg2" are called "type", "inst", and "tback" in the python ast,
// so that's the order we have to read them:
// so that's the order we have to read them:
...
@@ -671,7 +681,7 @@ AST_Raise* read_raise(BufferedReader* reader) {
...
@@ -671,7 +681,7 @@ AST_Raise* read_raise(BufferedReader* reader) {
}
}
AST_Return
*
read_return
(
BufferedReader
*
reader
)
{
AST_Return
*
read_return
(
BufferedReader
*
reader
)
{
AST_Return
*
rtn
=
new
AST_Return
();
AST_Return
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Return
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
lineno
=
reader
->
readULL
();
rtn
->
lineno
=
reader
->
readULL
();
...
@@ -680,7 +690,7 @@ AST_Return* read_return(BufferedReader* reader) {
...
@@ -680,7 +690,7 @@ AST_Return* read_return(BufferedReader* reader) {
}
}
AST_Set
*
read_set
(
BufferedReader
*
reader
)
{
AST_Set
*
read_set
(
BufferedReader
*
reader
)
{
AST_Set
*
rtn
=
new
AST_Set
();
AST_Set
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Set
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
readExprVector
(
rtn
->
elts
,
reader
);
readExprVector
(
rtn
->
elts
,
reader
);
...
@@ -690,7 +700,7 @@ AST_Set* read_set(BufferedReader* reader) {
...
@@ -690,7 +700,7 @@ AST_Set* read_set(BufferedReader* reader) {
}
}
AST_SetComp
*
read_setcomp
(
BufferedReader
*
reader
)
{
AST_SetComp
*
read_setcomp
(
BufferedReader
*
reader
)
{
AST_SetComp
*
rtn
=
new
AST_SetComp
();
AST_SetComp
*
rtn
=
new
(
reader
->
getAlloc
())
AST_SetComp
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
elt
=
readASTExpr
(
reader
);
rtn
->
elt
=
readASTExpr
(
reader
);
...
@@ -700,7 +710,7 @@ AST_SetComp* read_setcomp(BufferedReader* reader) {
...
@@ -700,7 +710,7 @@ AST_SetComp* read_setcomp(BufferedReader* reader) {
}
}
AST_Slice
*
read_slice
(
BufferedReader
*
reader
)
{
AST_Slice
*
read_slice
(
BufferedReader
*
reader
)
{
AST_Slice
*
rtn
=
new
AST_Slice
();
AST_Slice
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Slice
();
rtn
->
col_offset
=
-
1
;
rtn
->
col_offset
=
-
1
;
rtn
->
lineno
=
-
1
;
rtn
->
lineno
=
-
1
;
...
@@ -712,7 +722,7 @@ AST_Slice* read_slice(BufferedReader* reader) {
...
@@ -712,7 +722,7 @@ AST_Slice* read_slice(BufferedReader* reader) {
}
}
AST_Str
*
read_str
(
BufferedReader
*
reader
)
{
AST_Str
*
read_str
(
BufferedReader
*
reader
)
{
AST_Str
*
rtn
=
new
AST_Str
();
AST_Str
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Str
();
rtn
->
str_type
=
(
AST_Str
::
StrType
)
reader
->
readByte
();
rtn
->
str_type
=
(
AST_Str
::
StrType
)
reader
->
readByte
();
...
@@ -731,7 +741,7 @@ AST_Str* read_str(BufferedReader* reader) {
...
@@ -731,7 +741,7 @@ AST_Str* read_str(BufferedReader* reader) {
}
}
AST_Subscript
*
read_subscript
(
BufferedReader
*
reader
)
{
AST_Subscript
*
read_subscript
(
BufferedReader
*
reader
)
{
AST_Subscript
*
rtn
=
new
AST_Subscript
();
AST_Subscript
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Subscript
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
ctx_type
=
(
AST_TYPE
::
AST_TYPE
)
reader
->
readByte
();
rtn
->
ctx_type
=
(
AST_TYPE
::
AST_TYPE
)
reader
->
readByte
();
...
@@ -743,7 +753,7 @@ AST_Subscript* read_subscript(BufferedReader* reader) {
...
@@ -743,7 +753,7 @@ AST_Subscript* read_subscript(BufferedReader* reader) {
}
}
AST_TryExcept
*
read_tryexcept
(
BufferedReader
*
reader
)
{
AST_TryExcept
*
read_tryexcept
(
BufferedReader
*
reader
)
{
AST_TryExcept
*
rtn
=
new
AST_TryExcept
();
AST_TryExcept
*
rtn
=
new
(
reader
->
getAlloc
())
AST_TryExcept
();
readStmtVector
(
rtn
->
body
,
reader
);
readStmtVector
(
rtn
->
body
,
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
...
@@ -754,7 +764,7 @@ AST_TryExcept* read_tryexcept(BufferedReader* reader) {
...
@@ -754,7 +764,7 @@ AST_TryExcept* read_tryexcept(BufferedReader* reader) {
}
}
AST_TryFinally
*
read_tryfinally
(
BufferedReader
*
reader
)
{
AST_TryFinally
*
read_tryfinally
(
BufferedReader
*
reader
)
{
AST_TryFinally
*
rtn
=
new
AST_TryFinally
();
AST_TryFinally
*
rtn
=
new
(
reader
->
getAlloc
())
AST_TryFinally
();
readStmtVector
(
rtn
->
body
,
reader
);
readStmtVector
(
rtn
->
body
,
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
...
@@ -764,7 +774,7 @@ AST_TryFinally* read_tryfinally(BufferedReader* reader) {
...
@@ -764,7 +774,7 @@ AST_TryFinally* read_tryfinally(BufferedReader* reader) {
}
}
AST_Tuple
*
read_tuple
(
BufferedReader
*
reader
)
{
AST_Tuple
*
read_tuple
(
BufferedReader
*
reader
)
{
AST_Tuple
*
rtn
=
new
AST_Tuple
();
AST_Tuple
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Tuple
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
ctx_type
=
(
AST_TYPE
::
AST_TYPE
)
reader
->
readByte
();
rtn
->
ctx_type
=
(
AST_TYPE
::
AST_TYPE
)
reader
->
readByte
();
...
@@ -775,7 +785,7 @@ AST_Tuple* read_tuple(BufferedReader* reader) {
...
@@ -775,7 +785,7 @@ AST_Tuple* read_tuple(BufferedReader* reader) {
}
}
AST_UnaryOp
*
read_unaryop
(
BufferedReader
*
reader
)
{
AST_UnaryOp
*
read_unaryop
(
BufferedReader
*
reader
)
{
AST_UnaryOp
*
rtn
=
new
AST_UnaryOp
();
AST_UnaryOp
*
rtn
=
new
(
reader
->
getAlloc
())
AST_UnaryOp
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
lineno
=
reader
->
readULL
();
rtn
->
lineno
=
reader
->
readULL
();
...
@@ -786,7 +796,7 @@ AST_UnaryOp* read_unaryop(BufferedReader* reader) {
...
@@ -786,7 +796,7 @@ AST_UnaryOp* read_unaryop(BufferedReader* reader) {
}
}
AST_While
*
read_while
(
BufferedReader
*
reader
)
{
AST_While
*
read_while
(
BufferedReader
*
reader
)
{
AST_While
*
rtn
=
new
AST_While
();
AST_While
*
rtn
=
new
(
reader
->
getAlloc
())
AST_While
();
readStmtVector
(
rtn
->
body
,
reader
);
readStmtVector
(
rtn
->
body
,
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
...
@@ -798,7 +808,7 @@ AST_While* read_while(BufferedReader* reader) {
...
@@ -798,7 +808,7 @@ AST_While* read_while(BufferedReader* reader) {
}
}
AST_With
*
read_with
(
BufferedReader
*
reader
)
{
AST_With
*
read_with
(
BufferedReader
*
reader
)
{
AST_With
*
rtn
=
new
AST_With
();
AST_With
*
rtn
=
new
(
reader
->
getAlloc
())
AST_With
();
readStmtVector
(
rtn
->
body
,
reader
);
readStmtVector
(
rtn
->
body
,
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
...
@@ -810,7 +820,7 @@ AST_With* read_with(BufferedReader* reader) {
...
@@ -810,7 +820,7 @@ AST_With* read_with(BufferedReader* reader) {
}
}
AST_Yield
*
read_yield
(
BufferedReader
*
reader
)
{
AST_Yield
*
read_yield
(
BufferedReader
*
reader
)
{
AST_Yield
*
rtn
=
new
AST_Yield
();
AST_Yield
*
rtn
=
new
(
reader
->
getAlloc
())
AST_Yield
();
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
col_offset
=
readColOffset
(
reader
);
rtn
->
lineno
=
reader
->
readULL
();
rtn
->
lineno
=
reader
->
readULL
();
...
@@ -1001,7 +1011,7 @@ AST* readASTMisc(BufferedReader* reader) {
...
@@ -1001,7 +1011,7 @@ AST* readASTMisc(BufferedReader* reader) {
}
}
}
}
AST_Module
*
parse_string
(
const
char
*
code
,
FutureFlags
inherited_flags
)
{
std
::
pair
<
AST_Module
*
,
std
::
unique_ptr
<
ASTAllocator
>>
parse_string
(
const
char
*
code
,
FutureFlags
inherited_flags
)
{
inherited_flags
&=
~
(
CO_NESTED
|
CO_FUTURE_DIVISION
);
inherited_flags
&=
~
(
CO_NESTED
|
CO_FUTURE_DIVISION
);
PyCompilerFlags
cf
;
PyCompilerFlags
cf
;
...
@@ -1013,11 +1023,11 @@ AST_Module* parse_string(const char* code, FutureFlags inherited_flags) {
...
@@ -1013,11 +1023,11 @@ AST_Module* parse_string(const char* code, FutureFlags inherited_flags) {
if
(
!
mod
)
if
(
!
mod
)
throwCAPIException
();
throwCAPIException
();
assert
(
mod
->
kind
!=
Interactive_kind
);
assert
(
mod
->
kind
!=
Interactive_kind
);
auto
rtn
=
static_cast
<
AST_Module
*>
(
cpythonToPystonAST
(
mod
,
fn
)
);
auto
t
=
cpythonToPystonAST
(
mod
,
fn
);
return
rtn
;
return
std
::
make_pair
((
AST_Module
*
)
t
.
first
,
std
::
move
(
t
.
second
))
;
}
}
AST_Module
*
parse_file
(
const
char
*
fn
,
FutureFlags
inherited_flags
)
{
std
::
pair
<
AST_Module
*
,
std
::
unique_ptr
<
ASTAllocator
>>
parse_file
(
const
char
*
fn
,
FutureFlags
inherited_flags
)
{
Timer
_t
(
"parsing"
);
Timer
_t
(
"parsing"
);
FileHandle
fp
(
fn
,
"r"
);
FileHandle
fp
(
fn
,
"r"
);
...
@@ -1029,13 +1039,13 @@ AST_Module* parse_file(const char* fn, FutureFlags inherited_flags) {
...
@@ -1029,13 +1039,13 @@ AST_Module* parse_file(const char* fn, FutureFlags inherited_flags) {
if
(
!
mod
)
if
(
!
mod
)
throwCAPIException
();
throwCAPIException
();
assert
(
mod
->
kind
!=
Interactive_kind
);
assert
(
mod
->
kind
!=
Interactive_kind
);
auto
rtn
=
static_cast
<
AST_Module
*>
(
cpythonToPystonAST
(
mod
,
fn
)
);
auto
t
=
cpythonToPystonAST
(
mod
,
fn
);
return
rtn
;
return
std
::
make_pair
((
AST_Module
*
)
t
.
first
,
std
::
move
(
t
.
second
))
;
}
}
// Does at least one of: returns a valid file_data vector, or fills in 'module'
// Does at least one of: returns a valid file_data vector, or fills in 'module'
static
std
::
vector
<
char
>
_reparse
(
const
char
*
fn
,
const
std
::
string
&
cache_fn
,
AST_Module
*&
module
,
static
std
::
vector
<
char
>
_reparse
(
const
char
*
fn
,
const
std
::
string
&
cache_fn
,
AST_Module
*&
module
,
FutureFlags
inherited_flags
)
{
std
::
unique_ptr
<
ASTAllocator
>&
ast_allocator
,
FutureFlags
inherited_flags
)
{
inherited_flags
&=
~
(
CO_NESTED
|
CO_FUTURE_DIVISION
);
inherited_flags
&=
~
(
CO_NESTED
|
CO_FUTURE_DIVISION
);
FileHandle
cache_fp
(
cache_fn
.
c_str
(),
"w"
);
FileHandle
cache_fp
(
cache_fn
.
c_str
(),
"w"
);
...
@@ -1069,7 +1079,9 @@ static std::vector<char> _reparse(const char* fn, const std::string& cache_fn, A
...
@@ -1069,7 +1079,9 @@ static std::vector<char> _reparse(const char* fn, const std::string& cache_fn, A
if
(
!
mod
)
if
(
!
mod
)
throwCAPIException
();
throwCAPIException
();
assert
(
mod
->
kind
!=
Interactive_kind
);
assert
(
mod
->
kind
!=
Interactive_kind
);
module
=
static_cast
<
AST_Module
*>
(
cpythonToPystonAST
(
mod
,
fn
));
auto
t
=
cpythonToPystonAST
(
mod
,
fn
);
module
=
static_cast
<
AST_Module
*>
(
t
.
first
);
ast_allocator
=
std
::
move
(
t
.
second
);
if
(
!
cache_fp
)
if
(
!
cache_fp
)
return
std
::
vector
<
char
>
();
return
std
::
vector
<
char
>
();
...
@@ -1092,7 +1104,7 @@ static std::vector<char> _reparse(const char* fn, const std::string& cache_fn, A
...
@@ -1092,7 +1104,7 @@ static std::vector<char> _reparse(const char* fn, const std::string& cache_fn, A
// Parsing the file is somewhat expensive since we have to shell out to cpython;
// Parsing the file is somewhat expensive since we have to shell out to cpython;
// it's not a huge deal right now, but this caching version can significantly cut down
// it's not a huge deal right now, but this caching version can significantly cut down
// on the startup time (40ms -> 10ms).
// on the startup time (40ms -> 10ms).
AST_Module
*
caching_parse_file
(
const
char
*
fn
,
FutureFlags
inherited_flags
)
{
std
::
pair
<
AST_Module
*
,
std
::
unique_ptr
<
ASTAllocator
>>
caching_parse_file
(
const
char
*
fn
,
FutureFlags
inherited_flags
)
{
std
::
ostringstream
oss
;
std
::
ostringstream
oss
;
UNAVOIDABLE_STAT_TIMER
(
t0
,
"us_timer_caching_parse_file"
);
UNAVOIDABLE_STAT_TIMER
(
t0
,
"us_timer_caching_parse_file"
);
...
@@ -1124,9 +1136,10 @@ AST_Module* caching_parse_file(const char* fn, FutureFlags inherited_flags) {
...
@@ -1124,9 +1136,10 @@ AST_Module* caching_parse_file(const char* fn, FutureFlags inherited_flags) {
if
(
ferror
(
cache_fp
))
{
if
(
ferror
(
cache_fp
))
{
oss
<<
"encountered io error reading from the file
\n
"
;
oss
<<
"encountered io error reading from the file
\n
"
;
AST_Module
*
mod
=
0
;
AST_Module
*
mod
=
0
;
file_data
=
_reparse
(
fn
,
cache_fn
,
mod
,
inherited_flags
);
std
::
unique_ptr
<
ASTAllocator
>
ast_allocator
;
file_data
=
_reparse
(
fn
,
cache_fn
,
mod
,
ast_allocator
,
inherited_flags
);
if
(
mod
)
if
(
mod
)
return
mod
;
return
std
::
make_pair
(
mod
,
std
::
move
(
ast_allocator
))
;
assert
(
file_data
.
size
());
assert
(
file_data
.
size
());
}
}
break
;
break
;
...
@@ -1204,7 +1217,7 @@ AST_Module* caching_parse_file(const char* fn, FutureFlags inherited_flags) {
...
@@ -1204,7 +1217,7 @@ AST_Module* caching_parse_file(const char* fn, FutureFlags inherited_flags) {
if
(
rtn
&&
reader
->
bytesBuffered
()
==
0
)
{
if
(
rtn
&&
reader
->
bytesBuffered
()
==
0
)
{
assert
(
rtn
->
type
==
AST_TYPE
::
Module
);
assert
(
rtn
->
type
==
AST_TYPE
::
Module
);
return
ast_cast
<
AST_Module
>
(
rtn
);
return
std
::
make_pair
(
ast_cast
<
AST_Module
>
(
rtn
),
std
::
move
(
reader
->
ast_allocator
)
);
}
}
oss
<<
"returned NULL module
\n
"
;
oss
<<
"returned NULL module
\n
"
;
...
@@ -1226,9 +1239,10 @@ AST_Module* caching_parse_file(const char* fn, FutureFlags inherited_flags) {
...
@@ -1226,9 +1239,10 @@ AST_Module* caching_parse_file(const char* fn, FutureFlags inherited_flags) {
file_data
.
clear
();
file_data
.
clear
();
AST_Module
*
mod
=
0
;
AST_Module
*
mod
=
0
;
file_data
=
_reparse
(
fn
,
cache_fn
,
mod
,
inherited_flags
);
std
::
unique_ptr
<
ASTAllocator
>
ast_allocator
;
file_data
=
_reparse
(
fn
,
cache_fn
,
mod
,
ast_allocator
,
inherited_flags
);
if
(
mod
)
if
(
mod
)
return
mod
;
return
std
::
make_pair
(
mod
,
std
::
move
(
ast_allocator
))
;
assert
(
file_data
.
size
());
assert
(
file_data
.
size
());
}
}
}
}
...
...
src/codegen/parser.h
View file @
128e2b0d
...
@@ -20,10 +20,11 @@
...
@@ -20,10 +20,11 @@
namespace
pyston
{
namespace
pyston
{
class
AST_Module
;
class
AST_Module
;
class
ASTAllocator
;
AST_Module
*
parse_string
(
const
char
*
code
,
FutureFlags
inherited_flags
);
std
::
pair
<
AST_Module
*
,
std
::
unique_ptr
<
ASTAllocator
>>
parse_string
(
const
char
*
code
,
FutureFlags
inherited_flags
);
AST_Module
*
parse_file
(
const
char
*
fn
,
FutureFlags
inherited_flags
);
std
::
pair
<
AST_Module
*
,
std
::
unique_ptr
<
ASTAllocator
>>
parse_file
(
const
char
*
fn
,
FutureFlags
inherited_flags
);
AST_Module
*
caching_parse_file
(
const
char
*
fn
,
FutureFlags
inherited_flags
);
std
::
pair
<
AST_Module
*
,
std
::
unique_ptr
<
ASTAllocator
>>
caching_parse_file
(
const
char
*
fn
,
FutureFlags
inherited_flags
);
}
}
#endif
#endif
src/core/ast.h
View file @
128e2b0d
...
@@ -23,6 +23,7 @@
...
@@ -23,6 +23,7 @@
#include <vector>
#include <vector>
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Allocator.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/raw_ostream.h"
#include "analysis/scoping_analysis.h"
#include "analysis/scoping_analysis.h"
...
@@ -164,6 +165,44 @@ class ASTStmtVisitor;
...
@@ -164,6 +165,44 @@ class ASTStmtVisitor;
class
AST_keyword
;
class
AST_keyword
;
class
AST_stmt
;
class
AST_stmt
;
class
ASTAllocator
{
private:
template
<
int
slab_size
,
int
alignment
=
8
>
class
ASTAllocatorSlab
{
unsigned
char
data
[
slab_size
];
int
num_bytes_used
;
public:
ASTAllocatorSlab
()
:
num_bytes_used
(
0
)
{}
~
ASTAllocatorSlab
();
int
numBytesFree
()
const
{
return
slab_size
-
num_bytes_used
;
}
void
*
alloc
(
int
num_bytes
)
{
assert
(
num_bytes_used
%
alignment
==
0
);
assert
(
numBytesFree
()
>=
num_bytes
);
void
*
ptr
=
&
data
[
num_bytes_used
];
num_bytes_used
+=
llvm
::
RoundUpToAlignment
(
num_bytes
,
alignment
);
return
ptr
;
}
};
// we subtract the size of the "num_bytes_used" field to generate a power of two allocation which I guess is more
// what the allocator is optimized for.
static
constexpr
int
slab_size
=
4096
-
sizeof
(
int
);
static_assert
(
sizeof
(
ASTAllocatorSlab
<
slab_size
>
)
==
4096
,
""
);
llvm
::
SmallVector
<
std
::
unique_ptr
<
ASTAllocatorSlab
<
slab_size
>>
,
4
>
slabs
;
public:
ASTAllocator
()
=
default
;
ASTAllocator
(
ASTAllocator
&&
)
=
delete
;
void
*
allocate
(
int
num_bytes
)
{
if
(
slabs
.
empty
()
||
slabs
.
back
()
->
numBytesFree
()
<
num_bytes
)
slabs
.
emplace_back
(
llvm
::
make_unique
<
ASTAllocatorSlab
<
slab_size
>>
());
return
slabs
.
back
()
->
alloc
(
num_bytes
);
}
};
class
AST
{
class
AST
{
public:
public:
virtual
~
AST
()
{}
virtual
~
AST
()
{}
...
@@ -172,6 +211,7 @@ public:
...
@@ -172,6 +211,7 @@ public:
uint32_t
lineno
,
col_offset
;
uint32_t
lineno
,
col_offset
;
virtual
void
accept
(
ASTVisitor
*
v
)
=
0
;
virtual
void
accept
(
ASTVisitor
*
v
)
=
0
;
virtual
int
getSize
()
const
=
0
;
// returns size of AST node
// #define DEBUG_LINE_NUMBERS 1
// #define DEBUG_LINE_NUMBERS 1
#ifdef DEBUG_LINE_NUMBERS
#ifdef DEBUG_LINE_NUMBERS
...
@@ -188,6 +228,10 @@ public:
...
@@ -188,6 +228,10 @@ public:
AST
(
AST_TYPE
::
AST_TYPE
type
,
uint32_t
lineno
,
uint32_t
col_offset
=
0
)
AST
(
AST_TYPE
::
AST_TYPE
type
,
uint32_t
lineno
,
uint32_t
col_offset
=
0
)
:
type
(
type
),
lineno
(
lineno
),
col_offset
(
col_offset
)
{}
:
type
(
type
),
lineno
(
lineno
),
col_offset
(
col_offset
)
{}
static
void
*
operator
new
(
size_t
count
,
ASTAllocator
&
allocator
)
{
return
allocator
.
allocate
(
count
);
}
static
void
operator
delete
(
void
*
)
{
RELEASE_ASSERT
(
0
,
"use the ASTAllocator instead"
);
}
// These could be virtual methods, but since we already keep track of the type use a switch statement
// These could be virtual methods, but since we already keep track of the type use a switch statement
// like everywhere else.
// like everywhere else.
InternedStringPool
&
getStringpool
();
InternedStringPool
&
getStringpool
();
...
@@ -196,6 +240,22 @@ public:
...
@@ -196,6 +240,22 @@ public:
};
};
Box
*
getDocString
(
llvm
::
ArrayRef
<
AST_stmt
*>
body
);
Box
*
getDocString
(
llvm
::
ArrayRef
<
AST_stmt
*>
body
);
template
<
int
slab_size
,
int
alignment
>
ASTAllocator
::
ASTAllocatorSlab
<
slab_size
,
alignment
>::~
ASTAllocatorSlab
()
{
// find all AST* nodes and call the virtual destructor
for
(
int
current_pos
=
0
;
current_pos
<
num_bytes_used
;)
{
AST
*
node
=
(
AST
*
)
&
data
[
current_pos
];
int
node_size
=
node
->
getSize
();
node
->~
AST
();
current_pos
+=
llvm
::
RoundUpToAlignment
(
node_size
,
alignment
);
}
}
#define DEFINE_AST_NODE(name) \
static const AST_TYPE::AST_TYPE TYPE = AST_TYPE::name; \
virtual int getSize() const override { return sizeof(*this); }
class
AST_expr
:
public
AST
{
class
AST_expr
:
public
AST
{
public:
public:
AST_expr
(
AST_TYPE
::
AST_TYPE
type
)
:
AST
(
type
)
{}
AST_expr
(
AST_TYPE
::
AST_TYPE
type
)
:
AST
(
type
)
{}
...
@@ -223,7 +283,7 @@ public:
...
@@ -223,7 +283,7 @@ public:
AST_alias
(
InternedString
name
,
InternedString
asname
)
:
AST
(
AST_TYPE
::
alias
),
name
(
name
),
asname
(
asname
)
{}
AST_alias
(
InternedString
name
,
InternedString
asname
)
:
AST
(
AST_TYPE
::
alias
),
name
(
name
),
asname
(
asname
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
alias
;
DEFINE_AST_NODE
(
alias
)
};
};
class
AST_Name
;
class
AST_Name
;
...
@@ -239,7 +299,7 @@ public:
...
@@ -239,7 +299,7 @@ public:
AST_arguments
()
:
AST
(
AST_TYPE
::
arguments
)
{}
AST_arguments
()
:
AST
(
AST_TYPE
::
arguments
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
arguments
;
DEFINE_AST_NODE
(
arguments
)
};
};
class
AST_Assert
:
public
AST_stmt
{
class
AST_Assert
:
public
AST_stmt
{
...
@@ -251,7 +311,7 @@ public:
...
@@ -251,7 +311,7 @@ public:
AST_Assert
()
:
AST_stmt
(
AST_TYPE
::
Assert
)
{}
AST_Assert
()
:
AST_stmt
(
AST_TYPE
::
Assert
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Assert
;
DEFINE_AST_NODE
(
Assert
)
};
};
class
AST_Assign
:
public
AST_stmt
{
class
AST_Assign
:
public
AST_stmt
{
...
@@ -264,7 +324,7 @@ public:
...
@@ -264,7 +324,7 @@ public:
AST_Assign
()
:
AST_stmt
(
AST_TYPE
::
Assign
)
{}
AST_Assign
()
:
AST_stmt
(
AST_TYPE
::
Assign
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Assign
;
DEFINE_AST_NODE
(
Assign
)
};
};
class
AST_AugAssign
:
public
AST_stmt
{
class
AST_AugAssign
:
public
AST_stmt
{
...
@@ -278,7 +338,7 @@ public:
...
@@ -278,7 +338,7 @@ public:
AST_AugAssign
()
:
AST_stmt
(
AST_TYPE
::
AugAssign
)
{}
AST_AugAssign
()
:
AST_stmt
(
AST_TYPE
::
AugAssign
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
AugAssign
;
DEFINE_AST_NODE
(
AugAssign
)
};
};
class
AST_AugBinOp
:
public
AST_expr
{
class
AST_AugBinOp
:
public
AST_expr
{
...
@@ -290,7 +350,7 @@ public:
...
@@ -290,7 +350,7 @@ public:
AST_AugBinOp
()
:
AST_expr
(
AST_TYPE
::
AugBinOp
)
{}
AST_AugBinOp
()
:
AST_expr
(
AST_TYPE
::
AugBinOp
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
AugBinOp
;
DEFINE_AST_NODE
(
AugBinOp
)
};
};
class
AST_Attribute
:
public
AST_expr
{
class
AST_Attribute
:
public
AST_expr
{
...
@@ -306,7 +366,7 @@ public:
...
@@ -306,7 +366,7 @@ public:
AST_Attribute
(
AST_expr
*
value
,
AST_TYPE
::
AST_TYPE
ctx_type
,
InternedString
attr
)
AST_Attribute
(
AST_expr
*
value
,
AST_TYPE
::
AST_TYPE
ctx_type
,
InternedString
attr
)
:
AST_expr
(
AST_TYPE
::
Attribute
),
value
(
value
),
ctx_type
(
ctx_type
),
attr
(
attr
)
{}
:
AST_expr
(
AST_TYPE
::
Attribute
),
value
(
value
),
ctx_type
(
ctx_type
),
attr
(
attr
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Attribute
;
DEFINE_AST_NODE
(
Attribute
)
};
};
class
AST_BinOp
:
public
AST_expr
{
class
AST_BinOp
:
public
AST_expr
{
...
@@ -318,7 +378,7 @@ public:
...
@@ -318,7 +378,7 @@ public:
AST_BinOp
()
:
AST_expr
(
AST_TYPE
::
BinOp
)
{}
AST_BinOp
()
:
AST_expr
(
AST_TYPE
::
BinOp
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
BinOp
;
DEFINE_AST_NODE
(
BinOp
)
};
};
class
AST_BoolOp
:
public
AST_expr
{
class
AST_BoolOp
:
public
AST_expr
{
...
@@ -330,7 +390,7 @@ public:
...
@@ -330,7 +390,7 @@ public:
AST_BoolOp
()
:
AST_expr
(
AST_TYPE
::
BoolOp
)
{}
AST_BoolOp
()
:
AST_expr
(
AST_TYPE
::
BoolOp
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
BoolOp
;
DEFINE_AST_NODE
(
BoolOp
)
};
};
class
AST_Break
:
public
AST_stmt
{
class
AST_Break
:
public
AST_stmt
{
...
@@ -340,7 +400,7 @@ public:
...
@@ -340,7 +400,7 @@ public:
AST_Break
()
:
AST_stmt
(
AST_TYPE
::
Break
)
{}
AST_Break
()
:
AST_stmt
(
AST_TYPE
::
Break
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Break
;
DEFINE_AST_NODE
(
Break
)
};
};
class
AST_Call
:
public
AST_expr
{
class
AST_Call
:
public
AST_expr
{
...
@@ -353,7 +413,7 @@ public:
...
@@ -353,7 +413,7 @@ public:
AST_Call
()
:
AST_expr
(
AST_TYPE
::
Call
)
{}
AST_Call
()
:
AST_expr
(
AST_TYPE
::
Call
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Call
;
DEFINE_AST_NODE
(
Call
)
};
};
class
AST_Compare
:
public
AST_expr
{
class
AST_Compare
:
public
AST_expr
{
...
@@ -366,7 +426,7 @@ public:
...
@@ -366,7 +426,7 @@ public:
AST_Compare
()
:
AST_expr
(
AST_TYPE
::
Compare
)
{}
AST_Compare
()
:
AST_expr
(
AST_TYPE
::
Compare
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Compare
;
DEFINE_AST_NODE
(
Compare
)
};
};
class
AST_comprehension
:
public
AST
{
class
AST_comprehension
:
public
AST
{
...
@@ -379,7 +439,7 @@ public:
...
@@ -379,7 +439,7 @@ public:
AST_comprehension
()
:
AST
(
AST_TYPE
::
comprehension
)
{}
AST_comprehension
()
:
AST
(
AST_TYPE
::
comprehension
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
comprehension
;
DEFINE_AST_NODE
(
comprehension
)
};
};
class
AST_ClassDef
:
public
AST_stmt
{
class
AST_ClassDef
:
public
AST_stmt
{
...
@@ -393,7 +453,7 @@ public:
...
@@ -393,7 +453,7 @@ public:
AST_ClassDef
()
:
AST_stmt
(
AST_TYPE
::
ClassDef
)
{}
AST_ClassDef
()
:
AST_stmt
(
AST_TYPE
::
ClassDef
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
ClassDef
;
DEFINE_AST_NODE
(
ClassDef
)
};
};
class
AST_Continue
:
public
AST_stmt
{
class
AST_Continue
:
public
AST_stmt
{
...
@@ -403,7 +463,7 @@ public:
...
@@ -403,7 +463,7 @@ public:
AST_Continue
()
:
AST_stmt
(
AST_TYPE
::
Continue
)
{}
AST_Continue
()
:
AST_stmt
(
AST_TYPE
::
Continue
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Continue
;
DEFINE_AST_NODE
(
Continue
)
};
};
class
AST_Dict
:
public
AST_expr
{
class
AST_Dict
:
public
AST_expr
{
...
@@ -414,7 +474,7 @@ public:
...
@@ -414,7 +474,7 @@ public:
AST_Dict
()
:
AST_expr
(
AST_TYPE
::
Dict
)
{}
AST_Dict
()
:
AST_expr
(
AST_TYPE
::
Dict
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Dict
;
DEFINE_AST_NODE
(
Dict
)
};
};
class
AST_DictComp
:
public
AST_expr
{
class
AST_DictComp
:
public
AST_expr
{
...
@@ -426,7 +486,7 @@ public:
...
@@ -426,7 +486,7 @@ public:
AST_DictComp
()
:
AST_expr
(
AST_TYPE
::
DictComp
)
{}
AST_DictComp
()
:
AST_expr
(
AST_TYPE
::
DictComp
)
{}
const
static
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
DictComp
;
DEFINE_AST_NODE
(
DictComp
)
};
};
class
AST_Delete
:
public
AST_stmt
{
class
AST_Delete
:
public
AST_stmt
{
...
@@ -437,7 +497,7 @@ public:
...
@@ -437,7 +497,7 @@ public:
AST_Delete
()
:
AST_stmt
(
AST_TYPE
::
Delete
)
{}
AST_Delete
()
:
AST_stmt
(
AST_TYPE
::
Delete
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Delete
;
DEFINE_AST_NODE
(
Delete
)
};
};
class
AST_Ellipsis
:
public
AST_slice
{
class
AST_Ellipsis
:
public
AST_slice
{
...
@@ -446,7 +506,7 @@ public:
...
@@ -446,7 +506,7 @@ public:
AST_Ellipsis
()
:
AST_slice
(
AST_TYPE
::
Ellipsis
)
{}
AST_Ellipsis
()
:
AST_slice
(
AST_TYPE
::
Ellipsis
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Ellipsis
;
DEFINE_AST_NODE
(
Ellipsis
)
};
};
class
AST_Expr
:
public
AST_stmt
{
class
AST_Expr
:
public
AST_stmt
{
...
@@ -459,7 +519,7 @@ public:
...
@@ -459,7 +519,7 @@ public:
AST_Expr
()
:
AST_stmt
(
AST_TYPE
::
Expr
)
{}
AST_Expr
()
:
AST_stmt
(
AST_TYPE
::
Expr
)
{}
AST_Expr
(
AST_expr
*
value
)
:
AST_stmt
(
AST_TYPE
::
Expr
),
value
(
value
)
{}
AST_Expr
(
AST_expr
*
value
)
:
AST_stmt
(
AST_TYPE
::
Expr
),
value
(
value
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Expr
;
DEFINE_AST_NODE
(
Expr
)
};
};
class
AST_ExceptHandler
:
public
AST
{
class
AST_ExceptHandler
:
public
AST
{
...
@@ -472,7 +532,7 @@ public:
...
@@ -472,7 +532,7 @@ public:
AST_ExceptHandler
()
:
AST
(
AST_TYPE
::
ExceptHandler
)
{}
AST_ExceptHandler
()
:
AST
(
AST_TYPE
::
ExceptHandler
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
ExceptHandler
;
DEFINE_AST_NODE
(
ExceptHandler
)
};
};
class
AST_Exec
:
public
AST_stmt
{
class
AST_Exec
:
public
AST_stmt
{
...
@@ -486,7 +546,7 @@ public:
...
@@ -486,7 +546,7 @@ public:
AST_Exec
()
:
AST_stmt
(
AST_TYPE
::
Exec
)
{}
AST_Exec
()
:
AST_stmt
(
AST_TYPE
::
Exec
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Exec
;
DEFINE_AST_NODE
(
Exec
)
};
};
// (Alternative to AST_Module, used for, e.g., eval)
// (Alternative to AST_Module, used for, e.g., eval)
...
@@ -502,7 +562,7 @@ public:
...
@@ -502,7 +562,7 @@ public:
AST_Expression
(
std
::
unique_ptr
<
InternedStringPool
>
interned_strings
)
AST_Expression
(
std
::
unique_ptr
<
InternedStringPool
>
interned_strings
)
:
AST
(
AST_TYPE
::
Expression
),
interned_strings
(
std
::
move
(
interned_strings
))
{}
:
AST
(
AST_TYPE
::
Expression
),
interned_strings
(
std
::
move
(
interned_strings
))
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Expression
;
DEFINE_AST_NODE
(
Expression
)
};
};
class
AST_ExtSlice
:
public
AST_slice
{
class
AST_ExtSlice
:
public
AST_slice
{
...
@@ -513,7 +573,7 @@ public:
...
@@ -513,7 +573,7 @@ public:
AST_ExtSlice
()
:
AST_slice
(
AST_TYPE
::
ExtSlice
)
{}
AST_ExtSlice
()
:
AST_slice
(
AST_TYPE
::
ExtSlice
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
ExtSlice
;
DEFINE_AST_NODE
(
ExtSlice
)
};
};
class
AST_For
:
public
AST_stmt
{
class
AST_For
:
public
AST_stmt
{
...
@@ -526,7 +586,7 @@ public:
...
@@ -526,7 +586,7 @@ public:
AST_For
()
:
AST_stmt
(
AST_TYPE
::
For
)
{}
AST_For
()
:
AST_stmt
(
AST_TYPE
::
For
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
For
;
DEFINE_AST_NODE
(
For
)
};
};
class
AST_FunctionDef
:
public
AST_stmt
{
class
AST_FunctionDef
:
public
AST_stmt
{
...
@@ -541,7 +601,7 @@ public:
...
@@ -541,7 +601,7 @@ public:
AST_FunctionDef
()
:
AST_stmt
(
AST_TYPE
::
FunctionDef
)
{}
AST_FunctionDef
()
:
AST_stmt
(
AST_TYPE
::
FunctionDef
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
FunctionDef
;
DEFINE_AST_NODE
(
FunctionDef
)
};
};
class
AST_GeneratorExp
:
public
AST_expr
{
class
AST_GeneratorExp
:
public
AST_expr
{
...
@@ -553,7 +613,7 @@ public:
...
@@ -553,7 +613,7 @@ public:
AST_GeneratorExp
()
:
AST_expr
(
AST_TYPE
::
GeneratorExp
)
{}
AST_GeneratorExp
()
:
AST_expr
(
AST_TYPE
::
GeneratorExp
)
{}
const
static
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
GeneratorExp
;
DEFINE_AST_NODE
(
GeneratorExp
)
};
};
class
AST_Global
:
public
AST_stmt
{
class
AST_Global
:
public
AST_stmt
{
...
@@ -565,7 +625,7 @@ public:
...
@@ -565,7 +625,7 @@ public:
AST_Global
()
:
AST_stmt
(
AST_TYPE
::
Global
)
{}
AST_Global
()
:
AST_stmt
(
AST_TYPE
::
Global
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Global
;
DEFINE_AST_NODE
(
Global
)
};
};
class
AST_If
:
public
AST_stmt
{
class
AST_If
:
public
AST_stmt
{
...
@@ -578,7 +638,7 @@ public:
...
@@ -578,7 +638,7 @@ public:
AST_If
()
:
AST_stmt
(
AST_TYPE
::
If
)
{}
AST_If
()
:
AST_stmt
(
AST_TYPE
::
If
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
If
;
DEFINE_AST_NODE
(
If
)
};
};
class
AST_IfExp
:
public
AST_expr
{
class
AST_IfExp
:
public
AST_expr
{
...
@@ -589,7 +649,7 @@ public:
...
@@ -589,7 +649,7 @@ public:
AST_IfExp
()
:
AST_expr
(
AST_TYPE
::
IfExp
)
{}
AST_IfExp
()
:
AST_expr
(
AST_TYPE
::
IfExp
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
IfExp
;
DEFINE_AST_NODE
(
IfExp
)
};
};
class
AST_Import
:
public
AST_stmt
{
class
AST_Import
:
public
AST_stmt
{
...
@@ -601,7 +661,7 @@ public:
...
@@ -601,7 +661,7 @@ public:
AST_Import
()
:
AST_stmt
(
AST_TYPE
::
Import
)
{}
AST_Import
()
:
AST_stmt
(
AST_TYPE
::
Import
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Import
;
DEFINE_AST_NODE
(
Import
)
};
};
class
AST_ImportFrom
:
public
AST_stmt
{
class
AST_ImportFrom
:
public
AST_stmt
{
...
@@ -615,7 +675,7 @@ public:
...
@@ -615,7 +675,7 @@ public:
AST_ImportFrom
()
:
AST_stmt
(
AST_TYPE
::
ImportFrom
)
{}
AST_ImportFrom
()
:
AST_stmt
(
AST_TYPE
::
ImportFrom
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
ImportFrom
;
DEFINE_AST_NODE
(
ImportFrom
)
};
};
class
AST_Index
:
public
AST_slice
{
class
AST_Index
:
public
AST_slice
{
...
@@ -626,7 +686,7 @@ public:
...
@@ -626,7 +686,7 @@ public:
AST_Index
()
:
AST_slice
(
AST_TYPE
::
Index
)
{}
AST_Index
()
:
AST_slice
(
AST_TYPE
::
Index
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Index
;
DEFINE_AST_NODE
(
Index
)
};
};
class
AST_keyword
:
public
AST
{
class
AST_keyword
:
public
AST
{
...
@@ -639,7 +699,7 @@ public:
...
@@ -639,7 +699,7 @@ public:
AST_keyword
()
:
AST
(
AST_TYPE
::
keyword
)
{}
AST_keyword
()
:
AST
(
AST_TYPE
::
keyword
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
keyword
;
DEFINE_AST_NODE
(
keyword
)
};
};
class
AST_Lambda
:
public
AST_expr
{
class
AST_Lambda
:
public
AST_expr
{
...
@@ -651,7 +711,7 @@ public:
...
@@ -651,7 +711,7 @@ public:
AST_Lambda
()
:
AST_expr
(
AST_TYPE
::
Lambda
)
{}
AST_Lambda
()
:
AST_expr
(
AST_TYPE
::
Lambda
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Lambda
;
DEFINE_AST_NODE
(
Lambda
)
};
};
class
AST_List
:
public
AST_expr
{
class
AST_List
:
public
AST_expr
{
...
@@ -663,7 +723,7 @@ public:
...
@@ -663,7 +723,7 @@ public:
AST_List
()
:
AST_expr
(
AST_TYPE
::
List
)
{}
AST_List
()
:
AST_expr
(
AST_TYPE
::
List
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
List
;
DEFINE_AST_NODE
(
List
)
};
};
class
AST_ListComp
:
public
AST_expr
{
class
AST_ListComp
:
public
AST_expr
{
...
@@ -675,7 +735,7 @@ public:
...
@@ -675,7 +735,7 @@ public:
AST_ListComp
()
:
AST_expr
(
AST_TYPE
::
ListComp
)
{}
AST_ListComp
()
:
AST_expr
(
AST_TYPE
::
ListComp
)
{}
const
static
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
ListComp
;
DEFINE_AST_NODE
(
ListComp
)
};
};
class
AST_Module
:
public
AST
{
class
AST_Module
:
public
AST
{
...
@@ -690,7 +750,7 @@ public:
...
@@ -690,7 +750,7 @@ public:
AST_Module
(
std
::
unique_ptr
<
InternedStringPool
>
interned_strings
)
AST_Module
(
std
::
unique_ptr
<
InternedStringPool
>
interned_strings
)
:
AST
(
AST_TYPE
::
Module
),
interned_strings
(
std
::
move
(
interned_strings
))
{}
:
AST
(
AST_TYPE
::
Module
),
interned_strings
(
std
::
move
(
interned_strings
))
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Module
;
DEFINE_AST_NODE
(
Module
)
};
};
class
AST_Suite
:
public
AST
{
class
AST_Suite
:
public
AST
{
...
@@ -704,7 +764,7 @@ public:
...
@@ -704,7 +764,7 @@ public:
AST_Suite
(
std
::
unique_ptr
<
InternedStringPool
>
interned_strings
)
AST_Suite
(
std
::
unique_ptr
<
InternedStringPool
>
interned_strings
)
:
AST
(
AST_TYPE
::
Suite
),
interned_strings
(
std
::
move
(
interned_strings
))
{}
:
AST
(
AST_TYPE
::
Suite
),
interned_strings
(
std
::
move
(
interned_strings
))
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Suite
;
DEFINE_AST_NODE
(
Suite
)
};
};
class
AST_Name
:
public
AST_expr
{
class
AST_Name
:
public
AST_expr
{
...
@@ -725,7 +785,7 @@ public:
...
@@ -725,7 +785,7 @@ public:
id
(
id
),
id
(
id
),
lookup_type
(
ScopeInfo
::
VarScopeType
::
UNKNOWN
)
{}
lookup_type
(
ScopeInfo
::
VarScopeType
::
UNKNOWN
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Name
;
DEFINE_AST_NODE
(
Name
)
};
};
class
AST_Num
:
public
AST_expr
{
class
AST_Num
:
public
AST_expr
{
...
@@ -750,7 +810,7 @@ public:
...
@@ -750,7 +810,7 @@ public:
AST_Num
()
:
AST_expr
(
AST_TYPE
::
Num
)
{}
AST_Num
()
:
AST_expr
(
AST_TYPE
::
Num
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Num
;
DEFINE_AST_NODE
(
Num
)
};
};
class
AST_Repr
:
public
AST_expr
{
class
AST_Repr
:
public
AST_expr
{
...
@@ -761,7 +821,7 @@ public:
...
@@ -761,7 +821,7 @@ public:
AST_Repr
()
:
AST_expr
(
AST_TYPE
::
Repr
)
{}
AST_Repr
()
:
AST_expr
(
AST_TYPE
::
Repr
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Repr
;
DEFINE_AST_NODE
(
Repr
)
};
};
class
AST_Pass
:
public
AST_stmt
{
class
AST_Pass
:
public
AST_stmt
{
...
@@ -771,7 +831,7 @@ public:
...
@@ -771,7 +831,7 @@ public:
AST_Pass
()
:
AST_stmt
(
AST_TYPE
::
Pass
)
{}
AST_Pass
()
:
AST_stmt
(
AST_TYPE
::
Pass
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Pass
;
DEFINE_AST_NODE
(
Pass
)
};
};
class
AST_Print
:
public
AST_stmt
{
class
AST_Print
:
public
AST_stmt
{
...
@@ -785,7 +845,7 @@ public:
...
@@ -785,7 +845,7 @@ public:
AST_Print
()
:
AST_stmt
(
AST_TYPE
::
Print
)
{}
AST_Print
()
:
AST_stmt
(
AST_TYPE
::
Print
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Print
;
DEFINE_AST_NODE
(
Print
)
};
};
class
AST_Raise
:
public
AST_stmt
{
class
AST_Raise
:
public
AST_stmt
{
...
@@ -801,7 +861,7 @@ public:
...
@@ -801,7 +861,7 @@ public:
AST_Raise
()
:
AST_stmt
(
AST_TYPE
::
Raise
),
arg0
(
NULL
),
arg1
(
NULL
),
arg2
(
NULL
)
{}
AST_Raise
()
:
AST_stmt
(
AST_TYPE
::
Raise
),
arg0
(
NULL
),
arg1
(
NULL
),
arg2
(
NULL
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Raise
;
DEFINE_AST_NODE
(
Raise
)
};
};
class
AST_Return
:
public
AST_stmt
{
class
AST_Return
:
public
AST_stmt
{
...
@@ -813,7 +873,7 @@ public:
...
@@ -813,7 +873,7 @@ public:
AST_Return
()
:
AST_stmt
(
AST_TYPE
::
Return
)
{}
AST_Return
()
:
AST_stmt
(
AST_TYPE
::
Return
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Return
;
DEFINE_AST_NODE
(
Return
)
};
};
class
AST_Set
:
public
AST_expr
{
class
AST_Set
:
public
AST_expr
{
...
@@ -824,7 +884,7 @@ public:
...
@@ -824,7 +884,7 @@ public:
AST_Set
()
:
AST_expr
(
AST_TYPE
::
Set
)
{}
AST_Set
()
:
AST_expr
(
AST_TYPE
::
Set
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Set
;
DEFINE_AST_NODE
(
Set
)
};
};
class
AST_SetComp
:
public
AST_expr
{
class
AST_SetComp
:
public
AST_expr
{
...
@@ -836,7 +896,7 @@ public:
...
@@ -836,7 +896,7 @@ public:
AST_SetComp
()
:
AST_expr
(
AST_TYPE
::
SetComp
)
{}
AST_SetComp
()
:
AST_expr
(
AST_TYPE
::
SetComp
)
{}
const
static
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
SetComp
;
DEFINE_AST_NODE
(
SetComp
)
};
};
class
AST_Slice
:
public
AST_slice
{
class
AST_Slice
:
public
AST_slice
{
...
@@ -847,7 +907,7 @@ public:
...
@@ -847,7 +907,7 @@ public:
AST_Slice
()
:
AST_slice
(
AST_TYPE
::
Slice
)
{}
AST_Slice
()
:
AST_slice
(
AST_TYPE
::
Slice
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Slice
;
DEFINE_AST_NODE
(
Slice
)
};
};
class
AST_Str
:
public
AST_expr
{
class
AST_Str
:
public
AST_expr
{
...
@@ -867,7 +927,7 @@ public:
...
@@ -867,7 +927,7 @@ public:
AST_Str
()
:
AST_expr
(
AST_TYPE
::
Str
),
str_type
(
UNSET
)
{}
AST_Str
()
:
AST_expr
(
AST_TYPE
::
Str
),
str_type
(
UNSET
)
{}
AST_Str
(
std
::
string
s
)
:
AST_expr
(
AST_TYPE
::
Str
),
str_type
(
STR
),
str_data
(
std
::
move
(
s
))
{}
AST_Str
(
std
::
string
s
)
:
AST_expr
(
AST_TYPE
::
Str
),
str_type
(
STR
),
str_data
(
std
::
move
(
s
))
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Str
;
DEFINE_AST_NODE
(
Str
)
};
};
class
AST_Subscript
:
public
AST_expr
{
class
AST_Subscript
:
public
AST_expr
{
...
@@ -880,7 +940,7 @@ public:
...
@@ -880,7 +940,7 @@ public:
AST_Subscript
()
:
AST_expr
(
AST_TYPE
::
Subscript
)
{}
AST_Subscript
()
:
AST_expr
(
AST_TYPE
::
Subscript
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Subscript
;
DEFINE_AST_NODE
(
Subscript
)
};
};
class
AST_TryExcept
:
public
AST_stmt
{
class
AST_TryExcept
:
public
AST_stmt
{
...
@@ -893,7 +953,7 @@ public:
...
@@ -893,7 +953,7 @@ public:
AST_TryExcept
()
:
AST_stmt
(
AST_TYPE
::
TryExcept
)
{}
AST_TryExcept
()
:
AST_stmt
(
AST_TYPE
::
TryExcept
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
TryExcept
;
DEFINE_AST_NODE
(
TryExcept
)
};
};
class
AST_TryFinally
:
public
AST_stmt
{
class
AST_TryFinally
:
public
AST_stmt
{
...
@@ -905,7 +965,7 @@ public:
...
@@ -905,7 +965,7 @@ public:
AST_TryFinally
()
:
AST_stmt
(
AST_TYPE
::
TryFinally
)
{}
AST_TryFinally
()
:
AST_stmt
(
AST_TYPE
::
TryFinally
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
TryFinally
;
DEFINE_AST_NODE
(
TryFinally
)
};
};
class
AST_Tuple
:
public
AST_expr
{
class
AST_Tuple
:
public
AST_expr
{
...
@@ -917,7 +977,7 @@ public:
...
@@ -917,7 +977,7 @@ public:
AST_Tuple
()
:
AST_expr
(
AST_TYPE
::
Tuple
)
{}
AST_Tuple
()
:
AST_expr
(
AST_TYPE
::
Tuple
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Tuple
;
DEFINE_AST_NODE
(
Tuple
)
};
};
class
AST_UnaryOp
:
public
AST_expr
{
class
AST_UnaryOp
:
public
AST_expr
{
...
@@ -929,7 +989,7 @@ public:
...
@@ -929,7 +989,7 @@ public:
AST_UnaryOp
()
:
AST_expr
(
AST_TYPE
::
UnaryOp
)
{}
AST_UnaryOp
()
:
AST_expr
(
AST_TYPE
::
UnaryOp
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
UnaryOp
;
DEFINE_AST_NODE
(
UnaryOp
)
};
};
class
AST_While
:
public
AST_stmt
{
class
AST_While
:
public
AST_stmt
{
...
@@ -942,7 +1002,7 @@ public:
...
@@ -942,7 +1002,7 @@ public:
AST_While
()
:
AST_stmt
(
AST_TYPE
::
While
)
{}
AST_While
()
:
AST_stmt
(
AST_TYPE
::
While
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
While
;
DEFINE_AST_NODE
(
While
)
};
};
class
AST_With
:
public
AST_stmt
{
class
AST_With
:
public
AST_stmt
{
...
@@ -955,7 +1015,7 @@ public:
...
@@ -955,7 +1015,7 @@ public:
AST_With
()
:
AST_stmt
(
AST_TYPE
::
With
)
{}
AST_With
()
:
AST_stmt
(
AST_TYPE
::
With
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
With
;
DEFINE_AST_NODE
(
With
)
};
};
class
AST_Yield
:
public
AST_expr
{
class
AST_Yield
:
public
AST_expr
{
...
@@ -966,7 +1026,7 @@ public:
...
@@ -966,7 +1026,7 @@ public:
AST_Yield
()
:
AST_expr
(
AST_TYPE
::
Yield
)
{}
AST_Yield
()
:
AST_expr
(
AST_TYPE
::
Yield
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Yield
;
DEFINE_AST_NODE
(
Yield
)
};
};
...
@@ -984,7 +1044,7 @@ public:
...
@@ -984,7 +1044,7 @@ public:
AST_ClsAttribute
()
:
AST_expr
(
AST_TYPE
::
ClsAttribute
)
{}
AST_ClsAttribute
()
:
AST_expr
(
AST_TYPE
::
ClsAttribute
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
ClsAttribute
;
DEFINE_AST_NODE
(
ClsAttribute
)
};
};
class
AST_Invoke
:
public
AST_stmt
{
class
AST_Invoke
:
public
AST_stmt
{
...
@@ -998,7 +1058,7 @@ public:
...
@@ -998,7 +1058,7 @@ public:
AST_Invoke
(
AST_stmt
*
stmt
)
:
AST_stmt
(
AST_TYPE
::
Invoke
),
stmt
(
stmt
)
{}
AST_Invoke
(
AST_stmt
*
stmt
)
:
AST_stmt
(
AST_TYPE
::
Invoke
),
stmt
(
stmt
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
Invoke
;
DEFINE_AST_NODE
(
Invoke
)
};
};
// "LangPrimitive" represents operations that "primitive" to the language,
// "LangPrimitive" represents operations that "primitive" to the language,
...
@@ -1028,7 +1088,7 @@ public:
...
@@ -1028,7 +1088,7 @@ public:
AST_LangPrimitive
(
Opcodes
opcode
)
:
AST_expr
(
AST_TYPE
::
LangPrimitive
),
opcode
(
opcode
)
{}
AST_LangPrimitive
(
Opcodes
opcode
)
:
AST_expr
(
AST_TYPE
::
LangPrimitive
),
opcode
(
opcode
)
{}
static
const
AST_TYPE
::
AST_TYPE
TYPE
=
AST_TYPE
::
LangPrimitive
;
DEFINE_AST_NODE
(
LangPrimitive
)
};
};
template
<
typename
T
>
T
*
ast_cast
(
AST
*
node
)
{
template
<
typename
T
>
T
*
ast_cast
(
AST
*
node
)
{
...
...
src/core/cfg.cpp
View file @
128e2b0d
...
@@ -367,8 +367,9 @@ private:
...
@@ -367,8 +367,9 @@ private:
return
stringpool
.
get
(
std
::
move
(
name
));
return
stringpool
.
get
(
std
::
move
(
name
));
}
}
AST_Name
*
makeASTName
(
InternedString
id
,
AST_TYPE
::
AST_TYPE
ctx_type
,
int
lineno
,
int
col_offset
=
0
)
{
AST_Name
*
makeASTName
(
ASTAllocator
&
allocator
,
InternedString
id
,
AST_TYPE
::
AST_TYPE
ctx_type
,
int
lineno
,
AST_Name
*
name
=
new
AST_Name
(
id
,
ctx_type
,
lineno
,
col_offset
);
int
col_offset
=
0
)
{
AST_Name
*
name
=
new
(
allocator
)
AST_Name
(
id
,
ctx_type
,
lineno
,
col_offset
);
return
name
;
return
name
;
}
}
...
@@ -683,15 +684,15 @@ private:
...
@@ -683,15 +684,15 @@ private:
curblock
=
nullptr
;
curblock
=
nullptr
;
}
}
AST_expr
*
makeASTLoadAttribute
(
AST_expr
*
base
,
InternedString
name
,
bool
clsonly
)
{
AST_expr
*
makeASTLoadAttribute
(
AST
Allocator
&
allocator
,
AST
_expr
*
base
,
InternedString
name
,
bool
clsonly
)
{
AST_expr
*
rtn
;
AST_expr
*
rtn
;
if
(
clsonly
)
{
if
(
clsonly
)
{
AST_ClsAttribute
*
attr
=
new
AST_ClsAttribute
();
AST_ClsAttribute
*
attr
=
new
(
allocator
)
AST_ClsAttribute
();
attr
->
value
=
base
;
attr
->
value
=
base
;
attr
->
attr
=
name
;
attr
->
attr
=
name
;
rtn
=
attr
;
rtn
=
attr
;
}
else
{
}
else
{
AST_Attribute
*
attr
=
new
AST_Attribute
();
AST_Attribute
*
attr
=
new
(
allocator
)
AST_Attribute
();
attr
->
ctx_type
=
AST_TYPE
::
Load
;
attr
->
ctx_type
=
AST_TYPE
::
Load
;
attr
->
value
=
base
;
attr
->
value
=
base
;
attr
->
attr
=
name
;
attr
->
attr
=
name
;
...
@@ -720,8 +721,8 @@ private:
...
@@ -720,8 +721,8 @@ private:
return
rtn
;
return
rtn
;
}
}
AST_Call
*
makeASTCall
(
AST_expr
*
func
)
{
AST_Call
*
makeASTCall
(
AST
Allocator
&
allocator
,
AST
_expr
*
func
)
{
AST_Call
*
call
=
new
AST_Call
();
AST_Call
*
call
=
new
(
allocator
)
AST_Call
();
call
->
starargs
=
NULL
;
call
->
starargs
=
NULL
;
call
->
kwargs
=
NULL
;
call
->
kwargs
=
NULL
;
call
->
func
=
func
;
call
->
func
=
func
;
...
@@ -730,14 +731,14 @@ private:
...
@@ -730,14 +731,14 @@ private:
return
call
;
return
call
;
}
}
AST_Call
*
makeASTCall
(
AST_expr
*
func
,
AST_expr
*
arg0
)
{
AST_Call
*
makeASTCall
(
AST
Allocator
&
allocator
,
AST
_expr
*
func
,
AST_expr
*
arg0
)
{
auto
call
=
makeASTCall
(
func
);
auto
call
=
makeASTCall
(
allocator
,
func
);
call
->
args
.
push_back
(
arg0
);
call
->
args
.
push_back
(
arg0
);
return
call
;
return
call
;
}
}
AST_Call
*
makeASTCall
(
AST_expr
*
func
,
AST_expr
*
arg0
,
AST_expr
*
arg1
)
{
AST_Call
*
makeASTCall
(
AST
Allocator
&
allocator
,
AST
_expr
*
func
,
AST_expr
*
arg0
,
AST_expr
*
arg1
)
{
auto
call
=
makeASTCall
(
func
);
auto
call
=
makeASTCall
(
allocator
,
func
);
call
->
args
.
push_back
(
arg0
);
call
->
args
.
push_back
(
arg0
);
call
->
args
.
push_back
(
arg1
);
call
->
args
.
push_back
(
arg1
);
return
call
;
return
call
;
...
@@ -880,8 +881,8 @@ private:
...
@@ -880,8 +881,8 @@ private:
push_back
(
assign
);
push_back
(
assign
);
}
}
AST_stmt
*
makeASTExpr
(
AST_expr
*
expr
)
{
AST_stmt
*
makeASTExpr
(
AST
Allocator
&
allocator
,
AST
_expr
*
expr
)
{
AST_Expr
*
stmt
=
new
AST_Expr
();
AST_Expr
*
stmt
=
new
(
allocator
)
AST_Expr
();
stmt
->
value
=
expr
;
stmt
->
value
=
expr
;
stmt
->
lineno
=
expr
->
lineno
;
stmt
->
lineno
=
expr
->
lineno
;
stmt
->
col_offset
=
expr
->
col_offset
;
stmt
->
col_offset
=
expr
->
col_offset
;
...
@@ -1188,13 +1189,13 @@ private:
...
@@ -1188,13 +1189,13 @@ private:
// This is a helper function used for generator expressions and comprehensions.
// This is a helper function used for generator expressions and comprehensions.
// TODO(rntz): use this to handle unscoped (i.e. list) comprehensions as well?
// TODO(rntz): use this to handle unscoped (i.e. list) comprehensions as well?
void
emitComprehensionLoops
(
int
lineno
,
std
::
vector
<
AST_stmt
*>*
insert_point
,
void
emitComprehensionLoops
(
ASTAllocator
&
allocator
,
int
lineno
,
std
::
vector
<
AST_stmt
*>*
insert_point
,
const
std
::
vector
<
AST_comprehension
*>&
comprehensions
,
AST_expr
*
first_generator
,
const
std
::
vector
<
AST_comprehension
*>&
comprehensions
,
AST_expr
*
first_generator
,
std
::
function
<
void
(
std
::
vector
<
AST_stmt
*>*
)
>
do_yield
)
{
std
::
function
<
void
(
std
::
vector
<
AST_stmt
*>*
)
>
do_yield
)
{
for
(
int
i
=
0
;
i
<
comprehensions
.
size
();
i
++
)
{
for
(
int
i
=
0
;
i
<
comprehensions
.
size
();
i
++
)
{
AST_comprehension
*
c
=
comprehensions
[
i
];
AST_comprehension
*
c
=
comprehensions
[
i
];
AST_For
*
loop
=
new
AST_For
();
AST_For
*
loop
=
new
(
allocator
)
AST_For
();
loop
->
target
=
c
->
target
;
loop
->
target
=
c
->
target
;
loop
->
iter
=
(
i
==
0
)
?
first_generator
:
c
->
iter
;
loop
->
iter
=
(
i
==
0
)
?
first_generator
:
c
->
iter
;
loop
->
lineno
=
lineno
;
loop
->
lineno
=
lineno
;
...
@@ -1203,7 +1204,7 @@ private:
...
@@ -1203,7 +1204,7 @@ private:
insert_point
=
&
loop
->
body
;
insert_point
=
&
loop
->
body
;
for
(
AST_expr
*
if_condition
:
c
->
ifs
)
{
for
(
AST_expr
*
if_condition
:
c
->
ifs
)
{
AST_If
*
if_block
=
new
AST_If
();
AST_If
*
if_block
=
new
(
allocator
)
AST_If
();
if_block
->
lineno
=
if_condition
->
lineno
;
if_block
->
lineno
=
if_condition
->
lineno
;
// Note: don't call callNonzero here, since we are generating
// Note: don't call callNonzero here, since we are generating
// AST inside a new functiondef which will go through the CFG
// AST inside a new functiondef which will go through the CFG
...
@@ -1216,7 +1217,6 @@ private:
...
@@ -1216,7 +1217,6 @@ private:
}
}
do_yield
(
insert_point
);
do_yield
(
insert_point
);
// TODO: have to delete these new ast nodes
}
}
BST_expr
*
remapGeneratorExp
(
AST_GeneratorExp
*
node
)
{
BST_expr
*
remapGeneratorExp
(
AST_GeneratorExp
*
node
)
{
...
@@ -1228,16 +1228,17 @@ private:
...
@@ -1228,16 +1228,17 @@ private:
BST_expr
*
first
=
remapExpr
(
node
->
generators
[
0
]
->
iter
);
BST_expr
*
first
=
remapExpr
(
node
->
generators
[
0
]
->
iter
);
InternedString
arg_name
=
internString
(
"#arg"
);
InternedString
arg_name
=
internString
(
"#arg"
);
AST_arguments
*
genexp_args
=
new
AST_arguments
();
ASTAllocator
allocator
;
genexp_args
->
args
.
push_back
(
makeASTName
(
arg_name
,
AST_TYPE
::
Param
,
node
->
lineno
));
AST_arguments
*
genexp_args
=
new
(
allocator
)
AST_arguments
();
genexp_args
->
args
.
push_back
(
makeASTName
(
allocator
,
arg_name
,
AST_TYPE
::
Param
,
node
->
lineno
));
std
::
vector
<
AST_stmt
*>
new_body
;
std
::
vector
<
AST_stmt
*>
new_body
;
emitComprehensionLoops
(
node
->
lineno
,
&
new_body
,
node
->
generators
,
emitComprehensionLoops
(
allocator
,
node
->
lineno
,
&
new_body
,
node
->
generators
,
makeASTName
(
arg_name
,
AST_TYPE
::
Load
,
node
->
lineno
,
/* col_offset */
0
),
makeASTName
(
a
llocator
,
a
rg_name
,
AST_TYPE
::
Load
,
node
->
lineno
,
/* col_offset */
0
),
[
this
,
node
](
std
::
vector
<
AST_stmt
*>*
insert_point
)
{
[
this
,
node
,
&
allocator
](
std
::
vector
<
AST_stmt
*>*
insert_point
)
{
auto
y
=
new
AST_Yield
();
auto
y
=
new
(
allocator
)
AST_Yield
();
y
->
value
=
node
->
elt
;
y
->
value
=
node
->
elt
;
y
->
lineno
=
node
->
lineno
;
y
->
lineno
=
node
->
lineno
;
insert_point
->
push_back
(
makeASTExpr
(
y
));
insert_point
->
push_back
(
makeASTExpr
(
allocator
,
y
));
});
});
// I'm not sure this actually gets used
// I'm not sure this actually gets used
...
@@ -1258,18 +1259,21 @@ private:
...
@@ -1258,18 +1259,21 @@ private:
return
makeCall
(
makeLoad
(
func_var_name
,
node
,
true
),
first
);
return
makeCall
(
makeLoad
(
func_var_name
,
node
,
true
),
first
);
}
}
void
emitComprehensionYield
(
AST_DictComp
*
node
,
InternedString
dict_name
,
std
::
vector
<
AST_stmt
*>*
insert_point
)
{
void
emitComprehensionYield
(
ASTAllocator
&
allocator
,
AST_DictComp
*
node
,
InternedString
dict_name
,
std
::
vector
<
AST_stmt
*>*
insert_point
)
{
// add entry to the dictionary
// add entry to the dictionary
AST_expr
*
setitem
=
makeASTLoadAttribute
(
makeASTName
(
dict_name
,
AST_TYPE
::
Load
,
node
->
lineno
),
AST_expr
*
setitem
=
makeASTLoadAttribute
(
allocator
,
makeASTName
(
allocator
,
dict_name
,
AST_TYPE
::
Load
,
node
->
lineno
),
internString
(
"__setitem__"
),
true
);
internString
(
"__setitem__"
),
true
);
insert_point
->
push_back
(
makeASTExpr
(
makeASTCall
(
setitem
,
node
->
key
,
node
->
value
)));
insert_point
->
push_back
(
makeASTExpr
(
allocator
,
makeASTCall
(
allocator
,
setitem
,
node
->
key
,
node
->
value
)));
}
}
void
emitComprehensionYield
(
AST_SetComp
*
node
,
InternedString
set_name
,
std
::
vector
<
AST_stmt
*>*
insert_point
)
{
void
emitComprehensionYield
(
ASTAllocator
&
allocator
,
AST_SetComp
*
node
,
InternedString
set_name
,
std
::
vector
<
AST_stmt
*>*
insert_point
)
{
// add entry to the dictionary
// add entry to the dictionary
AST_expr
*
add
AST_expr
*
add
=
makeASTLoadAttribute
(
allocator
,
makeASTName
(
allocator
,
set_name
,
AST_TYPE
::
Load
,
node
->
lineno
),
=
makeASTLoadAttribute
(
makeASTName
(
set_name
,
AST_TYPE
::
Load
,
node
->
lineno
),
internString
(
"add"
),
true
);
internString
(
"add"
),
true
);
insert_point
->
push_back
(
makeASTExpr
(
makeASTCall
(
add
,
node
->
elt
)));
insert_point
->
push_back
(
makeASTExpr
(
allocator
,
makeASTCall
(
allocator
,
add
,
node
->
elt
)));
}
}
template
<
typename
ResultType
,
typename
CompType
>
BST_expr
*
remapScopedComprehension
(
CompType
*
node
)
{
template
<
typename
ResultType
,
typename
CompType
>
BST_expr
*
remapScopedComprehension
(
CompType
*
node
)
{
...
@@ -1277,25 +1281,28 @@ private:
...
@@ -1277,25 +1281,28 @@ private:
BST_expr
*
first
=
remapExpr
(
node
->
generators
[
0
]
->
iter
);
BST_expr
*
first
=
remapExpr
(
node
->
generators
[
0
]
->
iter
);
InternedString
arg_name
=
internString
(
"#arg"
);
InternedString
arg_name
=
internString
(
"#arg"
);
AST_arguments
*
args
=
new
AST_arguments
();
ASTAllocator
allocator
;
args
->
args
.
push_back
(
makeASTName
(
arg_name
,
AST_TYPE
::
Param
,
node
->
lineno
));
AST_arguments
*
args
=
new
(
allocator
)
AST_arguments
();
args
->
args
.
push_back
(
makeASTName
(
allocator
,
arg_name
,
AST_TYPE
::
Param
,
node
->
lineno
));
std
::
vector
<
AST_stmt
*>
new_body
;
std
::
vector
<
AST_stmt
*>
new_body
;
InternedString
rtn_name
=
internString
(
"#comp_rtn"
);
InternedString
rtn_name
=
internString
(
"#comp_rtn"
);
auto
asgn
=
new
AST_Assign
();
auto
asgn
=
new
(
allocator
)
AST_Assign
();
asgn
->
targets
.
push_back
(
makeASTName
(
rtn_name
,
AST_TYPE
::
Store
,
node
->
lineno
));
asgn
->
targets
.
push_back
(
makeASTName
(
allocator
,
rtn_name
,
AST_TYPE
::
Store
,
node
->
lineno
));
asgn
->
value
=
new
ResultType
();
asgn
->
value
=
new
(
allocator
)
ResultType
();
asgn
->
lineno
=
node
->
lineno
;
asgn
->
lineno
=
node
->
lineno
;
new_body
.
push_back
(
asgn
);
new_body
.
push_back
(
asgn
);
auto
lambda
=
auto
lambda
=
[
&
](
std
::
vector
<
AST_stmt
*>*
insert_point
)
{
[
&
](
std
::
vector
<
AST_stmt
*>*
insert_point
)
{
emitComprehensionYield
(
node
,
rtn_name
,
insert_point
);
};
emitComprehensionYield
(
allocator
,
node
,
rtn_name
,
insert_point
);
AST_Name
*
first_name
=
makeASTName
(
internString
(
"#arg"
),
AST_TYPE
::
Load
,
node
->
lineno
,
/* col_offset */
0
);
};
emitComprehensionLoops
(
node
->
lineno
,
&
new_body
,
node
->
generators
,
first_name
,
lambda
);
AST_Name
*
first_name
=
makeASTName
(
allocator
,
internString
(
"#arg"
),
AST_TYPE
::
Load
,
node
->
lineno
,
/* col_offset */
0
);
emitComprehensionLoops
(
allocator
,
node
->
lineno
,
&
new_body
,
node
->
generators
,
first_name
,
lambda
);
auto
rtn
=
new
AST_Return
();
auto
rtn
=
new
(
allocator
)
AST_Return
();
rtn
->
value
=
makeASTName
(
rtn_name
,
AST_TYPE
::
Load
,
node
->
lineno
,
/* col_offset */
0
);
rtn
->
value
=
makeASTName
(
allocator
,
rtn_name
,
AST_TYPE
::
Load
,
node
->
lineno
,
/* col_offset */
0
);
rtn
->
lineno
=
node
->
lineno
;
rtn
->
lineno
=
node
->
lineno
;
new_body
.
push_back
(
rtn
);
new_body
.
push_back
(
rtn
);
...
@@ -1363,7 +1370,8 @@ private:
...
@@ -1363,7 +1370,8 @@ private:
}
}
BST_expr
*
remapLambda
(
AST_Lambda
*
node
)
{
BST_expr
*
remapLambda
(
AST_Lambda
*
node
)
{
auto
stmt
=
new
AST_Return
;
ASTAllocator
allocator
;
auto
stmt
=
new
(
allocator
)
AST_Return
;
stmt
->
lineno
=
node
->
lineno
;
stmt
->
lineno
=
node
->
lineno
;
stmt
->
value
=
node
->
body
;
// don't remap now; will be CFG'ed later
stmt
->
value
=
node
->
body
;
// don't remap now; will be CFG'ed later
...
@@ -2140,7 +2148,8 @@ public:
...
@@ -2140,7 +2148,8 @@ public:
}
}
case
AST_TYPE
:
:
List
:
{
case
AST_TYPE
:
:
List
:
{
AST_List
*
list
=
static_cast
<
AST_List
*>
(
t
);
AST_List
*
list
=
static_cast
<
AST_List
*>
(
t
);
AST_Delete
*
temp_ast_del
=
new
AST_Delete
();
ASTAllocator
allocator
;
AST_Delete
*
temp_ast_del
=
new
(
allocator
)
AST_Delete
();
temp_ast_del
->
lineno
=
node
->
lineno
;
temp_ast_del
->
lineno
=
node
->
lineno
;
temp_ast_del
->
col_offset
=
node
->
col_offset
;
temp_ast_del
->
col_offset
=
node
->
col_offset
;
...
@@ -2152,7 +2161,8 @@ public:
...
@@ -2152,7 +2161,8 @@ public:
}
}
case
AST_TYPE
:
:
Tuple
:
{
case
AST_TYPE
:
:
Tuple
:
{
AST_Tuple
*
tuple
=
static_cast
<
AST_Tuple
*>
(
t
);
AST_Tuple
*
tuple
=
static_cast
<
AST_Tuple
*>
(
t
);
AST_Delete
*
temp_ast_del
=
new
AST_Delete
();
ASTAllocator
allocator
;
AST_Delete
*
temp_ast_del
=
new
(
allocator
)
AST_Delete
();
temp_ast_del
->
lineno
=
node
->
lineno
;
temp_ast_del
->
lineno
=
node
->
lineno
;
temp_ast_del
->
col_offset
=
node
->
col_offset
;
temp_ast_del
->
col_offset
=
node
->
col_offset
;
...
...
src/jit.cpp
View file @
128e2b0d
...
@@ -460,7 +460,9 @@ static int main(int argc, char** argv) noexcept {
...
@@ -460,7 +460,9 @@ static int main(int argc, char** argv) noexcept {
if
(
command
!=
NULL
)
{
if
(
command
!=
NULL
)
{
try
{
try
{
main_module
=
createModule
(
autoDecref
(
boxString
(
"__main__"
)),
"<string>"
);
main_module
=
createModule
(
autoDecref
(
boxString
(
"__main__"
)),
"<string>"
);
AST_Module
*
m
=
parse_string
(
command
,
/* future_flags = */
0
);
AST_Module
*
m
;
std
::
unique_ptr
<
ASTAllocator
>
ast_allocator
;
std
::
tie
(
m
,
ast_allocator
)
=
parse_string
(
command
,
/* future_flags = */
0
);
compileAndRunModule
(
m
,
main_module
);
compileAndRunModule
(
m
,
main_module
);
rtncode
=
0
;
rtncode
=
0
;
}
catch
(
ExcInfo
e
)
{
}
catch
(
ExcInfo
e
)
{
...
@@ -504,7 +506,10 @@ static int main(int argc, char** argv) noexcept {
...
@@ -504,7 +506,10 @@ static int main(int argc, char** argv) noexcept {
free
(
real_path
);
free
(
real_path
);
try
{
try
{
AST_Module
*
ast
=
parse_file
(
fn
,
/* future_flags = */
0
);
std
::
unique_ptr
<
ASTAllocator
>
ast_allocator
;
AST_Module
*
ast
;
std
::
tie
(
ast
,
ast_allocator
)
=
parse_file
(
fn
,
/* future_flags = */
0
);
compileAndRunModule
(
ast
,
main_module
);
compileAndRunModule
(
ast
,
main_module
);
rtncode
=
0
;
rtncode
=
0
;
}
catch
(
ExcInfo
e
)
{
}
catch
(
ExcInfo
e
)
{
...
...
src/runtime/capi.cpp
View file @
128e2b0d
...
@@ -37,6 +37,7 @@
...
@@ -37,6 +37,7 @@
#include "capi/types.h"
#include "capi/types.h"
#include "codegen/irgen/hooks.h"
#include "codegen/irgen/hooks.h"
#include "codegen/unwinding.h"
#include "codegen/unwinding.h"
#include "core/ast.h"
#include "core/threading.h"
#include "core/threading.h"
#include "core/types.h"
#include "core/types.h"
#include "runtime/classobj.h"
#include "runtime/classobj.h"
...
@@ -847,8 +848,8 @@ extern "C" int PyRun_InteractiveOneFlags(FILE* fp, const char* filename, PyCompi
...
@@ -847,8 +848,8 @@ extern "C" int PyRun_InteractiveOneFlags(FILE* fp, const char* filename, PyCompi
bool
failed
=
false
;
bool
failed
=
false
;
try
{
try
{
assert
(
mod
->
kind
==
Interactive_kind
);
assert
(
mod
->
kind
==
Interactive_kind
);
AST_Module
*
pyston_module
=
static_cast
<
AST_Module
*>
(
cpythonToPystonAST
(
mod
,
filename
)
);
auto
res
=
cpythonToPystonAST
(
mod
,
filename
);
compileAndRunModule
(
pyston_module
,
static_cast
<
BoxedModule
*>
(
m
));
compileAndRunModule
(
(
AST_Module
*
)
res
.
first
,
static_cast
<
BoxedModule
*>
(
m
));
}
catch
(
ExcInfo
e
)
{
}
catch
(
ExcInfo
e
)
{
setCAPIException
(
e
);
setCAPIException
(
e
);
failed
=
true
;
failed
=
true
;
...
...
src/runtime/import.cpp
View file @
128e2b0d
...
@@ -25,6 +25,7 @@
...
@@ -25,6 +25,7 @@
#include "codegen/irgen/hooks.h"
#include "codegen/irgen/hooks.h"
#include "codegen/parser.h"
#include "codegen/parser.h"
#include "codegen/unwinding.h"
#include "codegen/unwinding.h"
#include "core/ast.h"
#include "runtime/inline/list.h"
#include "runtime/inline/list.h"
#include "runtime/objmodel.h"
#include "runtime/objmodel.h"
#include "runtime/util.h"
#include "runtime/util.h"
...
@@ -87,7 +88,9 @@ extern "C" PyObject* load_source_module(char* name, char* pathname, FILE* fp) no
...
@@ -87,7 +88,9 @@ extern "C" PyObject* load_source_module(char* name, char* pathname, FILE* fp) no
AUTO_DECREF
(
name_boxed
);
AUTO_DECREF
(
name_boxed
);
try
{
try
{
BoxedModule
*
module
=
createModule
(
name_boxed
,
pathname
);
BoxedModule
*
module
=
createModule
(
name_boxed
,
pathname
);
AST_Module
*
ast
=
caching_parse_file
(
pathname
,
/* future_flags = */
0
);
std
::
unique_ptr
<
ASTAllocator
>
ast_allocator
;
AST_Module
*
ast
;
std
::
tie
(
ast
,
ast_allocator
)
=
caching_parse_file
(
pathname
,
/* future_flags = */
0
);
assert
(
ast
);
assert
(
ast
);
compileAndRunModule
(
ast
,
module
);
compileAndRunModule
(
ast
,
module
);
Box
*
r
=
getSysModulesDict
()
->
getOrNull
(
name_boxed
);
Box
*
r
=
getSysModulesDict
()
->
getOrNull
(
name_boxed
);
...
@@ -118,7 +121,9 @@ extern "C" PyObject* PyImport_ExecCodeModuleEx(const char* name, PyObject* co, c
...
@@ -118,7 +121,9 @@ extern "C" PyObject* PyImport_ExecCodeModuleEx(const char* name, PyObject* co, c
static
BoxedString
*
file_str
=
getStaticString
(
"__file__"
);
static
BoxedString
*
file_str
=
getStaticString
(
"__file__"
);
module
->
setattr
(
file_str
,
autoDecref
(
boxString
(
pathname
)),
NULL
);
module
->
setattr
(
file_str
,
autoDecref
(
boxString
(
pathname
)),
NULL
);
AST_Module
*
ast
=
parse_string
(
code
->
data
(),
/* future_flags = */
0
);
AST_Module
*
ast
;
std
::
unique_ptr
<
ASTAllocator
>
ast_allocator
;
std
::
tie
(
ast
,
ast_allocator
)
=
parse_string
(
code
->
data
(),
/* future_flags = */
0
);
compileAndRunModule
(
ast
,
module
);
compileAndRunModule
(
ast
,
module
);
return
incref
(
module
);
return
incref
(
module
);
}
catch
(
ExcInfo
e
)
{
}
catch
(
ExcInfo
e
)
{
...
...
test/unittests/analysis.cpp
View file @
128e2b0d
...
@@ -29,7 +29,9 @@ protected:
...
@@ -29,7 +29,9 @@ protected:
#ifndef NDEBUG
#ifndef NDEBUG
TEST_F
(
AnalysisTest
,
augassign
)
{
TEST_F
(
AnalysisTest
,
augassign
)
{
const
std
::
string
fn
(
"test/unittests/analysis_listcomp.py"
);
const
std
::
string
fn
(
"test/unittests/analysis_listcomp.py"
);
AST_Module
*
module
=
caching_parse_file
(
fn
.
c_str
(),
0
);
std
::
unique_ptr
<
ASTAllocator
>
ast_allocator
;
AST_Module
*
module
;
std
::
tie
(
module
,
ast_allocator
)
=
caching_parse_file
(
fn
.
c_str
(),
0
);
assert
(
module
);
assert
(
module
);
FutureFlags
future_flags
=
getFutureFlags
(
module
->
body
,
fn
.
c_str
());
FutureFlags
future_flags
=
getFutureFlags
(
module
->
body
,
fn
.
c_str
());
...
@@ -45,7 +47,7 @@ TEST_F(AnalysisTest, augassign) {
...
@@ -45,7 +47,7 @@ TEST_F(AnalysisTest, augassign) {
ASSERT_NE
(
scope_info
->
getScopeTypeOfName
(
module
->
interned_strings
->
get
(
"a"
)),
ScopeInfo
::
VarScopeType
::
GLOBAL
);
ASSERT_NE
(
scope_info
->
getScopeTypeOfName
(
module
->
interned_strings
->
get
(
"a"
)),
ScopeInfo
::
VarScopeType
::
GLOBAL
);
ASSERT_FALSE
(
scope_info
->
getScopeTypeOfName
(
module
->
interned_strings
->
get
(
"b"
))
==
ScopeInfo
::
VarScopeType
::
GLOBAL
);
ASSERT_FALSE
(
scope_info
->
getScopeTypeOfName
(
module
->
interned_strings
->
get
(
"b"
))
==
ScopeInfo
::
VarScopeType
::
GLOBAL
);
AST_arguments
*
args
=
new
AST_arguments
();
AST_arguments
*
args
=
new
(
*
ast_allocator
)
AST_arguments
();
ParamNames
param_names
(
args
,
*
module
->
interned_strings
.
get
());
ParamNames
param_names
(
args
,
*
module
->
interned_strings
.
get
());
// Hack to get at the cfg:
// Hack to get at the cfg:
...
@@ -68,7 +70,9 @@ TEST_F(AnalysisTest, augassign) {
...
@@ -68,7 +70,9 @@ TEST_F(AnalysisTest, augassign) {
void
doOsrTest
(
bool
is_osr
,
bool
i_maybe_undefined
)
{
void
doOsrTest
(
bool
is_osr
,
bool
i_maybe_undefined
)
{
const
std
::
string
fn
(
"test/unittests/analysis_osr.py"
);
const
std
::
string
fn
(
"test/unittests/analysis_osr.py"
);
AST_Module
*
module
=
caching_parse_file
(
fn
.
c_str
(),
0
);
std
::
unique_ptr
<
ASTAllocator
>
ast_allocator
;
AST_Module
*
module
;
std
::
tie
(
module
,
ast_allocator
)
=
caching_parse_file
(
fn
.
c_str
(),
0
);
assert
(
module
);
assert
(
module
);
ParamNames
param_names
(
NULL
,
*
module
->
interned_strings
.
get
());
ParamNames
param_names
(
NULL
,
*
module
->
interned_strings
.
get
());
...
...
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