Skip to content

AST-27 Desugar objects and functions into let#188

Merged
nomeata merged 13 commits intomasterfrom
let
Feb 28, 2019
Merged

AST-27 Desugar objects and functions into let#188
nomeata merged 13 commits intomasterfrom
let

Conversation

@rossberg
Copy link
Contributor

Remove binding identifiers from Obj and Func forms and desugar them into lets:

  • Make let return its RHS value
  • In AST, change FuncD to FuncE and remove id from ObjE
  • In parser, desugar function and object forms into let or expression forms
  • Remove previous grammar hacks for dealing with objects
  • In definedness check, allow delayed use of free variables in actor
  • Temporary desugaring hacks turning let x = actor back into actor x in IR
  • Temporary desugaring hack turning FuncE back into FuncE in IR

FuncE still carries a name, but this is only used for tracing outputs, it is no longer semantically relevant.

TODO(joachim): replace FuncD with FuncE in IR and compiler (I tried, but did not understand code generation well enough)
TODO(joachim): handle free and forward references in actors

@rossberg rossberg requested a review from nomeata February 24, 2019 20:13
@rossberg
Copy link
Contributor Author

Note that it's not necessary for Ir.LetD to return values, since that is taken care fo by desugaring. After FuncD is replaced with FuncE in the IR, all non-ExpD decs should have type () there.

@nomeata
Copy link
Contributor

nomeata commented Feb 24, 2019

Hello from above the Caribbeans. We might have a race going on with #189 now :-)

@nomeata
Copy link
Contributor

nomeata commented Feb 24, 2019

Although, this seems to be only affecting the front-end until IR. Nice decoupling :-)

@nomeata
Copy link
Contributor

nomeata commented Feb 24, 2019

In definedness check, allow delayed use of free variables in actor

Are you sure we will be able to support that? My current implementation strategy for closed actors is “serialize upon actor initialization”, which means that everything needs to be defined, with a special case for actors.

Copy link
Contributor

@nomeata nomeata left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have qualms about the changes to the definedness checker. In any case, instead of deleting test cases, just move them to run if they ought to work now.

@nomeata
Copy link
Contributor

nomeata commented Feb 24, 2019

I suggest you leave in your change to definedness.ml (to make it permissive enough for your testing, although too permissive for what the backend will be able to handle), but with a TODO around ObjE indicating that Actors needs special handling, and you leave in the test case (with updated output).

I will then deal with it together with AST-49 (closing over values in actors).

@nomeata nomeata changed the title Desugar objects and functions into let AST-27 Desugar objects and functions into let Feb 24, 2019
@nomeata
Copy link
Contributor

nomeata commented Feb 25, 2019

Ah, you raised that point on JIRA. Let’s continue here, ok? You wrote

Joachim Breitner, at which point would you send it? At that point you need to have all necessary values available. They may come from outer scopes, so the init may need to be hoisted to an outer scope. Consider:

{
  let h = {
    actor a {f() = x; g() = y};
    let x = 0;
    func h() : async Nat { (await a.f()) + (await a.g()) }
  }
  let y = 0;
  // This is the earliest point to init a, which isn’t even in scope here
  h();
}

Also, what about async code? Will it be a problem when there is an await between the actor and its init point (I couldn’t find any, but it may be subtle).

@nomeata
Copy link
Contributor

nomeata commented Feb 25, 2019

So, the design I had in my mind would

  • At the beginning of a block, instantiate all declared actors (but not initialize them yet). This means that an actorref is valid everywhere in a block.
  • When we come across actor { … }, we collect its environment, serialize it, and send it to a special init method.

This design does not allow actors to capture values that are defined later other than actorrefs (and I expect that you have no great sympathy for such discontinuities). But the bigger problem is: This only works with ActorD declarations, but not with ActorE expressions, as with expressions we don't know which actors are declared where.

So the only alternative I see right now is:

  • When we come across actor { … }, instantiate the module, which creates the actorref, and collect its environment. But do not serialize it yet. Instead, put the actorref and the closure it in a RTS-managed list of actors-to-be-instantiated.
  • At the end of handling the current message (e.g. before Garbage Collection), go through the queue, serialize all the closures, and sends it to each actor’s init method.

By that time, all definitions from any recursive declaration group have been filled in.

This has the problem that in the case of actor{ …}.foo() we probably want to call the init function before we call foo(). Two alternatives:

  • We expect the hypervisor to reorder the messages for us. More precisely, the hypervisor knows about the special meaning of the init method, treats freshly instantiated actors as uninitialized and holds off calling any other methods on them (keeps them in the queue) until it has an init message to deliver. This has the advantage that it avoid races when three canisters are involved.
  • We queue all message sends withing one message execution, in order, and send all of them at the end of the current message execution. This is semantically not observerable, i.e. we just queue them inside Wasm instead of in the Hypervisor bookkeeping for this actor.

@rossberg
Copy link
Contributor Author

@nomeata:

This only works with ActorD declarations, but not with ActorE expressions.

What's the difference, given that they are interchangeable modulo an auxiliary BlockE or LetD?

put the actorref and the closure it in a RTS-managed list of actors-to-be-instantiated.

Yes, that was my conclusion as well. Especially since you can create a dynamic number of actors, e.g., in a loop. (Though in this case I couldn't find an example where either the actor is never used, or there is a local eager use in that loop.)

At the end of handling the current message (e.g. before Garbage Collection), go through the queue, serialize all the closures, and sends it to each actor’s init method.

I'm not sure "end of current message" is late enough for async. Consider:

func meth() : async T {
  actor a { f() { ...b... };
  await something();
  actor b { g() { ...a... };
}

This has the problem that in the case of actor{ …}.foo() we probably want to call the init function before we call foo().

Right. I think the more uniform approach is to invoke init right before the point where the actor is first "eagerfied", either directly or transitively. The definedness check should imply that at this point (1) all references are available, while (2) nobody has used it yet.

This requires no RTS-managed queue, only some syntactic transformations to make the necessary values accessible at the right point -- e.g. as a closure build locally but invoked at the aforementioned point. It should be compatible with both async and with dynamically created actors. Unused actors (that are never eagerified) would never be initialised, but that's fine because they are dead code.

More precisely, the hypervisor knows about the special meaning of the init method

Yeah, would be great if we could avoid such a special mechanism in the OS.

We queue all message sends withing one message execution, in order, and send all of them at the end of the current message execution.

Maybe I'm misunderstanding this, but isn't that the Dfn semantics already?

Just for the sake of concrete example of the message ordering problem, let's take this minimal piece:

actor A {
  func meth() {
    actor B {f() { ...x...} };
    let x = ...;
    // (*) B.init(x);
    C.send(B);
  }
}

At point (*), A would implicitly send the init message to B. It would then send a message to C passing along B. After that, C could send f to B.

The problem is that there is no guarantee that B receives init before f. This is exactly the transitive message ordering problem. We'd need some kind of barrier mechanism.

Would it work to make the init message return an async (), so that we can synchronise on it? Then the above could be transformed into s.th like

actor A {
  func meth() {
    actor B {f() { ...x...} };
    let x = ...;
    // (*) let ready = B.init(x);
    ignore(async { await ready; C.send(B) });
  }
}

Of course, when meth sends multiple messages this gets slightly more tricky, since we still need to maintain their order, so they cannot be put into separate asyncs. Hm...

@nomeata
Copy link
Contributor

nomeata commented Feb 25, 2019

This only works with ActorD declarations, but not with ActorE expressions.

What's the difference, given that they are interchangeable modulo an auxiliary BlockE or LetD?

With ActorD, at the beginning of the block (i.e. the full scope of the actorref) I know statically which modules (i.e. actor sans closure) will be created, and I can instantiate these modules, which gives me a valid actorref.

With ActorE I can have

{ let a = actor { … b … };
  let b = if long computation then actor { … } else actor { … };
}

I cannot instantiate b before the first line, because I cannot know which of the two branches are taken.

Note that you cannot express that code directly with ActorD.

I'm not sure "end of current message" is late enough for async.

Ugh, async. I don’t think about async, it seems, it has been translated away already when I start to come in :-)

I think the more uniform approach is to invoke init right before the point where the actor is first "eagerfied", either directly or transitively. The definedness check should imply that at this point (1) all references are available, while (2) nobody has used it yet.

That sounds promising. Will think about it on the next flight.

Unused actors (that are never eagerified) would never be initialised, but that's fine because they are dead code.

Is that sound? Actors can have side-effects (e.g. call further actors during their initialization).

We queue all message sends withing one message execution, in order, and send all of them at the end of the current message execution.

Maybe I'm misunderstanding this, but isn't that the Dfn semantics already?

Precisely, but currently the hypervisor maintains that queue; with this change we might have to maintain another queue in the RTS. Also, we could then re-order the message to put all init calls first.

Would it work to make the init message return an async (), so that we can synchronise on it? Then the above could be transformed into s.th like

Would this restrict actor creation to contexts where an await would be valid?

Boarding flight to Zurich now.

@rossberg
Copy link
Contributor Author

rossberg commented Feb 25, 2019

@nomeata:

Note that you cannot express that code directly with ActorD.

I don't see why not. How would

{ actor a { … b … };
  let b = if long computation then { actor b { … } } else { actor b { … } }
}

be any different?

Is that sound? Actors can have side-effects (e.g. call further actors during their initialization).

Ah, good point. So there would need to be a special case for actors that are never forced explicitly.

with this change we might have to maintain another queue in the RTS.

But why would this be necessary?

Would this restrict actor creation to contexts where an await would be valid?

No, see my example. Only message sends would need async, but you can always locally introduce async expressions. That's not observable for (individual) message sends, since they are async anyway (though the message ordering guarantee with multiple sends remains trickier).

I should also mention that we probably don't need to solve the general problem for the pre release. For that, only actors need to work.

@nomeata
Copy link
Contributor

nomeata commented Feb 25, 2019

Note that you cannot express that code directly with ActorD.

I don't see why not. How would

{ actor a { … b … };
  let b = if long computation then { actor b { … } } else { actor b { … } }
}

be any different?

Ah, I see: I was not considering the nested-block scenario, and the solution in the back of my head would look at { actor b { … } } and consider the escaping reference to the actor as a first-class, eager use of it (as it was the case for an earlier design of the definedness checker, for closures). But you are right that we are already more ambitious than that and have a definedness checker that can handle such nested blocks, so we should do it for blocks as well.

tl;dr: You are right, that should be equivalent.

with this change we might have to maintain another queue in the RTS.

But why would this be necessary?

If we hold off sending the init messages in the RTS, we want to hold off sending all messages, to send them in order. (This was with the flush-at-end approach; your flush-at-first-use approach might not need a queue.)

I still hope we can do something better than such a heavy synchronization protocol. How about the variant where the receiving actor queues incoming message until it has seen the init message?

@nomeata
Copy link
Contributor

nomeata commented Feb 27, 2019

Even with local actors out-of-scope for the preview release, this is still useful (and the only pain points are around local actors). And we should also not waste work, so I propose we invest enough work to merge this (and #189) without breaking too much existing support for actors.

With Andreas being away for a while, I suggest I take over this PR, address my own concerns, and then get it merged.

@nomeata nomeata self-assigned this Feb 27, 2019
Copy link
Contributor

@nomeata nomeata left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, I updated the branch to address my own nits, so I would accept it now. Should I just merge, or do we want another review? (@crusso maybe)

@nomeata
Copy link
Contributor

nomeata commented Feb 27, 2019

I also did the corresponding FuncE introduction in IR. There were some nasty bugs on the way, but here it is: #196 (that PR is relative to this one).

@crusso crusso self-requested a review February 28, 2019 10:09
at = no_region;
note = { S.note_typ = T.unit; (* ! *)
S.note_eff = eff exp; }
note = exp.note;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this deliberate? Joachim, have you changed the IR letD to also return the value of rhs?This contradics Andreas first comment on the PR:

" Note that it's not necessary for Ir.LetD to return values, since that is taken care fo by desugaring. After FuncD is replaced with FuncE in the IR, all non-ExpD decs should have type () there"

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, I guess I was confused when I wrote that. But I am fixing this in #196 in any case (including Check_ir), so it’s fine for now if we merge both.

In fact, I want to refactor BlockE further to (dec list * exp), and then declarations have no type at all (which means less to check in Check_ir and worry about in Construct).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both sound good

if Type.is_unit note.S.note_typ && not (is_expD (Lib.List.last ds'))
then I.BlockE (ds' @ [expD (tupE [])])
else I.BlockE (ds')
let prefix, last = Lib.List.split_last ds' in
Copy link
Contributor

@crusso crusso Feb 28, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What if ds is [], won't split_last fail? Do we rule out empty blocks earlier? Even if so, maybe add an assert...

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Never mind - the diff just doesn't show a previous S.Block [] case...

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In fact, in #196 Check_ir asserts that the list is non-empty, the afore-mentioned refactoring will make that explicit on the type level.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good.

@@ -1,4 +1,13 @@
(unknown location): internal error, Env.Make(X).Clash("test")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do we know that is going on here?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This must be [AST-60].

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, this is unrelated to this change (just the error message looks different now).

func(5 or _ : Nat) {};
func(_ or 6 : Nat) {};
func((_ or _) : Nat) {};
func f1(_ : Nat) {};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

are anonymous functions not allowed anymore? Or is this just a trivial change?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was done by Andreas, I don’t know why.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok.

@nomeata nomeata merged commit eecf6ec into master Feb 28, 2019
@nomeata nomeata deleted the let branch February 28, 2019 17:08
dfinity-bot added a commit that referenced this pull request Feb 17, 2021
Branch: master
Commits: [dfinity/candid@25fb8470...322ea4a2](dfinity/candid@25fb847...322ea4a)

* [`ea2c72f5`](dfinity/candid@ea2c72f) support reference types ([dfinity/candid⁠#153](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/153))
* [`d48bc04c`](dfinity/candid@d48bc04) fix record_nesting_depth for native Rust types ([dfinity/candid⁠#155](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/155))
* [`e54d3e4a`](dfinity/candid@e54d3e4) support more Rust built-in types ([dfinity/candid⁠#156](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/156))
* [`3b3637e1`](dfinity/candid@3b3637e) release ([dfinity/candid⁠#157](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/157))
* [`98d73586`](dfinity/candid@98d7358) debug print for values ([dfinity/candid⁠#159](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/159))
* [`620ad802`](dfinity/candid@620ad80) fix debug print
* [`01d23d61`](dfinity/candid@01d23d6) Candid test suite: More tests related to references ([dfinity/candid⁠#160](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/160))
* [`c59c2fd1`](dfinity/candid@c59c2fd) release
* [`3ac7e9d3`](dfinity/candid@3ac7e9d) fix type annotation in parser ([dfinity/candid⁠#162](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/162))
* [`432c4289`](dfinity/candid@432c428) A Candid users’s guide ([dfinity/candid⁠#158](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/158))
* [`315cb991`](dfinity/candid@315cb99) Coq: MiniCandid ([dfinity/candid⁠#147](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/147))
* [`83fdff28`](dfinity/candid@83fdff2) Improve wording for type mismatches ([dfinity/candid⁠#167](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/167))
* [`3028f5ed`](dfinity/candid@3028f5e) Lg/candid rev pre split ([dfinity/candid⁠#169](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/169))
* [`6c8d4e39`](dfinity/candid@6c8d4e3) Lg/candid users guide ([dfinity/candid⁠#170](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/170))
* [`0c2205fc`](dfinity/candid@0c2205f) FIx typo toll>tool ([dfinity/candid⁠#172](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/172))
* [`63d9f6fd`](dfinity/candid@63d9f6f) Test suite: A test that invalid unicode in method names is rejected ([dfinity/candid⁠#174](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/174))
* [`dad82102`](dfinity/candid@dad8210) generate random candid values ([dfinity/candid⁠#166](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/166))
* [`2720d995`](dfinity/candid@2720d99) Release ([dfinity/candid⁠#176](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/176))
* [`9fbffdcc`](dfinity/candid@9fbffdc) Meta-Theory: Clarify transitive coherence ([dfinity/candid⁠#173](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/173))
* [`8acbbd47`](dfinity/candid@8acbbd4) Update README.md
* [`05ff9f82`](dfinity/candid@05ff9f8) Fix RUSTSEC-2020-0122 by upgrading logos which upgrades beef ([dfinity/candid⁠#179](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/179))
* [`b65c0859`](dfinity/candid@b65c085) Candid test suite: Method sorting test ([dfinity/candid⁠#177](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/177))
* [`8df6e6c0`](dfinity/candid@8df6e6c) bump ui
* [`1977fdb3`](dfinity/candid@1977fdb) Typescript binding for Candid ([dfinity/candid⁠#181](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/181))
* [`0c988a9a`](dfinity/candid@0c988a9) Lg/rust js type mapping ([dfinity/candid⁠#180](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/180))
* [`b80a2389`](dfinity/candid@b80a238) Doc typo ([dfinity/candid⁠#182](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/182))
* [`b4a73dea`](dfinity/candid@b4a73de) support more Rust types for serialization ([dfinity/candid⁠#185](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/185))
* [`14f50bc6`](dfinity/candid@14f50bc) fix typescript binding for references ([dfinity/candid⁠#184](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/184))
* [`6e35c0e2`](dfinity/candid@6e35c0e) Release ([dfinity/candid⁠#186](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/186))
* [`05df9eb3`](dfinity/candid@05df9eb) Candid users guide: Linebreak example pretty printing ([dfinity/candid⁠#188](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/188))
* [`322ea4a2`](dfinity/candid@322ea4a) [rust] Fix reserved subtyping
dfinity-bot added a commit that referenced this pull request Feb 18, 2021
## Changelog for candid:
Branch: master
Commits: [dfinity/candid@0c2205fc...322ea4a2](dfinity/candid@0c2205f...322ea4a)

* [`63d9f6fd`](dfinity/candid@63d9f6f) Test suite: A test that invalid unicode in method names is rejected ([dfinity/candid⁠#174](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/174))
* [`dad82102`](dfinity/candid@dad8210) generate random candid values ([dfinity/candid⁠#166](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/166))
* [`2720d995`](dfinity/candid@2720d99) Release ([dfinity/candid⁠#176](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/176))
* [`9fbffdcc`](dfinity/candid@9fbffdc) Meta-Theory: Clarify transitive coherence ([dfinity/candid⁠#173](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/173))
* [`8acbbd47`](dfinity/candid@8acbbd4) Update README.md
* [`05ff9f82`](dfinity/candid@05ff9f8) Fix RUSTSEC-2020-0122 by upgrading logos which upgrades beef ([dfinity/candid⁠#179](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/179))
* [`b65c0859`](dfinity/candid@b65c085) Candid test suite: Method sorting test ([dfinity/candid⁠#177](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/177))
* [`8df6e6c0`](dfinity/candid@8df6e6c) bump ui
* [`1977fdb3`](dfinity/candid@1977fdb) Typescript binding for Candid ([dfinity/candid⁠#181](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/181))
* [`0c988a9a`](dfinity/candid@0c988a9) Lg/rust js type mapping ([dfinity/candid⁠#180](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/180))
* [`b80a2389`](dfinity/candid@b80a238) Doc typo ([dfinity/candid⁠#182](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/182))
* [`b4a73dea`](dfinity/candid@b4a73de) support more Rust types for serialization ([dfinity/candid⁠#185](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/185))
* [`14f50bc6`](dfinity/candid@14f50bc) fix typescript binding for references ([dfinity/candid⁠#184](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/184))
* [`6e35c0e2`](dfinity/candid@6e35c0e) Release ([dfinity/candid⁠#186](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/186))
* [`05df9eb3`](dfinity/candid@05df9eb) Candid users guide: Linebreak example pretty printing ([dfinity/candid⁠#188](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/188))
* [`322ea4a2`](dfinity/candid@322ea4a) [rust] Fix reserved subtyping
mergify bot pushed a commit that referenced this pull request Feb 18, 2021
## Changelog for candid:
Branch: master
Commits: [dfinity/candid@0c2205fc...322ea4a2](dfinity/candid@0c2205f...322ea4a)

* [`63d9f6fd`](dfinity/candid@63d9f6f) Test suite: A test that invalid unicode in method names is rejected ([dfinity/candid⁠#174](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/174))
* [`dad82102`](dfinity/candid@dad8210) generate random candid values ([dfinity/candid⁠#166](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/166))
* [`2720d995`](dfinity/candid@2720d99) Release ([dfinity/candid⁠#176](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/176))
* [`9fbffdcc`](dfinity/candid@9fbffdc) Meta-Theory: Clarify transitive coherence ([dfinity/candid⁠#173](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/173))
* [`8acbbd47`](dfinity/candid@8acbbd4) Update README.md
* [`05ff9f82`](dfinity/candid@05ff9f8) Fix RUSTSEC-2020-0122 by upgrading logos which upgrades beef ([dfinity/candid⁠#179](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/179))
* [`b65c0859`](dfinity/candid@b65c085) Candid test suite: Method sorting test ([dfinity/candid⁠#177](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/177))
* [`8df6e6c0`](dfinity/candid@8df6e6c) bump ui
* [`1977fdb3`](dfinity/candid@1977fdb) Typescript binding for Candid ([dfinity/candid⁠#181](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/181))
* [`0c988a9a`](dfinity/candid@0c988a9) Lg/rust js type mapping ([dfinity/candid⁠#180](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/180))
* [`b80a2389`](dfinity/candid@b80a238) Doc typo ([dfinity/candid⁠#182](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/182))
* [`b4a73dea`](dfinity/candid@b4a73de) support more Rust types for serialization ([dfinity/candid⁠#185](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/185))
* [`14f50bc6`](dfinity/candid@14f50bc) fix typescript binding for references ([dfinity/candid⁠#184](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/184))
* [`6e35c0e2`](dfinity/candid@6e35c0e) Release ([dfinity/candid⁠#186](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/186))
* [`05df9eb3`](dfinity/candid@05df9eb) Candid users guide: Linebreak example pretty printing ([dfinity/candid⁠#188](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/188))
* [`322ea4a2`](dfinity/candid@322ea4a) [rust] Fix reserved subtyping
mergify bot pushed a commit that referenced this pull request Jun 6, 2023
## Changelog for ic-hs:
Branch: master
Commits: [dfinity/ic-hs@406decfa...9152a0ff](dfinity/ic-hs@406decf...9152a0f)

* [`d4db8d07`](dfinity/ic-hs@d4db8d0) bump nixpkgs to 7c786944f801745310578d1cfc019923396f830c ([dfinity/ic-hs⁠#163](https://github.com/dfinity/ic-hs/issues/163))
* [`31d535d2`](dfinity/ic-hs@31d535d) increase the number of allowed delegations in a request from 4 to 20 ([dfinity/ic-hs⁠#166](https://github.com/dfinity/ic-hs/issues/166))
* [`4a310c0d`](dfinity/ic-hs@4a310c0) support ic0.is_controller ([dfinity/ic-hs⁠#169](https://github.com/dfinity/ic-hs/issues/169))
* [`5fc27bdc`](dfinity/ic-hs@5fc27bd) do not include keep-alive header in httpbin response ([dfinity/ic-hs⁠#170](https://github.com/dfinity/ic-hs/issues/170))
* [`96448083`](dfinity/ic-hs@9644808) drop nix-build-uncached ([dfinity/ic-hs⁠#175](https://github.com/dfinity/ic-hs/issues/175))
* [`c6fbe1f7`](dfinity/ic-hs@c6fbe1f) increase ingress_expiry in reference test suite ([dfinity/ic-hs⁠#176](https://github.com/dfinity/ic-hs/issues/176))
* [`a1b3f670`](dfinity/ic-hs@a1b3f67) add Connection: close header to httpbin ([dfinity/ic-hs⁠#178](https://github.com/dfinity/ic-hs/issues/178))
* [`d3812ffc`](dfinity/ic-hs@d3812ff) increase delegation expiry in tests ([dfinity/ic-hs⁠#182](https://github.com/dfinity/ic-hs/issues/182))
* [`40a46e2f`](dfinity/ic-hs@40a46e2) sync universal-canister with IC repo ([dfinity/ic-hs⁠#177](https://github.com/dfinity/ic-hs/issues/177))
* [`7a6259c2`](dfinity/ic-hs@7a6259c) decrease number of threads and request submission latency ([dfinity/ic-hs⁠#179](https://github.com/dfinity/ic-hs/issues/179))
* [`a9f73dba`](dfinity/ic-hs@a9f73db) fix decoding compressed WASM modules during snapshotting ([dfinity/ic-hs⁠#184](https://github.com/dfinity/ic-hs/issues/184))
* [`64c19a95`](dfinity/ic-hs@64c19a9) bump nixpkgs to eaf03591711b46d21abc7082a8ebee4681f9dbeb ([dfinity/ic-hs⁠#189](https://github.com/dfinity/ic-hs/issues/189))
* [`9152a0ff`](dfinity/ic-hs@9152a0f) add date header to httpbin responses and make http header names lower-case ([dfinity/ic-hs⁠#188](https://github.com/dfinity/ic-hs/issues/188))

Includes and closes #3915. Reason: `ic-hs` and `nixpkgs` must be in sync, so that the artefact caching can work.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants