forked from GitHub/gf-core
fix reference counting for concrete revisions
This commit is contained in:
@@ -873,7 +873,7 @@ PgfConcrRevision pgf_create_concrete(PgfDB *db, PgfRevision revision,
|
||||
throw pgf_error("The concrete syntax already exists");
|
||||
|
||||
concr = PgfDB::malloc<PgfConcr>(name->size+1);
|
||||
concr->ref_count = 1;
|
||||
concr->ref_count = 2;
|
||||
concr->ref_count_ex = 1;
|
||||
concr->cflags = 0;
|
||||
concr->lins = 0;
|
||||
@@ -912,7 +912,7 @@ PgfConcrRevision pgf_clone_concrete(PgfDB *db, PgfRevision revision,
|
||||
throw pgf_error("Unknown concrete syntax");
|
||||
|
||||
ref<PgfConcr> clone = PgfDB::malloc<PgfConcr>(name->size+1);
|
||||
clone->ref_count = 1;
|
||||
clone->ref_count = 2;
|
||||
clone->ref_count_ex = 1;
|
||||
clone->cflags = concr->cflags;
|
||||
clone->lins = concr->lins;
|
||||
|
||||
@@ -66,6 +66,8 @@ foreign import ccall "pgf_free_revision" pgf_free_revision_ :: Ptr PgfDB -> Ptr
|
||||
|
||||
foreign import ccall "&pgf_free_revision" pgf_free_revision :: FinalizerEnvPtr PgfDB (PgfRevision PGF)
|
||||
|
||||
foreign import ccall "pgf_free_concr_revision" pgf_free_concr_revision_ :: Ptr PgfDB -> Ptr (PgfRevision Concr) -> IO ()
|
||||
|
||||
foreign import ccall "&pgf_free_concr_revision" pgf_free_concr_revision :: FinalizerEnvPtr PgfDB (PgfRevision Concr)
|
||||
|
||||
foreign import ccall "pgf_abstract_name"
|
||||
|
||||
@@ -147,7 +147,8 @@ dropCategory name = Transaction $ \c_db c_revision c_exn ->
|
||||
createConcrete :: ConcName -> Transaction Concr () -> Transaction PGF ()
|
||||
createConcrete name (Transaction f) = Transaction $ \c_db c_revision c_exn ->
|
||||
withText name $ \c_name -> do
|
||||
c_concr_revision <- pgf_create_concrete c_db c_revision c_name c_exn
|
||||
bracket (pgf_create_concrete c_db c_revision c_name c_exn)
|
||||
(pgf_free_concr_revision_ c_db) $ \c_concr_revision ->
|
||||
f c_db c_concr_revision c_exn
|
||||
|
||||
alterConcrete :: ConcName -> Transaction Concr () -> Transaction PGF ()
|
||||
|
||||
Reference in New Issue
Block a user