Skip to content

Commit dbd8310

Browse files
bors[bot]Marwes
andauthored
Merge #851
851: fix: Handle errors when pushing a BTreeMap r=Marwes a=Marwes Also move the insert_string hack into std.map so std.json.de does not need to be imported Fixes #847 Co-authored-by: Markus Westerlind <[email protected]>
2 parents a290f17 + bd8ad34 commit dbd8310

File tree

5 files changed

+61
-22
lines changed

5 files changed

+61
-22
lines changed

std/json/de.glu

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -253,9 +253,6 @@ let run ?de value : [Deserialize a] -> Value -> Result Error a =
253253
do state = de.deserializer value
254254
Ok state.value
255255

256-
#[doc(hidden)]
257-
let insert_string : String -> a -> Map String a -> Map String a = std_map.insert
258-
259256
let bool_deserializer : Deserialize Bool = { deserializer = bool }
260257

261258
let int_deserializer : Deserialize Int = { deserializer = int }
@@ -317,6 +314,4 @@ let map_deserializer : [Deserialize a] -> Deserialize (Map String a) =
317314
list_deserializer,
318315
array_deserializer,
319316
map_deserializer,
320-
321-
insert_string,
322317
}

std/map.glu

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ let keys : [Ord k] -> Map k a -> List k = foldr_with_key (\k _ acc -> Cons k acc
124124
/// Returns a list of all values in the map.
125125
let values : [Ord k] -> Map k a -> List a = foldr Cons Nil
126126

127+
128+
129+
#[doc(hidden)]
130+
let insert_string : String -> a -> Map String a -> Map String a = insert
131+
127132
{
128133
Map,
129134

@@ -146,4 +151,6 @@ let values : [Ord k] -> Map k a -> List a = foldr Cons Nil
146151
to_list,
147152
keys,
148153
values,
154+
155+
insert_string,
149156
}

tests/api.rs

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ extern crate gluon_vm;
66
#[macro_use]
77
extern crate gluon_codegen;
88

9-
use std::sync::Arc;
9+
use std::{collections::BTreeMap, sync::Arc};
1010

1111
use futures::prelude::*;
1212

1313
use gluon::{
1414
base::types::{Alias, ArcType, Type},
15-
import::{add_extern_module, Import},
15+
import::{add_extern_module, add_extern_module_with_deps, Import},
1616
query::Compilation,
1717
vm::{
1818
api::{
@@ -368,6 +368,41 @@ fn use_rust_created_record_as_polymorphic() {
368368
assert_eq!(result, 1);
369369
}
370370

371+
#[test]
372+
fn return_btreemap() {
373+
let _ = ::env_logger::try_init();
374+
375+
let vm = make_vm();
376+
377+
add_extern_module_with_deps(
378+
&vm,
379+
"test",
380+
|vm| {
381+
ExternModule::new(
382+
vm,
383+
primitive!(1, "test", |()| {
384+
vec![("a".to_string(), 1), ("b".to_string(), 2)]
385+
.into_iter()
386+
.collect::<BTreeMap<_, _>>()
387+
}),
388+
)
389+
},
390+
vec!["std.map".into(), "std.json.de".into()],
391+
);
392+
393+
vm.run_expr::<()>("", "let _ = import! test in ()")
394+
.unwrap_or_else(|err| panic!("{}", err));
395+
let (result, _) = vm
396+
.run_expr::<BTreeMap<_, _>>("", "(import! test) ()")
397+
.unwrap_or_else(|err| panic!("{}", err));
398+
assert_eq!(
399+
result,
400+
vec![("a".to_string(), 1), ("b".to_string(), 2)]
401+
.into_iter()
402+
.collect::<BTreeMap<_, _>>()
403+
);
404+
}
405+
371406
#[test]
372407
fn get_value_boxed_or_unboxed() {
373408
let _ = ::env_logger::try_init();

vm/src/api/mod.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -512,8 +512,9 @@ where
512512
lock: Lock,
513513
_: VmIndex,
514514
) -> Poll<Result<()>> {
515+
let result = self.push(context);
515516
context.stack().release_lock(lock);
516-
Poll::Ready(self.push(context))
517+
Poll::Ready(result)
517518
}
518519
}
519520

@@ -1316,13 +1317,14 @@ where
13161317
type Map<V2> = OpaqueValue<RootedThread, BTreeMap<String, V2>>;
13171318
let mut map: Map<V> = thread.get_global("std.map.empty")?;
13181319
let mut insert: OwnedFunction<fn(String, V, Map<V>) -> Map<V>> =
1319-
thread.get_global("std.json.de.insert_string")?;
1320+
thread.get_global("std.map.insert_string")?;
13201321

1321-
context.drop();
1322-
for (key, value) in map_iter {
1323-
map = insert.call(key.borrow().to_string(), value, map)?;
1324-
}
1325-
context.restore();
1322+
map = context.release_for(|| {
1323+
for (key, value) in map_iter {
1324+
map = insert.call(key.borrow().to_string(), value, map)?;
1325+
}
1326+
Ok::<_, Error>(map)
1327+
})?;
13261328

13271329
map.push(context)
13281330
}

vm/src/thread.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2333,10 +2333,11 @@ impl<'b, 'gc> ExecuteContext<'b, 'gc> {
23332333
let data_tag = match self.stack.top().get_repr() {
23342334
Data(data) => data.tag(),
23352335
ValueRepr::Tag(tag) => *tag,
2336-
_ => {
2337-
return Err(Error::Message(
2338-
"Op TestTag called on non data type".to_string(),
2339-
))
2336+
data => {
2337+
return Err(Error::Message(format!(
2338+
"Op TestTag called on non data type: {:?}",
2339+
data
2340+
)))
23402341
.into();
23412342
}
23422343
};
@@ -2859,12 +2860,11 @@ pub struct ActiveThread<'vm> {
28592860
}
28602861

28612862
impl<'vm> ActiveThread<'vm> {
2862-
pub fn drop(&mut self) {
2863+
pub fn release_for<R>(&mut self, f: impl FnOnce() -> R) -> R {
28632864
self.context = None;
2864-
}
2865-
2866-
pub fn restore(&mut self) {
2865+
let r = f();
28672866
*self = self.thread.current_context();
2867+
r
28682868
}
28692869

28702870
pub fn thread(&self) -> &'vm Thread {

0 commit comments

Comments
 (0)