mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-23 23:34:48 +00:00
Revert "Remove the environment argument from bare functions"
This reverts commit 1b0f1f0b79
.
This commit is contained in:
parent
070c39ca1d
commit
3bb020aaf8
@ -95,16 +95,7 @@ fn type_of_fn(cx: @crate_ctxt, sp: span, proto: ast::proto,
|
|||||||
// Arg 1: Env (closure-bindings / self-obj)
|
// Arg 1: Env (closure-bindings / self-obj)
|
||||||
if is_method {
|
if is_method {
|
||||||
atys += [T_ptr(cx.rust_object_type)];
|
atys += [T_ptr(cx.rust_object_type)];
|
||||||
} else {
|
} else { atys += [T_opaque_closure_ptr(*cx)]; }
|
||||||
alt proto {
|
|
||||||
ast::proto_bare. {
|
|
||||||
// Bare functions have no environment
|
|
||||||
}
|
|
||||||
_ {
|
|
||||||
atys += [T_opaque_closure_ptr(*cx)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Args >2: ty params, if not acquired via capture...
|
// Args >2: ty params, if not acquired via capture...
|
||||||
if !is_method {
|
if !is_method {
|
||||||
@ -3549,15 +3540,7 @@ fn trans_bind_thunk(cx: @local_ctxt, sp: span, incoming_fty: ty::t,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set up the three implicit arguments to the thunk.
|
// Set up the three implicit arguments to the thunk.
|
||||||
let llargs: [ValueRef] = alt ty::ty_fn_proto(ccx.tcx, outgoing_fty) {
|
let llargs: [ValueRef] = [llretptr, lltargetenv];
|
||||||
ast::proto_bare. {
|
|
||||||
// Bare functions don't take an environment
|
|
||||||
[llretptr]
|
|
||||||
}
|
|
||||||
_ {
|
|
||||||
[llretptr, lltargetenv]
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Copy in the type parameters.
|
// Copy in the type parameters.
|
||||||
let i: uint = 0u;
|
let i: uint = 0u;
|
||||||
@ -3840,12 +3823,7 @@ fn trans_args(cx: @block_ctxt, outer_cx: @block_ctxt, llenv: ValueRef,
|
|||||||
} else { llargs += [llretslot]; }
|
} else { llargs += [llretslot]; }
|
||||||
|
|
||||||
// Arg 1: Env (closure-bindings / self-obj)
|
// Arg 1: Env (closure-bindings / self-obj)
|
||||||
alt ty::ty_fn_proto(tcx, fn_ty) {
|
llargs += [llenv];
|
||||||
ast::proto_bare. { }
|
|
||||||
_ {
|
|
||||||
llargs += [llenv];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Args >2: ty_params ...
|
// Args >2: ty_params ...
|
||||||
llargs += lltydescs;
|
llargs += lltydescs;
|
||||||
@ -5097,7 +5075,6 @@ fn new_fn_ctxt_w_id(cx: @local_ctxt, sp: span, llfndecl: ValueRef,
|
|||||||
id: ast::node_id, rstyle: ast::ret_style)
|
id: ast::node_id, rstyle: ast::ret_style)
|
||||||
-> @fn_ctxt {
|
-> @fn_ctxt {
|
||||||
let llbbs = mk_standard_basic_blocks(llfndecl);
|
let llbbs = mk_standard_basic_blocks(llfndecl);
|
||||||
// FIXME: llenv is not correct for bare functions
|
|
||||||
ret @{llfn: llfndecl,
|
ret @{llfn: llfndecl,
|
||||||
llenv: llvm::LLVMGetParam(llfndecl, 1u),
|
llenv: llvm::LLVMGetParam(llfndecl, 1u),
|
||||||
llretptr: llvm::LLVMGetParam(llfndecl, 0u),
|
llretptr: llvm::LLVMGetParam(llfndecl, 0u),
|
||||||
@ -5127,13 +5104,6 @@ fn new_fn_ctxt(cx: @local_ctxt, sp: span, llfndecl: ValueRef) -> @fn_ctxt {
|
|||||||
ret new_fn_ctxt_w_id(cx, sp, llfndecl, -1, ast::return_val);
|
ret new_fn_ctxt_w_id(cx, sp, llfndecl, -1, ast::return_val);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn implicit_args_for_fn(proto: ast::proto) -> uint {
|
|
||||||
alt proto {
|
|
||||||
ast::proto_bare. { 1u }
|
|
||||||
_ { 2u }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NB: must keep 4 fns in sync:
|
// NB: must keep 4 fns in sync:
|
||||||
//
|
//
|
||||||
// - type_of_fn
|
// - type_of_fn
|
||||||
@ -5151,8 +5121,10 @@ fn implicit_args_for_fn(proto: ast::proto) -> uint {
|
|||||||
fn create_llargs_for_fn_args(cx: @fn_ctxt, proto: ast::proto,
|
fn create_llargs_for_fn_args(cx: @fn_ctxt, proto: ast::proto,
|
||||||
ty_self: option::t<ty::t>, ret_ty: ty::t,
|
ty_self: option::t<ty::t>, ret_ty: ty::t,
|
||||||
args: [ast::arg], ty_params: [ast::ty_param]) {
|
args: [ast::arg], ty_params: [ast::ty_param]) {
|
||||||
// Skip the implicit arguments
|
// Skip the implicit arguments 0, and 1. TODO: Pull out 2u and define
|
||||||
let arg_n = implicit_args_for_fn(proto);
|
// it as a constant, since we're using it in several places in trans this
|
||||||
|
// way.
|
||||||
|
let arg_n = 2u;
|
||||||
alt ty_self {
|
alt ty_self {
|
||||||
some(tt) { cx.llself = some::<val_self_pair>({v: cx.llenv, t: tt}); }
|
some(tt) { cx.llself = some::<val_self_pair>({v: cx.llenv, t: tt}); }
|
||||||
none. {
|
none. {
|
||||||
|
Loading…
Reference in New Issue
Block a user