@@ -178,6 +178,10 @@ export function createApi(Z3: Z3Core): Z3HighLevel {
178
178
ctxs . forEach ( other => assert ( 'ctx' in other ? ctx === other . ctx : ctx === other , 'Context mismatch' ) ) ;
179
179
}
180
180
181
+ function _assertPtr < T extends Number > ( ptr : T | null ) : asserts ptr is T {
182
+ if ( ptr == null ) throw new TypeError ( 'Expected non-null pointer' ) ;
183
+ }
184
+
181
185
// call this after every nontrivial call to the underlying API
182
186
function throwIfError ( ) {
183
187
if ( Z3 . get_error_code ( contextPtr ) !== Z3_error_code . Z3_OK ) {
@@ -1203,7 +1207,7 @@ export function createApi(Z3: Z3Core): Z3HighLevel {
1203
1207
const myAst = this . ast ;
1204
1208
1205
1209
Z3 . inc_ref ( contextPtr , myAst ) ;
1206
- cleanup . register ( this , ( ) => Z3 . dec_ref ( contextPtr , myAst ) ) ;
1210
+ cleanup . register ( this , ( ) => Z3 . dec_ref ( contextPtr , myAst ) , this ) ;
1207
1211
}
1208
1212
1209
1213
get ast ( ) : Z3_ast {
@@ -1240,8 +1244,12 @@ export function createApi(Z3: Z3Core): Z3HighLevel {
1240
1244
class SolverImpl implements Solver < Name > {
1241
1245
declare readonly __typename : Solver [ '__typename' ] ;
1242
1246
1243
- readonly ptr : Z3_solver ;
1244
1247
readonly ctx : Context < Name > ;
1248
+ private _ptr : Z3_solver | null ;
1249
+ get ptr ( ) : Z3_solver {
1250
+ _assertPtr ( this . _ptr ) ;
1251
+ return this . _ptr ;
1252
+ }
1245
1253
1246
1254
constructor ( ptr : Z3_solver | string = Z3 . mk_solver ( contextPtr ) ) {
1247
1255
this . ctx = ctx ;
@@ -1251,9 +1259,9 @@ export function createApi(Z3: Z3Core): Z3HighLevel {
1251
1259
} else {
1252
1260
myPtr = ptr ;
1253
1261
}
1254
- this . ptr = myPtr ;
1262
+ this . _ptr = myPtr ;
1255
1263
Z3 . solver_inc_ref ( contextPtr , myPtr ) ;
1256
- cleanup . register ( this , ( ) => Z3 . solver_dec_ref ( contextPtr , myPtr ) ) ;
1264
+ cleanup . register ( this , ( ) => Z3 . solver_dec_ref ( contextPtr , myPtr ) , this ) ;
1257
1265
}
1258
1266
1259
1267
set ( key : string , value : any ) : void {
@@ -1327,21 +1335,32 @@ export function createApi(Z3: Z3Core): Z3HighLevel {
1327
1335
Z3 . solver_from_string ( contextPtr , this . ptr , s ) ;
1328
1336
throwIfError ( ) ;
1329
1337
}
1338
+
1339
+ release ( ) {
1340
+ Z3 . solver_dec_ref ( contextPtr , this . ptr ) ;
1341
+ // Mark the ptr as null to prevent double free
1342
+ this . _ptr = null ;
1343
+ cleanup . unregister ( this ) ;
1344
+ }
1330
1345
}
1331
1346
1332
1347
class OptimizeImpl implements Optimize < Name > {
1333
1348
declare readonly __typename : Optimize [ '__typename' ] ;
1334
1349
1335
- readonly ptr : Z3_optimize ;
1336
1350
readonly ctx : Context < Name > ;
1351
+ private _ptr : Z3_optimize | null ;
1352
+ get ptr ( ) : Z3_optimize {
1353
+ _assertPtr ( this . _ptr ) ;
1354
+ return this . _ptr ;
1355
+ }
1337
1356
1338
1357
constructor ( ptr : Z3_optimize = Z3 . mk_optimize ( contextPtr ) ) {
1339
1358
this . ctx = ctx ;
1340
1359
let myPtr : Z3_optimize ;
1341
1360
myPtr = ptr ;
1342
- this . ptr = myPtr ;
1361
+ this . _ptr = myPtr ;
1343
1362
Z3 . optimize_inc_ref ( contextPtr , myPtr ) ;
1344
- cleanup . register ( this , ( ) => Z3 . optimize_dec_ref ( contextPtr , myPtr ) ) ;
1363
+ cleanup . register ( this , ( ) => Z3 . optimize_dec_ref ( contextPtr , myPtr ) , this ) ;
1345
1364
}
1346
1365
1347
1366
set ( key : string , value : any ) : void {
@@ -1363,11 +1382,11 @@ export function createApi(Z3: Z3Core): Z3HighLevel {
1363
1382
} ) ;
1364
1383
}
1365
1384
1366
- addSoft ( expr : Bool < Name > , weight : number | bigint | string | CoercibleRational , id : number | string = "" ) {
1385
+ addSoft ( expr : Bool < Name > , weight : number | bigint | string | CoercibleRational , id : number | string = '' ) {
1367
1386
if ( isCoercibleRational ( weight ) ) {
1368
1387
weight = `${ weight . numerator } /${ weight . denominator } ` ;
1369
1388
}
1370
- check ( Z3 . optimize_assert_soft ( contextPtr , this . ptr , expr . ast , weight . toString ( ) , _toSymbol ( id ) ) )
1389
+ check ( Z3 . optimize_assert_soft ( contextPtr , this . ptr , expr . ast , weight . toString ( ) , _toSymbol ( id ) ) ) ;
1371
1390
}
1372
1391
1373
1392
addAndTrack ( expr : Bool < Name > , constant : Bool < Name > | string ) {
@@ -1395,9 +1414,7 @@ export function createApi(Z3: Z3Core): Z3HighLevel {
1395
1414
_assertContext ( expr ) ;
1396
1415
return expr . ast ;
1397
1416
} ) ;
1398
- const result = await asyncMutex . runExclusive ( ( ) =>
1399
- check ( Z3 . optimize_check ( contextPtr , this . ptr , assumptions ) ) ,
1400
- ) ;
1417
+ const result = await asyncMutex . runExclusive ( ( ) => check ( Z3 . optimize_check ( contextPtr , this . ptr , assumptions ) ) ) ;
1401
1418
switch ( result ) {
1402
1419
case Z3_lbool . Z3_L_FALSE :
1403
1420
return 'unsat' ;
@@ -1422,17 +1439,28 @@ export function createApi(Z3: Z3Core): Z3HighLevel {
1422
1439
Z3 . optimize_from_string ( contextPtr , this . ptr , s ) ;
1423
1440
throwIfError ( ) ;
1424
1441
}
1425
- }
1426
1442
1443
+ release ( ) {
1444
+ Z3 . optimize_dec_ref ( contextPtr , this . ptr ) ;
1445
+ this . _ptr = null ;
1446
+ cleanup . unregister ( this ) ;
1447
+ }
1448
+ }
1427
1449
1428
1450
class ModelImpl implements Model < Name > {
1429
1451
declare readonly __typename : Model [ '__typename' ] ;
1430
1452
readonly ctx : Context < Name > ;
1453
+ private _ptr : Z3_model | null ;
1454
+ get ptr ( ) : Z3_model {
1455
+ _assertPtr ( this . _ptr ) ;
1456
+ return this . _ptr ;
1457
+ }
1431
1458
1432
- constructor ( readonly ptr : Z3_model = Z3 . mk_model ( contextPtr ) ) {
1459
+ constructor ( ptr : Z3_model = Z3 . mk_model ( contextPtr ) ) {
1433
1460
this . ctx = ctx ;
1461
+ this . _ptr = ptr ;
1434
1462
Z3 . model_inc_ref ( contextPtr , ptr ) ;
1435
- cleanup . register ( this , ( ) => Z3 . model_dec_ref ( contextPtr , ptr ) ) ;
1463
+ cleanup . register ( this , ( ) => Z3 . model_dec_ref ( contextPtr , ptr ) , this ) ;
1436
1464
}
1437
1465
1438
1466
length ( ) {
@@ -1594,6 +1622,12 @@ export function createApi(Z3: Z3Core): Z3HighLevel {
1594
1622
_assertContext ( sort ) ;
1595
1623
return new AstVectorImpl ( check ( Z3 . model_get_sort_universe ( contextPtr , this . ptr , sort . ptr ) ) ) ;
1596
1624
}
1625
+
1626
+ release ( ) {
1627
+ Z3 . model_dec_ref ( contextPtr , this . ptr ) ;
1628
+ this . _ptr = null ;
1629
+ cleanup . unregister ( this ) ;
1630
+ }
1597
1631
}
1598
1632
1599
1633
class FuncEntryImpl implements FuncEntry < Name > {
@@ -1604,7 +1638,7 @@ export function createApi(Z3: Z3Core): Z3HighLevel {
1604
1638
constructor ( readonly ptr : Z3_func_entry ) {
1605
1639
this . ctx = ctx ;
1606
1640
Z3 . func_entry_inc_ref ( contextPtr , ptr ) ;
1607
- cleanup . register ( this , ( ) => Z3 . func_entry_dec_ref ( contextPtr , ptr ) ) ;
1641
+ cleanup . register ( this , ( ) => Z3 . func_entry_dec_ref ( contextPtr , ptr ) , this ) ;
1608
1642
}
1609
1643
1610
1644
numArgs ( ) {
@@ -1627,7 +1661,7 @@ export function createApi(Z3: Z3Core): Z3HighLevel {
1627
1661
constructor ( readonly ptr : Z3_func_interp ) {
1628
1662
this . ctx = ctx ;
1629
1663
Z3 . func_interp_inc_ref ( contextPtr , ptr ) ;
1630
- cleanup . register ( this , ( ) => Z3 . func_interp_dec_ref ( contextPtr , ptr ) ) ;
1664
+ cleanup . register ( this , ( ) => Z3 . func_interp_dec_ref ( contextPtr , ptr ) , this ) ;
1631
1665
}
1632
1666
1633
1667
elseValue ( ) : Expr < Name > {
@@ -1922,7 +1956,7 @@ export function createApi(Z3: Z3Core): Z3HighLevel {
1922
1956
this . ptr = myPtr ;
1923
1957
1924
1958
Z3 . tactic_inc_ref ( contextPtr , myPtr ) ;
1925
- cleanup . register ( this , ( ) => Z3 . tactic_dec_ref ( contextPtr , myPtr ) ) ;
1959
+ cleanup . register ( this , ( ) => Z3 . tactic_dec_ref ( contextPtr , myPtr ) , this ) ;
1926
1960
}
1927
1961
}
1928
1962
@@ -2586,7 +2620,7 @@ export function createApi(Z3: Z3Core): Z3HighLevel {
2586
2620
constructor ( readonly ptr : Z3_ast_vector = Z3 . mk_ast_vector ( contextPtr ) ) {
2587
2621
this . ctx = ctx ;
2588
2622
Z3 . ast_vector_inc_ref ( contextPtr , ptr ) ;
2589
- cleanup . register ( this , ( ) => Z3 . ast_vector_dec_ref ( contextPtr , ptr ) ) ;
2623
+ cleanup . register ( this , ( ) => Z3 . ast_vector_dec_ref ( contextPtr , ptr ) , this ) ;
2590
2624
}
2591
2625
2592
2626
length ( ) : number {
@@ -2684,7 +2718,7 @@ export function createApi(Z3: Z3Core): Z3HighLevel {
2684
2718
constructor ( readonly ptr : Z3_ast_map = Z3 . mk_ast_map ( contextPtr ) ) {
2685
2719
this . ctx = ctx ;
2686
2720
Z3 . ast_map_inc_ref ( contextPtr , ptr ) ;
2687
- cleanup . register ( this , ( ) => Z3 . ast_map_dec_ref ( contextPtr , ptr ) ) ;
2721
+ cleanup . register ( this , ( ) => Z3 . ast_map_dec_ref ( contextPtr , ptr ) , this ) ;
2688
2722
}
2689
2723
2690
2724
[ Symbol . iterator ] ( ) : Iterator < [ Key , Value ] > {
0 commit comments