Skip to content

Conversation

@jpbetz
Copy link
Contributor

@jpbetz jpbetz commented Mar 22, 2022

I discovered that the stack that I had introduced in #494 as part of the introduction of runtime cost budgeting was not being managed correctly. Specifically, not all stack items pushed were being properly popped.

This PR fixes the stack by tracking the expression IDs associated with each stack value. The pop operations then specify the expression IDs of the stack items they wish to pop. If any spurious values are above the stack item being popped, they are removed from the stack as part of the pop.

This solves a bunch of problems and generally makes the stack much safer to use.

I have also improved the stack handling overall, which helps keep memory usage to a minimum. The only remaining case where I am certain that spurious stack items are left behind is the case where top-level variable lookup not being accounted for correctly.

@jpbetz
Copy link
Contributor Author

jpbetz commented Mar 22, 2022

/assign @TristonianJones

@jpbetz jpbetz requested a review from TristonianJones March 22, 2022 04:33
@jpbetz
Copy link
Contributor Author

jpbetz commented Mar 22, 2022

Feedback applied @TristonianJones

// the stack.
// WARNING: It is possible for multiple expressions with the same ID to exist (due to how macros are implemented) so it's
// possible that a dropped ID will remain on the stack. They should be removed when IDs on the stack are popped.
func (s *refValStack) popArgs(args []Interpretable) ([]ref.Val, bool) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

nit: consider calling this dropArgs

@jpbetz jpbetz merged commit ffa9b84 into google:master Mar 22, 2022
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.

2 participants