3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-12 12:08:18 +00:00

Merge pull request #648 from cheshire/no_finalizers

Replace finalizers with PhantomReferences in Java API
This commit is contained in:
Christoph M. Wintersteiger 2016-06-24 14:17:29 +01:00 committed by GitHub
commit 3e96a7972f
56 changed files with 524 additions and 1241 deletions

View file

@ -175,15 +175,8 @@ public class AST extends Z3Object implements Comparable<AST>
* A string representation of the AST. * A string representation of the AST.
**/ **/
@Override @Override
public String toString() public String toString() {
{ return Native.astToString(getContext().nCtx(), getNativeObject());
try
{
return Native.astToString(getContext().nCtx(), getNativeObject());
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
}
} }
/** /**
@ -194,34 +187,18 @@ public class AST extends Z3Object implements Comparable<AST>
return Native.astToString(getContext().nCtx(), getNativeObject()); return Native.astToString(getContext().nCtx(), getNativeObject());
} }
AST(Context ctx) AST(Context ctx, long obj) {
{
super(ctx);
}
AST(Context ctx, long obj)
{
super(ctx, obj); super(ctx, obj);
} }
@Override @Override
void incRef(long o) void incRef() {
{ Native.incRef(getContext().nCtx(), getNativeObject());
// Console.WriteLine("AST IncRef()");
if (getContext() == null || o == 0)
return;
getContext().getASTDRQ().incAndClear(getContext(), o);
super.incRef(o);
} }
@Override @Override
void decRef(long o) void addToReferenceQueue() {
{ getContext().getASTDRQ().storeReference(getContext(), this);
// Console.WriteLine("AST DecRef()");
if (getContext() == null || o == 0)
return;
getContext().getASTDRQ().add(o);
super.decRef(o);
} }
static AST create(Context ctx, long obj) static AST create(Context ctx, long obj)

View file

@ -17,39 +17,15 @@ Notes:
package com.microsoft.z3; package com.microsoft.z3;
class ASTDecRefQueue extends IDecRefQueue class ASTDecRefQueue extends IDecRefQueue<AST>
{ {
public ASTDecRefQueue() public ASTDecRefQueue()
{ {
super(); super();
} }
public ASTDecRefQueue(int move_limit)
{
super(move_limit);
}
@Override @Override
protected void incRef(Context ctx, long obj) protected void decRef(Context ctx, long obj) {
{ Native.decRef(ctx.nCtx(), obj);
try
{
Native.incRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
}
@Override
protected void decRef(Context ctx, long obj)
{
try
{
Native.decRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
} }
}; };

View file

@ -20,8 +20,7 @@ package com.microsoft.z3;
/** /**
* Map from AST to AST * Map from AST to AST
**/ **/
class ASTMap extends Z3Object class ASTMap extends Z3Object {
{
/** /**
* Checks whether the map contains the key {@code k}. * Checks whether the map contains the key {@code k}.
* @param k An AST * @param k An AST
@ -104,13 +103,7 @@ class ASTMap extends Z3Object
@Override @Override
public String toString() public String toString()
{ {
try return Native.astMapToString(getContext().nCtx(), getNativeObject());
{
return Native.astMapToString(getContext().nCtx(), getNativeObject());
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
}
} }
ASTMap(Context ctx, long obj) ASTMap(Context ctx, long obj)
@ -124,16 +117,12 @@ class ASTMap extends Z3Object
} }
@Override @Override
void incRef(long o) void incRef() {
{ Native.astMapIncRef(getContext().nCtx(), getNativeObject());
getContext().getASTMapDRQ().incAndClear(getContext(), o);
super.incRef(o);
} }
@Override @Override
void decRef(long o) void addToReferenceQueue() {
{ getContext().getASTMapDRQ().storeReference(getContext(), this);
getContext().getASTMapDRQ().add(o);
super.decRef(o);
} }
} }

View file

@ -20,8 +20,7 @@ package com.microsoft.z3;
/** /**
* Vectors of ASTs. * Vectors of ASTs.
**/ **/
public class ASTVector extends Z3Object public class ASTVector extends Z3Object {
{
/** /**
* The size of the vector * The size of the vector
**/ **/
@ -88,15 +87,8 @@ public class ASTVector extends Z3Object
* Retrieves a string representation of the vector. * Retrieves a string representation of the vector.
**/ **/
@Override @Override
public String toString() public String toString() {
{ return Native.astVectorToString(getContext().nCtx(), getNativeObject());
try
{
return Native.astVectorToString(getContext().nCtx(), getNativeObject());
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
}
} }
ASTVector(Context ctx, long obj) ASTVector(Context ctx, long obj)
@ -110,19 +102,15 @@ public class ASTVector extends Z3Object
} }
@Override @Override
void incRef(long o) void incRef() {
{ Native.astVectorIncRef(getContext().nCtx(), getNativeObject());
getContext().getASTVectorDRQ().incAndClear(getContext(), o);
super.incRef(o);
} }
@Override @Override
void decRef(long o) void addToReferenceQueue() {
{ getContext().getASTVectorDRQ().storeReference(getContext(), this);
getContext().getASTVectorDRQ().add(o);
super.decRef(o);
} }
/** /**
* Translates the AST vector into an AST[] * Translates the AST vector into an AST[]
* */ * */

View file

@ -21,8 +21,7 @@ package com.microsoft.z3;
* ApplyResult objects represent the result of an application of a tactic to a * ApplyResult objects represent the result of an application of a tactic to a
* goal. It contains the subgoals that were produced. * goal. It contains the subgoals that were produced.
**/ **/
public class ApplyResult extends Z3Object public class ApplyResult extends Z3Object {
{
/** /**
* The number of Subgoals. * The number of Subgoals.
**/ **/
@ -64,15 +63,8 @@ public class ApplyResult extends Z3Object
* A string representation of the ApplyResult. * A string representation of the ApplyResult.
**/ **/
@Override @Override
public String toString() public String toString() {
{ return Native.applyResultToString(getContext().nCtx(), getNativeObject());
try
{
return Native.applyResultToString(getContext().nCtx(), getNativeObject());
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
}
} }
ApplyResult(Context ctx, long obj) ApplyResult(Context ctx, long obj)
@ -81,16 +73,12 @@ public class ApplyResult extends Z3Object
} }
@Override @Override
void incRef(long o) void incRef() {
{ Native.applyResultIncRef(getContext().nCtx(), getNativeObject());
getContext().getApplyResultDRQ().incAndClear(getContext(), o);
super.incRef(o);
} }
@Override @Override
void decRef(long o) void addToReferenceQueue() {
{ getContext().getApplyResultDRQ().storeReference(getContext(), this);
getContext().getApplyResultDRQ().add(o);
super.decRef(o);
} }
} }

View file

@ -17,39 +17,15 @@ Notes:
package com.microsoft.z3; package com.microsoft.z3;
class ApplyResultDecRefQueue extends IDecRefQueue class ApplyResultDecRefQueue extends IDecRefQueue<ApplyResult>
{ {
public ApplyResultDecRefQueue() public ApplyResultDecRefQueue()
{ {
super(); super();
} }
public ApplyResultDecRefQueue(int move_limit)
{
super(move_limit);
}
@Override @Override
protected void incRef(Context ctx, long obj) protected void decRef(Context ctx, long obj) {
{ Native.applyResultDecRef(ctx.nCtx(), obj);
try
{
Native.applyResultIncRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
}
@Override
protected void decRef(Context ctx, long obj)
{
try
{
Native.applyResultDecRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
} }
}; };

View file

@ -17,39 +17,14 @@ Notes:
package com.microsoft.z3; package com.microsoft.z3;
class ASTMapDecRefQueue extends IDecRefQueue class ASTMapDecRefQueue extends IDecRefQueue<ASTMap> {
{
public ASTMapDecRefQueue() public ASTMapDecRefQueue()
{ {
super(); super();
} }
public ASTMapDecRefQueue(int move_limit)
{
super(move_limit);
}
@Override @Override
protected void incRef(Context ctx, long obj) protected void decRef(Context ctx, long obj) {
{ Native.astMapDecRef(ctx.nCtx(), obj);
try
{
Native.astMapIncRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
} }
}
@Override
protected void decRef(Context ctx, long obj)
{
try
{
Native.astMapDecRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
}
};

View file

@ -17,39 +17,14 @@ Notes:
package com.microsoft.z3; package com.microsoft.z3;
class ASTVectorDecRefQueue extends IDecRefQueue class ASTVectorDecRefQueue extends IDecRefQueue<ASTVector> {
{
public ASTVectorDecRefQueue() public ASTVectorDecRefQueue()
{ {
super(); super();
} }
public ASTVectorDecRefQueue(int move_limit)
{
super(move_limit);
}
@Override @Override
protected void incRef(Context ctx, long obj) protected void decRef(Context ctx, long obj) {
{ Native.astVectorDecRef(ctx.nCtx(), obj);
try
{
Native.astVectorIncRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
} }
}
@Override
protected void decRef(Context ctx, long obj)
{
try
{
Native.astVectorDecRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
}
};

View file

@ -66,13 +66,7 @@ public class BitVecNum extends BitVecExpr
@Override @Override
public String toString() public String toString()
{ {
try return Native.getNumeralString(getContext().nCtx(), getNativeObject());
{
return Native.getNumeralString(getContext().nCtx(), getNativeObject());
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
}
} }
BitVecNum(Context ctx, long obj) BitVecNum(Context ctx, long obj)

View file

@ -20,15 +20,7 @@ package com.microsoft.z3;
/** /**
* Boolean expressions * Boolean expressions
**/ **/
public class BoolExpr extends Expr public class BoolExpr extends Expr {
{
/**
* Constructor for BoolExpr
**/
protected BoolExpr(Context ctx)
{
super(ctx);
}
/** /**
* Constructor for BoolExpr * Constructor for BoolExpr

View file

@ -20,8 +20,14 @@ package com.microsoft.z3;
/** /**
* Constructors are used for datatype sorts. * Constructors are used for datatype sorts.
**/ **/
public class Constructor extends Z3Object public class Constructor extends Z3Object {
{ private final int n;
Constructor(Context ctx, int n, long nativeObj) {
super(ctx, nativeObj);
this.n = n;
}
/** /**
* The number of fields of the constructor. * The number of fields of the constructor.
* @throws Z3Exception * @throws Z3Exception
@ -78,29 +84,19 @@ public class Constructor extends Z3Object
return t; return t;
} }
/** @Override
* Destructor. void incRef() {
* @throws Throwable // Datatype constructors are not reference counted.
* @throws Z3Exception on error
**/
protected void finalize() throws Throwable
{
try {
Native.delConstructor(getContext().nCtx(), getNativeObject());
} finally {
super.finalize();
}
} }
private int n = 0; @Override
void addToReferenceQueue() {
getContext().getConstructorDRQ().storeReference(getContext(), this);
}
Constructor(Context ctx, Symbol name, Symbol recognizer, static Constructor of(Context ctx, Symbol name, Symbol recognizer,
Symbol[] fieldNames, Sort[] sorts, int[] sortRefs) Symbol[] fieldNames, Sort[] sorts, int[] sortRefs) {
int n = AST.arrayLength(fieldNames);
{
super(ctx);
n = AST.arrayLength(fieldNames);
if (n != AST.arrayLength(sorts)) if (n != AST.arrayLength(sorts))
throw new Z3Exception( throw new Z3Exception(
@ -112,9 +108,10 @@ public class Constructor extends Z3Object
if (sortRefs == null) if (sortRefs == null)
sortRefs = new int[n]; sortRefs = new int[n];
setNativeObject(Native.mkConstructor(ctx.nCtx(), name.getNativeObject(), long nativeObj = Native.mkConstructor(ctx.nCtx(), name.getNativeObject(),
recognizer.getNativeObject(), n, Symbol.arrayToNative(fieldNames), recognizer.getNativeObject(), n, Symbol.arrayToNative(fieldNames),
Sort.arrayToNative(sorts), sortRefs)); Sort.arrayToNative(sorts), sortRefs);
return new Constructor(ctx, n, nativeObj);
} }
} }

View file

@ -0,0 +1,12 @@
package com.microsoft.z3;
public class ConstructorDecRefQueue extends IDecRefQueue<Constructor> {
public ConstructorDecRefQueue() {
super();
}
@Override
protected void decRef(Context ctx, long obj) {
Native.delConstructor(ctx.nCtx(), obj);
}
}

View file

@ -20,32 +20,26 @@ package com.microsoft.z3;
/** /**
* Lists of constructors * Lists of constructors
**/ **/
public class ConstructorList extends Z3Object public class ConstructorList extends Z3Object {
{
/**
* Destructor.
* @throws Throwable
* @throws Z3Exception on error
**/
protected void finalize() throws Throwable
{
try {
Native.delConstructorList(getContext().nCtx(), getNativeObject());
} finally {
super.finalize();
}
}
ConstructorList(Context ctx, long obj) ConstructorList(Context ctx, long obj)
{ {
super(ctx, obj); super(ctx, obj);
} }
@Override
void incRef() {
// Constructor lists are not reference counted.
}
@Override
void addToReferenceQueue() {
getContext().getConstructorListDRQ().storeReference(getContext(), this);
}
ConstructorList(Context ctx, Constructor[] constructors) ConstructorList(Context ctx, Constructor[] constructors)
{ {
super(ctx); super(ctx, Native.mkConstructorList(ctx.nCtx(),
setNativeObject(Native.mkConstructorList(getContext().nCtx(),
constructors.length, constructors.length,
Constructor.arrayToNative(constructors))); Constructor.arrayToNative(constructors)));
} }

View file

@ -0,0 +1,12 @@
package com.microsoft.z3;
public class ConstructorListDecRefQueue extends IDecRefQueue<ConstructorList> {
public ConstructorListDecRefQueue() {
super();
}
@Override
protected void decRef(Context ctx, long obj) {
Native.delConstructorList(ctx.nCtx(), obj);
}
}

View file

@ -17,34 +17,31 @@ Notes:
package com.microsoft.z3; package com.microsoft.z3;
import java.util.Map; import static com.microsoft.z3.Constructor.of;
import java.util.concurrent.atomic.AtomicInteger;
import com.microsoft.z3.enumerations.Z3_ast_print_mode; import com.microsoft.z3.enumerations.Z3_ast_print_mode;
import java.util.Map;
/** /**
* The main interaction with Z3 happens via the Context. * The main interaction with Z3 happens via the Context.
**/ **/
public class Context extends IDisposable public class Context implements AutoCloseable {
{ private final long m_ctx;
/** static final Object creation_lock = new Object();
* Constructor.
**/ public Context () {
public Context() m_ctx = Native.mkContextRc(0);
{ init();
super();
synchronized (creation_lock) {
m_ctx = Native.mkContextRc(0);
initContext();
}
} }
/** /**
* Constructor. * Constructor.
* Remarks: * Remarks:
* The following parameters can be set: * The following parameters can be set:
* - proof (Boolean) Enable proof generation * - proof (Boolean) Enable proof generation
* - debug_ref_count (Boolean) Enable debug support for Z3_ast reference counting * - debug_ref_count (Boolean) Enable debug support for Z3_ast reference counting
* - trace (Boolean) Tracing support for VCC * - trace (Boolean) Tracing support for VCC
* - trace_file_name (String) Trace out file for VCC traces * - trace_file_name (String) Trace out file for VCC traces
* - timeout (unsigned) default timeout (in milliseconds) used for solvers * - timeout (unsigned) default timeout (in milliseconds) used for solvers
@ -53,20 +50,22 @@ public class Context extends IDisposable
* - model model generation for solvers, this parameter can be overwritten when creating a solver * - model model generation for solvers, this parameter can be overwritten when creating a solver
* - model_validate validate models produced by solvers * - model_validate validate models produced by solvers
* - unsat_core unsat-core generation for solvers, this parameter can be overwritten when creating a solver * - unsat_core unsat-core generation for solvers, this parameter can be overwritten when creating a solver
* Note that in previous versions of Z3, this constructor was also used to set global and * Note that in previous versions of Z3, this constructor was also used to set global and
* module parameters. For this purpose we should now use {@code Global.setParameter} * module parameters. For this purpose we should now use {@code Global.setParameter}
**/ **/
public Context(Map<String, String> settings) public Context(Map<String, String> settings) {
{ long cfg = Native.mkConfig();
super(); for (Map.Entry<String, String> kv : settings.entrySet()) {
synchronized (creation_lock) { Native.setParamValue(cfg, kv.getKey(), kv.getValue());
long cfg = Native.mkConfig();
for (Map.Entry<String, String> kv : settings.entrySet())
Native.setParamValue(cfg, kv.getKey(), kv.getValue());
m_ctx = Native.mkContextRc(cfg);
Native.delConfig(cfg);
initContext();
} }
m_ctx = Native.mkContextRc(cfg);
Native.delConfig(cfg);
init();
}
private void init() {
setPrintMode(Z3_ast_print_mode.Z3_PRINT_SMTLIB2_COMPLIANT);
Native.setInternalErrorHandler(m_ctx);
} }
/** /**
@ -242,7 +241,7 @@ public class Context extends IDisposable
checkContextMatch(name); checkContextMatch(name);
checkContextMatch(fieldNames); checkContextMatch(fieldNames);
checkContextMatch(fieldSorts); checkContextMatch(fieldSorts);
return new TupleSort(this, name, (int) fieldNames.length, fieldNames, return new TupleSort(this, name, fieldNames.length, fieldNames,
fieldSorts); fieldSorts);
} }
@ -319,8 +318,7 @@ public class Context extends IDisposable
Symbol[] fieldNames, Sort[] sorts, int[] sortRefs) Symbol[] fieldNames, Sort[] sorts, int[] sortRefs)
{ {
return of(this, name, recognizer, fieldNames, sorts,
return new Constructor(this, name, recognizer, fieldNames, sorts,
sortRefs); sortRefs);
} }
@ -329,10 +327,8 @@ public class Context extends IDisposable
**/ **/
public Constructor mkConstructor(String name, String recognizer, public Constructor mkConstructor(String name, String recognizer,
String[] fieldNames, Sort[] sorts, int[] sortRefs) String[] fieldNames, Sort[] sorts, int[] sortRefs)
{ {
return of(this, mkSymbol(name), mkSymbol(recognizer),
return new Constructor(this, mkSymbol(name), mkSymbol(recognizer),
mkSymbols(fieldNames), sorts, sortRefs); mkSymbols(fieldNames), sorts, sortRefs);
} }
@ -525,7 +521,7 @@ public class Context extends IDisposable
throw new Z3Exception("Cannot create a pattern from zero terms"); throw new Z3Exception("Cannot create a pattern from zero terms");
long[] termsNative = AST.arrayToNative(terms); long[] termsNative = AST.arrayToNative(terms);
return new Pattern(this, Native.mkPattern(nCtx(), (int) terms.length, return new Pattern(this, Native.mkPattern(nCtx(), terms.length,
termsNative)); termsNative));
} }
@ -688,7 +684,7 @@ public class Context extends IDisposable
public BoolExpr mkDistinct(Expr... args) public BoolExpr mkDistinct(Expr... args)
{ {
checkContextMatch(args); checkContextMatch(args);
return new BoolExpr(this, Native.mkDistinct(nCtx(), (int) args.length, return new BoolExpr(this, Native.mkDistinct(nCtx(), args.length,
AST.arrayToNative(args))); AST.arrayToNative(args)));
} }
@ -756,7 +752,7 @@ public class Context extends IDisposable
public BoolExpr mkAnd(BoolExpr... t) public BoolExpr mkAnd(BoolExpr... t)
{ {
checkContextMatch(t); checkContextMatch(t);
return new BoolExpr(this, Native.mkAnd(nCtx(), (int) t.length, return new BoolExpr(this, Native.mkAnd(nCtx(), t.length,
AST.arrayToNative(t))); AST.arrayToNative(t)));
} }
@ -766,7 +762,7 @@ public class Context extends IDisposable
public BoolExpr mkOr(BoolExpr... t) public BoolExpr mkOr(BoolExpr... t)
{ {
checkContextMatch(t); checkContextMatch(t);
return new BoolExpr(this, Native.mkOr(nCtx(), (int) t.length, return new BoolExpr(this, Native.mkOr(nCtx(), t.length,
AST.arrayToNative(t))); AST.arrayToNative(t)));
} }
@ -777,7 +773,7 @@ public class Context extends IDisposable
{ {
checkContextMatch(t); checkContextMatch(t);
return (ArithExpr) Expr.create(this, return (ArithExpr) Expr.create(this,
Native.mkAdd(nCtx(), (int) t.length, AST.arrayToNative(t))); Native.mkAdd(nCtx(), t.length, AST.arrayToNative(t)));
} }
/** /**
@ -787,7 +783,7 @@ public class Context extends IDisposable
{ {
checkContextMatch(t); checkContextMatch(t);
return (ArithExpr) Expr.create(this, return (ArithExpr) Expr.create(this,
Native.mkMul(nCtx(), (int) t.length, AST.arrayToNative(t))); Native.mkMul(nCtx(), t.length, AST.arrayToNative(t)));
} }
/** /**
@ -797,7 +793,7 @@ public class Context extends IDisposable
{ {
checkContextMatch(t); checkContextMatch(t);
return (ArithExpr) Expr.create(this, return (ArithExpr) Expr.create(this,
Native.mkSub(nCtx(), (int) t.length, AST.arrayToNative(t))); Native.mkSub(nCtx(), t.length, AST.arrayToNative(t)));
} }
/** /**
@ -1814,7 +1810,7 @@ public class Context extends IDisposable
{ {
checkContextMatch(args); checkContextMatch(args);
return (ArrayExpr)Expr.create(this, return (ArrayExpr)Expr.create(this,
Native.mkSetUnion(nCtx(), (int) args.length, Native.mkSetUnion(nCtx(), args.length,
AST.arrayToNative(args))); AST.arrayToNative(args)));
} }
@ -1825,7 +1821,7 @@ public class Context extends IDisposable
{ {
checkContextMatch(args); checkContextMatch(args);
return (ArrayExpr)Expr.create(this, return (ArrayExpr)Expr.create(this,
Native.mkSetIntersect(nCtx(), (int) args.length, Native.mkSetIntersect(nCtx(), args.length,
AST.arrayToNative(args))); AST.arrayToNative(args)));
} }
@ -1912,7 +1908,7 @@ public class Context extends IDisposable
public SeqExpr MkConcat(SeqExpr... t) public SeqExpr MkConcat(SeqExpr... t)
{ {
checkContextMatch(t); checkContextMatch(t);
return new SeqExpr(this, Native.mkSeqConcat(nCtx(), (int)t.length, AST.arrayToNative(t))); return new SeqExpr(this, Native.mkSeqConcat(nCtx(), t.length, AST.arrayToNative(t)));
} }
@ -2040,7 +2036,7 @@ public class Context extends IDisposable
public ReExpr MkConcat(ReExpr... t) public ReExpr MkConcat(ReExpr... t)
{ {
checkContextMatch(t); checkContextMatch(t);
return new ReExpr(this, Native.mkReConcat(nCtx(), (int)t.length, AST.arrayToNative(t))); return new ReExpr(this, Native.mkReConcat(nCtx(), t.length, AST.arrayToNative(t)));
} }
/** /**
@ -2049,7 +2045,7 @@ public class Context extends IDisposable
public ReExpr MkUnion(ReExpr... t) public ReExpr MkUnion(ReExpr... t)
{ {
checkContextMatch(t); checkContextMatch(t);
return new ReExpr(this, Native.mkReUnion(nCtx(), (int)t.length, AST.arrayToNative(t))); return new ReExpr(this, Native.mkReUnion(nCtx(), t.length, AST.arrayToNative(t)));
} }
@ -2258,7 +2254,7 @@ public class Context extends IDisposable
Symbol quantifierID, Symbol skolemID) Symbol quantifierID, Symbol skolemID)
{ {
return new Quantifier(this, true, sorts, names, body, weight, patterns, return Quantifier.of(this, true, sorts, names, body, weight, patterns,
noPatterns, quantifierID, skolemID); noPatterns, quantifierID, skolemID);
} }
@ -2271,7 +2267,7 @@ public class Context extends IDisposable
Symbol skolemID) Symbol skolemID)
{ {
return new Quantifier(this, true, boundConstants, body, weight, return Quantifier.of(this, true, boundConstants, body, weight,
patterns, noPatterns, quantifierID, skolemID); patterns, noPatterns, quantifierID, skolemID);
} }
@ -2284,7 +2280,7 @@ public class Context extends IDisposable
Symbol quantifierID, Symbol skolemID) Symbol quantifierID, Symbol skolemID)
{ {
return new Quantifier(this, false, sorts, names, body, weight, return Quantifier.of(this, false, sorts, names, body, weight,
patterns, noPatterns, quantifierID, skolemID); patterns, noPatterns, quantifierID, skolemID);
} }
@ -2297,7 +2293,7 @@ public class Context extends IDisposable
Symbol skolemID) Symbol skolemID)
{ {
return new Quantifier(this, false, boundConstants, body, weight, return Quantifier.of(this, false, boundConstants, body, weight,
patterns, noPatterns, quantifierID, skolemID); patterns, noPatterns, quantifierID, skolemID);
} }
@ -3814,7 +3810,7 @@ public class Context extends IDisposable
* must be a native object obtained from Z3 (e.g., through * must be a native object obtained from Z3 (e.g., through
* {@code UnwrapAST}) and that it must have a correct reference count. * {@code UnwrapAST}) and that it must have a correct reference count.
* @see Native#incRef * @see Native#incRef
* @see unwrapAST * @see #unwrapAST
* @param nativeObject The native pointer to wrap. * @param nativeObject The native pointer to wrap.
**/ **/
public AST wrapAST(long nativeObject) public AST wrapAST(long nativeObject)
@ -3869,19 +3865,12 @@ public class Context extends IDisposable
Native.updateParamValue(nCtx(), id, value); Native.updateParamValue(nCtx(), id, value);
} }
protected long m_ctx = 0;
protected static final Object creation_lock = new Object();
long nCtx() long nCtx()
{ {
return m_ctx; return m_ctx;
} }
void initContext()
{
setPrintMode(Z3_ast_print_mode.Z3_PRINT_SMTLIB2_COMPLIANT);
Native.setInternalErrorHandler(nCtx());
}
void checkContextMatch(Z3Object other) void checkContextMatch(Z3Object other)
{ {
@ -3910,125 +3899,118 @@ public class Context extends IDisposable
} }
private ASTDecRefQueue m_AST_DRQ = new ASTDecRefQueue(); private ASTDecRefQueue m_AST_DRQ = new ASTDecRefQueue();
private ASTMapDecRefQueue m_ASTMap_DRQ = new ASTMapDecRefQueue(10); private ASTMapDecRefQueue m_ASTMap_DRQ = new ASTMapDecRefQueue();
private ASTVectorDecRefQueue m_ASTVector_DRQ = new ASTVectorDecRefQueue(10); private ASTVectorDecRefQueue m_ASTVector_DRQ = new ASTVectorDecRefQueue();
private ApplyResultDecRefQueue m_ApplyResult_DRQ = new ApplyResultDecRefQueue(10); private ApplyResultDecRefQueue m_ApplyResult_DRQ = new ApplyResultDecRefQueue();
private FuncInterpEntryDecRefQueue m_FuncEntry_DRQ = new FuncInterpEntryDecRefQueue(10); private FuncInterpEntryDecRefQueue m_FuncEntry_DRQ = new FuncInterpEntryDecRefQueue();
private FuncInterpDecRefQueue m_FuncInterp_DRQ = new FuncInterpDecRefQueue(10); private FuncInterpDecRefQueue m_FuncInterp_DRQ = new FuncInterpDecRefQueue();
private GoalDecRefQueue m_Goal_DRQ = new GoalDecRefQueue(10); private GoalDecRefQueue m_Goal_DRQ = new GoalDecRefQueue();
private ModelDecRefQueue m_Model_DRQ = new ModelDecRefQueue(10); private ModelDecRefQueue m_Model_DRQ = new ModelDecRefQueue();
private ParamsDecRefQueue m_Params_DRQ = new ParamsDecRefQueue(10); private ParamsDecRefQueue m_Params_DRQ = new ParamsDecRefQueue();
private ParamDescrsDecRefQueue m_ParamDescrs_DRQ = new ParamDescrsDecRefQueue(10); private ParamDescrsDecRefQueue m_ParamDescrs_DRQ = new ParamDescrsDecRefQueue();
private ProbeDecRefQueue m_Probe_DRQ = new ProbeDecRefQueue(10); private ProbeDecRefQueue m_Probe_DRQ = new ProbeDecRefQueue();
private SolverDecRefQueue m_Solver_DRQ = new SolverDecRefQueue(10); private SolverDecRefQueue m_Solver_DRQ = new SolverDecRefQueue();
private StatisticsDecRefQueue m_Statistics_DRQ = new StatisticsDecRefQueue(10); private StatisticsDecRefQueue m_Statistics_DRQ = new StatisticsDecRefQueue();
private TacticDecRefQueue m_Tactic_DRQ = new TacticDecRefQueue(10); private TacticDecRefQueue m_Tactic_DRQ = new TacticDecRefQueue();
private FixedpointDecRefQueue m_Fixedpoint_DRQ = new FixedpointDecRefQueue(10); private FixedpointDecRefQueue m_Fixedpoint_DRQ = new FixedpointDecRefQueue();
private OptimizeDecRefQueue m_Optimize_DRQ = new OptimizeDecRefQueue(10); private OptimizeDecRefQueue m_Optimize_DRQ = new OptimizeDecRefQueue();
private ConstructorDecRefQueue m_Constructor_DRQ = new ConstructorDecRefQueue();
private ConstructorListDecRefQueue m_ConstructorList_DRQ =
new ConstructorListDecRefQueue();
public IDecRefQueue getASTDRQ() public IDecRefQueue<Constructor> getConstructorDRQ() {
return m_Constructor_DRQ;
}
public IDecRefQueue<ConstructorList> getConstructorListDRQ() {
return m_ConstructorList_DRQ;
}
public IDecRefQueue<AST> getASTDRQ()
{ {
return m_AST_DRQ; return m_AST_DRQ;
} }
public IDecRefQueue getASTMapDRQ() public IDecRefQueue<ASTMap> getASTMapDRQ()
{ {
return m_ASTMap_DRQ; return m_ASTMap_DRQ;
} }
public IDecRefQueue getASTVectorDRQ() public IDecRefQueue<ASTVector> getASTVectorDRQ()
{ {
return m_ASTVector_DRQ; return m_ASTVector_DRQ;
} }
public IDecRefQueue getApplyResultDRQ() public IDecRefQueue<ApplyResult> getApplyResultDRQ()
{ {
return m_ApplyResult_DRQ; return m_ApplyResult_DRQ;
} }
public IDecRefQueue getFuncEntryDRQ() public IDecRefQueue<FuncInterp.Entry> getFuncEntryDRQ()
{ {
return m_FuncEntry_DRQ; return m_FuncEntry_DRQ;
} }
public IDecRefQueue getFuncInterpDRQ() public IDecRefQueue<FuncInterp> getFuncInterpDRQ()
{ {
return m_FuncInterp_DRQ; return m_FuncInterp_DRQ;
} }
public IDecRefQueue getGoalDRQ() public IDecRefQueue<Goal> getGoalDRQ()
{ {
return m_Goal_DRQ; return m_Goal_DRQ;
} }
public IDecRefQueue getModelDRQ() public IDecRefQueue<Model> getModelDRQ()
{ {
return m_Model_DRQ; return m_Model_DRQ;
} }
public IDecRefQueue getParamsDRQ() public IDecRefQueue<Params> getParamsDRQ()
{ {
return m_Params_DRQ; return m_Params_DRQ;
} }
public IDecRefQueue getParamDescrsDRQ() public IDecRefQueue<ParamDescrs> getParamDescrsDRQ()
{ {
return m_ParamDescrs_DRQ; return m_ParamDescrs_DRQ;
} }
public IDecRefQueue getProbeDRQ() public IDecRefQueue<Probe> getProbeDRQ()
{ {
return m_Probe_DRQ; return m_Probe_DRQ;
} }
public IDecRefQueue getSolverDRQ() public IDecRefQueue<Solver> getSolverDRQ()
{ {
return m_Solver_DRQ; return m_Solver_DRQ;
} }
public IDecRefQueue getStatisticsDRQ() public IDecRefQueue<Statistics> getStatisticsDRQ()
{ {
return m_Statistics_DRQ; return m_Statistics_DRQ;
} }
public IDecRefQueue getTacticDRQ() public IDecRefQueue<Tactic> getTacticDRQ()
{ {
return m_Tactic_DRQ; return m_Tactic_DRQ;
} }
public IDecRefQueue getFixedpointDRQ() public IDecRefQueue<Fixedpoint> getFixedpointDRQ()
{ {
return m_Fixedpoint_DRQ; return m_Fixedpoint_DRQ;
} }
public IDecRefQueue getOptimizeDRQ() public IDecRefQueue<Optimize> getOptimizeDRQ()
{ {
return m_Optimize_DRQ; return m_Optimize_DRQ;
} }
protected AtomicInteger m_refCount = new AtomicInteger(0);
/**
* Finalizer.
* @throws Throwable
**/
protected void finalize() throws Throwable
{
try {
dispose();
}
catch (Throwable t) {
throw t;
}
finally {
super.finalize();
}
}
/** /**
* Disposes of the context. * Disposes of the context.
**/ **/
public void dispose() @Override
public void close()
{ {
m_AST_DRQ.clear(this); m_AST_DRQ.clear(this);
m_ASTMap_DRQ.clear(this); m_ASTMap_DRQ.clear(this);
@ -4051,16 +4033,6 @@ public class Context extends IDisposable
m_realSort = null; m_realSort = null;
m_stringSort = null; m_stringSort = null;
synchronized (creation_lock) { Native.delContext(m_ctx);
if (m_refCount.get() == 0 && m_ctx != 0) {
try {
Native.delContext(m_ctx);
} catch (Z3Exception e) {
// OK?
System.out.println("Context deletion failed; memory leak possible.");
}
m_ctx = 0;
}
}
} }
} }

View file

@ -92,13 +92,9 @@ public class EnumSort extends Sort
EnumSort(Context ctx, Symbol name, Symbol[] enumNames) EnumSort(Context ctx, Symbol name, Symbol[] enumNames)
{ {
super(ctx, 0); super(ctx, Native.mkEnumerationSort(ctx.nCtx(),
name.getNativeObject(), enumNames.length,
int n = enumNames.length; Symbol.arrayToNative(enumNames),
long[] n_constdecls = new long[n]; new long[enumNames.length], new long[enumNames.length]));
long[] n_testers = new long[n];
setNativeObject(Native.mkEnumerationSort(ctx.nCtx(),
name.getNativeObject(), n, Symbol.arrayToNative(enumNames),
n_constdecls, n_testers));
} }
}; };

View file

@ -120,13 +120,13 @@ public class Expr extends AST
* @param args arguments * @param args arguments
* @throws Z3Exception on error * @throws Z3Exception on error
**/ **/
public void update(Expr[] args) public Expr update(Expr[] args)
{ {
getContext().checkContextMatch(args); getContext().checkContextMatch(args);
if (isApp() && args.length != getNumArgs()) { if (isApp() && args.length != getNumArgs()) {
throw new Z3Exception("Number of arguments does not match"); throw new Z3Exception("Number of arguments does not match");
} }
setNativeObject(Native.updateTerm(getContext().nCtx(), getNativeObject(), return new Expr(getContext(), Native.updateTerm(getContext().nCtx(), getNativeObject(),
args.length, Expr.arrayToNative(args))); args.length, Expr.arrayToNative(args)));
} }
@ -2091,36 +2091,23 @@ public class Expr extends AST
**/ **/
public int getIndex() public int getIndex()
{ {
if (!isVar()) if (!isVar()) {
throw new Z3Exception("Term is not a bound variable."); throw new Z3Exception("Term is not a bound variable.");
}
return Native.getIndexValue(getContext().nCtx(), getNativeObject()); return Native.getIndexValue(getContext().nCtx(), getNativeObject());
} }
/**
* Constructor for Expr
**/
protected Expr(Context ctx)
{
super(ctx);
{
}
}
/** /**
* Constructor for Expr * Constructor for Expr
* @throws Z3Exception on error * @throws Z3Exception on error
**/ **/
protected Expr(Context ctx, long obj) protected Expr(Context ctx, long obj) {
{
super(ctx, obj); super(ctx, obj);
{
}
} }
@Override @Override
void checkNativeObject(long obj) void checkNativeObject(long obj) {
{
if (!Native.isApp(getContext().nCtx(), obj) && if (!Native.isApp(getContext().nCtx(), obj) &&
Native.getAstKind(getContext().nCtx(), obj) != Z3_ast_kind.Z3_VAR_AST.toInt() && Native.getAstKind(getContext().nCtx(), obj) != Z3_ast_kind.Z3_VAR_AST.toInt() &&
Native.getAstKind(getContext().nCtx(), obj) != Z3_ast_kind.Z3_QUANTIFIER_AST.toInt()) { Native.getAstKind(getContext().nCtx(), obj) != Z3_ast_kind.Z3_QUANTIFIER_AST.toInt()) {

View file

@ -28,7 +28,7 @@ public class FPNum extends FPExpr
*/ */
public boolean getSign() { public boolean getSign() {
Native.IntPtr res = new Native.IntPtr(); Native.IntPtr res = new Native.IntPtr();
if (Native.fpaGetNumeralSign(getContext().nCtx(), getNativeObject(), res) ^ true) if (!Native.fpaGetNumeralSign(getContext().nCtx(), getNativeObject(), res))
throw new Z3Exception("Sign is not a Boolean value"); throw new Z3Exception("Sign is not a Boolean value");
return res.value != 0; return res.value != 0;
} }
@ -53,7 +53,7 @@ public class FPNum extends FPExpr
public long getSignificandUInt64() public long getSignificandUInt64()
{ {
Native.LongPtr res = new Native.LongPtr(); Native.LongPtr res = new Native.LongPtr();
if (Native.fpaGetNumeralSignificandUint64(getContext().nCtx(), getNativeObject(), res) ^ true) if (!Native.fpaGetNumeralSignificandUint64(getContext().nCtx(), getNativeObject(), res))
throw new Z3Exception("Significand is not a 64 bit unsigned integer"); throw new Z3Exception("Significand is not a 64 bit unsigned integer");
return res.value; return res.value;
} }
@ -72,7 +72,7 @@ public class FPNum extends FPExpr
*/ */
public long getExponentInt64() { public long getExponentInt64() {
Native.LongPtr res = new Native.LongPtr(); Native.LongPtr res = new Native.LongPtr();
if (Native.fpaGetNumeralExponentInt64(getContext().nCtx(), getNativeObject(), res) ^ true) if (!Native.fpaGetNumeralExponentInt64(getContext().nCtx(), getNativeObject(), res))
throw new Z3Exception("Exponent is not a 64 bit integer"); throw new Z3Exception("Exponent is not a 64 bit integer");
return res.value; return res.value;
} }
@ -87,13 +87,7 @@ public class FPNum extends FPExpr
*/ */
public String toString() public String toString()
{ {
try return Native.getNumeralString(getContext().nCtx(), getNativeObject());
{
return Native.getNumeralString(getContext().nCtx(), getNativeObject());
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
}
} }
} }

View file

@ -68,12 +68,6 @@ public class FiniteDomainNum extends FiniteDomainExpr
@Override @Override
public String toString() public String toString()
{ {
try return Native.getNumeralString(getContext().nCtx(), getNativeObject());
{
return Native.getNumeralString(getContext().nCtx(), getNativeObject());
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
}
} }
} }

View file

@ -255,14 +255,8 @@ public class Fixedpoint extends Z3Object
@Override @Override
public String toString() public String toString()
{ {
try return Native.fixedpointToString(getContext().nCtx(), getNativeObject(),
{
return Native.fixedpointToString(getContext().nCtx(), getNativeObject(),
0, null); 0, null);
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
}
} }
/** /**
@ -355,16 +349,15 @@ public class Fixedpoint extends Z3Object
} }
@Override @Override
void incRef(long o) void incRef() {
{ Native.fixedpointIncRef(getContext().nCtx(), getNativeObject());
getContext().getFixedpointDRQ().incAndClear(getContext(), o);
super.incRef(o);
} }
@Override @Override
void decRef(long o) void addToReferenceQueue() {
{ getContext().getFixedpointDRQ().storeReference(getContext(), this);
getContext().getFixedpointDRQ().add(o);
super.decRef(o);
} }
@Override
void checkNativeObject(long obj) { }
} }

View file

@ -17,39 +17,15 @@ Notes:
package com.microsoft.z3; package com.microsoft.z3;
class FixedpointDecRefQueue extends IDecRefQueue class FixedpointDecRefQueue extends IDecRefQueue<Fixedpoint> {
{
public FixedpointDecRefQueue() public FixedpointDecRefQueue()
{ {
super(); super();
} }
public FixedpointDecRefQueue(int move_limit)
{
super(move_limit);
}
@Override
protected void incRef(Context ctx, long obj)
{
try
{
Native.fixedpointIncRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
}
@Override @Override
protected void decRef(Context ctx, long obj) protected void decRef(Context ctx, long obj)
{ {
try Native.fixedpointDecRef(ctx.nCtx(), obj);
{
Native.fixedpointDecRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
} }
}; };

View file

@ -47,13 +47,7 @@ public class FuncDecl extends AST
@Override @Override
public String toString() public String toString()
{ {
try return Native.funcDeclToString(getContext().nCtx(), getNativeObject());
{
return Native.funcDeclToString(getContext().nCtx(), getNativeObject());
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
}
} }
/** /**

View file

@ -22,20 +22,20 @@ package com.microsoft.z3;
* Each entry in the finite map represents the value of a function given a set * Each entry in the finite map represents the value of a function given a set
* of arguments. * of arguments.
**/ **/
public class FuncInterp extends Z3Object public class FuncInterp extends Z3Object {
{
/** /**
* An Entry object represents an element in the finite map used to encode a * An Entry object represents an element in the finite map used to encode a
* function interpretation. * function interpretation.
**/ **/
public class Entry extends Z3Object public static class Entry extends Z3Object {
{
/** /**
* Return the (symbolic) value of this entry. * Return the (symbolic) value of this entry.
* *
* @throws Z3Exception * @throws Z3Exception
* @throws Z3Exception on error * @throws Z3Exception on error
**/ **/
public Expr getValue() public Expr getValue()
{ {
return Expr.create(getContext(), return Expr.create(getContext(),
@ -45,7 +45,7 @@ public class FuncInterp extends Z3Object
/** /**
* The number of arguments of the entry. * The number of arguments of the entry.
* @throws Z3Exception on error * @throws Z3Exception on error
**/ **/
public int getNumArgs() public int getNumArgs()
{ {
return Native.funcEntryGetNumArgs(getContext().nCtx(), getNativeObject()); return Native.funcEntryGetNumArgs(getContext().nCtx(), getNativeObject());
@ -53,10 +53,10 @@ public class FuncInterp extends Z3Object
/** /**
* The arguments of the function entry. * The arguments of the function entry.
* *
* @throws Z3Exception * @throws Z3Exception
* @throws Z3Exception on error * @throws Z3Exception on error
**/ **/
public Expr[] getArgs() public Expr[] getArgs()
{ {
int n = getNumArgs(); int n = getNumArgs();
@ -73,37 +73,26 @@ public class FuncInterp extends Z3Object
@Override @Override
public String toString() public String toString()
{ {
try int n = getNumArgs();
{ String res = "[";
int n = getNumArgs(); Expr[] args = getArgs();
String res = "["; for (int i = 0; i < n; i++)
Expr[] args = getArgs(); res += args[i] + ", ";
for (int i = 0; i < n; i++) return res + getValue() + "]";
res += args[i] + ", ";
return res + getValue() + "]";
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
}
} }
Entry(Context ctx, long obj) Entry(Context ctx, long obj) {
{
super(ctx, obj); super(ctx, obj);
} }
@Override @Override
void incRef(long o) void incRef() {
{ Native.funcEntryIncRef(getContext().nCtx(), getNativeObject());
getContext().getFuncEntryDRQ().incAndClear(getContext(), o);
super.incRef(o);
} }
@Override @Override
void decRef(long o) void addToReferenceQueue() {
{ getContext().getFuncEntryDRQ().storeReference(getContext(), this);
getContext().getFuncEntryDRQ().add(o);
super.decRef(o);
} }
} }
@ -161,33 +150,27 @@ public class FuncInterp extends Z3Object
**/ **/
public String toString() public String toString()
{ {
try String res = "";
res += "[";
for (Entry e : getEntries())
{ {
String res = ""; int n = e.getNumArgs();
res += "["; if (n > 1)
for (Entry e : getEntries()) res += "[";
Expr[] args = e.getArgs();
for (int i = 0; i < n; i++)
{ {
int n = e.getNumArgs(); if (i != 0)
if (n > 1) res += ", ";
res += "["; res += args[i];
Expr[] args = e.getArgs();
for (int i = 0; i < n; i++)
{
if (i != 0)
res += ", ";
res += args[i];
}
if (n > 1)
res += "]";
res += " -> " + e.getValue() + ", ";
} }
res += "else -> " + getElse(); if (n > 1)
res += "]"; res += "]";
return res; res += " -> " + e.getValue() + ", ";
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
} }
res += "else -> " + getElse();
res += "]";
return res;
} }
FuncInterp(Context ctx, long obj) FuncInterp(Context ctx, long obj)
@ -196,16 +179,12 @@ public class FuncInterp extends Z3Object
} }
@Override @Override
void incRef(long o) void incRef() {
{ Native.funcInterpIncRef(getContext().nCtx(), getNativeObject());
getContext().getFuncInterpDRQ().incAndClear(getContext(), o);
super.incRef(o);
} }
@Override @Override
void decRef(long o) void addToReferenceQueue() {
{ getContext().getFuncInterpDRQ().storeReference(getContext(), this);
getContext().getFuncInterpDRQ().add(o);
super.decRef(o);
} }
} }

View file

@ -17,39 +17,15 @@ Notes:
package com.microsoft.z3; package com.microsoft.z3;
class FuncInterpDecRefQueue extends IDecRefQueue class FuncInterpDecRefQueue extends IDecRefQueue<FuncInterp>
{ {
public FuncInterpDecRefQueue() public FuncInterpDecRefQueue()
{ {
super(); super();
} }
public FuncInterpDecRefQueue(int move_limit)
{
super(move_limit);
}
@Override @Override
protected void incRef(Context ctx, long obj) protected void decRef(Context ctx, long obj) {
{ Native.funcInterpDecRef(ctx.nCtx(), obj);
try
{
Native.funcInterpIncRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
}
@Override
protected void decRef(Context ctx, long obj)
{
try
{
Native.funcInterpDecRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
} }
}; };

View file

@ -17,39 +17,14 @@ Notes:
package com.microsoft.z3; package com.microsoft.z3;
class FuncInterpEntryDecRefQueue extends IDecRefQueue class FuncInterpEntryDecRefQueue extends IDecRefQueue<FuncInterp.Entry> {
{
public FuncInterpEntryDecRefQueue() public FuncInterpEntryDecRefQueue()
{ {
super(); super();
} }
public FuncInterpEntryDecRefQueue(int move_limit)
{
super(move_limit);
}
@Override @Override
protected void incRef(Context ctx, long obj) protected void decRef(Context ctx, long obj) {
{ Native.funcEntryDecRef(ctx.nCtx(), obj);
try
{
Native.funcEntryIncRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
} }
}
@Override
protected void decRef(Context ctx, long obj)
{
try
{
Native.funcEntryDecRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
}
};

View file

@ -23,8 +23,7 @@ import com.microsoft.z3.enumerations.Z3_goal_prec;
* A goal (aka problem). A goal is essentially a set of formulas, that can be * A goal (aka problem). A goal is essentially a set of formulas, that can be
* solved and/or transformed using tactics and solvers. * solved and/or transformed using tactics and solvers.
**/ **/
public class Goal extends Z3Object public class Goal extends Z3Object {
{
/** /**
* The precision of the goal. * The precision of the goal.
* Remarks: Goals can be transformed using over * Remarks: Goals can be transformed using over
@ -211,15 +210,8 @@ public class Goal extends Z3Object
* *
* @return A string representation of the Goal. * @return A string representation of the Goal.
**/ **/
public String toString() public String toString() {
{ return Native.goalToString(getContext().nCtx(), getNativeObject());
try
{
return Native.goalToString(getContext().nCtx(), getNativeObject());
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
}
} }
/** /**
@ -229,11 +221,11 @@ public class Goal extends Z3Object
**/ **/
public BoolExpr AsBoolExpr() { public BoolExpr AsBoolExpr() {
int n = size(); int n = size();
if (n == 0) if (n == 0) {
return getContext().mkTrue(); return getContext().mkTrue();
else if (n == 1) } else if (n == 1) {
return getFormulas()[0]; return getFormulas()[0];
else { } else {
return getContext().mkAnd(getFormulas()); return getContext().mkAnd(getFormulas());
} }
} }
@ -243,23 +235,18 @@ public class Goal extends Z3Object
super(ctx, obj); super(ctx, obj);
} }
Goal(Context ctx, boolean models, boolean unsatCores, boolean proofs) Goal(Context ctx, boolean models, boolean unsatCores, boolean proofs) {
{
super(ctx, Native.mkGoal(ctx.nCtx(), (models), super(ctx, Native.mkGoal(ctx.nCtx(), (models),
(unsatCores), (proofs))); (unsatCores), (proofs)));
} }
void incRef(long o) @Override
{ void incRef() {
getContext().getGoalDRQ().incAndClear(getContext(), o); Native.goalIncRef(getContext().nCtx(), getNativeObject());
super.incRef(o);
} }
void decRef(long o) @Override
{ void addToReferenceQueue() {
getContext().getGoalDRQ().add(o); getContext().getGoalDRQ().storeReference(getContext(), this);
super.decRef(o);
} }
} }

View file

@ -17,39 +17,14 @@ Notes:
package com.microsoft.z3; package com.microsoft.z3;
class GoalDecRefQueue extends IDecRefQueue class GoalDecRefQueue extends IDecRefQueue<Goal> {
{
public GoalDecRefQueue() public GoalDecRefQueue()
{ {
super(); super();
} }
public GoalDecRefQueue(int move_limit)
{
super(move_limit);
}
@Override @Override
protected void incRef(Context ctx, long obj) protected void decRef(Context ctx, long obj) {
{
try
{
Native.goalIncRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
}
@Override
protected void decRef(Context ctx, long obj)
{
try
{
Native.goalDecRef(ctx.nCtx(), obj); Native.goalDecRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
} }
}; }

View file

@ -17,55 +17,54 @@ Notes:
package com.microsoft.z3; package com.microsoft.z3;
import java.util.LinkedList; import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.util.IdentityHashMap;
import java.util.Map;
public abstract class IDecRefQueue /**
{ * A queue to handle management of native memory.
protected final Object m_lock = new Object(); *
protected LinkedList<Long> m_queue = new LinkedList<Long>(); * <p><b>Mechanics: </b>once an object is created, a metadata is stored for it in
protected int m_move_limit; * {@code referenceMap}, and a {@link PhantomReference} is created with a
* reference to {@code referenceQueue}.
* Once the object becomes strongly unreachable, the phantom reference gets
* added by JVM to the {@code referenceQueue}.
* After each object creation, we iterate through the available objects in
* {@code referenceQueue} and decrement references for them.
*
* @param <T> Type of object stored in queue.
*/
public abstract class IDecRefQueue<T extends Z3Object> {
private final ReferenceQueue<T> referenceQueue = new ReferenceQueue<>();
private final Map<PhantomReference<T>, Long> referenceMap =
new IdentityHashMap<>();
protected IDecRefQueue() protected IDecRefQueue() {}
{
m_move_limit = 1024;
}
protected IDecRefQueue(int move_limit)
{
m_move_limit = move_limit;
}
public void setLimit(int l) { m_move_limit = l; }
protected abstract void incRef(Context ctx, long obj);
/**
* An implementation of this method should decrement the reference on a
* given native object.
* This function should always be called on the {@code ctx} thread.
*
* @param ctx Z3 context.
* @param obj Pointer to a Z3 object.
*/
protected abstract void decRef(Context ctx, long obj); protected abstract void decRef(Context ctx, long obj);
protected void incAndClear(Context ctx, long o) public void storeReference(Context ctx, T obj) {
{ PhantomReference<T> ref = new PhantomReference<>(obj, referenceQueue);
incRef(ctx, o); referenceMap.put(ref, obj.getNativeObject());
if (m_queue.size() >= m_move_limit) clear(ctx);
clear(ctx);
}
protected void add(long o)
{
if (o == 0)
return;
synchronized (m_lock)
{
m_queue.add(o);
}
} }
protected void clear(Context ctx) protected void clear(Context ctx)
{ {
synchronized (m_lock) Reference<? extends T> ref;
{ while ((ref = referenceQueue.poll()) != null) {
for (Long o : m_queue) long z3ast = referenceMap.remove(ref);
decRef(ctx, o); decRef(ctx, z3ast);
m_queue.clear();
} }
} }
} }

View file

@ -1,25 +0,0 @@
/*++
Copyright (c) 2012 Microsoft Corporation
Module Name:
IDisposable.java
Abstract:
Compatability interface (C# -> Java)
Author:
Christoph Wintersteiger (cwinter) 2012-03-16
Notes:
--*/
package com.microsoft.z3;
public abstract class IDisposable
{
public abstract void dispose();
}

View file

@ -63,14 +63,7 @@ public class IntNum extends IntExpr
/** /**
* Returns a string representation of the numeral. * Returns a string representation of the numeral.
**/ **/
public String toString() public String toString() {
{ return Native.getNumeralString(getContext().nCtx(), getNativeObject());
try
{
return Native.getNumeralString(getContext().nCtx(), getNativeObject());
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
}
} }
} }

View file

@ -17,11 +17,10 @@ Notes:
package com.microsoft.z3; package com.microsoft.z3;
import java.util.Map;
import java.lang.String;
import com.microsoft.z3.enumerations.Z3_lbool; import com.microsoft.z3.enumerations.Z3_lbool;
import java.util.Map;
/** /**
* The InterpolationContext is suitable for generation of interpolants. * The InterpolationContext is suitable for generation of interpolants.
* *
@ -33,13 +32,13 @@ public class InterpolationContext extends Context
/** /**
* Constructor. * Constructor.
**/ **/
public InterpolationContext() public static InterpolationContext mkContext()
{ {
super(); long m_ctx;
synchronized(creation_lock) { synchronized(creation_lock) {
m_ctx = Native.mkInterpolationContext(0); m_ctx = Native.mkInterpolationContext(0);
initContext();
} }
return new InterpolationContext(m_ctx);
} }
/** /**
@ -49,17 +48,21 @@ public class InterpolationContext extends Context
* Remarks: * Remarks:
* @see Context#Context * @see Context#Context
**/ **/
public InterpolationContext(Map<String, String> settings) public static InterpolationContext mkContext(Map<String, String> settings)
{ {
super(); long m_ctx;
synchronized(creation_lock) { synchronized(creation_lock) {
long cfg = Native.mkConfig(); long cfg = Native.mkConfig();
for (Map.Entry<String, String> kv : settings.entrySet()) for (Map.Entry<String, String> kv : settings.entrySet())
Native.setParamValue(cfg, kv.getKey(), kv.getValue()); Native.setParamValue(cfg, kv.getKey(), kv.getValue());
m_ctx = Native.mkInterpolationContext(cfg); m_ctx = Native.mkInterpolationContext(cfg);
Native.delConfig(cfg); Native.delConfig(cfg);
initContext();
} }
return new InterpolationContext(m_ctx);
}
private InterpolationContext(long m_ctx) {
super(m_ctx);
} }
/** /**

View file

@ -17,6 +17,8 @@ Notes:
package com.microsoft.z3; package com.microsoft.z3;
import com.microsoft.z3.Native.LongPtr;
/** /**
* List sorts. * List sorts.
**/ **/
@ -88,14 +90,9 @@ public class ListSort extends Sort
ListSort(Context ctx, Symbol name, Sort elemSort) ListSort(Context ctx, Symbol name, Sort elemSort)
{ {
super(ctx, 0); super(ctx, Native.mkListSort(ctx.nCtx(), name.getNativeObject(),
elemSort.getNativeObject(),
Native.LongPtr inil = new Native.LongPtr(), iisnil = new Native.LongPtr(); new LongPtr(), new Native.LongPtr(), new LongPtr(),
Native.LongPtr icons = new Native.LongPtr(), iiscons = new Native.LongPtr(); new LongPtr(), new LongPtr(), new LongPtr()));
Native.LongPtr ihead = new Native.LongPtr(), itail = new Native.LongPtr();
setNativeObject(Native.mkListSort(ctx.nCtx(), name.getNativeObject(),
elemSort.getNativeObject(), inil, iisnil, icons, iiscons, ihead,
itail));
} }
}; };

View file

@ -22,8 +22,7 @@ import com.microsoft.z3.enumerations.Z3_sort_kind;
/** /**
* A Model contains interpretations (assignments) of constants and functions. * A Model contains interpretations (assignments) of constants and functions.
**/ **/
public class Model extends Z3Object public class Model extends Z3Object {
{
/** /**
* Retrieves the interpretation (the assignment) of {@code a} in * Retrieves the interpretation (the assignment) of {@code a} in
* the model. * the model.
@ -283,15 +282,8 @@ public class Model extends Z3Object
* @return A string representation of the model. * @return A string representation of the model.
**/ **/
@Override @Override
public String toString() public String toString() {
{ return Native.modelToString(getContext().nCtx(), getNativeObject());
try
{
return Native.modelToString(getContext().nCtx(), getNativeObject());
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
}
} }
Model(Context ctx, long obj) Model(Context ctx, long obj)
@ -300,16 +292,12 @@ public class Model extends Z3Object
} }
@Override @Override
void incRef(long o) void incRef() {
{ Native.modelIncRef(getContext().nCtx(), getNativeObject());
getContext().getModelDRQ().incAndClear(getContext(), o);
super.incRef(o);
} }
@Override @Override
void decRef(long o) void addToReferenceQueue() {
{ getContext().getModelDRQ().storeReference(getContext(), this);
getContext().getModelDRQ().add(o);
super.decRef(o);
} }
} }

View file

@ -17,39 +17,14 @@ Notes:
package com.microsoft.z3; package com.microsoft.z3;
class ModelDecRefQueue extends IDecRefQueue class ModelDecRefQueue extends IDecRefQueue<Model> {
{
public ModelDecRefQueue() public ModelDecRefQueue()
{ {
super(); super();
} }
public ModelDecRefQueue(int move_limit)
{
super(move_limit);
}
@Override @Override
protected void incRef(Context ctx, long obj) protected void decRef(Context ctx, long obj) {
{ Native.modelDecRef(ctx.nCtx(), obj);
try
{
Native.modelIncRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
} }
}
@Override
protected void decRef(Context ctx, long obj)
{
try
{
Native.modelDecRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
}
};

View file

@ -266,17 +266,12 @@ public class Optimize extends Z3Object
} }
@Override @Override
void incRef(long o) void incRef() {
{ Native.optimizeIncRef(getContext().nCtx(), getNativeObject());
getContext().getOptimizeDRQ().incAndClear(getContext(), o);
super.incRef(o);
} }
@Override @Override
void decRef(long o) void addToReferenceQueue() {
{ getContext().getOptimizeDRQ().storeReference(getContext(), this);
getContext().getOptimizeDRQ().add(o);
super.decRef(o);
} }
} }

View file

@ -17,39 +17,14 @@ Notes:
package com.microsoft.z3; package com.microsoft.z3;
class OptimizeDecRefQueue extends IDecRefQueue class OptimizeDecRefQueue extends IDecRefQueue<Optimize> {
{
public OptimizeDecRefQueue() public OptimizeDecRefQueue()
{ {
super(); super();
} }
public OptimizeDecRefQueue(int move_limit)
{
super(move_limit);
}
@Override @Override
protected void incRef(Context ctx, long obj) protected void decRef(Context ctx, long obj) {
{ Native.optimizeDecRef(ctx.nCtx(), obj);
try
{
Native.fixedpointIncRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
}
@Override
protected void decRef(Context ctx, long obj)
{
try
{
Native.fixedpointDecRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
} }
}; };

View file

@ -22,8 +22,7 @@ import com.microsoft.z3.enumerations.Z3_param_kind;
/** /**
* A ParamDescrs describes a set of parameters. * A ParamDescrs describes a set of parameters.
**/ **/
public class ParamDescrs extends Z3Object public class ParamDescrs extends Z3Object {
{
/** /**
* validate a set of parameters. * validate a set of parameters.
**/ **/
@ -82,15 +81,8 @@ public class ParamDescrs extends Z3Object
* Retrieves a string representation of the ParamDescrs. * Retrieves a string representation of the ParamDescrs.
**/ **/
@Override @Override
public String toString() public String toString() {
{ return Native.paramDescrsToString(getContext().nCtx(), getNativeObject());
try
{
return Native.paramDescrsToString(getContext().nCtx(), getNativeObject());
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
}
} }
ParamDescrs(Context ctx, long obj) ParamDescrs(Context ctx, long obj)
@ -99,16 +91,12 @@ public class ParamDescrs extends Z3Object
} }
@Override @Override
void incRef(long o) void incRef() {
{ Native.paramDescrsIncRef(getContext().nCtx(), getNativeObject());
getContext().getParamDescrsDRQ().incAndClear(getContext(), o);
super.incRef(o);
} }
@Override @Override
void decRef(long o) void addToReferenceQueue() {
{ getContext().getParamDescrsDRQ().storeReference(getContext(), this);
getContext().getParamDescrsDRQ().add(o);
super.decRef(o);
} }
} }

View file

@ -17,39 +17,15 @@ Notes:
package com.microsoft.z3; package com.microsoft.z3;
class ParamDescrsDecRefQueue extends IDecRefQueue class ParamDescrsDecRefQueue extends IDecRefQueue<ParamDescrs> {
{
public ParamDescrsDecRefQueue() public ParamDescrsDecRefQueue()
{ {
super(); super();
} }
public ParamDescrsDecRefQueue(int move_limit)
{
super(move_limit);
}
@Override
protected void incRef(Context ctx, long obj)
{
try
{
Native.paramDescrsIncRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
}
@Override @Override
protected void decRef(Context ctx, long obj) protected void decRef(Context ctx, long obj)
{ {
try Native.paramDescrsDecRef(ctx.nCtx(), obj);
{
Native.paramDescrsDecRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
} }
}; }

View file

@ -21,8 +21,7 @@ package com.microsoft.z3;
/** /**
* A ParameterSet represents a configuration in the form of Symbol/value pairs. * A ParameterSet represents a configuration in the form of Symbol/value pairs.
**/ **/
public class Params extends Z3Object public class Params extends Z3Object {
{
/** /**
* Adds a parameter setting. * Adds a parameter setting.
**/ **/
@ -115,13 +114,7 @@ public class Params extends Z3Object
@Override @Override
public String toString() public String toString()
{ {
try return Native.paramsToString(getContext().nCtx(), getNativeObject());
{
return Native.paramsToString(getContext().nCtx(), getNativeObject());
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
}
} }
Params(Context ctx) Params(Context ctx)
@ -129,17 +122,14 @@ public class Params extends Z3Object
super(ctx, Native.mkParams(ctx.nCtx())); super(ctx, Native.mkParams(ctx.nCtx()));
} }
@Override @Override
void incRef(long o) void incRef() {
{ Native.paramsIncRef(getContext().nCtx(), getNativeObject());
getContext().getParamsDRQ().incAndClear(getContext(), o);
super.incRef(o);
} }
@Override @Override
void decRef(long o) void addToReferenceQueue() {
{ getContext().getParamsDRQ().storeReference(getContext(), this);
getContext().getParamsDRQ().add(o);
super.decRef(o);
} }
} }

View file

@ -17,39 +17,14 @@ Notes:
package com.microsoft.z3; package com.microsoft.z3;
class ParamsDecRefQueue extends IDecRefQueue class ParamsDecRefQueue extends IDecRefQueue<Params> {
{
public ParamsDecRefQueue() public ParamsDecRefQueue()
{ {
super(); super();
} }
public ParamsDecRefQueue(int move_limit)
{
super(move_limit);
}
@Override @Override
protected void incRef(Context ctx, long obj) protected void decRef(Context ctx, long obj) {
{ Native.paramsDecRef(ctx.nCtx(), obj);
try
{
Native.paramsIncRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
} }
}
@Override
protected void decRef(Context ctx, long obj)
{
try
{
Native.paramsDecRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
}
};

View file

@ -53,13 +53,7 @@ public class Pattern extends AST
@Override @Override
public String toString() public String toString()
{ {
try return Native.patternToString(getContext().nCtx(), getNativeObject());
{
return Native.patternToString(getContext().nCtx(), getNativeObject());
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
}
} }
Pattern(Context ctx, long obj) Pattern(Context ctx, long obj)

View file

@ -25,8 +25,7 @@ package com.microsoft.z3;
* also be obtained using the command {@code (help-tactic)} in the SMT 2.0 * also be obtained using the command {@code (help-tactic)} in the SMT 2.0
* front-end. * front-end.
**/ **/
public class Probe extends Z3Object public class Probe extends Z3Object {
{
/** /**
* Execute the probe over the goal. * Execute the probe over the goal.
* *
@ -46,22 +45,17 @@ public class Probe extends Z3Object
super(ctx, obj); super(ctx, obj);
} }
Probe(Context ctx, String name) Probe(Context ctx, String name) {
{
super(ctx, Native.mkProbe(ctx.nCtx(), name)); super(ctx, Native.mkProbe(ctx.nCtx(), name));
} }
@Override @Override
void incRef(long o) void incRef() {
{ Native.probeIncRef(getContext().nCtx(), getNativeObject());
getContext().getProbeDRQ().incAndClear(getContext(), o);
super.incRef(o);
} }
@Override @Override
void decRef(long o) void addToReferenceQueue() {
{ getContext().getProbeDRQ().storeReference(getContext(), this);
getContext().getProbeDRQ().add(o);
super.decRef(o);
} }
} }

View file

@ -17,39 +17,16 @@ Notes:
package com.microsoft.z3; package com.microsoft.z3;
class ProbeDecRefQueue extends IDecRefQueue class ProbeDecRefQueue extends IDecRefQueue<Probe>
{ {
public ProbeDecRefQueue() public ProbeDecRefQueue()
{ {
super(); super();
} }
public ProbeDecRefQueue(int move_limit)
{
super(move_limit);
}
@Override
protected void incRef(Context ctx, long obj)
{
try
{
Native.probeIncRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
}
@Override @Override
protected void decRef(Context ctx, long obj) protected void decRef(Context ctx, long obj)
{ {
try Native.probeDecRef(ctx.nCtx(), obj);
{
Native.probeDecRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
} }
}; };

View file

@ -145,68 +145,67 @@ public class Quantifier extends BoolExpr
.nCtx(), getNativeObject())); .nCtx(), getNativeObject()));
} }
Quantifier(Context ctx, boolean isForall, Sort[] sorts, Symbol[] names, public static Quantifier of(
Context ctx, boolean isForall, Sort[] sorts, Symbol[] names,
Expr body, int weight, Pattern[] patterns, Expr[] noPatterns, Expr body, int weight, Pattern[] patterns, Expr[] noPatterns,
Symbol quantifierID, Symbol skolemID) Symbol quantifierID, Symbol skolemID
{ ) {
super(ctx, 0); ctx.checkContextMatch(patterns);
ctx.checkContextMatch(noPatterns);
getContext().checkContextMatch(patterns); ctx.checkContextMatch(sorts);
getContext().checkContextMatch(noPatterns); ctx.checkContextMatch(names);
getContext().checkContextMatch(sorts); ctx.checkContextMatch(body);
getContext().checkContextMatch(names);
getContext().checkContextMatch(body);
if (sorts.length != names.length) if (sorts.length != names.length)
throw new Z3Exception( throw new Z3Exception(
"Number of sorts does not match number of names"); "Number of sorts does not match number of names");
if (noPatterns == null && quantifierID == null && skolemID == null) long nativeObj;
{ if (noPatterns == null && quantifierID == null && skolemID == null) {
setNativeObject(Native.mkQuantifier(ctx.nCtx(), (isForall), weight, AST.arrayLength(patterns), AST nativeObj = Native.mkQuantifier(ctx.nCtx(), (isForall), weight, AST.arrayLength(patterns), AST
.arrayToNative(patterns), AST.arrayLength(sorts), AST .arrayToNative(patterns), AST.arrayLength(sorts), AST
.arrayToNative(sorts), Symbol.arrayToNative(names), body .arrayToNative(sorts), Symbol.arrayToNative(names), body
.getNativeObject())); .getNativeObject());
} else } else {
{ nativeObj = Native.mkQuantifierEx(ctx.nCtx(),
setNativeObject(Native.mkQuantifierEx(ctx.nCtx(), (isForall), weight, AST.getNativeObject(quantifierID),
(isForall), weight, AST.getNativeObject(quantifierID), AST.getNativeObject(skolemID),
AST.getNativeObject(skolemID), AST.arrayLength(patterns), AST.arrayToNative(patterns),
AST.arrayLength(patterns), AST.arrayToNative(patterns), AST.arrayLength(noPatterns), AST.arrayToNative(noPatterns),
AST.arrayLength(noPatterns), AST.arrayToNative(noPatterns), AST.arrayLength(sorts), AST.arrayToNative(sorts),
AST.arrayLength(sorts), AST.arrayToNative(sorts), Symbol.arrayToNative(names),
Symbol.arrayToNative(names), body.getNativeObject());
body.getNativeObject()));
} }
return new Quantifier(ctx, nativeObj);
} }
Quantifier(Context ctx, boolean isForall, Expr[] bound, Expr body,
public static Quantifier of(Context ctx, boolean isForall, Expr[] bound, Expr body,
int weight, Pattern[] patterns, Expr[] noPatterns, int weight, Pattern[] patterns, Expr[] noPatterns,
Symbol quantifierID, Symbol skolemID) Symbol quantifierID, Symbol skolemID)
{ {
super(ctx, 0); ctx.checkContextMatch(noPatterns);
ctx.checkContextMatch(patterns);
getContext().checkContextMatch(noPatterns); // ctx.CheckContextMatch(bound);
getContext().checkContextMatch(patterns); ctx.checkContextMatch(body);
// Context().CheckContextMatch(bound);
getContext().checkContextMatch(body);
long nativeObj;
if (noPatterns == null && quantifierID == null && skolemID == null) if (noPatterns == null && quantifierID == null && skolemID == null)
{ {
setNativeObject(Native.mkQuantifierConst(ctx.nCtx(), nativeObj = Native.mkQuantifierConst(ctx.nCtx(),
isForall, weight, AST.arrayLength(bound), isForall, weight, AST.arrayLength(bound),
AST.arrayToNative(bound), AST.arrayLength(patterns), AST.arrayToNative(bound), AST.arrayLength(patterns),
AST.arrayToNative(patterns), body.getNativeObject())); AST.arrayToNative(patterns), body.getNativeObject());
} else } else {
{ nativeObj = Native.mkQuantifierConstEx(ctx.nCtx(),
setNativeObject(Native.mkQuantifierConstEx(ctx.nCtx(),
isForall, weight, isForall, weight,
AST.getNativeObject(quantifierID), AST.getNativeObject(quantifierID),
AST.getNativeObject(skolemID), AST.arrayLength(bound), AST.getNativeObject(skolemID), AST.arrayLength(bound),
AST.arrayToNative(bound), AST.arrayLength(patterns), AST.arrayToNative(bound), AST.arrayLength(patterns),
AST.arrayToNative(patterns), AST.arrayLength(noPatterns), AST.arrayToNative(patterns), AST.arrayLength(noPatterns),
AST.arrayToNative(noPatterns), body.getNativeObject())); AST.arrayToNative(noPatterns), body.getNativeObject());
} }
return new Quantifier(ctx, nativeObj);
} }
Quantifier(Context ctx, long obj) Quantifier(Context ctx, long obj)

View file

@ -75,15 +75,8 @@ public class RatNum extends RealExpr
* Returns a string representation of the numeral. * Returns a string representation of the numeral.
**/ **/
@Override @Override
public String toString() public String toString() {
{ return Native.getNumeralString(getContext().nCtx(), getNativeObject());
try
{
return Native.getNumeralString(getContext().nCtx(), getNativeObject());
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
}
} }
RatNum(Context ctx, long obj) RatNum(Context ctx, long obj)

View file

@ -22,8 +22,7 @@ import com.microsoft.z3.enumerations.Z3_lbool;
/** /**
* Solvers. * Solvers.
**/ **/
public class Solver extends Z3Object public class Solver extends Z3Object {
{
/** /**
* A string that describes all available solver parameters. * A string that describes all available solver parameters.
**/ **/
@ -127,13 +126,13 @@ public class Solver extends Z3Object
* using the Boolean constants in ps. * using the Boolean constants in ps.
* *
* Remarks: * Remarks:
* This API is an alternative to {@link check} with assumptions for * This API is an alternative to {@link #check()} with assumptions for
* extracting unsat cores. * extracting unsat cores.
* Both APIs can be used in the same solver. The unsat core will contain a * Both APIs can be used in the same solver. The unsat core will contain a
* combination * combination
* of the Boolean variables provided using {@link assertAndTrack} * of the Boolean variables provided using {@code #assertAndTrack}
* and the Boolean literals * and the Boolean literals
* provided using {@link check} with assumptions. * provided using {@link #check()} with assumptions.
**/ **/
public void assertAndTrack(BoolExpr[] constraints, BoolExpr[] ps) public void assertAndTrack(BoolExpr[] constraints, BoolExpr[] ps)
{ {
@ -154,13 +153,13 @@ public class Solver extends Z3Object
* using the Boolean constant p. * using the Boolean constant p.
* *
* Remarks: * Remarks:
* This API is an alternative to {@link check} with assumptions for * This API is an alternative to {@link #check} with assumptions for
* extracting unsat cores. * extracting unsat cores.
* Both APIs can be used in the same solver. The unsat core will contain a * Both APIs can be used in the same solver. The unsat core will contain a
* combination * combination
* of the Boolean variables provided using {@link assertAndTrack} * of the Boolean variables provided using {@link #assertAndTrack}
* and the Boolean literals * and the Boolean literals
* provided using {@link check} with assumptions. * provided using {@link #check} with assumptions.
*/ */
public void assertAndTrack(BoolExpr constraint, BoolExpr p) public void assertAndTrack(BoolExpr constraint, BoolExpr p)
{ {
@ -323,14 +322,8 @@ public class Solver extends Z3Object
@Override @Override
public String toString() public String toString()
{ {
try return Native
{ .solverToString(getContext().nCtx(), getNativeObject());
return Native
.solverToString(getContext().nCtx(), getNativeObject());
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
}
} }
Solver(Context ctx, long obj) Solver(Context ctx, long obj)
@ -339,16 +332,12 @@ public class Solver extends Z3Object
} }
@Override @Override
void incRef(long o) void incRef() {
{ Native.solverIncRef(getContext().nCtx(), getNativeObject());
getContext().getSolverDRQ().incAndClear(getContext(), o);
super.incRef(o);
} }
@Override @Override
void decRef(long o) void addToReferenceQueue() {
{ getContext().getSolverDRQ().storeReference(getContext(), this);
getContext().getSolverDRQ().add(o);
super.decRef(o);
} }
} }

View file

@ -17,36 +17,11 @@ Notes:
package com.microsoft.z3; package com.microsoft.z3;
class SolverDecRefQueue extends IDecRefQueue class SolverDecRefQueue extends IDecRefQueue<Solver> {
{
public SolverDecRefQueue() { super(); } public SolverDecRefQueue() { super(); }
public SolverDecRefQueue(int move_limit)
{
super(move_limit);
}
@Override @Override
protected void incRef(Context ctx, long obj) protected void decRef(Context ctx, long obj) {
{ Native.solverDecRef(ctx.nCtx(), obj);
try
{
Native.solverIncRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
} }
}
@Override
protected void decRef(Context ctx, long obj)
{
try
{
Native.solverDecRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
}
};

View file

@ -82,15 +82,9 @@ public class Sort extends AST
/** /**
* A string representation of the sort. * A string representation of the sort.
**/ **/
public String toString() @Override
{ public String toString() {
try return Native.sortToString(getContext().nCtx(), getNativeObject());
{
return Native.sortToString(getContext().nCtx(), getNativeObject());
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
}
} }
/** /**
@ -101,6 +95,7 @@ public class Sort extends AST
super(ctx, obj); super(ctx, obj);
} }
@Override
void checkNativeObject(long obj) void checkNativeObject(long obj)
{ {
if (Native.getAstKind(getContext().nCtx(), obj) != Z3_ast_kind.Z3_SORT_AST if (Native.getAstKind(getContext().nCtx(), obj) != Z3_ast_kind.Z3_SORT_AST

View file

@ -20,8 +20,7 @@ package com.microsoft.z3;
/** /**
* Objects of this class track statistical information about solvers. * Objects of this class track statistical information about solvers.
**/ **/
public class Statistics extends Z3Object public class Statistics extends Z3Object {
{
/** /**
* Statistical data is organized into pairs of [Key, Entry], where every * Statistical data is organized into pairs of [Key, Entry], where every
* Entry is either a {@code DoubleEntry} or a {@code UIntEntry} * Entry is either a {@code DoubleEntry} or a {@code UIntEntry}
@ -84,15 +83,9 @@ public class Statistics extends Z3Object
/** /**
* The string representation of the Entry. * The string representation of the Entry.
**/ **/
public String toString() @Override
{ public String toString() {
try return Key + ": " + getValueString();
{
return Key + ": " + getValueString();
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
}
} }
private boolean m_is_int = false; private boolean m_is_int = false;
@ -118,15 +111,10 @@ public class Statistics extends Z3Object
/** /**
* A string representation of the statistical data. * A string representation of the statistical data.
**/ **/
@Override
public String toString() public String toString()
{ {
try return Native.statsToString(getContext().nCtx(), getNativeObject());
{
return Native.statsToString(getContext().nCtx(), getNativeObject());
} catch (Z3Exception e)
{
return "Z3Exception: " + e.getMessage();
}
} }
/** /**
@ -201,15 +189,13 @@ public class Statistics extends Z3Object
super(ctx, obj); super(ctx, obj);
} }
void incRef(long o) @Override
{ void incRef() {
getContext().getStatisticsDRQ().incAndClear(getContext(), o); getContext().getStatisticsDRQ().storeReference(getContext(), this);
super.incRef(o);
} }
void decRef(long o) @Override
{ void addToReferenceQueue() {
getContext().getStatisticsDRQ().add(o); Native.statsIncRef(getContext().nCtx(), getNativeObject());
super.decRef(o);
} }
} }

View file

@ -17,37 +17,14 @@ Notes:
package com.microsoft.z3; package com.microsoft.z3;
class StatisticsDecRefQueue extends IDecRefQueue class StatisticsDecRefQueue extends IDecRefQueue<Statistics> {
{
public StatisticsDecRefQueue() public StatisticsDecRefQueue()
{ {
super(); super();
} }
public StatisticsDecRefQueue(int move_limit) @Override
{ protected void decRef(Context ctx, long obj) {
super(move_limit); Native.statsDecRef(ctx.nCtx(), obj);
} }
}
protected void incRef(Context ctx, long obj)
{
try
{
Native.statsIncRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
}
protected void decRef(Context ctx, long obj)
{
try
{
Native.statsDecRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
}
};

View file

@ -48,9 +48,9 @@ public class StringSymbol extends Symbol
void checkNativeObject(long obj) void checkNativeObject(long obj)
{ {
if (Native.getSymbolKind(getContext().nCtx(), obj) != Z3_symbol_kind.Z3_STRING_SYMBOL if (Native.getSymbolKind(getContext().nCtx(), obj) != Z3_symbol_kind.Z3_STRING_SYMBOL
.toInt()) .toInt()) {
throw new Z3Exception("Symbol is not of String kind"); throw new Z3Exception("Symbol is not of String kind");
}
super.checkNativeObject(obj); super.checkNativeObject(obj);
} }
} }

View file

@ -22,8 +22,7 @@ import com.microsoft.z3.enumerations.Z3_symbol_kind;
/** /**
* Symbols are used to name several term and type constructors. * Symbols are used to name several term and type constructors.
**/ **/
public class Symbol extends Z3Object public class Symbol extends Z3Object {
{
/** /**
* The kind of the symbol (int or string) * The kind of the symbol (int or string)
**/ **/
@ -62,19 +61,13 @@ public class Symbol extends Z3Object
* A string representation of the symbol. * A string representation of the symbol.
**/ **/
@Override @Override
public String toString() public String toString() {
{ if (isIntSymbol()) {
try return Integer.toString(((IntSymbol) this).getInt());
{ } else if (isStringSymbol()) {
if (isIntSymbol()) return ((StringSymbol) this).getString();
return Integer.toString(((IntSymbol) this).getInt()); } else {
else if (isStringSymbol()) return "Z3Exception: Unknown symbol kind encountered.";
return ((StringSymbol) this).getString();
else
return "Z3Exception: Unknown symbol kind encountered.";
} catch (Z3Exception ex)
{
return "Z3Exception: " + ex.getMessage();
} }
} }
@ -86,6 +79,17 @@ public class Symbol extends Z3Object
super(ctx, obj); super(ctx, obj);
} }
@Override
void incRef() {
// Symbol does not require tracking.
}
@Override
void addToReferenceQueue() {
// Symbol does not require tracking.
}
static Symbol create(Context ctx, long obj) static Symbol create(Context ctx, long obj)
{ {
switch (Z3_symbol_kind.fromInt(Native.getSymbolKind(ctx.nCtx(), obj))) switch (Z3_symbol_kind.fromInt(Native.getSymbolKind(ctx.nCtx(), obj)))

View file

@ -24,8 +24,7 @@ package com.microsoft.z3;
* also be obtained using the command {@code (help-tactic)} in the SMT 2.0 * also be obtained using the command {@code (help-tactic)} in the SMT 2.0
* front-end. * front-end.
**/ **/
public class Tactic extends Z3Object public class Tactic extends Z3Object {
{
/** /**
* A string containing a description of parameters accepted by the tactic. * A string containing a description of parameters accepted by the tactic.
**/ **/
@ -92,15 +91,13 @@ public class Tactic extends Z3Object
super(ctx, Native.mkTactic(ctx.nCtx(), name)); super(ctx, Native.mkTactic(ctx.nCtx(), name));
} }
void incRef(long o) @Override
{ void incRef() {
getContext().getTacticDRQ().incAndClear(getContext(), o); Native.tacticIncRef(getContext().nCtx(), getNativeObject());
super.incRef(o);
} }
void decRef(long o) @Override
{ void addToReferenceQueue() {
getContext().getTacticDRQ().add(o); getContext().getTacticDRQ().storeReference(getContext(), this);
super.decRef(o);
} }
} }

View file

@ -17,37 +17,15 @@ Notes:
package com.microsoft.z3; package com.microsoft.z3;
class TacticDecRefQueue extends IDecRefQueue class TacticDecRefQueue extends IDecRefQueue<Tactic> {
{
public TacticDecRefQueue() public TacticDecRefQueue()
{ {
super(); super();
} }
public TacticDecRefQueue(int move_limit) @Override
{
super(move_limit);
}
protected void incRef(Context ctx, long obj)
{
try
{
Native.tacticIncRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
}
protected void decRef(Context ctx, long obj) protected void decRef(Context ctx, long obj)
{ {
try Native.tacticDecRef(ctx.nCtx(), obj);
{
Native.tacticDecRef(ctx.nCtx(), obj);
} catch (Z3Exception e)
{
// OK.
}
} }
}; }

View file

@ -59,11 +59,9 @@ public class TupleSort extends Sort
TupleSort(Context ctx, Symbol name, int numFields, Symbol[] fieldNames, TupleSort(Context ctx, Symbol name, int numFields, Symbol[] fieldNames,
Sort[] fieldSorts) Sort[] fieldSorts)
{ {
super(ctx, 0); super(ctx, Native.mkTupleSort(ctx.nCtx(), name.getNativeObject(),
Native.LongPtr t = new Native.LongPtr();
setNativeObject(Native.mkTupleSort(ctx.nCtx(), name.getNativeObject(),
numFields, Symbol.arrayToNative(fieldNames), numFields, Symbol.arrayToNative(fieldNames),
AST.arrayToNative(fieldSorts), t, new long[numFields])); AST.arrayToNative(fieldSorts), new Native.LongPtr(),
new long[numFields]));
} }
}; };

View file

@ -21,88 +21,43 @@ package com.microsoft.z3;
* Internal base class for interfacing with native Z3 objects. Should not be * Internal base class for interfacing with native Z3 objects. Should not be
* used externally. * used externally.
**/ **/
public class Z3Object extends IDisposable public abstract class Z3Object {
{
/**
* Finalizer.
* @throws Throwable
**/
protected void finalize() throws Throwable
{
try {
dispose();
} finally {
super.finalize();
}
}
/** private final Context m_ctx;
* Disposes of the underlying native Z3 object. private final long m_n_obj;
**/
public void dispose()
{
if (m_n_obj != 0)
{
decRef(m_n_obj);
m_n_obj = 0;
}
if (m_ctx != null) Z3Object(Context ctx, long obj) {
{
if (m_ctx.m_refCount.decrementAndGet() == 0)
m_ctx.dispose();
m_ctx = null;
}
}
private Context m_ctx = null;
private long m_n_obj = 0;
Z3Object(Context ctx)
{
ctx.m_refCount.incrementAndGet();
m_ctx = ctx; m_ctx = ctx;
} checkNativeObject(obj);
Z3Object(Context ctx, long obj)
{
ctx.m_refCount.incrementAndGet();
m_ctx = ctx;
incRef(obj);
m_n_obj = obj; m_n_obj = obj;
incRef();
addToReferenceQueue();
} }
void incRef(long o) /**
{ * Add to ReferenceQueue for tracking reachability on the object and
} * decreasing the reference count when the object is no longer reachable.
*/
abstract void addToReferenceQueue();
void decRef(long o) /**
{ * Increment reference count on {@code this}.
} */
abstract void incRef();
void checkNativeObject(long obj) /**
{ * This function is provided for overriding, and a child class
} * can insert consistency checks on {@code obj}.
*
* @param obj Z3 native object.
*/
void checkNativeObject(long obj) {}
long getNativeObject() long getNativeObject()
{ {
return m_n_obj; return m_n_obj;
} }
void setNativeObject(long value)
{
if (value != 0)
{
checkNativeObject(value);
incRef(value);
}
if (m_n_obj != 0)
{
decRef(m_n_obj);
}
m_n_obj = value;
}
static long getNativeObject(Z3Object s) static long getNativeObject(Z3Object s)
{ {
if (s == null) if (s == null)
@ -121,7 +76,7 @@ public class Z3Object extends IDisposable
return null; return null;
long[] an = new long[a.length]; long[] an = new long[a.length];
for (int i = 0; i < a.length; i++) for (int i = 0; i < a.length; i++)
an[i] = (a[i] == null) ? 0 : a[i].getNativeObject(); an[i] = (a[i] == null) ? 0 : a[i].getNativeObject();
return an; return an;
} }