mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-29 23:04:49 +00:00
make closure borrowed example work
This commit is contained in:
parent
e4f0dc8897
commit
3b267392b3
3 changed files with 40 additions and 5 deletions
|
@ -209,6 +209,18 @@ mod cli_run {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[serial(closure_borrowed)]
|
||||||
|
fn run_closure_borrowed_not_optimized() {
|
||||||
|
check_output(
|
||||||
|
&example_file("benchmarks", "ClosureBorrowed.roc"),
|
||||||
|
"closure-borrowed",
|
||||||
|
&[],
|
||||||
|
"",
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// #[test]
|
// #[test]
|
||||||
// #[serial(effect)]
|
// #[serial(effect)]
|
||||||
// fn run_effect_unoptimized() {
|
// fn run_effect_unoptimized() {
|
||||||
|
|
|
@ -17,7 +17,7 @@ use roc_types::subs::{Content, FlatType, Subs, Variable};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use ven_pretty::{BoxAllocator, DocAllocator, DocBuilder};
|
use ven_pretty::{BoxAllocator, DocAllocator, DocBuilder};
|
||||||
|
|
||||||
pub const PRETTY_PRINT_IR_SYMBOLS: bool = false;
|
pub const PRETTY_PRINT_IR_SYMBOLS: bool = true;
|
||||||
|
|
||||||
macro_rules! return_on_layout_error {
|
macro_rules! return_on_layout_error {
|
||||||
($env:expr, $layout_result:expr) => {
|
($env:expr, $layout_result:expr) => {
|
||||||
|
@ -5505,7 +5505,13 @@ fn reuse_function_symbol<'a>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let expr = Expr::FunctionPointer(original, function_ptr_layout.clone());
|
let expr = call_by_pointer(
|
||||||
|
env,
|
||||||
|
procs,
|
||||||
|
layout_cache,
|
||||||
|
original,
|
||||||
|
function_ptr_layout.clone(),
|
||||||
|
);
|
||||||
|
|
||||||
stmt = Stmt::Let(
|
stmt = Stmt::Let(
|
||||||
function_pointer,
|
function_pointer,
|
||||||
|
@ -5527,7 +5533,7 @@ fn reuse_function_symbol<'a>(
|
||||||
|
|
||||||
Stmt::Let(
|
Stmt::Let(
|
||||||
symbol,
|
symbol,
|
||||||
Expr::FunctionPointer(original, layout.clone()),
|
call_by_pointer(env, procs, layout_cache, original, layout.clone()),
|
||||||
layout,
|
layout,
|
||||||
env.arena.alloc(result),
|
env.arena.alloc(result),
|
||||||
)
|
)
|
||||||
|
@ -5611,11 +5617,13 @@ fn call_by_pointer<'a>(
|
||||||
symbol: Symbol,
|
symbol: Symbol,
|
||||||
layout: Layout<'a>,
|
layout: Layout<'a>,
|
||||||
) -> Expr<'a> {
|
) -> Expr<'a> {
|
||||||
|
let other = env.unique_symbol();
|
||||||
|
|
||||||
procs
|
procs
|
||||||
.passed_by_pointer
|
.passed_by_pointer
|
||||||
.insert((symbol, layout.clone()), symbol);
|
.insert((symbol, layout.clone()), other);
|
||||||
|
|
||||||
Expr::FunctionPointer(symbol, layout)
|
Expr::FunctionPointer(other, layout)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_needed_external<'a>(
|
fn add_needed_external<'a>(
|
||||||
|
|
15
examples/benchmarks/ClosureBorrowed.roc
Normal file
15
examples/benchmarks/ClosureBorrowed.roc
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
app "closure-borrowed"
|
||||||
|
packages { base: "platform" }
|
||||||
|
imports [base.Task]
|
||||||
|
provides [ main ] to base
|
||||||
|
|
||||||
|
# see https://github.com/rtfeldman/roc/issues/985
|
||||||
|
|
||||||
|
main : Task.Task {} []
|
||||||
|
main =
|
||||||
|
Task.succeed (foo toUnitBorrowed "a long string such that it's malloced")
|
||||||
|
|> Task.map (\_ -> {})
|
||||||
|
|
||||||
|
toUnitBorrowed = \x -> Str.countGraphemes x
|
||||||
|
|
||||||
|
foo = \f, x -> f x
|
Loading…
Add table
Add a link
Reference in a new issue