[m-dev.] add goal path at external ports

Mark Anthony BROWN dougl at cs.mu.OZ.AU
Wed Jan 27 17:48:40 AEDT 1999


Erwan Jahier writes:
> 
> | In each case the goal path for an external port at depth N is the same as
> | the most recent goal path for an internal port at depth N - 1.  So if
> | you remember the most recent goal path for each depth less (shallower)
> | than the current depth, you can reconstruct that context information.
> 
> Sure. But if I want to work out the coverage ratio of a several millions events 
> execution, it would be far more too inneffective (see after). 

I don't understand.


> 
> | > How hard do you think it is to add this information to the current trace ?
> | > Is this information still available when generating external events ? 
> | 
> | You could reserve a stack slot, store the information there for
> | every internal port, then look it up at every external port.  
> | I wouldn't recommend this though, since for large conjunctions you
> | may wind up sending the same goal path through the socket many
> | times.  You would pay for the extra stack slot 
> 
> Well, is there any reason why this can't be done at compile time (i.e. when 
> generating the code and the MR_trace statements ?)


No, this could be done.  But I forgot to mention my main point:  I
think this could be done more easily in Opium.


[...]

> In fact my first idea was to stop at every internal port and collect the goal
> paths as a set of pair : (procedure, goalpath). Since all the possible goal
> paths can be generated staticly from the HLDS, we then just have to compare the
> 2 sets of goal paths to have a coverage ratio.
> 
> But then you have the problem caused with my exemple (((a,b);c) -> d ; e). With 
> this proposal, you have no way to check b has been executed if b doesn't 
> generate any internal event.

I disagree.  If you record the most recent internal event at each depth,
then when you get an external event at depth N you have:
	i) the immediate ancestor (ie the procedure of the most
		recent internal event at depth N - 1),
	ii) the path to the called atom within the body of the
		ancestor (ie the goal path of the most recent
		internal event at depth N - 1), and
	iii) the procedure being called (ie the procedure of the current
		event).


The atom b, above, is executed if and only if a 'CALL b' event is reached
at depth N (for some N) when the most recent event at depth N - 1 has
procedure p and goal path "?;d1".

However, as I mentioned previously, there is no way to distinguish
between two calls to the same procedure in the same conjunction.


> 
> To check that those paths are covered, just stop at call and exit ports, retrie
> ve the curent pred, port, goalpath and ancestor, and add that current path
> to set of paths to be covered (the opium code that does that is 10 lines, provided
> I have goalpath information at exit and fail ports).

My suggestion would require more state than just the set of paths to be
covered, but I think it would still be SMOP in Opium.


[...]

> 
> I think in such a context (test coverage), we don't have to care about what a 
> user can do but about what can be done automaticly in a reasonable amount of 
> times.

Valid point, but the issue you raise is relevant to other contexts as
well.  Does anybody have any comments on how source linking should
be implemented?


Cheers,
Mark
-- 
Mark Brown  (dougl at cs.mu.oz.au)       )O+   |  For Microsoft to win,
MEngSc student,                             |  the customer must lose
Dept of Computer Science, Melbourne Uni     |          -- Eric S. Raymond



More information about the developers mailing list