From 3aee39a6ec910bde6ae9a5423b11aaaad4a1b089 Mon Sep 17 00:00:00 2001 From: Eric Holk Date: Wed, 25 Jul 2012 17:29:34 -0700 Subject: Add #[inline(never)], and also fixed inlining on vec::push --- src/libsyntax/attr.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src/libsyntax') diff --git a/src/libsyntax/attr.rs b/src/libsyntax/attr.rs index 859bc70bfd6..4587a5b8b29 100644 --- a/src/libsyntax/attr.rs +++ b/src/libsyntax/attr.rs @@ -364,7 +364,8 @@ fn foreign_abi(attrs: ~[ast::attribute]) -> either<~str, ast::foreign_abi> { enum inline_attr { ia_none, ia_hint, - ia_always + ia_always, + ia_never, } /// True if something like #[inline] is found in the list of attrs. @@ -376,6 +377,9 @@ fn find_inline_attr(attrs: ~[ast::attribute]) -> inline_attr { ast::meta_list(@~"inline", items) { if !vec::is_empty(find_meta_items_by_name(items, ~"always")) { ia_always + } else if !vec::is_empty( + find_meta_items_by_name(items, ~"never")) { + ia_never } else { ia_hint } -- cgit 1.4.1-3-g733a5 From ab1defb1ce8d40d03fe0074b56d3066873f62911 Mon Sep 17 00:00:00 2001 From: Eric Holk Date: Wed, 25 Jul 2012 19:13:58 -0700 Subject: Make parsing about 0.3 seconds faster. --- src/libsyntax/parse/common.rs | 19 ++++++++++--------- src/libsyntax/parse/lexer.rs | 6 +++--- src/libsyntax/parse/parser.rs | 2 +- 3 files changed, 14 insertions(+), 13 deletions(-) (limited to 'src/libsyntax') diff --git a/src/libsyntax/parse/common.rs b/src/libsyntax/parse/common.rs index 9126bbb3be4..e35b762f972 100644 --- a/src/libsyntax/parse/common.rs +++ b/src/libsyntax/parse/common.rs @@ -141,17 +141,18 @@ impl parser_common of parser_common for parser { fn eat_keyword(word: ~str) -> bool { self.require_keyword(word); - // FIXME (#13042): this gratuitous use of @ is to - // workaround LLVM bug. - alt @self.token { - @token::IDENT(sid, false) { + let mut bump = false; + let val = alt self.token { + token::IDENT(sid, false) { if str::eq(word, *self.get_str(sid)) { - self.bump(); - ret true; - } else { ret false; } + bump = true; + true + } else { false } } - _ { ret false; } - } + _ { false } + }; + if bump { self.bump() } + val } fn expect_keyword(word: ~str) { diff --git a/src/libsyntax/parse/lexer.rs b/src/libsyntax/parse/lexer.rs index 7afdc301b02..94e12e16185 100644 --- a/src/libsyntax/parse/lexer.rs +++ b/src/libsyntax/parse/lexer.rs @@ -14,7 +14,7 @@ iface reader { fn next_token() -> {tok: token::token, sp: span}; fn fatal(~str) -> !; fn span_diag() -> span_handler; - fn interner() -> @interner<@~str>; + pure fn interner() -> @interner<@~str>; fn peek() -> {tok: token::token, sp: span}; fn dup() -> reader; } @@ -79,7 +79,7 @@ impl string_reader_as_reader of reader for string_reader { self.span_diagnostic.span_fatal(copy self.peek_span, m) } fn span_diag() -> span_handler { self.span_diagnostic } - fn interner() -> @interner<@~str> { self.interner } + pure fn interner() -> @interner<@~str> { self.interner } fn peek() -> {tok: token::token, sp: span} { {tok: self.peek_tok, sp: self.peek_span} } @@ -101,7 +101,7 @@ impl tt_reader_as_reader of reader for tt_reader { self.sp_diag.span_fatal(copy self.cur_span, m); } fn span_diag() -> span_handler { self.sp_diag } - fn interner() -> @interner<@~str> { self.interner } + pure fn interner() -> @interner<@~str> { self.interner } fn peek() -> {tok: token::token, sp: span} { { tok: self.cur_tok, sp: self.cur_span } } diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index de772b0ff1c..21248b496a4 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -232,7 +232,7 @@ class parser { fn warn(m: ~str) { self.sess.span_diagnostic.span_warn(copy self.span, m) } - fn get_str(i: token::str_num) -> @~str { + pure fn get_str(i: token::str_num) -> @~str { interner::get(*self.reader.interner(), i) } fn get_id() -> node_id { next_node_id(self.sess) } -- cgit 1.4.1-3-g733a5 From fec749df169945f856fcfe0c5ee265616a224d3a Mon Sep 17 00:00:00 2001 From: Eric Holk Date: Wed, 25 Jul 2012 15:28:36 -0700 Subject: Comments Only: Remove outdated FIXMEs. Fixes #2886. --- src/libsyntax/ext/pipes/ast_builder.rs | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/libsyntax') diff --git a/src/libsyntax/ext/pipes/ast_builder.rs b/src/libsyntax/ext/pipes/ast_builder.rs index c9b35e561bb..f367fb63985 100644 --- a/src/libsyntax/ext/pipes/ast_builder.rs +++ b/src/libsyntax/ext/pipes/ast_builder.rs @@ -183,7 +183,6 @@ impl ast_builder of ext_ctxt_ast_builder for ext_ctxt { {mode: ast::infer(self.next_id()), ty: ty, ident: name, - // FIXME #2886: should this be the same as the infer id? id: self.next_id()} } @@ -280,7 +279,6 @@ impl ast_builder of ext_ctxt_ast_builder for ext_ctxt { } fn ty_path_ast_builder(path: @ast::path) -> @ast::ty { - // FIXME #2886: make sure the node ids are legal. @{id: self.next_id(), node: ast::ty_path(path, self.next_id()), span: self.empty_span()} -- cgit 1.4.1-3-g733a5 From afd9a75c9ebf56b0a387928cdbef7d086200f534 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Thu, 26 Jul 2012 15:29:33 -0700 Subject: rustc: Fix cross-crate max/min-class-style constructors --- src/libsyntax/ast.rs | 2 +- src/libsyntax/ast_util.rs | 2 +- src/rustc/metadata/decoder.rs | 6 ++++-- src/rustc/metadata/encoder.rs | 11 ++++++++++- src/rustc/middle/astencode.rs | 4 ++-- src/rustc/middle/borrowck/categorization.rs | 2 +- src/rustc/middle/region.rs | 2 +- src/rustc/middle/resolve3.rs | 23 +++++++++++++++-------- src/rustc/middle/ty.rs | 2 +- src/rustc/middle/typeck/astconv.rs | 2 +- src/rustc/middle/typeck/check.rs | 4 ++-- src/rustc/middle/typeck/check/regionmanip.rs | 2 +- 12 files changed, 40 insertions(+), 22 deletions(-) (limited to 'src/libsyntax') diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index fb27724e369..4988adf9373 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -87,7 +87,7 @@ enum def { def_upvar(node_id /* local id of closed over var */, @def /* closed over def */, node_id /* expr node that creates the closure */), - def_class(def_id), + def_class(def_id, bool /* has constructor */), def_region(node_id) } diff --git a/src/libsyntax/ast_util.rs b/src/libsyntax/ast_util.rs index 37e8671facd..0cf593efdc3 100644 --- a/src/libsyntax/ast_util.rs +++ b/src/libsyntax/ast_util.rs @@ -53,7 +53,7 @@ pure fn def_id_of_def(d: def) -> def_id { def_fn(id, _) | def_mod(id) | def_foreign_mod(id) | def_const(id) | def_variant(_, id) | def_ty(id) | def_ty_param(id, _) | - def_use(id) | def_class(id) { id } + def_use(id) | def_class(id, _) { id } def_arg(id, _) | def_local(id, _) | def_self(id) | def_upvar(id, _, _) | def_binding(id) | def_region(id) { local_def(id) diff --git a/src/rustc/metadata/decoder.rs b/src/rustc/metadata/decoder.rs index a5261d039c1..83684413641 100644 --- a/src/rustc/metadata/decoder.rs +++ b/src/rustc/metadata/decoder.rs @@ -283,7 +283,8 @@ fn item_to_def_like(item: ebml::doc, did: ast::def_id, cnum: ast::crate_num) let fam_ch = item_family(item); alt fam_ch { 'c' { dl_def(ast::def_const(did)) } - 'C' { dl_def(ast::def_class(did)) } + 'C' { dl_def(ast::def_class(did, true)) } + 'S' { dl_def(ast::def_class(did, false)) } 'u' { dl_def(ast::def_fn(did, ast::unsafe_fn)) } 'f' { dl_def(ast::def_fn(did, ast::impure_fn)) } 'p' { dl_def(ast::def_fn(did, ast::pure_fn)) } @@ -707,7 +708,7 @@ fn family_has_type_params(fam_ch: char) -> bool { alt check fam_ch { 'c' | 'T' | 'm' | 'n' | 'g' | 'h' | 'j' { false } 'f' | 'u' | 'p' | 'F' | 'U' | 'P' | 'y' | 't' | 'v' | 'i' | 'I' | 'C' - | 'a' + | 'a' | 'S' { true } } } @@ -751,6 +752,7 @@ fn item_family_to_str(fam: char) -> ~str { 'i' { ret ~"impl"; } 'I' { ret ~"trait"; } 'C' { ret ~"class"; } + 'S' { ret ~"struct"; } 'g' { ret ~"public field"; } 'j' { ret ~"private field"; } } diff --git a/src/rustc/metadata/encoder.rs b/src/rustc/metadata/encoder.rs index b4818959344..e1ed9fe396a 100644 --- a/src/rustc/metadata/encoder.rs +++ b/src/rustc/metadata/encoder.rs @@ -663,7 +663,16 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item, /* Now, make an item for the class itself */ ebml_w.start_tag(tag_items_data_item); encode_def_id(ebml_w, local_def(item.id)); - encode_family(ebml_w, 'C'); + + alt ctor { + none { + encode_family(ebml_w, 'S'); + } + some(_) { + encode_family(ebml_w, 'C'); + } + } + encode_type_param_bounds(ebml_w, ecx, tps); encode_type(ecx, ebml_w, node_id_to_type(tcx, item.id)); encode_name(ebml_w, item.ident); diff --git a/src/rustc/middle/astencode.rs b/src/rustc/middle/astencode.rs index 002b4d97e23..1f5f7c4518d 100644 --- a/src/rustc/middle/astencode.rs +++ b/src/rustc/middle/astencode.rs @@ -369,8 +369,8 @@ impl of tr for ast::def { ast::def_upvar(nid1, def, nid2) { ast::def_upvar(xcx.tr_id(nid1), @(*def).tr(xcx), xcx.tr_id(nid2)) } - ast::def_class(did) { - ast::def_class(did.tr(xcx)) + ast::def_class(did, has_constructor) { + ast::def_class(did.tr(xcx), has_constructor) } ast::def_region(nid) { ast::def_region(xcx.tr_id(nid)) } } diff --git a/src/rustc/middle/borrowck/categorization.rs b/src/rustc/middle/borrowck/categorization.rs index f5879145a9d..4088945e550 100644 --- a/src/rustc/middle/borrowck/categorization.rs +++ b/src/rustc/middle/borrowck/categorization.rs @@ -196,7 +196,7 @@ impl public_methods for borrowck_ctxt { ast::def_foreign_mod(_) | ast::def_const(_) | ast::def_use(_) | ast::def_variant(_, _) | ast::def_ty(_) | ast::def_prim_ty(_) | - ast::def_ty_param(_, _) | ast::def_class(_) | + ast::def_ty_param(_, _) | ast::def_class(_, _) | ast::def_region(_) { @{id:id, span:span, cat:cat_special(sk_static_item), lp:none, diff --git a/src/rustc/middle/region.rs b/src/rustc/middle/region.rs index ca00aeaa0f4..cc6874bc967 100644 --- a/src/rustc/middle/region.rs +++ b/src/rustc/middle/region.rs @@ -467,7 +467,7 @@ fn determine_rp_in_ty(ty: @ast::ty, alt ty.node { ast::ty_path(_, id) { alt cx.def_map.get(id) { - ast::def_ty(did) | ast::def_class(did) { + ast::def_ty(did) | ast::def_class(did, _) { if did.crate == ast::local_crate { cx.add_dep(did.node, cx.item_id); } else { diff --git a/src/rustc/middle/resolve3.rs b/src/rustc/middle/resolve3.rs index bddf83c429e..e75268cde7f 100644 --- a/src/rustc/middle/resolve3.rs +++ b/src/rustc/middle/resolve3.rs @@ -41,7 +41,7 @@ import syntax::visit::{visit_mod, visit_ty, vt}; import box::ptr_eq; import dvec::{dvec, extensions}; -import option::get; +import option::{get, is_some}; import str::{connect, split_str}; import vec::pop; @@ -604,7 +604,7 @@ class Resolver { let unused_import_lint_level: level; let trait_info: hashmap>; - let structs: hashmap; + let structs: hashmap; // The number of imports that are currently unresolved. let mut unresolved_imports: uint; @@ -926,7 +926,8 @@ class Resolver { (*name_bindings).define_impl(impl_info); // Record the def ID of this struct. - self.structs.insert(local_def(item.id), ()); + self.structs.insert(local_def(item.id), + is_some(optional_ctor)); visit_item(item, new_parent, visitor); } @@ -1378,12 +1379,16 @@ class Resolver { (*child_name_bindings).define_type(def); } - def_class(def_id) { + def_class(def_id, has_constructor) { #debug("(building reduced graph for external \ - crate) building value and type %s", - final_ident); - (*child_name_bindings).define_value(def); + crate) building type %s (value? %d)", + final_ident, + if has_constructor { 1 } else { 0 }); (*child_name_bindings).define_type(def); + + if has_constructor { + (*child_name_bindings).define_value(def); + } } def_self(*) | def_arg(*) | def_local(*) | def_prim_ty(*) | def_ty_param(*) | def_binding(*) | @@ -4201,7 +4206,9 @@ class Resolver { some(definition @ def_ty(class_id)) if self.structs.contains_key(class_id) { - self.record_def(expr.id, def_class(class_id)); + let has_constructor = self.structs.get(class_id); + let class_def = def_class(class_id, has_constructor); + self.record_def(expr.id, class_def); } _ { self.session.span_err(path.span, diff --git a/src/rustc/middle/ty.rs b/src/rustc/middle/ty.rs index b6b1873b1dc..465aeebe3af 100644 --- a/src/rustc/middle/ty.rs +++ b/src/rustc/middle/ty.rs @@ -2587,7 +2587,7 @@ fn type_err_to_str(cx: ctxt, err: type_err) -> ~str { fn def_has_ty_params(def: ast::def) -> bool { alt def { - ast::def_fn(_, _) | ast::def_variant(_, _) | ast::def_class(_) + ast::def_fn(_, _) | ast::def_variant(_, _) | ast::def_class(_, _) { true } _ { false } } diff --git a/src/rustc/middle/typeck/astconv.rs b/src/rustc/middle/typeck/astconv.rs index ebd189a15b7..3baea12ab48 100644 --- a/src/rustc/middle/typeck/astconv.rs +++ b/src/rustc/middle/typeck/astconv.rs @@ -270,7 +270,7 @@ fn ast_ty_to_ty( path_to_str(path))); } some(d) { d }}; alt a_def { - ast::def_ty(did) | ast::def_class(did) { + ast::def_ty(did) | ast::def_class(did, _) { ast_path_to_ty(self, rscope, did, path, id).ty } ast::def_prim_ty(nty) { diff --git a/src/rustc/middle/typeck/check.rs b/src/rustc/middle/typeck/check.rs index 0b78fd1a505..eaf0e90b26d 100644 --- a/src/rustc/middle/typeck/check.rs +++ b/src/rustc/middle/typeck/check.rs @@ -1649,7 +1649,7 @@ fn check_expr_with_unifier(fcx: @fn_ctxt, // Resolve the path. let class_id; alt tcx.def_map.find(id) { - some(ast::def_class(type_def_id)) => { + some(ast::def_class(type_def_id, _)) => { class_id = type_def_id; } _ => { @@ -2160,7 +2160,7 @@ fn ty_param_bounds_and_ty_for_def(fcx: @fn_ctxt, sp: span, defn: ast::def) -> } ast::def_fn(id, _) | ast::def_const(id) | - ast::def_variant(_, id) | ast::def_class(id) { + ast::def_variant(_, id) | ast::def_class(id, _) { ret ty::lookup_item_type(fcx.ccx.tcx, id); } ast::def_binding(nid) { diff --git a/src/rustc/middle/typeck/check/regionmanip.rs b/src/rustc/middle/typeck/check/regionmanip.rs index 2231d9b320a..d1052fd6a2a 100644 --- a/src/rustc/middle/typeck/check/regionmanip.rs +++ b/src/rustc/middle/typeck/check/regionmanip.rs @@ -200,7 +200,7 @@ fn region_of(fcx: @fn_ctxt, expr: @ast::expr) -> ty::region { ast::def_foreign_mod(_) | ast::def_const(_) | ast::def_use(_) | ast::def_variant(_, _) | ast::def_ty(_) | ast::def_prim_ty(_) | - ast::def_ty_param(_, _) | ast::def_class(_) | + ast::def_ty_param(_, _) | ast::def_class(_, _) | ast::def_region(_) { ty::re_static } -- cgit 1.4.1-3-g733a5