On Mon Mar 19 03:39:21 2007, codermattie wrote:
> Hello,
> 
> This patch begins the feature enhancement phase of the
> Parrot_locate_runtime_str.
> 
> based on: rev 17631
> 
> two new static functions are introduced.
> 
> * try_load_path:
> 
> this helper combines the path_finalization with the stat check for
> file existence.
> it is also a good debug point so I have left the bread-crumbs ifdef'd
> out.
> 
> * try_bytecode_extensions
> 
> this new function uses an array of extensions trying each one with the
> try_load_path
> call. compatibility is preserved by trying the path as given before
> attempting to
> guess an extension.
> 
> *Parrot_locate_runtime_str:
> 
> updated to use the new try_bytecode_extensions whenever the requested
> type
> is not PARROT_RUNTIME_FT_DYNEXT.
> 
> Also some tabs that leaked into the file have been removed. I will be
> more vigilant
> in the future in regards to this.
> 
> status: compile tested, full test-suite ran w/o new failures.
> 
> At this point the extension guessing code is functional. I should in
> all likely-hood
> code a test file for the extension guessing as it exists. If this is
> necessary simply
> hold this ticket.
> 
> [phase 2]
> 
> At this point a real discussion is needed with the parrot developer
> community.
> 
> The ultimate purpose of these patches is to enable developers to write
> code that
> will work the same way in both their working-copies and the install
> tree. To do
> this the parrot development process will need to be modified. I have
> thought up
> a solution that I believe is extremely un-obtrusive , and possibly a
> unique feature.
> 
> background:
> 
> If the developers begin removing extensions from their requested files
> the work-cycle
> will change to a full-compilation cycle, as the loader will prefer a
> .pbc file over
> a .pasm or a .pir.
> 
> In discussions on IRC there was a reluctance to switch to this cycle.
> It does take
> some of the dynamic flavor out of the development process.
> 
> There are two solutions.
> 
> 1. do a clean during development. only the source files will remain
> and there should
>    not be any problems. There could be collisions with a installed
> tree, however the
>    second option is a step towards a complete solution.
> 
> 2. introduce a environment variable, for example: PARROT_LOAD_PREFER
> 
>    this variable when set would have two valid values: source|compile.
> 
>    if no variable was set, or it was incorrectly set it would default
>    to the compile value, giving typical (perl5 for example) behavior
>    where a compiled version is always loaded over the source version.
> 
>    when the variable would be set to "source" then the reverse would
>    happen, and the ".pir" files would be loaded over a .pbc.
> 
>    This allows developers to simply export PARROT_LOAD_PREFER="source"
>    when developing to guarantee that the loaded files will be
>    the source files with their most recent changes.
> 
>    by looking at the diff I think you will see the code changes
> subsequent
>    to this patch to implement this will be nearly trivial at this
> point.
> 
> [phase 3] the big win
> 
>    assuming that environment variables are a suitable way for parrot
>    developers to maintain their current behavior a big step forward
>    is now possible.
> 
>    the last remaining issue is the difference between the layout
>    in the working-copy and the install tree.
> 
>    ie: parrot/library vs. runtime/parrot/library
> 
>    I have been developing a perl5 program in my spare time meant to
>    address this very problem for my own purposes. but either the idea
>    or an adapted version of the code can solve this neatly.
> 
>    the idea is that markers are placed in the working-copy tree
> marking
>    installation paths. so in runtime/ some sort of file (MANIFEST ?)
> would indicate
>    that the paths below runtime/ are to be preserved in the install
>    tree.
> 
>    [if those files listed what needed to be installed writing the
> install
>    target would be a snap, with language-hackers having control over
>    their installed files.]
> 
>    With this information a perl program can recursively traverse the
> tree
>    and create and add each of these directories with a MANIFEST file
> to
>    the load path ( PARROT_INC ? , I am not sure )
> 
>    so if you have your source code in ${HOME}/parrot/ , and there is a
>    MANIFEST file in runtime/ , the code would add an environment
> variable
>    like this:
> 
>    PARROT_INC="${HOME}/parrot/runtime"
> 
>    the perl program can simply dump out this list of environment
> variables
>    on stdout.
> 
>    when a perl developer is ready to hack in the tree , he runs the
> program,
>    and source's the output, updating his environment for that session.
> 
>    now his path "Digest/MD5" automatically gets a ".pir" tried first
> because
>    of PARROT_LOAD_PREFER="source", and the prefix is the exact same in
> both
>    the working copy and the install tree.
> 
>    when the perl developer installs his code, and the environment
> variables
>    are cleared .pbc files are loaded as they should be and the path
> prefixes
>    are the same.
> 
>    Extensive release testing is not necessary to maintain the install
> target
>    because things break in the working-copy in the same way they would
> break
>    in the install-tree. This is extremely powerful for development.
> 
> [leftovers]
> 
>    there is a insignificant race, but still a race in the code. This
> needs
>    to be addressed later as a part of fully insulating the
> src/library.c API.
> 
>    Ultimately a struct like this is needed.
> 
>    struct load_file {
>       FILE* handle,
>       parrot_runtime_ft type
>    }
> 
>    1. Parrot_runtime_locate_runtime_str would be renamed to
> parrot_locate_runtime_file,
>       it would return the struct with the handle, the type value would
> be a null/unkown
>       value.
> 
>       this closes the race by getting rid of a pointless stat()
> introduced by the string
>       return value, a result of the poor API insulation. dynext.c
> replicates much of
>       Parrot_locate_runtime_str in it's own fashion.
> 
>       also this should be opened on unix with O_NOCTTY | O_NOFOLLOW
> btw. maybe even
>       fsat for block/char devices too.
> 
>     2. a a hueristic routine for detecting parrot_runtime_ft
> 
>        it would take the load_file struct, and do the magic
> number/heuristic checks
>        on the first chunk of the file and determine what
> runtime_ft_type it is,
>        setting the value in the load_file struct.
> 
>        At this point the appropriate loader/infrastructure can be
> chosen to load the
>        file.
> 
>    also the handling of shared object extensions can be done in the
> same way of
>    try_bytecode_extensions now.
> 
> That's all for now. Thanks again for answering all my questions, and I
> look forward
> to any comments or suggestions.
> 
> Cheers,
> Mike Mattie ([EMAIL PROTECTED])


Patch applied as r17632.  Thanks!

Reply via email to