libsyntax: use unboxed closures
This commit is contained in:
parent
2160427900
commit
0dac05dd62
32 changed files with 377 additions and 245 deletions
|
|
@ -15,12 +15,13 @@ use ext::deriving::generic::*;
|
|||
use ext::deriving::generic::ty::*;
|
||||
use ptr::P;
|
||||
|
||||
pub fn expand_deriving_bound(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: |P<Item>|) {
|
||||
|
||||
pub fn expand_deriving_bound<F>(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: F) where
|
||||
F: FnOnce(P<Item>),
|
||||
{
|
||||
let name = match mitem.node {
|
||||
MetaWord(ref tname) => {
|
||||
match tname.get() {
|
||||
|
|
|
|||
|
|
@ -17,11 +17,13 @@ use ext::deriving::generic::ty::*;
|
|||
use parse::token::InternedString;
|
||||
use ptr::P;
|
||||
|
||||
pub fn expand_deriving_clone(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: |P<Item>|) {
|
||||
pub fn expand_deriving_clone<F>(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: F) where
|
||||
F: FnOnce(P<Item>),
|
||||
{
|
||||
let inline = cx.meta_word(span, InternedString::new("inline"));
|
||||
let attrs = vec!(cx.attribute(span, inline));
|
||||
let trait_def = TraitDef {
|
||||
|
|
|
|||
|
|
@ -17,11 +17,13 @@ use ext::deriving::generic::ty::*;
|
|||
use parse::token::InternedString;
|
||||
use ptr::P;
|
||||
|
||||
pub fn expand_deriving_eq(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: |P<Item>|) {
|
||||
pub fn expand_deriving_eq<F>(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: F) where
|
||||
F: FnOnce(P<Item>),
|
||||
{
|
||||
// structures are equal if all fields are equal, and non equal, if
|
||||
// any fields are not equal or if the enum variants are different
|
||||
fn cs_eq(cx: &mut ExtCtxt, span: Span, substr: &Substructure) -> P<Expr> {
|
||||
|
|
|
|||
|
|
@ -20,11 +20,13 @@ use ext::deriving::generic::ty::*;
|
|||
use parse::token::InternedString;
|
||||
use ptr::P;
|
||||
|
||||
pub fn expand_deriving_ord(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: |P<Item>|) {
|
||||
pub fn expand_deriving_ord<F>(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: F) where
|
||||
F: FnOnce(P<Item>),
|
||||
{
|
||||
macro_rules! md (
|
||||
($name:expr, $op:expr, $equal:expr) => { {
|
||||
let inline = cx.meta_word(span, InternedString::new("inline"));
|
||||
|
|
|
|||
|
|
@ -17,11 +17,13 @@ use ext::deriving::generic::ty::*;
|
|||
use parse::token::InternedString;
|
||||
use ptr::P;
|
||||
|
||||
pub fn expand_deriving_totaleq(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: |P<Item>|) {
|
||||
pub fn expand_deriving_totaleq<F>(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: F) where
|
||||
F: FnOnce(P<Item>),
|
||||
{
|
||||
fn cs_total_eq_assert(cx: &mut ExtCtxt, span: Span, substr: &Substructure) -> P<Expr> {
|
||||
cs_same_method(|cx, span, exprs| {
|
||||
// create `a.<method>(); b.<method>(); c.<method>(); ...`
|
||||
|
|
|
|||
|
|
@ -18,11 +18,13 @@ use ext::deriving::generic::ty::*;
|
|||
use parse::token::InternedString;
|
||||
use ptr::P;
|
||||
|
||||
pub fn expand_deriving_totalord(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: |P<Item>|) {
|
||||
pub fn expand_deriving_totalord<F>(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: F) where
|
||||
F: FnOnce(P<Item>),
|
||||
{
|
||||
let inline = cx.meta_word(span, InternedString::new("inline"));
|
||||
let attrs = vec!(cx.attribute(span, inline));
|
||||
let trait_def = TraitDef {
|
||||
|
|
|
|||
|
|
@ -21,11 +21,13 @@ use parse::token::InternedString;
|
|||
use parse::token;
|
||||
use ptr::P;
|
||||
|
||||
pub fn expand_deriving_decodable(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: |P<Item>|) {
|
||||
pub fn expand_deriving_decodable<F>(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: F) where
|
||||
F: FnOnce(P<Item>),
|
||||
{
|
||||
let trait_def = TraitDef {
|
||||
span: span,
|
||||
attributes: Vec::new(),
|
||||
|
|
@ -155,12 +157,14 @@ fn decodable_substructure(cx: &mut ExtCtxt, trait_span: Span,
|
|||
/// Create a decoder for a single enum variant/struct:
|
||||
/// - `outer_pat_path` is the path to this enum variant/struct
|
||||
/// - `getarg` should retrieve the `uint`-th field with name `@str`.
|
||||
fn decode_static_fields(cx: &mut ExtCtxt,
|
||||
trait_span: Span,
|
||||
outer_pat_path: ast::Path,
|
||||
fields: &StaticFields,
|
||||
getarg: |&mut ExtCtxt, Span, InternedString, uint| -> P<Expr>)
|
||||
-> P<Expr> {
|
||||
fn decode_static_fields<F>(cx: &mut ExtCtxt,
|
||||
trait_span: Span,
|
||||
outer_pat_path: ast::Path,
|
||||
fields: &StaticFields,
|
||||
mut getarg: F)
|
||||
-> P<Expr> where
|
||||
F: FnMut(&mut ExtCtxt, Span, InternedString, uint) -> P<Expr>,
|
||||
{
|
||||
match *fields {
|
||||
Unnamed(ref fields) => {
|
||||
let path_expr = cx.expr_path(outer_pat_path);
|
||||
|
|
|
|||
|
|
@ -17,11 +17,13 @@ use ext::deriving::generic::ty::*;
|
|||
use parse::token::InternedString;
|
||||
use ptr::P;
|
||||
|
||||
pub fn expand_deriving_default(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: |P<Item>|) {
|
||||
pub fn expand_deriving_default<F>(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: F) where
|
||||
F: FnOnce(P<Item>),
|
||||
{
|
||||
let inline = cx.meta_word(span, InternedString::new("inline"));
|
||||
let attrs = vec!(cx.attribute(span, inline));
|
||||
let trait_def = TraitDef {
|
||||
|
|
|
|||
|
|
@ -97,11 +97,13 @@ use ext::deriving::generic::ty::*;
|
|||
use parse::token;
|
||||
use ptr::P;
|
||||
|
||||
pub fn expand_deriving_encodable(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: |P<Item>|) {
|
||||
pub fn expand_deriving_encodable<F>(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: F) where
|
||||
F: FnOnce(P<Item>),
|
||||
{
|
||||
let trait_def = TraitDef {
|
||||
span: span,
|
||||
attributes: Vec::new(),
|
||||
|
|
|
|||
|
|
@ -333,11 +333,13 @@ pub fn combine_substructure<'a>(f: CombineSubstructureFunc<'a>)
|
|||
|
||||
|
||||
impl<'a> TraitDef<'a> {
|
||||
pub fn expand(&self,
|
||||
cx: &mut ExtCtxt,
|
||||
mitem: &ast::MetaItem,
|
||||
item: &ast::Item,
|
||||
push: |P<ast::Item>|) {
|
||||
pub fn expand<F>(&self,
|
||||
cx: &mut ExtCtxt,
|
||||
mitem: &ast::MetaItem,
|
||||
item: &ast::Item,
|
||||
push: F) where
|
||||
F: FnOnce(P<ast::Item>),
|
||||
{
|
||||
let newitem = match item.node {
|
||||
ast::ItemStruct(ref struct_def, ref generics) => {
|
||||
self.expand_struct_def(cx,
|
||||
|
|
@ -1309,14 +1311,16 @@ impl<'a> TraitDef<'a> {
|
|||
|
||||
/// Fold the fields. `use_foldl` controls whether this is done
|
||||
/// left-to-right (`true`) or right-to-left (`false`).
|
||||
pub fn cs_fold(use_foldl: bool,
|
||||
f: |&mut ExtCtxt, Span, P<Expr>, P<Expr>, &[P<Expr>]| -> P<Expr>,
|
||||
base: P<Expr>,
|
||||
enum_nonmatch_f: EnumNonMatchCollapsedFunc,
|
||||
cx: &mut ExtCtxt,
|
||||
trait_span: Span,
|
||||
substructure: &Substructure)
|
||||
-> P<Expr> {
|
||||
pub fn cs_fold<F>(use_foldl: bool,
|
||||
mut f: F,
|
||||
base: P<Expr>,
|
||||
enum_nonmatch_f: EnumNonMatchCollapsedFunc,
|
||||
cx: &mut ExtCtxt,
|
||||
trait_span: Span,
|
||||
substructure: &Substructure)
|
||||
-> P<Expr> where
|
||||
F: FnMut(&mut ExtCtxt, Span, P<Expr>, P<Expr>, &[P<Expr>]) -> P<Expr>,
|
||||
{
|
||||
match *substructure.fields {
|
||||
EnumMatching(_, _, ref all_fields) | Struct(ref all_fields) => {
|
||||
if use_foldl {
|
||||
|
|
@ -1355,12 +1359,14 @@ pub fn cs_fold(use_foldl: bool,
|
|||
/// self_2.method(__arg_1_2, __arg_2_2)])
|
||||
/// ```
|
||||
#[inline]
|
||||
pub fn cs_same_method(f: |&mut ExtCtxt, Span, Vec<P<Expr>>| -> P<Expr>,
|
||||
enum_nonmatch_f: EnumNonMatchCollapsedFunc,
|
||||
cx: &mut ExtCtxt,
|
||||
trait_span: Span,
|
||||
substructure: &Substructure)
|
||||
-> P<Expr> {
|
||||
pub fn cs_same_method<F>(f: F,
|
||||
enum_nonmatch_f: EnumNonMatchCollapsedFunc,
|
||||
cx: &mut ExtCtxt,
|
||||
trait_span: Span,
|
||||
substructure: &Substructure)
|
||||
-> P<Expr> where
|
||||
F: FnOnce(&mut ExtCtxt, Span, Vec<P<Expr>>) -> P<Expr>,
|
||||
{
|
||||
match *substructure.fields {
|
||||
EnumMatching(_, _, ref all_fields) | Struct(ref all_fields) => {
|
||||
// call self_n.method(other_1_n, other_2_n, ...)
|
||||
|
|
@ -1388,14 +1394,16 @@ pub fn cs_same_method(f: |&mut ExtCtxt, Span, Vec<P<Expr>>| -> P<Expr>,
|
|||
/// fields. `use_foldl` controls whether this is done left-to-right
|
||||
/// (`true`) or right-to-left (`false`).
|
||||
#[inline]
|
||||
pub fn cs_same_method_fold(use_foldl: bool,
|
||||
f: |&mut ExtCtxt, Span, P<Expr>, P<Expr>| -> P<Expr>,
|
||||
base: P<Expr>,
|
||||
enum_nonmatch_f: EnumNonMatchCollapsedFunc,
|
||||
cx: &mut ExtCtxt,
|
||||
trait_span: Span,
|
||||
substructure: &Substructure)
|
||||
-> P<Expr> {
|
||||
pub fn cs_same_method_fold<F>(use_foldl: bool,
|
||||
mut f: F,
|
||||
base: P<Expr>,
|
||||
enum_nonmatch_f: EnumNonMatchCollapsedFunc,
|
||||
cx: &mut ExtCtxt,
|
||||
trait_span: Span,
|
||||
substructure: &Substructure)
|
||||
-> P<Expr> where
|
||||
F: FnMut(&mut ExtCtxt, Span, P<Expr>, P<Expr>) -> P<Expr>,
|
||||
{
|
||||
cs_same_method(
|
||||
|cx, span, vals| {
|
||||
if use_foldl {
|
||||
|
|
|
|||
|
|
@ -17,11 +17,13 @@ use ext::deriving::generic::ty::*;
|
|||
use parse::token::InternedString;
|
||||
use ptr::P;
|
||||
|
||||
pub fn expand_deriving_hash(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: |P<Item>|) {
|
||||
pub fn expand_deriving_hash<F>(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: F) where
|
||||
F: FnOnce(P<Item>),
|
||||
{
|
||||
|
||||
let (path, generics, args) = if cx.ecfg.deriving_hash_type_parameter {
|
||||
(Path::new_(vec!("std", "hash", "Hash"), None,
|
||||
|
|
|
|||
|
|
@ -18,11 +18,13 @@ use ext::deriving::generic::ty::*;
|
|||
use parse::token::InternedString;
|
||||
use ptr::P;
|
||||
|
||||
pub fn expand_deriving_from_primitive(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: |P<Item>|) {
|
||||
pub fn expand_deriving_from_primitive<F>(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: F) where
|
||||
F: FnOnce(P<Item>),
|
||||
{
|
||||
let inline = cx.meta_word(span, InternedString::new("inline"));
|
||||
let attrs = vec!(cx.attribute(span, inline));
|
||||
let trait_def = TraitDef {
|
||||
|
|
|
|||
|
|
@ -17,11 +17,13 @@ use ext::deriving::generic::*;
|
|||
use ext::deriving::generic::ty::*;
|
||||
use ptr::P;
|
||||
|
||||
pub fn expand_deriving_rand(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: |P<Item>|) {
|
||||
pub fn expand_deriving_rand<F>(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: F) where
|
||||
F: FnOnce(P<Item>),
|
||||
{
|
||||
let trait_def = TraitDef {
|
||||
span: span,
|
||||
attributes: Vec::new(),
|
||||
|
|
@ -64,7 +66,7 @@ fn rand_substructure(cx: &mut ExtCtxt, trait_span: Span, substr: &Substructure)
|
|||
cx.ident_of("Rand"),
|
||||
cx.ident_of("rand")
|
||||
);
|
||||
let rand_call = |cx: &mut ExtCtxt, span| {
|
||||
let mut rand_call = |&mut: cx: &mut ExtCtxt, span| {
|
||||
cx.expr_call_global(span,
|
||||
rand_ident.clone(),
|
||||
vec!(rng.clone()))
|
||||
|
|
@ -133,12 +135,14 @@ fn rand_substructure(cx: &mut ExtCtxt, trait_span: Span, substr: &Substructure)
|
|||
_ => cx.bug("Non-static method in `deriving(Rand)`")
|
||||
};
|
||||
|
||||
fn rand_thing(cx: &mut ExtCtxt,
|
||||
trait_span: Span,
|
||||
ctor_path: ast::Path,
|
||||
summary: &StaticFields,
|
||||
rand_call: |&mut ExtCtxt, Span| -> P<Expr>)
|
||||
-> P<Expr> {
|
||||
fn rand_thing<F>(cx: &mut ExtCtxt,
|
||||
trait_span: Span,
|
||||
ctor_path: ast::Path,
|
||||
summary: &StaticFields,
|
||||
mut rand_call: F)
|
||||
-> P<Expr> where
|
||||
F: FnMut(&mut ExtCtxt, Span) -> P<Expr>,
|
||||
{
|
||||
let path = cx.expr_path(ctor_path.clone());
|
||||
match *summary {
|
||||
Unnamed(ref fields) => {
|
||||
|
|
|
|||
|
|
@ -21,11 +21,13 @@ use ptr::P;
|
|||
|
||||
use std::collections::HashMap;
|
||||
|
||||
pub fn expand_deriving_show(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: |P<Item>|) {
|
||||
pub fn expand_deriving_show<F>(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: F) where
|
||||
F: FnOnce(P<Item>),
|
||||
{
|
||||
// &mut ::std::fmt::Formatter
|
||||
let fmtr = Ptr(box Literal(Path::new(vec!("std", "fmt", "Formatter"))),
|
||||
Borrowed(None, ast::MutMutable));
|
||||
|
|
|
|||
|
|
@ -17,11 +17,13 @@ use ext::deriving::generic::ty::*;
|
|||
use parse::token::InternedString;
|
||||
use ptr::P;
|
||||
|
||||
pub fn expand_deriving_zero(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: |P<Item>|) {
|
||||
pub fn expand_deriving_zero<F>(cx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
mitem: &MetaItem,
|
||||
item: &Item,
|
||||
push: F) where
|
||||
F: FnOnce(P<Item>),
|
||||
{
|
||||
let inline = cx.meta_word(span, InternedString::new("inline"));
|
||||
let attrs = vec!(cx.attribute(span, inline));
|
||||
let trait_def = TraitDef {
|
||||
|
|
|
|||
|
|
@ -238,11 +238,13 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
|
|||
/// of expansion and the mark which must be applied to the result.
|
||||
/// Our current interface doesn't allow us to apply the mark to the
|
||||
/// result until after calling make_expr, make_items, etc.
|
||||
fn expand_mac_invoc<T>(mac: ast::Mac, span: codemap::Span,
|
||||
parse_thunk: |Box<MacResult>|->Option<T>,
|
||||
mark_thunk: |T,Mrk|->T,
|
||||
fld: &mut MacroExpander)
|
||||
-> Option<T>
|
||||
fn expand_mac_invoc<T, F, G>(mac: ast::Mac, span: codemap::Span,
|
||||
parse_thunk: F,
|
||||
mark_thunk: G,
|
||||
fld: &mut MacroExpander)
|
||||
-> Option<T> where
|
||||
F: FnOnce(Box<MacResult>) -> Option<T>,
|
||||
G: FnOnce(T, Mrk) -> T,
|
||||
{
|
||||
match mac.node {
|
||||
// it would almost certainly be cleaner to pass the whole
|
||||
|
|
|
|||
|
|
@ -105,9 +105,11 @@ pub fn apply_renames(renames: &RenameList, ctxt: SyntaxContext) -> SyntaxContext
|
|||
}
|
||||
|
||||
/// Fetch the SCTable from TLS, create one if it doesn't yet exist.
|
||||
pub fn with_sctable<T>(op: |&SCTable| -> T) -> T {
|
||||
pub fn with_sctable<T, F>(op: F) -> T where
|
||||
F: FnOnce(&SCTable) -> T,
|
||||
{
|
||||
thread_local!(static SCTABLE_KEY: SCTable = new_sctable_internal())
|
||||
SCTABLE_KEY.with(|slot| op(slot))
|
||||
SCTABLE_KEY.with(move |slot| op(slot))
|
||||
}
|
||||
|
||||
// Make a fresh syntax context table with EmptyCtxt in slot zero
|
||||
|
|
@ -167,12 +169,14 @@ type ResolveTable = HashMap<(Name,SyntaxContext),Name>;
|
|||
|
||||
// okay, I admit, putting this in TLS is not so nice:
|
||||
// fetch the SCTable from TLS, create one if it doesn't yet exist.
|
||||
fn with_resolve_table_mut<T>(op: |&mut ResolveTable| -> T) -> T {
|
||||
fn with_resolve_table_mut<T, F>(op: F) -> T where
|
||||
F: FnOnce(&mut ResolveTable) -> T,
|
||||
{
|
||||
thread_local!(static RESOLVE_TABLE_KEY: RefCell<ResolveTable> = {
|
||||
RefCell::new(HashMap::new())
|
||||
})
|
||||
|
||||
RESOLVE_TABLE_KEY.with(|slot| op(&mut *slot.borrow_mut()))
|
||||
RESOLVE_TABLE_KEY.with(move |slot| op(&mut *slot.borrow_mut()))
|
||||
}
|
||||
|
||||
/// Resolve a syntax object to a name, per MTWT.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue