mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-08-19 18:56:21 -06:00
in generateExprs, make sure that the NGF is not accidetally GCted
This commit is contained in:
@@ -848,20 +848,21 @@ data ParseOutput a
|
|||||||
parse :: Concr -> Type -> String -> ParseOutput [(Expr,Float)]
|
parse :: Concr -> Type -> String -> ParseOutput [(Expr,Float)]
|
||||||
parse c ty sent =
|
parse c ty sent =
|
||||||
unsafePerformIO $
|
unsafePerformIO $
|
||||||
withForeignPtr (c_revision c) $ \c_revision ->
|
withForeignPtr (c_revision c) $ \c_revision_ptr ->
|
||||||
bracket (newStablePtr ty) freeStablePtr $ \c_ty ->
|
bracket (newStablePtr ty) freeStablePtr $ \c_ty ->
|
||||||
withText sent $ \c_sent -> do
|
withText sent $ \c_sent -> do
|
||||||
c_enum <- withPgfExn "parse" (pgf_parse (c_db c) c_revision c_ty marshaller unmarshaller c_sent)
|
c_enum <- withPgfExn "parse" (pgf_parse (c_db c) c_revision_ptr c_ty marshaller unmarshaller c_sent)
|
||||||
exprs <- enumerateExprs (c_db c) c_enum
|
exprs <- enumerateExprs (c_db c) (c_revision c) c_enum
|
||||||
return (ParseOk exprs)
|
return (ParseOk exprs)
|
||||||
|
|
||||||
enumerateExprs c_db c_enum_ptr = do
|
enumerateExprs c_db c_revision c_enum_ptr = do
|
||||||
c_enum <- newForeignPtr pgf_free_expr_enum c_enum_ptr
|
c_enum <- newForeignPtr pgf_free_expr_enum c_enum_ptr
|
||||||
c_fetch <- (#peek PgfExprEnumVtbl, fetch) =<< (#peek PgfExprEnum, vtbl) c_enum_ptr
|
c_fetch <- (#peek PgfExprEnumVtbl, fetch) =<< (#peek PgfExprEnum, vtbl) c_enum_ptr
|
||||||
unsafeInterleaveIO (fetchLazy c_fetch c_enum)
|
unsafeInterleaveIO (fetchLazy c_fetch c_enum)
|
||||||
where
|
where
|
||||||
fetchLazy c_fetch c_enum =
|
fetchLazy c_fetch c_enum =
|
||||||
withForeignPtr c_enum $ \c_enum_ptr ->
|
withForeignPtr c_revision $ \_ ->
|
||||||
|
withForeignPtr c_enum $ \c_enum_ptr ->
|
||||||
alloca $ \p_prob -> do
|
alloca $ \p_prob -> do
|
||||||
c_expr <- callFetch c_fetch c_enum_ptr c_db p_prob
|
c_expr <- callFetch c_fetch c_enum_ptr c_db p_prob
|
||||||
if c_expr == castPtrToStablePtr nullPtr
|
if c_expr == castPtrToStablePtr nullPtr
|
||||||
@@ -1164,11 +1165,11 @@ generateAllExt p ty dp cs
|
|||||||
| otherwise =
|
| otherwise =
|
||||||
unsafePerformIO $
|
unsafePerformIO $
|
||||||
bracket (newStablePtr ty) freeStablePtr $ \c_ty ->
|
bracket (newStablePtr ty) freeStablePtr $ \c_ty ->
|
||||||
withForeignPtr (a_revision p) $ \a_revision ->
|
withForeignPtr (a_revision p) $ \a_revision_ptr ->
|
||||||
withPgfConcrs cs $ \c_db c_revisions n_revisions ->
|
withPgfConcrs cs $ \c_db c_revisions n_revisions ->
|
||||||
mask_ $ do
|
mask_ $ do
|
||||||
c_enum <- withPgfExn "generateAllExt" (pgf_generate_all (a_db p) a_revision c_revisions n_revisions c_ty (fromIntegral dp) marshaller unmarshaller)
|
c_enum <- withPgfExn "generateAllExt" (pgf_generate_all (a_db p) a_revision_ptr c_revisions n_revisions c_ty (fromIntegral dp) marshaller unmarshaller)
|
||||||
enumerateExprs (a_db p) c_enum
|
enumerateExprs (a_db p) (a_revision p) c_enum
|
||||||
|
|
||||||
generateAllFrom :: PGF -> Expr -> [(Expr,Float)]
|
generateAllFrom :: PGF -> Expr -> [(Expr,Float)]
|
||||||
generateAllFrom p ty = generateAllFromExt p ty maxBound []
|
generateAllFrom p ty = generateAllFromExt p ty maxBound []
|
||||||
|
|||||||
Reference in New Issue
Block a user