[svn:parrot] r41336 - branches/kill_jit/src
darbelo at svn.parrot.org
darbelo at svn.parrot.org
Fri Sep 18 18:09:40 UTC 2009
Author: darbelo
Date: Fri Sep 18 18:09:39 2009
New Revision: 41336
URL: https://trac.parrot.org/parrot/changeset/41336
Log:
Bring back Parrot_jit_clone_buffer and Parrot_jit_free_buffer, platforms with PARROT_HAS_EXEC_PROTECT need them.
Modified:
branches/kill_jit/src/frame_builder.c
Modified: branches/kill_jit/src/frame_builder.c
==============================================================================
--- branches/kill_jit/src/frame_builder.c Fri Sep 18 18:03:32 2009 (r41335)
+++ branches/kill_jit/src/frame_builder.c Fri Sep 18 18:09:39 2009 (r41336)
@@ -9,8 +9,94 @@
#include "parrot/parrot.h"
#include "pmc/pmc_fixedintegerarray.h"
#include "pmc/pmc_unmanagedstruct.h"
+#include "pmc/pmc_managedstruct.h"
#include "frame_builder.h"
+/*
+
+=item C<void Parrot_jit_free_buffer(PARROT_INTERP, void *ptr, void *priv)>
+
+This is a callback to implement the proper freeing semantics. It is called by
+the ManagedStruct PMC as it is garbage collected.
+
+=cut
+
+*/
+
+void
+Parrot_jit_free_buffer(PARROT_INTERP, void *ptr, void *priv)
+{
+ const struct jit_buffer_private_data * const jit = (struct jit_buffer_private_data*)priv;
+ mem_free_executable(ptr, jit->size);
+ free(priv);
+}
+
+/*
+
+=item C<PMC *Parrot_jit_clone_buffer(PARROT_INTERP, PMC *pmc, void *priv)>
+
+This is a callback to implement the proper cloning semantics for jit buffers.
+It is called by the ManagedStruct PMC's clone() function.
+
+=cut
+
+*/
+
+PMC *
+Parrot_jit_clone_buffer(PARROT_INTERP, PMC *pmc, void *priv)
+{
+ PMC * const rv = pmc_new(interp, pmc->vtable->base_type);
+
+ VTABLE_init(interp, rv);
+ /* copy the attributes */
+ {
+ void (*tmpfreefunc)(PARROT_INTERP, void*, void*);
+ GETATTR_ManagedStruct_custom_free_func(interp, pmc, tmpfreefunc);
+ SETATTR_ManagedStruct_custom_free_func(interp, rv , tmpfreefunc);
+ }
+ {
+ PMC* (*tmpclonefunc)(PARROT_INTERP, PMC*, void*);
+ GETATTR_ManagedStruct_custom_clone_func(interp, pmc, tmpclonefunc);
+ SETATTR_ManagedStruct_custom_clone_func(interp, rv , tmpclonefunc);
+ }
+
+ {
+ void *freepriv, *clonepriv;
+ GETATTR_ManagedStruct_custom_free_priv(interp , pmc, freepriv);
+ GETATTR_ManagedStruct_custom_clone_priv(interp, pmc, clonepriv);
+ if (freepriv) {
+ void *tmp = mem_sys_allocate(sizeof (struct jit_buffer_private_data));
+ memcpy(tmp, freepriv, sizeof (struct jit_buffer_private_data));
+ SETATTR_ManagedStruct_custom_free_priv(interp, rv , tmp);
+ if (clonepriv == freepriv) {
+ /* clonepriv is a copy of freepriv, make it a copy in the clone too. */
+ SETATTR_ManagedStruct_custom_clone_priv(interp, rv , tmp);
+ clonepriv = NULL; /* disable the clonepriv copying below */
+ }
+ }
+ if (clonepriv) {
+ void *tmp = mem_sys_allocate(sizeof (struct jit_buffer_private_data));
+ memcpy(tmp, clonepriv, sizeof (struct jit_buffer_private_data));
+ SETATTR_ManagedStruct_custom_clone_priv(interp, rv , tmp);
+ }
+ }
+
+ /* copy the execmem buffer */
+ if (PARROT_MANAGEDSTRUCT(pmc)->ptr) {
+ struct jit_buffer_private_data *jit = (struct jit_buffer_private_data*)priv;
+ void *ptr = PARROT_MANAGEDSTRUCT(pmc)->ptr;
+ void *newptr = mem_alloc_executable(jit->size);
+ if (!newptr)
+ Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_JIT_ERROR,
+ "Cannot allocate executable memory");
+ memcpy(newptr, ptr, jit->size);
+ PARROT_MANAGEDSTRUCT(rv)->ptr = newptr;
+ }
+
+ return rv;
+}
+
+
void
Parrot_jit_newfixup(Parrot_jit_info_t *jit_info)
{
More information about the parrot-commits
mailing list