Allison Randal wrote:

include/parrot/interpreter.h:
Delete the 'struct' before the "PMC *" declaration in the interpreter
struct.

-    struct Interp_Context ctx;
+    struct PMC           *ctx;                /* current Context */

This lingering bit of old code also appears in src/pmc/lexpad.pmc:

-        SET_ATTR_ctx(INTERP, SELF, (struct Parrot_Context *)ctx);
+        SET_ATTR_ctx(INTERP, SELF, (struct PMC *)ctx);

Done.


Keep backward compatibility with the CONTEXT(interp) macro, by having it return the data struct of the Context PMC. Introduce a new function 'Parrot_pcc_get_current_context' that returns the PMC (it's a clearer name anyway), and we'll deprecate the old macro for 2.0. (General principle: when you're working on refactoring old subsystems, think about how to preserve the old interface until the next deprecation point.)

I tend to disagree with keeping CONTEXT macro backward compatible. Parrot_Context structure changed anyway. But I can preserve it (and I actually had it before).

This branch introduces two macros CONTEXT_FIELD and CURRENT_CONTEXT_FIELD. They're an improvement over the old way of directly accessing the context struct members, but they're still too fragile. Since they use the struct field names directly, it ties us to supporting those field names. Instead, create a series of simple API functions for accessing context attributes. Once people are switched over to those, we'll be free to change the internals contexts without needing further API changes. (General principle: when adding a new interface, it should be one we plan to keep.)

They are not part of API. Just quick way to keep branch compiling and working. Almost all API accessors functions already implemented.

'Parrot_cx_get_caller_ctx' is a good idea, hiding those details behind an interface. But the concurrency scheduler (which is what the 'cx' prefix means) isn't where it belongs. Same for 'Parrot_cx_get_continuation', 'Parrot_cx_dec_recursion_depth', 'Parrot_cx_set_caller_ctx', 'Parrot_cx_get_namespace', 'Parrot_cx_get_pmc_constant', 'Parrot_cx_get_lex_pad'. Put them in src/call/context.c and use the prefix 'pcc' instead of 'cx'. Also make

I misunderstood "cx" prefix. Done with renaming.

sure to use "current" in the name of the functions that are fetching or setting the current namespace, context, or continuation, to make it clear what the function is doing.

Technically they are not "current". They always belong to passed Context PMC. I can add "current" version of functions which will fetch current context from interpreter.

The function currently named 'Parrot_cx_get_context' takes a Context PMC and returns the data struct for that PMC. We don't want that exposed as an interface, so eliminate it. (CONTEXT(interp) will continue working until after 2.0, so we have a migration strategy for anyone who was relying on the old direct access to the struct. In src/gc/mark_sweep.c, you can just use interp->ctx for the mark the same as all the other PMC members of the interpreter struct.)

I actually think about implementing CONTEXT macro in terms of Parrot_pcc_get_context function for simplifying future migration. It's easier to put deprecation warning inside function than macro. OTOH may be Parrot_pcc_get_context_struct cleaner.


Don't create a separate header file include/parrot/context.h, since it isn't an independent subsystem. Just add the entries to include/parrot/call.h.

Done.

src/pmc/context.pmc and src/context.c:
When you add a new file, just list the current year in the copyright, not 2001-2009.


Done.

src/pmc/sub.pmc:
Parrot doesn't use the '//' style of C comments. Also, no generic 'XXX' comments (in src/jit/i386/jit_defs.c too), either flag it with a ticket number or don't flag it at all. See the coding standards for more information.

They left on purpose to track places to fix before merging. Definitely will be fixed before.

Be careful to review all changes when you get ready to merge the branch back in. It looks like your branch reverts some trunk changes in unrelated files (like src/pmc/addrregistry.pmc, src/pmc/class.pmc), which is a sign that there may have been some glitches in your updates of the branch from trunk. The cleanest approach is to create a fresh branch and reapply your changes to it as a patch. That'd be a quick way to filter out the CONTEXT_FIELD/CURRENT_CONTEXT_FIELD changes too and all the changes where you have CONTEXT(interp) returning a PMC (faster than manually undoing them).

I will fully review my changes before merging anyway. On positive note branch is clean compiling and passing tests.



I recommend doing these changes in two passes, one that adds the Context PMC, changes the 'ctx' member of the interpreter to a PMC, introduces accessor functions for the context elements, and makes the minimal set of changes to get the tests passing. Since it leaves the CONTEXT(interp) macro still working, you can skip most of the changes currently in the context_pmc3 branch, so it would be a lightweight branch that could be merged quickly (you could have it ready and merged in a couple of days if you start with a stripped down patch from the current branch).

Then go back and do a second branch for the weighter conversion of direct struct member access to function calls across all the subsystems.

Actually branch contains both steps.

The logic in 'Parrot_alloc_context' should move into the PMC, but you can save that for a third refactor. The context-related code in src/sub.c should move into src/call/context.c, but save it for a third or fourth refactor.

Further code reshuffling and function will be done in next branches. I'm trying to stay closer to current trunk.

--
Bacek
_______________________________________________
http://lists.parrot.org/mailman/listinfo/parrot-dev

Reply via email to